From 4dbf4641a57a744f399fdef7f654eecd660610d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= Date: Tue, 14 Jul 2026 11:03:07 +0100 Subject: [PATCH 01/20] docs: add Material documentation theme --- .gitignore | 5 +- CONTRIBUTING.md | 51 ++ docs/account/emails.md | 2 +- docs/assets/images/codacy-docs-logo-light.svg | 1 + docs/assets/images/codacy-docs-logo.svg | 2 +- docs/assets/javascripts/docs-theme.js | 308 +++++++++++ docs/assets/javascripts/version-select.js | 147 ++++-- docs/assets/stylesheets/version-select.css | 45 -- docs/codacy-cloud-cli/index.md | 2 +- .../codacy-guardrails-getting-started.md | 6 +- docs/getting-started/codacy-quickstart.md | 2 +- .../supported-languages-and-tools.md | 12 +- docs/index.md | 57 +- .../managing-security-and-risk.md | 7 +- docs/release-notes/index.md | 53 +- mkdocs.yml | 50 +- requirements.txt | 4 +- theme/404.html | 23 + theme/PROJECT.md | 368 +++++++++++++ theme/assets/fonts/OFL.txt | 94 ++++ theme/assets/fonts/inter-latin-ext.woff2 | Bin 0 -> 85272 bytes theme/assets/fonts/inter-latin.woff2 | Bin 0 -> 48432 bytes .../assets/fonts/roboto-mono-latin-ext.woff2 | Bin 0 -> 22868 bytes theme/assets/fonts/roboto-mono-latin.woff2 | Bin 0 -> 32752 bytes theme/hooks/image_metadata.py | 231 ++++++++ theme/main.html | 43 ++ theme/partials/actions.html | 2 + theme/partials/footer.html | 12 + theme/partials/header.html | 35 ++ theme/partials/integrations/disqus.html | 7 + theme/partials/integrations/feedback.html | 54 ++ theme/partials/integrations/segment.html | 1 + theme/partials/integrations/zendesk.html | 1 + theme/partials/logo.html | 2 + theme/partials/nav-item.html | 122 +++++ theme/partials/nav.html | 21 + theme/partials/notices.html | 19 + theme/partials/palette.html | 13 + theme/partials/path-item.html | 16 + theme/partials/search.html | 40 ++ theme/partials/source-file.html | 13 + theme/partials/source-link.html | 5 + theme/partials/source.html | 4 + theme/partials/toc.html | 10 + theme/stylesheets/fonts.css | 36 ++ theme/stylesheets/theme.css | 496 ++++++++++++++++++ theme/stylesheets/tokens.css | 114 ++++ 47 files changed, 2355 insertions(+), 181 deletions(-) create mode 100644 docs/assets/images/codacy-docs-logo-light.svg create mode 100644 docs/assets/javascripts/docs-theme.js delete mode 100644 docs/assets/stylesheets/version-select.css create mode 100644 theme/404.html create mode 100644 theme/PROJECT.md create mode 100644 theme/assets/fonts/OFL.txt create mode 100644 theme/assets/fonts/inter-latin-ext.woff2 create mode 100644 theme/assets/fonts/inter-latin.woff2 create mode 100644 theme/assets/fonts/roboto-mono-latin-ext.woff2 create mode 100644 theme/assets/fonts/roboto-mono-latin.woff2 create mode 100644 theme/hooks/image_metadata.py create mode 100644 theme/main.html create mode 100644 theme/partials/actions.html create mode 100644 theme/partials/footer.html create mode 100644 theme/partials/header.html create mode 100644 theme/partials/integrations/disqus.html create mode 100644 theme/partials/integrations/feedback.html create mode 100644 theme/partials/integrations/segment.html create mode 100644 theme/partials/integrations/zendesk.html create mode 100644 theme/partials/logo.html create mode 100644 theme/partials/nav-item.html create mode 100644 theme/partials/nav.html create mode 100644 theme/partials/notices.html create mode 100644 theme/partials/palette.html create mode 100644 theme/partials/path-item.html create mode 100644 theme/partials/search.html create mode 100644 theme/partials/source-file.html create mode 100644 theme/partials/source-link.html create mode 100644 theme/partials/source.html create mode 100644 theme/partials/toc.html create mode 100644 theme/stylesheets/fonts.css create mode 100644 theme/stylesheets/theme.css create mode 100644 theme/stylesheets/tokens.css diff --git a/.gitignore b/.gitignore index c8d5cc9e04..32d3851084 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ # MkDocs build dir site/ +# Python bytecode generated while running MkDocs hooks +__pycache__/ +*.py[cod] + # OS generated files .DS_Store @@ -28,4 +32,3 @@ tools/*.csv #Ignore vscode AI rules .github/instructions/codacy.instructions.md - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e36cc8569c..3436385ae5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,6 +3,7 @@ You're welcome to make fixes and changes to the documentation. Here are a few steps to get you going: - [Authoring documentation pages](#authoring-documentation-pages) +- [Working on the documentation theme](#working-on-the-documentation-theme) - [Releasing a new Codacy Self-hosted documentation version](#releasing-a-new-codacy-self-hosted-documentation-version) - [Updating an existing Codacy Self-hosted documentation version](#updating-an-existing-codacy-self-hosted-documentation-version) - [Applying documentation hotfixes to existing chart releases](#applying-documentation-hotfixes-to-existing-chart-releases) @@ -39,6 +40,56 @@ You're welcome to make fixes and changes to the documentation. Here are a few st mkdocs serve ``` +### Working on the documentation theme + +The documentation uses the installed `mkdocs-material` package with a small, +Codacy-owned theme layer in [`theme/`](theme/). This is +the current theme source of truth. Do not copy, modify, or revive the legacy +`submodules/codacy-mkdocs-material` clone when changing this site's theme. + +The theme is intentionally plain CSS and minimal Jinja overrides: + +- [`theme/stylesheets/tokens.css`](theme/stylesheets/tokens.css) + defines the Codacy color tokens and Material color mappings. +- [`theme/stylesheets/theme.css`](theme/stylesheets/theme.css) + contains the visual styling. +- [`theme/main.html`](theme/main.html) and its + [`partials/`](theme/partials/) retain only the overrides and + integrations that Codacy needs. +- [`mkdocs.yml`](mkdocs.yml) connects this layer through `theme.custom_dir` + and loads the small supporting browser scripts and stylesheets. + +There is no SCSS compilation, Webpack configuration, Node dependency, or +frontend build step. Edit the CSS, Jinja partials, or supporting JavaScript +directly, then use the normal MkDocs preview: + +```bash +mkdocs serve +``` + +The theme self-hosts the Inter and Roboto Mono webfonts under +`theme/assets/fonts/`; it does not contact a third-party font +service. Keep the font license beside those assets when updating them. + +The dependency-free `theme/hooks/image_metadata.py` hook adds +intrinsic dimensions and safe loading hints to local documentation images at +build time. Authors normally only need to use standard Markdown image syntax; +explicit HTML image attributes are preserved when a page needs an exception. + +Before opening a pull request that changes the theme, build with warnings +treated as errors and check representative pages in the local preview: + +```bash +mkdocs build --strict +``` + +Check at least a Cloud page, a Self-hosted page when relevant, light and dark +color schemes, desktop and narrow mobile widths, search, the version picker, +and any changed content component. Preserve the behavior described in +[`theme/PROJECT.md`](theme/PROJECT.md), including +analytics, feedback, preview and Self-hosted notices, source metadata, and +existing URLs. + ### Markdown conventions Follow these Markdown conventions when editing the documentation: diff --git a/docs/account/emails.md b/docs/account/emails.md index be0bad6bf5..749da99675 100644 --- a/docs/account/emails.md +++ b/docs/account/emails.md @@ -8,7 +8,7 @@ To manage the email addresses associated with your account and your email notifi Codacy automatically links to your Codacy account the email addresses from the Git provider associated with your current session. On the **Emails** page, you can verify which email addresses are linked to your Codacy account. -!!! notes +!!! note - For **GitHub**, if you have [email privacy enabled](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address?platform=mac#about-commit-email-addresses) on the provider, Codacy doesn't show your private emails and uses another available email address when displaying your personal details on lists, search filters, or activity. - Codacy doesn't allow you to have one email associated with more than one GitHub account. You can manage your [associated emails in the provider GitHub](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/adding-an-email-address-to-your-github-account). diff --git a/docs/assets/images/codacy-docs-logo-light.svg b/docs/assets/images/codacy-docs-logo-light.svg new file mode 100644 index 0000000000..2c5cfc0408 --- /dev/null +++ b/docs/assets/images/codacy-docs-logo-light.svg @@ -0,0 +1 @@ + diff --git a/docs/assets/images/codacy-docs-logo.svg b/docs/assets/images/codacy-docs-logo.svg index 12cd5df14e..6728340b6e 100644 --- a/docs/assets/images/codacy-docs-logo.svg +++ b/docs/assets/images/codacy-docs-logo.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/docs/assets/javascripts/docs-theme.js b/docs/assets/javascripts/docs-theme.js new file mode 100644 index 0000000000..b2a1ecdb22 --- /dev/null +++ b/docs/assets/javascripts/docs-theme.js @@ -0,0 +1,308 @@ +var searchReturnTarget; +var tocScrollCleanup; + +function openSearch(opener) { + var searchToggle = document.querySelector("#__search"); + var trigger = opener || document.querySelector("[data-search-trigger]"); + var drawerToggle = document.querySelector("#__drawer"); + if (!searchToggle) { + return; + } + + if (!searchToggle.checked) { + if (drawerToggle && drawerToggle.checked) { + drawerToggle.click(); + } + searchToggle.click(); + } + + if (trigger) { + searchReturnTarget = trigger; + trigger.setAttribute("aria-expanded", "true"); + } + + window.setTimeout(function () { + var input = document.querySelector(".md-search__input"); + if (input) { + input.focus(); + } + }, 0); +} + +function closeSearch() { + var searchToggle = document.querySelector("#__search"); + + if (searchToggle && searchToggle.checked) { + searchToggle.click(); + } +} + +function initializeDocsTheme() { + if (tocScrollCleanup) { + tocScrollCleanup(); + tocScrollCleanup = undefined; + } + + var trigger = document.querySelector("[data-search-trigger]"); + var searchTriggers = document.querySelectorAll("[data-search-trigger]"); + var shortcut = document.querySelector("[data-search-shortcut]"); + if (shortcut && !/Mac|iPhone|iPad/.test(navigator.platform)) { + shortcut.textContent = "Ctrl K"; + } + searchTriggers.forEach(function (searchTrigger) { + searchTrigger.addEventListener("click", function (event) { + event.preventDefault(); + openSearch(searchTrigger); + }); + searchTrigger.addEventListener("keydown", function (event) { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + openSearch(searchTrigger); + } + }); + }); + + var drawerToggle = document.querySelector("#__drawer"); + var drawerTrigger = document.querySelector("[data-drawer-trigger]"); + var drawer = document.querySelector(".md-sidebar--primary"); + if (drawer) { + drawer.id = "docs-navigation"; + } + // With navigation.instant, Material keeps the header and drawer mounted + // while emitting document$ for each page. Only bind these persistent + // controls once; otherwise every navigation adds another click handler + // and a hamburger tap toggles the checkbox an even number of times. + if (drawerToggle && drawerTrigger && drawer && !drawerTrigger.dataset.docsDrawerInitialized) { + drawerTrigger.dataset.docsDrawerInitialized = "true"; + var suppressDrawerKeyboardClick = false; + drawerTrigger.addEventListener("keydown", function (event) { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + suppressDrawerKeyboardClick = true; + drawerToggle.click(); + window.setTimeout(function () { + suppressDrawerKeyboardClick = false; + }, 250); + } + }); + drawerTrigger.addEventListener("click", function (event) { + event.preventDefault(); + if (suppressDrawerKeyboardClick && event.detail === 0) { + return; + } + drawerToggle.click(); + }); + drawerToggle.addEventListener("change", function () { + drawerTrigger.setAttribute("aria-expanded", String(drawerToggle.checked)); + drawerTrigger.setAttribute("aria-label", drawerToggle.checked ? "Close navigation" : "Open navigation"); + document.querySelectorAll(".md-content, .md-sidebar--secondary, footer").forEach(function (element) { + element.toggleAttribute("inert", drawerToggle.checked); + }); + + if (drawerToggle.checked) { + window.setTimeout(function () { + var firstLink = drawer.querySelector(".md-nav__list a[href]"); + if (firstLink) { + firstLink.focus(); + } + }, 0); + } else { + drawerTrigger.focus(); + } + }); + } + + var breadcrumb = document.querySelector(".md-path"); + if (breadcrumb) { + breadcrumb.setAttribute("aria-label", "Breadcrumb"); + } + + document.querySelectorAll(".md-nav--primary a.md-nav__link--active[href]").forEach(function (link) { + if (new URL(link.href, window.location.href).pathname === window.location.pathname) { + link.setAttribute("aria-current", "page"); + } + }); + + var pageOutline = document.querySelector(".md-sidebar--secondary .md-nav--secondary"); + if (pageOutline && !pageOutline.querySelector("a[href]")) { + pageOutline.hidden = true; + } + + var searchToggle = document.querySelector("#__search"); + if (searchToggle && trigger) { + searchToggle.addEventListener("change", function () { + searchTriggers.forEach(function (searchTrigger) { + searchTrigger.setAttribute("aria-expanded", String(searchToggle.checked)); + }); + + document.querySelectorAll(".md-main, footer").forEach(function (element) { + element.toggleAttribute("inert", searchToggle.checked); + }); + + if (!searchToggle.checked) { + (searchReturnTarget || trigger).focus(); + } + }); + } + + var searchInput = document.querySelector(".md-search__input"); + if (searchInput) { + searchInput.addEventListener("input", function (event) { + // Material listens for keyup. Mirroring input events also covers + // paste, autofill, and browser automation without duplicating + // queries because Material de-duplicates unchanged values. + if (event.isComposing) { + return; + } + searchInput.dispatchEvent(new Event("keyup", { bubbles: true })); + }); + searchInput.addEventListener("compositionend", function () { + searchInput.dispatchEvent(new Event("keyup", { bubbles: true })); + }); + } + + document.querySelectorAll(".md-typeset table").forEach(function (table) { + if (table.classList.contains("highlighttable") || table.closest(".highlight, .md-typeset__scrollwrap") || table.parentElement.classList.contains("docs-table-scroll")) { + return; + } + + var wrapper = document.createElement("div"); + wrapper.className = "docs-table-scroll"; + table.parentNode.insertBefore(wrapper, table); + wrapper.appendChild(table); + }); + + // Material's legacy scroll spy activates a heading only once it clears the + // header. The outline is more useful when it reflects the reading position, + // so activate the latest heading that has crossed 40% of the viewport. + var tocLinks = Array.from(document.querySelectorAll(".md-sidebar--secondary .md-nav__link[href*='#']")).filter(function (link) { + var target = new URL(link.href, window.location.href); + return target.pathname === window.location.pathname && target.hash; + }); + if (tocLinks.length) { + // Material keeps its own active-link state. Mark the custom scroll spy + // as authoritative so the theme can suppress Material's stale state + // when the two updates occur in different animation frames. + document.documentElement.classList.add("docs-toc-scrollspy"); + + var updateTableOfContents = function () { + var threshold = window.innerHeight * 0.4; + var activeLink = tocLinks[0]; + + tocLinks.forEach(function (link) { + var id = decodeURIComponent(link.hash.slice(1)); + var heading = id ? document.getElementById(id) : null; + if (heading && heading.getBoundingClientRect().top <= threshold) { + activeLink = link; + } + }); + + tocLinks.forEach(function (link) { + link.classList.toggle("docs-toc-active", link === activeLink); + }); + }; + + var tocFrame; + var onTocScroll = function () { + window.cancelAnimationFrame(tocFrame); + tocFrame = window.requestAnimationFrame(updateTableOfContents); + }; + window.addEventListener("scroll", onTocScroll, { passive: true }); + window.addEventListener("resize", updateTableOfContents); + tocScrollCleanup = function () { + window.cancelAnimationFrame(tocFrame); + window.removeEventListener("scroll", onTocScroll); + window.removeEventListener("resize", updateTableOfContents); + document.documentElement.classList.remove("docs-toc-scrollspy"); + }; + window.setTimeout(updateTableOfContents, 0); + } + + // Frame block screenshots the way Mintlify does. Only images that stand + // alone in their own paragraph and are wide enough to be a screenshot get a + // border/rounded corners — inline badges, emoji, and card icons are left + // untouched by the size threshold and the empty-paragraph requirement. + document.querySelectorAll(".md-typeset img").forEach(function (img) { + if (img.closest(".tc-icon, table")) { + return; + } + + var paragraph = img.closest("p"); + var declaredWidth = Number(img.getAttribute("width")) || 0; + var frame = function () { + var intrinsicWidth = img.naturalWidth || declaredWidth; + if (intrinsicWidth && intrinsicWidth < 280) { + return; + } + img.classList.add("docs-image"); + if (paragraph && paragraph.textContent.trim() === "" && paragraph.querySelectorAll("img").length === 1) { + paragraph.classList.add("docs-image-block"); + } + }; + + if (declaredWidth >= 280 || (img.complete && img.naturalWidth)) { + frame(); + } else { + img.addEventListener("load", frame, { once: true }); + } + }); +} + +if (typeof document$ !== "undefined" && document$.subscribe) { + document$.subscribe(initializeDocsTheme); +} else { + window.addEventListener("DOMContentLoaded", initializeDocsTheme); +} + +window.addEventListener("keydown", function (event) { + if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") { + var target = event.target; + if (target && (target.matches("input, textarea, select") || target.isContentEditable)) { + return; + } + event.preventDefault(); + openSearch(); + } + + if (event.key === "Escape") { + closeSearch(); + var drawerToggle = document.querySelector("#__drawer"); + if (drawerToggle && drawerToggle.checked) { + drawerToggle.click(); + } + } + + var searchToggle = document.querySelector("#__search"); + if (event.key === "Tab" && searchToggle && searchToggle.checked) { + var dialog = document.querySelector("#docs-search"); + var focusable = dialog ? Array.from(dialog.querySelectorAll("input, button:not([disabled]), a[href], [tabindex]:not([tabindex='-1'])")).filter(function (element) { return element.offsetParent !== null; }) : []; + if (focusable.length) { + var first = focusable[0]; + var last = focusable[focusable.length - 1]; + if (event.shiftKey && document.activeElement === first) { + event.preventDefault(); + last.focus(); + } else if (!event.shiftKey && document.activeElement === last) { + event.preventDefault(); + first.focus(); + } + } + } + + var drawerToggle = document.querySelector("#__drawer"); + if (event.key === "Tab" && drawerToggle && drawerToggle.checked) { + var drawer = document.querySelector("#docs-navigation"); + var drawerFocusable = drawer ? Array.from(drawer.querySelectorAll("a[href], label[tabindex='0'], button:not([disabled]), [tabindex]:not([tabindex='-1'])")).filter(function (element) { return element.offsetParent !== null; }) : []; + if (drawerFocusable.length) { + var drawerFirst = drawerFocusable[0]; + var drawerLast = drawerFocusable[drawerFocusable.length - 1]; + if (event.shiftKey && document.activeElement === drawerFirst) { + event.preventDefault(); + drawerLast.focus(); + } else if (!event.shiftKey && document.activeElement === drawerLast) { + event.preventDefault(); + drawerFirst.focus(); + } + } + } +}, true); diff --git a/docs/assets/javascripts/version-select.js b/docs/assets/javascripts/version-select.js index 272a1ca9f9..c087ccd030 100644 --- a/docs/assets/javascripts/version-select.js +++ b/docs/assets/javascripts/version-select.js @@ -1,4 +1,25 @@ -window.addEventListener("DOMContentLoaded", function() { +function initializeVersionSelector() { + var selector = document.querySelector("#version-selector"); + if (!selector || selector.dataset.versionSelectorBound === "true") { + return; + } + selector.dataset.versionSelectorBound = "true"; + var selectorScrollPosition; + var preserveScrollPosition = function() { + if (!selectorScrollPosition) { + return; + } + window.scrollTo(selectorScrollPosition.left, selectorScrollPosition.top); + }; + selector.addEventListener("pointerdown", function() { + selectorScrollPosition = { left: window.scrollX, top: window.scrollY }; + }); + selector.addEventListener("focus", function() { + window.requestAnimationFrame(preserveScrollPosition); + }); + selector.addEventListener("blur", function() { + selectorScrollPosition = undefined; + }); window.versionPages = {}; var VERSION = window.location.pathname.split("/")[1]; var VERSION_LATEST = "latest"; @@ -9,26 +30,39 @@ window.addEventListener("DOMContentLoaded", function() { } function populateVersionSitemap(version) { + if (window.versionPages[version]) { + return Promise.resolve(); + } var versionPath = version === VERSION_LATEST ? "" : "/" + version; window.versionPages[version] = []; - var xhrSitemap = new XMLHttpRequest(); - var sitemapURL = window.location.origin + versionPath + "/sitemap.xml"; - xhrSitemap.open("GET", sitemapURL); - xhrSitemap.onload = function() { - var xmlLoc = this.responseXML.getElementsByTagName("loc"); - var nodeText = []; - - for (var index = 0; index < xmlLoc.length; index++) { - var element = xmlLoc[index]; - nodeText.push(element.textContent); - } - var prefix = nodeText[0].slice(0,-1); - window.versionPages[version] = nodeText.map(function(e) { - return removePrefix(e, prefix); - }); - }; - xhrSitemap.send(); + return new Promise(function(resolve) { + var xhrSitemap = new XMLHttpRequest(); + var sitemapURL = window.location.origin + versionPath + "/sitemap.xml"; + xhrSitemap.open("GET", sitemapURL); + xhrSitemap.onload = function() { + var xmlLoc = this.responseXML && this.responseXML.getElementsByTagName("loc"); + var nodeText = []; + + if (this.status >= 200 && this.status < 300 && xmlLoc) { + for (var index = 0; index < xmlLoc.length; index++) { + nodeText.push(xmlLoc[index].textContent); + } + } + + if (nodeText.length) { + var prefix = nodeText[0].slice(0, -1); + window.versionPages[version] = nodeText.map(function(e) { + return removePrefix(e, prefix); + }); + } + resolve(); + }; + xhrSitemap.onerror = resolve; + xhrSitemap.ontimeout = resolve; + xhrSitemap.timeout = 10000; + xhrSitemap.send(); + }); } function makeSelect(options, selected) { @@ -124,41 +158,34 @@ window.addEventListener("DOMContentLoaded", function() { function fetchVersions(callback) { var xhr = new XMLHttpRequest(); + var fallback = function() { + callback([{ "version": "latest", "title": "Cloud (Latest)", "aliases": [] }]); + }; // Obtain JSON listing all available versions xhr.open("GET", window.location.origin + "/versions.json"); xhr.onload = function() { - if (this.status === 404) { - // Use mock JSON as fallback - var staticJSON = [{"version": "latest", "title": "Cloud (Latest)", "aliases": []}]; - callback(staticJSON) - } else { - callback(JSON.parse(this.responseText)); + if (this.status < 200 || this.status >= 300) { + fallback(); + return; + } + try { + var versions = JSON.parse(this.responseText); + if (!Array.isArray(versions) || !versions.length) { + fallback(); + return; + } + callback(versions); + } catch (error) { + fallback(); } }; + xhr.onerror = fallback; + xhr.ontimeout = fallback; + xhr.timeout = 10000; xhr.send(); } - function placeSelectElement(ele) { - // Place the HTML select element in the DOM - var container = document.createElement("div"); - container.id = "version-selector"; - container.className = "version-select-container"; - - var span = document.createElement("span"); - span.innerText = "Version"; - - container.appendChild(span); - container.appendChild(ele); - - var article = document.querySelector(".search-cta-top > .md-search"); - article.insertAdjacentElement("afterend", container); - } - function generateVersionSwitcher(versionJSON) { - versionJSON.forEach(function(e) { - populateVersionSitemap(e.version); - }); - // Identify which is the current version var currentVersion = versionJSON.find(function(i) { return i.version === VERSION || @@ -174,31 +201,41 @@ window.addEventListener("DOMContentLoaded", function() { } // Build the HTML select element - var select = makeSelect(versionJSON.map(function(i) { + var generatedSelect = makeSelect(versionJSON.map(function(i) { return {text: i.title, value: i.version}; }), currentVersion.version); + selector.replaceChildren.apply(selector, Array.prototype.slice.call(generatedSelect.options)); + var select = selector; + select.disabled = false; // Navigate to the selected version select.addEventListener("change", function() { + var targetVersion = this.value; var currentPath = window.location.pathname; - var targetVersionPath = this.value === VERSION_LATEST ? "" : "/" + this.value; + var targetVersionPath = targetVersion === VERSION_LATEST ? "" : "/" + targetVersion; if(currentVersion.version !== VERSION_LATEST) { currentPath = removePrefix(window.location.pathname, "/" + currentVersion.version); } - if(window.versionPages[this.value].includes(currentPath)) { - window.location.href = window.location.origin + targetVersionPath + currentPath; - } else { - window.location.href = window.location.origin + targetVersionPath; - } + select.disabled = true; + populateVersionSitemap(targetVersion).then(function() { + if(window.versionPages[targetVersion].includes(currentPath)) { + window.location.href = window.location.origin + targetVersionPath + currentPath; + } else { + window.location.href = window.location.origin + targetVersionPath; + } + }); }); select.title = "For Codacy Cloud, select Latest.\nFor Codacy Self-Hosted, select the version of your Codacy installation."; - - // Place the HTML select element in the DOM - placeSelectElement(select); } fetchVersions(generateVersionSwitcher); -}); +} + +if (typeof document$ !== "undefined" && document$.subscribe) { + document$.subscribe(initializeVersionSelector); +} else { + window.addEventListener("DOMContentLoaded", initializeVersionSelector); +} diff --git a/docs/assets/stylesheets/version-select.css b/docs/assets/stylesheets/version-select.css deleted file mode 100644 index 52b11932a5..0000000000 --- a/docs/assets/stylesheets/version-select.css +++ /dev/null @@ -1,45 +0,0 @@ -.version-select-container > span { - color: #4c6083; - font-size: 0.6rem; - margin-right: 0.6rem; -} - -.version-select-container .select-css { - display: inline-block; - cursor: pointer; - height: 2rem; - font-size: 0.7rem; - box-sizing: border-box; - color: #354b71; - padding: 0.5rem; - padding-right: 1.2rem; - margin: 0; - border: 0; - border-radius: 0.25em; - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; - background-color: #e5ecf5; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='451.847' height='451.847'%3E%3Cpath fill='%23354B71' d='M225.923 354.706c-8.098 0-16.195-3.092-22.369-9.263L9.27 151.157c-12.359-12.359-12.359-32.397 0-44.751 12.354-12.354 32.388-12.354 44.748 0l171.905 171.915 171.906-171.909c12.359-12.354 32.391-12.354 44.744 0 12.365 12.354 12.365 32.392 0 44.751L248.292 345.449c-6.177 6.172-14.274 9.257-22.369 9.257z'/%3E%3C/svg%3E"); - background-repeat: no-repeat, repeat; - background-position: right 0.6em top 50%, 0 0; - background-size: 0.55em auto, 100%; -} - -.version-select-container .select-css::-ms-expand { - display: none; -} - -.version-select-container .select-css:hover { - background-color: #c9d8ef; -} - -.version-select-container .select-css option { - font-weight: normal; -} - -@media screen and (max-width: 719px) { - .version-select-container .select-css { - max-width: 38vw; - } -} diff --git a/docs/codacy-cloud-cli/index.md b/docs/codacy-cloud-cli/index.md index 5d77c37a37..65b1ab7cb3 100644 --- a/docs/codacy-cloud-cli/index.md +++ b/docs/codacy-cloud-cli/index.md @@ -8,7 +8,7 @@ The Codacy Cloud CLI gives you a fast terminal interface to your Codacy data. Ad Pair it with [Codacy Skills](#install-the-codacy-skills) to interact with your Codacy data in plain language directly from your AI assistant. -
+
## Installation diff --git a/docs/codacy-guardrails/codacy-guardrails-getting-started.md b/docs/codacy-guardrails/codacy-guardrails-getting-started.md index 8189c86512..9aa15f3ab9 100644 --- a/docs/codacy-guardrails/codacy-guardrails-getting-started.md +++ b/docs/codacy-guardrails/codacy-guardrails-getting-started.md @@ -9,7 +9,7 @@ Besides real-time AI code scanning, Guardrails users can now prompt all their Co -# VSCode-based IDEs +## VSCode-based IDEs ## Prerequisites @@ -235,7 +235,7 @@ If your proxy uses a custom CA certificate, the extension has an extra setting a ![Codacy proxy CA certificate path setting](images/codacy-proxy-ca-cert-path.png) -# JetBrains IDEs +## JetBrains IDEs ### Supported Operating Systems @@ -343,4 +343,4 @@ Install the guidelines by clicking on **Install AiAgent Guidelines** on the Coda ### 6. Start using your Agent and Codacy will be there with you! -![Codacy Guardrails running in JetBrains](images/codacy-guardrails-junie.png) \ No newline at end of file +![Codacy Guardrails running in JetBrains](images/codacy-guardrails-junie.png) diff --git a/docs/getting-started/codacy-quickstart.md b/docs/getting-started/codacy-quickstart.md index f4e25fa0ee..09788e13c8 100644 --- a/docs/getting-started/codacy-quickstart.md +++ b/docs/getting-started/codacy-quickstart.md @@ -9,7 +9,7 @@ Codacy is an automated code quality and coverage platform that analyzes your sou Check out our product demo for an overview of Codacy's main features (recorded on November, 2025): -
+
By integrating with your Git provider, Codacy keeps track of your team’s work, analyzes relevant commits, highlights problems, suggests improvements, and protects your codebase from unwelcome changes. From organization and repository level to individual files, pull requests, and commits, Codacy monitors the following metrics across your projects: diff --git a/docs/getting-started/supported-languages-and-tools.md b/docs/getting-started/supported-languages-and-tools.md index c5f68318cc..14b48f2948 100644 --- a/docs/getting-started/supported-languages-and-tools.md +++ b/docs/getting-started/supported-languages-and-tools.md @@ -25,18 +25,18 @@ The table below lists all languages that Codacy supports and the corresponding t !!! important Codacy runs security and other analysis tools when code changes are pushed to your repositories. These tools don't scan code for issues continuously. - +
- - + + - - - + + + diff --git a/docs/index.md b/docs/index.md index 0803bda357..b56daee076 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,66 +2,69 @@ description: Documentation homepage for the Codacy automated code review tool. --- -# Documentation home +# Codacy documentation + +Everything you need to set up Codacy, integrate it into your workflow, and get more value from your code-quality data. +{ .docs-home-lead }
- + - +
-

Most popular topics

+
- Adding and managing people +
-
Managing people in organizations
-
Invite your teammates to join Codacy to analyze their commits on private repositories.
+

Manage people

+

Invite teammates to analyze their work across private repositories.

- Adding coverage to your repository +
-
Adding coverage to your repository
-
Set up your repositories to show code coverage reports directly on Codacy.
+

Add coverage

+

Show repository coverage reports and changes directly in Codacy.

- Using the Codacy API +
-
Using the Codacy API
-
Retrieve and analyze data from Codacy and perform configuration changes programmatically
+

Use the Codacy API

+

Retrieve data and automate configuration changes programmatically.

-
\ No newline at end of file + diff --git a/docs/organizations/managing-security-and-risk.md b/docs/organizations/managing-security-and-risk.md index 8262ebf251..cacd5ad148 100644 --- a/docs/organizations/managing-security-and-risk.md +++ b/docs/organizations/managing-security-and-risk.md @@ -113,7 +113,7 @@ The same Common Vulnerability and Exposure can be classified with different seve To share the current view of the overview or findings page, click the **Copy URL** button in the top right-hand corner of the page. This action copies the URL with the current filters applied to the clipboard. -!!! Important " [**Segments**](../segments) filter won't be considered when sharing the filtered view" +!!! important " [**Segments**](../segments) filter won't be considered when sharing the filtered view" ## Ignoring findings {: id="ignoring-findings"} @@ -129,7 +129,7 @@ From Codacy's standpoint, ignoring a finding means it will be removed from the m !!! info "[Jira](./integrations/jira-integration.md) findings can't be ignored in Codacy. You should closed the issue directly in Jira." -!!! Important "Ignoring findings detected on [Git repositories](#opening-and-closing-items) will also [ignore the issue at the repository level](../repositories/issues.md#ignoring-and-managing-issues)." +!!! important "Ignoring findings detected on [Git repositories](#opening-and-closing-items) will also [ignore the issue at the repository level](../repositories/issues.md#ignoring-and-managing-issues)." You can still see **Ignored** findings in the [findings list](#item-list), by filtering for the **Ignored** status in the **Statuses** dropdown. You can assess which status a finding has at his overview, on the right top corner. @@ -141,7 +141,7 @@ Unignoring a finding reverts the effects of ignoring it. ![Security and risk management finding unignore](images/security-risk-management-finding-unignore.png) -!!! Important "Unignoring findings detected on [Git repositories](#opening-and-closing-items) will also [unignore the issue at the repository level](../repositories/issues.md#ignoring-and-managing-issues)." +!!! important "Unignoring findings detected on [Git repositories](#opening-and-closing-items) will also [unignore the issue at the repository level](../repositories/issues.md#ignoring-and-managing-issues)." !!! info "Ignoring and unignoring findings are [auditable actions](../organizations/audit-logs-for-organizations.md#organization)." @@ -839,4 +839,3 @@ If there is no last analysis date for an image tag, it means that the SBOM file !!! note Remember that scans run nightly (UTC). If you just uploaded the SBOM file, but need results immediately, consider using our [Codacy CLI v2](https://github.com/codacy/codacy-cli-v2) to run a local analysis to scan for any issues. - \ No newline at end of file diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 92ec489feb..eaa7deaa42 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -2,7 +2,8 @@ rss_title: Codacy release notes RSS feed rss_href: /feed_rss_created.xml description: Index of release notes for Codacy Cloud and Codacy Self-hosted. -hide_toc: true +hide: + - toc --- # Codacy release notes @@ -16,7 +17,7 @@ For product updates that are in progress or planned [visit the Codacy public roa ## Codacy Cloud release notes {: id="cloud"} -2026 +### 2026 {.release-series} - [PHP_CodeSniffer Upgrade and Legacy Package Deprecations July, 2026](cloud/cloud-2026-07-remove-codesniffer-packages.md) - [Cloud June 2026](cloud/cloud-2026-06.md) @@ -29,7 +30,7 @@ For product updates that are in progress or planned [visit the Codacy public roa - [Cloud January 2026](cloud/cloud-2026-01.md) - [Adding GolangCI-Lint as new supported tool January, 2026](cloud/cloud-2026-01-adding-golangci-lint.md) -2025 +### 2025 {.release-series} - [Cloud December 2025](cloud/cloud-2025-12.md) - [Cloud November 2025](cloud/cloud-2025-11.md) @@ -46,7 +47,7 @@ For product updates that are in progress or planned [visit the Codacy public roa - [Cloud February 2025](cloud/cloud-2025-02.md) - [Cloud January 2025](cloud/cloud-2025-01.md) -2024 +### 2024 {.release-series} - [Cloud December 2024](cloud/cloud-2024-12.md) - [Cloud November 2024](cloud/cloud-2024-11.md) @@ -63,7 +64,7 @@ For product updates that are in progress or planned [visit the Codacy public roa - [Cloud January 2024](cloud/cloud-2024-01.md) - [Discontinuation of SSH keys for GitHub repositories January 15, 2024](cloud/cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md) -2023 +### 2023 {.release-series} - [Cloud December 2023](cloud/cloud-2023-12.md) - [Cloud November 2023](cloud/cloud-2023-11.md) @@ -82,7 +83,7 @@ For product updates that are in progress or planned [visit the Codacy public roa - [Cloud February 2023](cloud/cloud-2023-02.md) - [Cloud January 2023](cloud/cloud-2023-01.md) -2022 +### 2022 {.release-series} - [Cloud December 2022](cloud/cloud-2022-12.md) - [Cloud November 2022](cloud/cloud-2022-11.md) @@ -99,7 +100,7 @@ For product updates that are in progress or planned [visit the Codacy public roa - [Removal of PMD (Legacy) February 16, 2022](cloud/cloud-2022-02-16-pmd-legacy-removal.md) - [Cloud January 2022](cloud/cloud-2022-01.md) -2021 +### 2021 {.release-series} - [Cloud December 2021](cloud/cloud-2021-12.md) - [Cloud November 2021](cloud/cloud-2021-11.md) @@ -109,13 +110,13 @@ For product updates that are in progress or planned [visit the Codacy public roa - [Cloud August 2021](cloud/cloud-2021-08.md) - [Performing scheduled database maintenance July 3, 2021](cloud/cloud-2021-07-03-scheduled-db-maintenance.md) -2020 +### 2020 {.release-series} - [Deprecating HTTP headers for API tokens April 1, 2020](cloud/cloud-2020-04-01-deprecating-http-headers-for-api-tokens.md) - [Removal of NodeSecurity, GoLint, and SCSS Lint March 9, 2020](cloud/cloud-2020-03-09-nodesecurity-golint-scsslint-removal.md) - [Codacy now supports GitHub Apps February 2, 2020](cloud/cloud-2020-02-github-apps.md) -2019 +### 2019 {.release-series} - [Cloud November 15, 2019](cloud/cloud-2019-11-15.md) - [Cloud October 30, 2019](cloud/cloud-2019-10-30.md) @@ -129,7 +130,7 @@ For product updates that are in progress or planned [visit the Codacy public roa - [Bitbucket changes February 18, 2019](cloud/cloud-2019-02-18-bitbucket-changes.md) - [Cloud January 2, 2019](cloud/cloud-2019-01-02.md) -2018 +### 2018 {.release-series} - [Cloud November 16, 2018](cloud/cloud-2018-11-16.md) - [Cloud November 2, 2018](cloud/cloud-2018-11-02.md) @@ -138,58 +139,58 @@ For product updates that are in progress or planned [visit the Codacy public roa ## Codacy Self-hosted release notes {: id="self-hosted"} -v16 +### v16 {.release-series} - [v16.0.0](self-hosted/self-hosted-v16.0.0.md) (January, 2026) -v15 +### v15 {.release-series} - [v15.0.0](self-hosted/self-hosted-v15.0.0.md) (April 10, 2025) -v14 +### v14 {.release-series} - [v14.1.1](self-hosted/self-hosted-v14.1.1.md) (March 10, 2025) - [v14.0.0](self-hosted/self-hosted-v14.0.0.md) (June 26, 2024) -v13 +### v13 {.release-series} - [v13.0.0](self-hosted/self-hosted-v13.0.0.md) (November 23, 2023) -v12 +### v12 {.release-series} - [v12.0.0](self-hosted/self-hosted-v12.0.0.md) (July 20, 2023) -v11 +### v11 {.release-series} - [v11.0.0](self-hosted/self-hosted-v11.0.0.md) (April 20, 2023) -v10 +### v10 {.release-series} - [v10.0.0](self-hosted/self-hosted-v10.0.0.md) (February 3, 2023) -v9 +### v9 {.release-series} - [v9.0.0](self-hosted/self-hosted-v9.0.0.md) (September 23, 2022) -v8 +### v8 {.release-series} - [v8.1.0](self-hosted/self-hosted-v8.1.0.md) (June 17, 2022) - [v8.0.0](self-hosted/self-hosted-v8.0.0.md) (May 12, 2022) -v7 +### v7 {.release-series} - [v7.0.0](self-hosted/self-hosted-v7.0.0.md) (April 4, 2022) -v6 +### v6 {.release-series} - [v6.0.0](self-hosted/self-hosted-v6.0.0.md) (March 2, 2022) -v5 +### v5 {.release-series} - [v5.1.0](self-hosted/self-hosted-v5.1.0.md) (January 6, 2022) - [v5.0.0](self-hosted/self-hosted-v5.0.0.md) (December 17, 2021) -v4 +### v4 {.release-series} - [v4.4.0](self-hosted/self-hosted-v4.4.0.md) (October 12, 2021) - [v4.3.0](self-hosted/self-hosted-v4.3.0.md) (September 16, 2021) @@ -198,7 +199,7 @@ v4 - [v4.0.1](self-hosted/self-hosted-v4.0.1.md) (June 2, 2021) - [v4.0.0](self-hosted/self-hosted-v4.0.0.md) (May 18, 2021) -v3 +### v3 {.release-series} - [v3.5.1](self-hosted/self-hosted-v3.5.1.md) (June 1, 2021) - [v3.5.0](self-hosted/self-hosted-v3.5.0.md) (March 31, 2021) @@ -208,7 +209,7 @@ v3 - [v3.1.0](self-hosted/self-hosted-v3.1.0.md) (December 10, 2020) - [v3.0.0](self-hosted/self-hosted-v3.0.0.md) (November 2, 2020) -v2 +### v2 {.release-series} - [v2.2.1](self-hosted/self-hosted-v2.2.1.md) (October 22, 2020) - [v2.2.0](self-hosted/self-hosted-v2.2.0.md) (October 8, 2020) @@ -216,7 +217,7 @@ v2 - [v2.1.0](self-hosted/self-hosted-v2.1.0.md) (September 16, 2020) - [v2.0.0](self-hosted/self-hosted-v2.0.0.md) (August 18, 2020) -v1 +### v1 {.release-series} - [v1.5.0](self-hosted/self-hosted-v1.5.0.md) (July 20, 2020) - [v1.4.0](self-hosted/self-hosted-v1.4.0.md) (June 23, 2020) diff --git a/mkdocs.yml b/mkdocs.yml index 1fc74ce711..e43d004cf4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_name: "Codacy docs" site_description: "Documentation for the Codacy automated code review tool." site_url: "https://docs.codacy.com/" site_author: "support@codacy.com (Codacy Support)" -copyright: "© Codacy - Automated code review" +copyright: "© 2026 Codacy - Automated code review" # Repository information repo_name: "codacy/docs" @@ -12,19 +12,45 @@ repo_url: "https://github.com/codacy/docs" # Theme configuration theme: name: "material" - custom_dir: "submodules/codacy-mkdocs-material/material" - font: false + # A small, plain-CSS theme layer over the installed Material package. + # It deliberately contains no vendored Material source or frontend build tooling. + custom_dir: "theme" + font: + text: "Inter" + code: "Roboto Mono" language: "en" favicon: "assets/images/favicon.ico" palette: - primary: "indigo" - accent: "indigo" + - media: "(prefers-color-scheme: light)" + scheme: "codacy-light" + primary: "custom" + accent: "custom" + toggle: + name: "Switch to dark mode" + - media: "(prefers-color-scheme: dark)" + scheme: "codacy-dark" + primary: "custom" + accent: "custom" + toggle: + name: "Switch to light mode" logo: "assets/images/codacy-docs-logo.svg" - features: [] + features: + - "search.suggest" + - "content.code.copy" + - "content.tabs.link" + - "navigation.instant" + - "navigation.path" extra_css: - - "assets/stylesheets/version-select.css" + - "stylesheets/fonts.css" + - "stylesheets/tokens.css" + - "stylesheets/theme.css" extra_javascript: - "assets/javascripts/version-select.js" + - "assets/javascripts/docs-theme.js" + +# Reserve image space and defer below-the-fold screenshots without a frontend build step. +hooks: + - "theme/hooks/image_metadata.py" # Extra variables # https://github.com/rosscdh/mkdocs-markdownextradata-plugin @@ -35,6 +61,8 @@ extra: user_feedback: "true" community_url: "https://community.codacy.com/" support_email: "support@codacy.com" + # Do not show a generated-by badge in the footer. + generator: false # Add pull request preview banner preview_branch: !ENV [MKDOCS_PREVIEW_BRANCH, false] preview_pull_request: !ENV [MKDOCS_PREVIEW_PULL_REQUEST, false] @@ -53,12 +81,17 @@ markdown_extensions: # Add attributes to the generated HTML elements, such as explicit ids for section titles # https://python-markdown.github.io/extensions/attr_list/ - attr_list + # Allow collapsible sections without introducing custom JavaScript + - pymdownx.details # Add syntax highlighting to code blocks # https://facelessuser.github.io/pymdown-extensions/extensions/highlight/ - pymdownx.highlight # Extended syntax for fenced code blocks # https://facelessuser.github.io/pymdown-extensions/extensions/superfences/ - pymdownx.superfences + # Support linked, accessible content tabs using Material's native markup + - pymdownx.tabbed: + alternate_style: true # Strip comments from the generated HTML # https://facelessuser.github.io/pymdown-extensions/extensions/striphtml/ - pymdownx.striphtml @@ -66,13 +99,14 @@ markdown_extensions: # https://python-markdown.github.io/extensions/toc/ - toc: permalink: "#" + title: "On this page" toc_depth: 2 # Plugins plugins: # Built-in plugin to activate the search # https://www.mkdocs.org/user-guide/configuration/#search - - search + - material/search # Exclude files to avoid warnings during the MkDocs build # https://github.com/apenwarr/mkdocs-exclude - exclude: diff --git a/requirements.txt b/requirements.txt index 0ec507ef19..b5d9b9d1c5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ mkdocs==1.6.1 mike==2.1.3 markdown==3.7 -mkdocs-material==8.2.3 +mkdocs-material==9.7.6 Jinja2==3.1.6 # Markdown extensions @@ -17,4 +17,4 @@ mkdocs-macros-plugin==1.2.0 mkdocs-meta-descriptions-plugin==3.0.0 mkdocs-monorepo-plugin==1.1.0 mkdocs-redirects==1.2.1 -mkdocs-rss-plugin==1.15.0 \ No newline at end of file +mkdocs-rss-plugin==1.15.0 diff --git a/theme/404.html b/theme/404.html new file mode 100644 index 0000000000..e506deb72a --- /dev/null +++ b/theme/404.html @@ -0,0 +1,23 @@ +{% extends "main.html" %} + +{% block content %} +
+

404

+

Page not found

+

The page you requested does not exist. If you think something is missing, let us know.

+
+ Browse documentation + +
+
+ +{% endblock %} diff --git a/theme/PROJECT.md b/theme/PROJECT.md new file mode 100644 index 0000000000..2933123832 --- /dev/null +++ b/theme/PROJECT.md @@ -0,0 +1,368 @@ +# Codacy documentation theme + +## Purpose + +Replace the legacy `codacy-mkdocs-material` clone with a professional, +Mintlify-inspired visual layer while keeping the documentation static, free, +and entirely owned by Codacy. + +The visual reference is the previous Codacy Mintlify proof of concept at +`https://codacy.mintlify.io/`. It is a direction for information density, +navigation, typography, and polish—not source code to copy. + +## Architecture decisions + +- Extend the installed `mkdocs-material` package using `theme.custom_dir`. +- Use only plain CSS, Markdown, and the smallest necessary Jinja partials. + No vendored Material source, SCSS compilation, Webpack, Node build step, or + copied upstream assets. +- Source colors and elevation from `../ui-components/src/theme/ColorSchemes/`. +- Use Inter for documentation text. +- Use `navigation.instant` with custom scripts bound through Material's + `document$` lifecycle, so dynamic page content reinitializes after every + client-side navigation. +- Do not change `submodules/chart` as part of phase 1. Its content is rendered + by this root site's `mkdocs-monorepo-plugin`; its standalone preview is a + separate, secondary migration. + +## Functionality contract + +The replacement must preserve the existing behavior before shipping: + +- Search, redirects, RSS feeds, metadata generation, content inclusion, + macros, self-hosted version deployment, and all existing MkDocs plugins. +- Cloud/Self-hosted version picker and its route-aware navigation. +- Segment analytics and feedback events, Zendesk, Disqus, edit/source links, + last-modified metadata, preview notices, and Self-hosted `noindex`. +- Responsive navigation, accessible focus states, code-copy controls, dark + mode, and the existing documentation URLs. + +## Delivery sequence + +1. Establish the new visual foundation and move the functionality contract. +2. Browser-test representative Cloud, Self-hosted, preview, search, mobile, + feedback, and version-switcher states. Fix regressions before structural + work. +3. Review information architecture: Cloud/API/CLI, maintained Self-hosted, + and improved release-log sections/tabs. +4. Review the chart's standalone preview and decide whether to consume this + theme as a submodule. +5. Remove obsolete theme processes and update contributor/runbook docs. + +## Continuation checklist + +At the start of every scheduled continuation: + +1. Read this file and `git status`; do not overwrite unrelated local work. +2. Run `mkdocs build --strict` and record new warnings separately from the + known content-link warnings. +3. Validate a representative page in a browser before claiming visual work. +4. Keep each change small, testable, and documented here when it changes an + architectural decision or the next priority. + +## Current state — 2026-07-10 + +- A fresh theme layer now exists in this directory. It has no frontend build + tooling and only overrides the header plus Codacy-specific integrations. +- `mkdocs.yml` points to this layer, uses product design-system tokens and + Inter, and enables native Material capabilities for search, code copying, + navigation path, and linked tabs. +- Strict build passes after migrating Segment, Zendesk, Disqus, feedback, + notices, source links, and revision dates. Existing content-link warnings + remain unchanged. +- The original Material-like shell was discarded after user review. The + replacement follows the measured Aikido/Mintlify pattern: 16px base type, + 36px H1, a narrow reading column, centered desktop search, quiet sidebars, + and a plain TOC rail. +- The static header now owns the version `` was floating mid-right by the + search box. Header grid is now `auto 1fr minmax(15rem,30rem) 1fr auto auto` + with the version selector on `grid-column: 5` and the palette on `6`, so the + version picker sits directly next to the theme toggle (measured 5px gap) while + search stays centered. Mobile resets both to `grid-column: auto` so the 6-col + desktop grid doesn't leak into the narrow header (verified intact at 375px). + (c) Type sizes — breadcrumb (`.md-path`, previously unstyled Material 11.2px), + TOC title (12px), and TOC links (12.48px) are now all `.8125rem` (13px), + matching the ~13px norm used by Mintlify/Docusaurus for secondary text. + Desktop, mobile, and strict build all verified. +- Loop pass 3 (2026-07-11): table legibility. Normal prose tables rendered at + Material's default 10.24px, small versus Mintlify's ~13px. Bumped + `table:not([class]):not([style])` to `.8125rem` (13px) with airier + `.6rem .9rem` cells and a header bottom border. The `:not([style])` scope + leaves inline-styled tables — notably the wide supported-languages matrix, + which carries `style="font-size:.5rem"` to fit ~10 columns — untouched (and an + inline style would win over the rule anyway). Verified live: the 2-column + "Docker images of supported tools" table is now 13px with 9.6/14.4px cell + padding while the matrix stays 8px/compact; strict build passes. +- Loop pass 4 (2026-07-11): dark-mode verification + two small Mintlify touches. + Verified dark mode across content, code, callouts, and the restyled tables — + all tokens resolve with good contrast (e.g. dark table th bg #11151D, text + #F9FAFB, border #344056); no dark-only override layer needed. Added + `html { scroll-behavior: smooth }` with a `prefers-reduced-motion` guard so + anchor/TOC/deep-link jumps glide (pairs with the pass-1 scroll-padding fix), + and gave inline code a hairline border via `.md-typeset :not(pre) > code` + (scoped so block code inside `pre` is untouched — verified: inline border + 1px/#344056, block code 0px, both fonts unchanged at 13.6px) plus + `.md-typeset a code { color: inherit }` so code inside links takes the link + color. Verified live in light and dark; strict build passes. +- Loop pass 5 (2026-07-11): framed screenshots, a strong Mintlify signature that + was missing (content images had no border/radius/shadow). Added a JS pass in + `docs/assets/javascripts/docs-theme.js` that tags an image `.docs-image` only + when it stands alone in an empty-text paragraph (one ``, no sibling text) + and its `naturalWidth >= 280px`; the class adds a `1px` border, `.5rem` radius, + and soft `--docs-shadow-1`. Note the content root is `article.md-typeset` + (the article *is* `.md-typeset`), so the selector is `.md-typeset img`, not + `.md-typeset article img`. The empty-paragraph + size guards leave inline + badges, emoji, and `.tc-icon` card icons untouched. Verified live: three + screenshots (705/1172/1240px) framed on the organizations page; on the badge + page the 825px and 1280px screenshots framed while a 260px badge-like image + was correctly left unframed. JS syntax check and strict build pass. diff --git a/theme/assets/fonts/OFL.txt b/theme/assets/fonts/OFL.txt new file mode 100644 index 0000000000..8a34a59c08 --- /dev/null +++ b/theme/assets/fonts/OFL.txt @@ -0,0 +1,94 @@ +Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) +Copyright 2015 The Roboto Mono Project Authors (https://github.com/googlefonts/robotomono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created using +the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/theme/assets/fonts/inter-latin-ext.woff2 b/theme/assets/fonts/inter-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..57da6f8d46e2e42d0fd7d8b1d69d39b3b5fda6d4 GIT binary patch literal 85272 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

uw6FG`p z$=_5_zJ!7tF)=^&J+k=(BGf5m%%bU&Sj0|9jL+a>=5YGJI;PEP^duJ(2M**DM4mvF z^6M?YdU$0})+1yed_W9eePZy@_%+_#@Ldwy3e;iPPJTC^XTQW2dP6h;Rpg*E`lU!n;&3V~&8Qu7{GT@#}GFigxcw zrapgrPrM<2gGr_O1LMY66*GcQtu8q{*{_6UOOkGAjioc|Q@a4#rG+Awf@w?v`U{f zk&&e+7-M1~PSa8U#vW%z5U)gWz`vJjTDy96*$hoaBeY+f~6u1;$P=Ux0DwS4UL_H@8D@-!c2;G%$W8?fq zfeJkccj65-sEl{kM}P7>t?4J@&3pV)^f@@9-V>DT_P8FmOli!Hv%J&pQKGv=fw_oO z-(~UZ)y`_Hsg(A$dz^fy7N1zBH=M5Zn!YIAQL+fv`$bEUQ{*{iCXYk!k^_=fKSXb!D3bWW`0_nd@t zmW8sY#UbwJrXYnYoCRqbhuGzCr6^@dB2kTLQp5yEC+`@JpzHl|*Xv}(j9A@4^zw%W zE$X{vx3?b;2c<9s0f(Rw4l<&o@OmCeRfte`!7!Cdml~xW(v_kd{7S8uN-fpVzH21L zgp?v}Q)ZtEUmls00Cy<OzT< zhXFJ>wF$^r=M~o&h(PP^+o~rfC(m)Rq*xb{khJ)~vS-IG!Gp#8_PcvmK+p(IU|s{I zoc{f*XotUHa*>YTyl^OsSu{7{O_>X^{foR>W^QztDH;6F$(Ur_vG)cBv%B2)KMv9o z37Gc>{Fpm)o_B6Lm^YLI{<)^RO4u$hF1!=PEbu}=5o`K0SKm!VyLX`z$z4&YJrC z$hpYQ)WEyypo^J-b8ce+tCs^Xy_4X=6a3IQ$%SXl%xJ@?c;L~KaT%wCdc(|#)sk@K zIY$m%`AuBwB{n|RF=5Q_vh&f1Aj^C=-UNpG$6?@;qud7(GrXQIAtt8ZXAWb2>|Alh z$u5VIfrD9-ixVji#(w15Vzfqi#g2vqnIb-x{$)FU!SKQ$|7JXVv)7MRJaw=)kCnU$ zYW%(T{N&|f9p8_w{kz@Krcm--W7wg@dfK;9Chp@F@0gr^G_zOoJ?!$0;TdJCv z$yStX)|2pZzcfW29M$CZF>#$i{l5QEgP5Ov9vly>N}c$PadZjnv2mpCt+ecW8dH1CML^>qh0Sg4^dX|NXtZcakmN zFH!!>g}kYjE~?ZMwYT-;gP^C>$IPkZmE z@*Zf)6s0YE9y%<|csFYPZ4QS3k^g@AfTOcHhhJL5*j9^wkCQZz_AM!$J>J0%UaR(V zG75j`-u9NLzD0Fu?T3zbY9E2l%b78$3#3|{VSYfYYR{$Bxl;_DJFq!Rm= zkhNupX?XiUmg~1BFnoAg8auJs>^rm0^AofXvDvu32gDsY6r~q-xP`Nu%6?(b_XJ&{ zul~tV?+p@07Pd4th(X+wfewY0x zo1@>0oi9s<6^W6qI?;};zI`X_qSXvi0K z8_|rOJlA(kzZeItetMU20>{5OiGO($iQgP|f((GQx>FL2+&z;Ll2;v`WwWupVb<(_ zuT9}5vqi53$XT?uE!8Y1w^s1Bxt_K9!yH4IU1P@vw1DXAvhgDX@d~*lBwi&!M3AJn z|2^Ha>kZ*?qNh#Y)rY~U*?ii?4mCef-+e4oOFV`3yAG@9If&6+2P~4YymxmX+|8vb z#ia#T7cDF`n9;n2M$#m?(lR;vK&rjy+Olu$q=OnQ-4wgbB}HDt(RLKQ%I@FtiN%y3 zyUIJ_{QOn}e!G1A#y6{)N4`F`(ducf&8H=dm6t~|W#dY(gVCyGkEq?alMr2_=Buwk zF}`H`7IjrQRqw$I(zx>*naRqV)=*f2N1w5`8XR!gS^Hqsq||J-xGHj&o2ai#uja}S zHwc*PNfzPZ@0Tgopv#*oiZeLv&O85aQ<4@Tm}+*t0p2^LsK`+;ngZJ05sX=Ba^w(J zds@{HsDiM6N=DYY$&0iokFqN&%8j07PUWrtDbk^=i*i4T$!kue%lC|QhGBsCwsga# z4Rfy#>{-|Xtx9+TxVe%DjY4Y8sX1#*6KL4vsUBu9*b$m;>$BKk;C;{KPCJkVwI!a9 zf4N-2p{$px6}3uj{r>(;L1XRdo!kC1QOi`f-uSgNrE_; z$acQitsz@2?ty&0a}ooY=aj$iiI+CReN)`=!G-Av<(z^ar#jNgS0e+RJj{sJ<}jl8 zU8(>?GNdNO15vtfWlC<7xVHSd5u-%g>ojdA5&TKwH<|K-Ab-xBT>s=c(-(zI;ctnU z7MR|6{YbifuD|B(zGIM25!<(ZHU4G`&&PI~nBJ`+d3XDtMRf1>8%OnF-^le&*bYXV zNCA{)#M0SlG0Tw;J@0`_&eH+!UOQLvLzdl_GI#QWz0m&Hyge@oC|T|BEH4pe6T;Fz052B z1LKwauD=&ZG=d2T$echzpMU^EBU4P8DIApt@_@g_#jy;*-}H+{Bq+Zzluc~rXMz}N zb5?(J0b?s=wRV+49un+XJx);?qje`Y?_s$m$}?~L8vX+$_saf6;_p}iLstW^=nXX5l7U86J>h2UPos=`%_vZ6-7_| zr<&yiVcfkF3DQwD=Ap?MH-O>EuOgch)hBfEY;Oi6xKxt3HjrRV32G3ezN7bHH{ z>1DhiAj1e98+F5puA2*_t=+(#o8OxBQFyRp07$eTIq8^3TYFYO%=WXMt4YpjjJm9d zFR+WQ%@%&>LCrUV<*S75%>D6#ToP*hpZ`{yKO3hI1BpsxHF@NfBMEd3TdJYyV0_Iw z|IspCwbgk)(`pVC+Cm2RX%+Q;kHC2C2ZwtOaGU1DyD+K`XW|XDIH7*mCHSkTuT}H&*=Caa&{-Rk) z0ZJiJ1+%!}08TQ7cG{9ZTFO>jgwhXK%8;`Kof;md;|_2db;x8>ArJNaFI&nQHO$;6 zI;@1Rg{DtoVVFg&K4mOv_3D7mtx2Sta#{1qH9`|D#W%G96{E27q`EUJ{Ut!stCCwdHzUNr^Q zth4#UaDVGa%wtF|_tTRy~axLcmC- zRv0%-@M|~<@?405KjYb5FFJNs12a%_b7rp-;qN~s5NY;}s>dxMD-TcJ-G?BdX zd@p5ufAG-YG3cg3s-^@vS zC+M9_6qqjyBE22;byKc1AQE99V5gX%qQ`CRQV)V*T|7d)9#e#3VRZSJm<(`1M@?S< zk>fqy{o$CcEBm=N9f=a^oD?pK&mt<*;Cb=j_11jtxT${H{BBmrNZ6XP9&lD2KZRae z8nza;d^WMT3Ar=*@=EH^hvtg|{uNP!?IG=aFYMH{vq11;qlJrZL;*8_W4b1XXKxL%l$5JKk6wy z<^K7v!OVc}W8h=2u11iN;7a zjuLW?y*<=wCk{yrg-(`To3Xg{ynOI@|PFORZ;us;Xe=$ z2=~|uV!m$!rBrv{{ov2cv_`rn_3wbT_K2IR^64pMYmq(D;(^{ce#n^ztdv4OFHPGz zUfHwGC`Et;Fa})WCODlOcDH?Q62q|p;k*v;_dZKqUk&R6K(HNM5zMBd4==hcGmF=w z-$zV?i~GNq83q0bP&VD#N5+Sfqu@i{R~;g)f$x$2DR%U6_x{gb7m_&aK7;<)G8A+y zrJs9j`@Hr(G|gx51;6WY@y#BEl|RAz!~MKa_i1*kcyxfTH6-}HZ@c#IxAXdN_ovt%4eg?Dztuq10B!g8 zcG=uoQ>oGhAZtC*Yxc(@&*TGZdjZE^f46PdOo=V{2>gMh9Lg!z7 zYaDfuDTKH8bEF%;$o%Auxi{8>Ol05kobLW>*-5+v(O2MVG`IPU+_&ZPI_hcI%q-C( zDP6`I`5Vzh{)y5H^UEUI_SQx)#f^-iI4$)tY*(KQ;0|AISMJHZr;W^Te@hwn$7lUN zU+|TPt$a;0GW`ob){Bm2EQ|g;sap_xCr2_DU9X?hZp?T}+!7Vt@SeHK{;!q5TMd*p zkM;E`@P?8#hm9{%r!H>!sWRW^_jeEoM;xJXasd7=DPBr@8=foVQcJ^4`1Gv_Nv@5* zsTwiFmr^R)qAe-J>5K#GQeSOjTjZ_zZa5#q)*O<`$?-v#RP~u4|J|5^9DA3*x%EH( z?Lr?CRP-v+vBHK2Eh5+Q@x;gJ|I>zD)w?WSw8zKf34f&j$1XV#`&u^mT5-PLSxxx3bZP?v^K%_e6cmna zmF-h4Dz-h-RZmZapU^^=4D-3(nDUUcI3%^Qwr)Fh>p>UKe_agq zd>Pr(DE)7Y(r;0JJ~g|9O|sU;ZM{5*>ly zZ!)`1JtVN**g8P_l6BjB+9e>r*TUb;qD_6YV}Ad~?fRWv?jzo@)LrVHHS9hAKI=24 zITkIZfF!d?N(oL7-kF0S2$r|}7z4USbn*~PV6Bqp@w47CsZ50@fwSXu53F*x3JCCa z(mUx2z-n5(30P$`N4&M93As(5nMj zF8&FsstQRHXop}(j;!Wo8bDH;6j#zbfsMN+wwSOcmnUgX$|bT9cyka{O4^oGNq|=r zTBZO9H729f?iy3wQ+1&}HjbtW>2jUSL?=7FvFd6|NfvgZr0vQ!NxfDkH^J3bn5`8! zb6w6vyBnd~?Rs?j)2gIoD{#t{QONn3%))Vt7eFyiL7u4DYpsuH?8wCjKn~K7H(r6h zMgA9ROEuIa;h@ybJ}QtjXU@-_v!mh((N8WTypBS_T52rIsIg3jAi_;oC^`n2$O)dv z^?q}k3_)fgy^C%a4y)v>K*CcFA9CjvClLMD*zAf)kORXQ1eeK6Kx4V)Vk*HEkn_hO z#W^A%fC^v0icKma(*Xpv@_PC-vdq~{pT3NY6p~6YDRu+MR}c_n*{q1+)F?3} zCIIp?vE)lg0UpRV5)ed5RyEKeOZ4;OKkprun!iNN0Kl3CaZ}Z}##^JiHOy7&Es|6K z5@tXF4Y zJc;sD_jU9hI&>{epHuq}6!*^O^BYl)6Q@3ePV_v4IqziV0>O*C_d-2ttWzn@*Z_1DwcV7eV zEEUq%X+C9=cb&xJaIZ4aw_cbV$e`Z{+)4(*tRzaKV@KGb!Q=FSP+~WnLKi>D!c@hS zg3k&mweYiIS}E+T_z_br1HXUF^q+DGLxaNuM1(|20;O_cln`tx7nYZW+r){-miKH< z%XGQlm``YjJ#P>I)W<(BH7xbT)@Y+Q@EKunEEYN5vHg zpE(Q$i;0Hg<>QwRO!NZ@64YH^FW%S>cnU|;*$2m$GyCCR#-prjyOCKnUwVbGJ%1IL z6>@;uy`nvdfAwAd%T9lA1P8ZZd06Yj%2i8c7gnrK$UsKdw@ERTvx)gwKVgHG#{5qrIK=CKLZga&AXOTiz49(56RQOZ ziI_^KRJTxcYsJdE@BqO`#gL@_4>Y4VC#JmamrF!IedGmYgu*@e*nyuL7X1N(>AH!s zuIoN5(+-2_wjHT3YYyZjV8G*`$L9x%j1r)?Pcd8ggKXgg94oK@1BaBDoWRV?(A3!6 z;N*c&= zH&{q8Bo;HSk(HbuC?R}tS*RhH$p7gvhJ3<$eq6;irnhl4ls!IU^j4{LlFai_WORfC zRrE-66pxpWC^uUPpJ8o3OIs)q3WZi*;LlUL$8a!a9e%bt)bw7)v z43rp}K%qisho{Hy4=6}zh^WZu2r(&Xf{INYn}TyEoA|FSWORiDQ2K!ZrPS^LI|*<* z`pan|+7$8YVm*z*JIQbSg3Ry752xEZPIleLb*67SZ>6b4V!bwC)Cy{z|DXZF_omv% zmH1fl(IPD87p=-}XwFO~0j&Z-(N=)U=>IJtA?r?aC2d)mgl&DZuj8-~Stjz2zO>K>>4K7Y@j;_w`4l{Qph8V|1BSeP5kr0;`loXa0n;V!Ioh{VJcEja% zb-X-c96+saR}b>VX0cc=8v5^Ch6aWPiwlSpg~((=siIg_tSnj-ERPh3X2aC@Ur2!?_E{Jqq;T~dvqLKGzT(&VAg7cryrZ5p zzsk0W6Mu`eN%B5Kq=xMix@w$npBSKFFhFE18ecaOdCsFbq3VKpM4L<{cj~T)HmbE< zYz(`6HWDr5*WNN$4=}um*wf2D4&eC_0zSME#wC+8HHB=n5jU>2#KB6nC(BNA8p}Tm zU)=+XyibJyb||MTA}B9Mk}S9EsL_rtkQ)p19q%SwXUE7GUzg)-7?^t_!@&ndDy+z0 zTN6bjTO9S?afUVLgK>>VB|lf|m`=(UMxlt8T}6Uu>ln{jZomHb`OW8jE1{fq({!)##RqWcNleAlOws*&C zQ4~p*^?zMmYWIB+_SCAo*P~OVT@s)zA+&`Cd!h!O4cUHjUI$h>+rau;xWZ9h%VuG zaYPf-q|esCRGfn3G>G{vtBnHIYc`1}vjC~uMWHx!5lOWKxNBH3W$)tR$=_sR0RaRI zpwK}?44_02(?(7mJbelz=@O<+p~@wT7Z{k>7+IOw8GLBNNsG|d*xKOY@5FX!RQ1WX5(tIEU@)0X zCK3wG<_?Jfd%bdXTDg2LtCd*PE5K|2trx%Bp>iDTuwS7A{G95t92Y%gLBbYTB*cbz3%*z|A?x|FJaFzCwN(o>TL|IMJ z?g!k}42R;|fj?WzGqA2WcdF|*sPjt?ZNO>H&1jCIA;Z9^kXQ@t<$oD)M`6owBMt4M z%_z{0m1=S*I(VF z_IAi@qFuUUJguMVlticR<=U4YocF$LWrjriS5brVX;m?_HN~O3zIs(V2KYj2E#6v- zgcD)6G((K9M~k-gnlec-(sP>q>aPvfr8Ug|V__Z~4Lj-(|grjf- z8Lsv8nJWyUN8N^08FbapBCa}0<*YitOJ$BzZ&4bPlwMbKB72z?Ub(YTyZRlyF=Ia~6_Y}|6d_jnr}gS7w=5GMkRCvu(QcWujIclN{M#ZY*zTUTVOs$@_ zE32=;T(;YjEj(P1B`eV$K_Q|Vc<6A;qGav!Il*S*Wip$K$ehAOJiiJC%HLE-j~ z`m11Is%i)T+xkC>0gbkiBHh_wIM-@voR&)g8atIj4GvdIU2q|4zSt6_lu|ZYB7+T^ z%)Hc-DsVLD)y*wnYeNWxRcwh;ub}YLG%J;BAIymgdAf!>D%eoNjg5GdOC@+mXSe1E z$nf)R?u!A972T*(ebYcg1<-(?hhcyN1f)2BlrB2~062ol03Z*(gRsC7kOm}303g_p zpT5gjU0=`Fqj^51GZFlP5Ny2n8DZXrFD;R zzkof;{et(XSBrAb+?Bf+x5_w+I^JUJy7RkS)}q2wKRz0*ML}m>)=?znsCqr(+Su$@ zycKsA;l#arQiU$by=_rDi?(sAW?^!CBXqoSkh0OMR*K%VigEyJ-&2{b$SOxmDnn+6 z=FDEMnKl1SOXS09b%w@l8J%5CYSTq(+gM7ox#ZSidZRME)!Vif*V=?@CwttM_NX;2 zmSvDbrcvm6tL44+ZEKLqwqPF!0Ei&~AYg#)3>IZAaD$c54+obOtBAj(hhjnYjCJ{@pyjR2~WcVfCC>S3@_A(e(Vq7fCv7b9Pmbx;fv(L3tGnq zyKoNp%X82RF@ZifA|3FLisTCprU$a2U0{D3;oF?~nBTIlUJehdfGou+n4klR+F|Eb(-N$Dn0ECV;+C8CTj9O#=Y)>(9Z{QXzk_ zU|F4!AzM}sdm5uXdtS@jCjD0BhU_LCN8|$|-~tFC*Y=1q^3-EY7PNv$^|1?Gw`%$& zg0V?zZ6uFVAp8^}SO2bW9>NFg(~t;BY)JyM@<>uiE=!Uflk7Mp2}((^isDjng~E7+ z!3v8wPBk8TEP9;Qym@|zj01TGa#&=R^Of_|bJz14bO-bo^daas$S{dhlZ7%rD)T8b zNd~$cm3fc(Av0#PU~^=%rBkIP?YF{D!d7{m#ec1*DD~pyGojJovyIZ?H%ruhQbV)i zV8;b4@!v!mbrfAub;VL|bfU)G^4R!;sLww4;r83tr1c3It8k+V9YNnOgl%56hQK5j z?ZX*Eb6F1GKP~lnOJpVsg>hWR&NW$k4}4qL0Bv`(A1bJBJR7!uO7Cai2DbX$Lp%Hm zOOv@!D1$?P?wBeg`SkHRpaH>rq-r3NOnw*Rq}E+3#cjVleP|p>(fz-^^tLYYB$I(R zJ?$Wu2Y%28Pb(wymDR7X2FL8^BI{M-J)iv}=)J23KZ$4CXYKE4qQ9p<1O@MUtH51g z0VcZ`z!woPKtO;f0?JYVp8=`z)lebC4in>LRv1HAo}4@X)wW zAXCTyAOZvcu=c8+#|>r+94%m2;VLS_2R`C}c1v?k+Q$PL?yw9(<8S1C(gCL;p#7}J z#NS=5^SNyNRh^)bFO0eFFm2cl#w8qfPA51}NmvY^f`7Up4H{zq@|Tpus}D&CHq2X3 ztF2g)ovAO(kCIaSMJT{Xi^lR}dy@Sd1cJbj*?>kYG6v)lqhy*aS6`1amgzc@tf$m+ z*dx^V83p>NE#YTLLmh}Mg+bor`CZ-3$5{gT}E){I-kjDNGR0n z{;+gEd1fxos!#sD;_uM+mq~s|0P=as7ygx)*MD91gG~}h@q=UW`@#S4`#tw&ll#5z zscS^#Pl5&SWv>Tk*$$yCA!(~}@6oj-zCuL!cSD68m6B3w>ALo`y?0sFIJ|$;U1lY+ zLy3P>i2PyKQm~370!XTWF`8na6=yKUaYj2_Nz`nN!t&qU919{4hI>FwKm}@2QdEPO zw?>p`<)S!FqUHNQCQ8W^mRw18wpOO((Y~nIy-rC7f8SIqSE}dSQaR0x;izXKx1B}U za$0-OZ6@~POdF5?8;Rs`C9}_&)jofk)AziW^6ShBy_)XX4h3|Fg8!uj!k{L?phwD} zAbqI&PxT&$1K{9;Kmiw;r-`QP;YR7@R$9`0G7g&Qi5qJV^IU7VKGvOnPxDJEjZDb7 zx~-V}l#=bjRZVAJ)t<+l$>lO<*stoYGaq}&b{e)cEY#0sHQGKbl*X-3b}9d23Aqv9FJ1&B`M3~ zAbC3p`qFV_O8TEB9Vpmt*S`587gh4%C z9oF>RK81jqd;_N@kI5bjkk*qqa%>vW%nB6n?n#hy3GMrjT95C^D>?U$QM~Dbp|JtTyXl&rM4_}CD)S}a8I-C`_65+-Xjz@)2s)EJMG z`Ls2jBk9*Y9;5l+K^`Ou@IfMHSxgf*5?QK|>3SU1N`-BlM98Jh*tF6)X;zZT76-9V z$}|_XP)L`*a2D`@tDeGVFBfz9ZzU;bIf**gSxxS1G2b}+x{?@sJ?-Rs9;)bZ<*Lt} z7YF({5$5a8pr=2rI-va|lRi)bbZixs7NC8?w4TQZ`rTM%6LQq(DH>T7=$o@ z-r_pfKZ9gg6hcdYPDQkbYiaXJ)Br_aZ9)A8Gb=oSDg>6_06K*SK@T^6hYM#rhnt!` zs6_7QdM*gVgt>sH3ty7T2Hz6BG;t=!Qe+v??m$4*-!;M#%>sZ%UsnW3A~3|BV2!9m zMs1v}12)rf!N40MgMr*wm0C40vm#3}uwG%19U1j4TaA2N%-PvFR>2L*Zks%HJlZi% zR;cO%m69jGrIo`WhINrSZKoK)s$JDS<3#!q2C>R*3j`rGYrzf3x>)^4Q3#en9t8WA znmTf+#JWZHHr@6a@7)VrtRA8-HUBifGxutv^k4GR&{Q&OBwKDhzql7okaRCV2*M?wH zop^x194_e||J!&<2W{N-rnE;5dtXOrE$ox{k z+a(-@Ok6UZ^dq~Zr6%k`f^_zTTWT)!*p46xP22#vizE2> zvPS4q6dy;Ws3F;Mie|%8+rUj>Hf%u6xSe6hhew$3m_BSo#tD21z@Q11_1ztu`7^$2 zDZNzHRFi59&9-$!BOQEZ|L?@?$rbV?>^gX;eNU2U7alk*c~SZCwHX%MwZ&KnQ;OaJ zx;rBiT@wrBwzGP}iUOxf6V45zDal)UWwfnK8-bR`)@MVEWxRmBN@$3p#ilTQ{>4FYBN^@pB%h-6bbaNZmn`x=9Ws@FFlTY2qAbsl7-5)k&9c4>vt#($!+v zcal5}5-SNzL)1Y;DVo{*JEdHRE`q@M%I7VF@5)SSjB3>w_% zvST`u_DIXgG4^Qobph(@aJUdhga#fyiGkaWJE!29vQdHjrdL}|0tNyI#N$xXL#Nq- z4>cOn>6uuowFnJO-`=M)_{o?r8%G70lU$|QJ9}$nxXg=HT8fX)J#&u=0y!niFxqVG zUzlJa)*-R1_~oWTweD~{GK^?38F)9dwQbvK1Pq^Wv-;>kEZj>53>wpO@&`hPnWO?a zzRn}0M|Bl4h}T9l%D^UpWr}OtS1|dsREb+u5f&KuiON)&=K*ezqQ@$*$s^D)=kdDO zzfk=a}F}2!JI! zquqB>HAqk?#mik`s5a^9DZ99uE^a3$?E9vN%KP4BIhl3LkUDcL9(cq3!{%N}nP53{ z4Ym;X%FzhNV6mTzfAcS+`-eiTB@?4?+&5<1oaf2cxUtf50PP$D2bmsEv}hdr1R@x@ z`6;)FZR?$87-9|Pkc5o}kHL_Vs0nF+>S@y=vkIyU0dzG;3yCEz!x~g|Gqv$(no(Kr zd!xnmL$($l5<)aLt;2jISD_ywz;O;HGhr&p*rqnBUg-x;MdZ%TlAhLL8-MdK$Ji); z`B+osFZ^QhsUXRq@!>Ha&(Iv%jsY&c!j1k5IrG8m{JUYSY60|9<1_V|!vyNsaHhBJ z?nz|0qD%_tOy&}VZ&-fuja$qm(#N~(g%6DIF(jcLHwNn)Q8Vdc?=G+Avc1K39y-s+ zrMP+oRAiV)YES_FyARkr5pX0Xi*5`Knjz2lgy!+#E|>ar3C*}!apLN$0gY+RD?>J1 zh|AWhP2w6HxSRf{glSH9VjpgHvV(3fU)Ha9qyY|c*@o~yc`tZ{ixJ#S8MTm$AS2$Sx z3&Z4h&#}Es%Rn>K-=vGbed60Pl;`_GP{joozYar%)mGem#~|_XzBX&d;~s7GjWf;1 zsSH*IgKDjLsGii_4Cg?~MN}Z&k9gq?;Rl_`av}S?!QcwaaV5|}NN7kRv7{JHd1Bg} zZ{QY;($k&sIL(o?+9rOQCY}b+D&-3s;ld;ha9{QB8rYVx6a8Cfd!l?a1lU&1!Kspx zD7;ki1xey3ZLOCc0887Zvn?*86!x+5UeJmS!&{;h%iXfNc7gjdtkY+sy8Gh52nMFU zc(laDrLWTX)KlCIY@u6Hd^uU8GA<+)gbE%?XD!53$wZusQV%rU(;7lNo@&+eE1+E_ zk0vB_UOF5B9N=lweCL!qdn>6o-x}&BZ*$vZ1JV|5UG*f?JVR2V9&e~?hT{{n9{}Rh zvXxk}#9vkO92cZME)fm=(|5JvG*kf_v{VTiZMOIJaP=gSARj4I(KKhp&)yFw&QF!Z z*LE(j*Ie@Ax1?4)XS8uEj(eF=t$26?>?Z{6>`;%@eI%B@yyuTpXqXrMPC3o5%s6{P zZYILR!Y-L&9YRjm{P@w+{&P;yfbm2;2woznX|=9tV620T_Aw{eD(G33YXXBvNpvVB`{k$g=%g>DOnoFcUIjq^;vAn z&JMCnU~Ri{XN44N@SXJ%QK-ZN0A@?w2sDXgo75YVT0C)pbw~M$Np!TzFSXD{-crbv zM%u}i>gQWyp$gCNSmJh|MA#BPrR=j(#ab|hLwO_V9wlr>i*rO)Fq$UGUCRb;FvzWr zCcG*n`aJ(*ZA1K|2sK;S7(vf((?%(?F&6Nlq8;@^6l6S+6yOW30D=yZ{Y%y_(i)r$ zwgq{4mn6kp7XW3K^J$qXjckdN?{~&JTsSK{S5Wvh(EkB{*ShR5o5^J?EP|i* zv&D1UW%(+suhwppx>?vEe5=36PuQ89widm{)9H~YCBEZWO-Q{iGWho`5K;zErzxi z{M_8NfMXLHk7_6+;fr_#!)M+zf?u^S;}a~nBHAA3#6&!k%O-!Y8nq-S?GD>zP&Q4)t4PIWCf0_ zYH^2e3q#9heZw5W4|J4?ql0emdts`9k3bh7gX+7n`0M7rHkp(S*a~MmwDcyGA@kbx ztlrhJ&Egd^_Y&USXl(ZjfI-XuqYiRVW+K4FEov>A&70EYkW`V#VOI)w-C8v)H6QEX zdFkMO%As;uB(y*NPKApMBHnySx%a%5u~p64j`x_j}B7b96#`;LxQ^OtN)htGtM965WTAx)T>|gc#ghvI4y!?Hq)<=w64F zId&{gF*}}>_YI!gX7Y5LifbJK5mfQNb{=>$Qx}T3BRTe&K74zh^=#hLWh+WpolLjZ zAZZP!JOjqV1AHT9xO)ppHlFga`clA-7N|Iu6%WMlYmzS8ZT%Q_>M6e9Dsoe-{ono0 zj-i`saA_kC=Kyu;wCRx`f0Jg=Fd54#yfY2mmrT$BY_aL z-G128auZz{cE1}C_9KxBCEVX|$XzqwI6wRb*x%|du%|Ip5&(eok=E_`aOK|*U;mnFLFyg5Uy z7;~p`N4XEP`pM{YV~5fdHmKYOUwALa&O=IVE5dZ)fR=eN`aT+K-2THs7G$rv*mk+Ta3~*2l@KaD)CPcV%upx$x<&w;pFeC4&Yeq z4Fv)mq^L3AKk`dz~SOKgUiWYGt=sd-R2mevk+hq2FG8LeF7wUc(>;)wsYv310 zEwUojn3!Hy-Q=hS;pmFQFR_;?LJ~lt4=stf`PGICbL1_Hm)K;pfjt4wGLZnK;lWWi z{B%-4iPYgkXb2Z+RiiEsk3O_$!B8 z5r99Cnqf>+v=HKX2(hD$|3-tR;zk2U&>sv@4i4222V)#*SVTRE8Cl^#e&GXD2HAW6 zT~HXn1r1RH5t<<1I)oX*F+EadL{2X1ZX+|*+N1kktV9anQfI0)UPn54HIwn!s*|o7 z?f9<{0kIu2?A;~C4e4wy`ut)=c{!tyL6l)1F=f`~$32`4*C0mG2Lij`+swmaec0~W z!%o+ypuvPKZU8AOh5DG9*e{por@ZoeDUrUVQJCz0WhOPOFhgt_j3fYHf=$LsYMEzT zc@`@l1R)6%DT3TVDcD7q-(95A+EB|A`^-q*gx6l@I?}N=(@6YAGHUmf5SpXoyW%wW zEu)WRQ}?3GwsES(;Yy5-$#IiX>~U&-$wXu@Mzt*!?Ki&KJC|hI2&*6b;z~fvXp@5V|;y3 z86=gJJ&fQxTw^`jZIc^1$Ghs_3)X4{LhEUah(IKVeCtN6)KS&*FycvNmDj!>U%=xL zt&XyROu7G%DBnap0T9LQalp7UylodiB>w^O_woMCTdseA@XqnB?yl-53}Ml0Dvt}F ze~$BCNN#FV_+;O$_pe?u79t0VSPnNHul#>b&%FA&dzQ+bS_vtJH^J(t}2#Lf@zm@n8m?eBH|o2g#3o`ipV*SF%I z`K^~+S0sSe=)cnTjf)?%My((P?c(Z>MqWGk-5))W=@vBPeaxa`_2+Q(sQBp$ymtM) zi~*$_?C-Bi3ZT?=Qjq#7VrU~Gpp2$yZQ%w3bRqWS$f!UXFBf|iq6kF)7qQd`oS%7j z9M1N@KYZk0Rp@YiI_I)Sb3JAwFn4obV4%&yXo>f4eXF`ub$Y5y^**i2zbXMorr<}? zyqXU^QLh{jSpFxNE>pQjqb(22G2A(u^<9#&AL;o@qr(I+RePG)t?8J09l^m{9@THNx#qTD{8|xFlN`yS4~|_U*75hsL9AnfgO?ZK$qJMrybqCA@%(B zsp`74N$H|cLD+P&;;I(x`R|sSjwJ&wwmEgOvz?H}40_seLJoibQGcScy*^F64sC73 z3l(lsj-`~yZ7xi$T)XxKUD2B zRMp)2c%!(x&vf3t&t5ino=}W;ecj~ihWdn*PWEoqlkGl@xhFc(nUF{RjN>T>g)?_; zm7Kr)b(mOs)L|2VIIPKH{<;Rg?VB-AjgRm*?-BjDG*Ys|~I)g1a+t!%mrhObEzk{JWD;1~;Ma~>@3wmz7HbL;R(LJ%@ zhkYW|8WkvedH3~=`cI4b(39j^*%H1qdN)q(yfVWsT>K+SW0!7eGjO-=UzNcy7g$rE zm+8f)?I(KRA3rF`{@T=;s(Z9D)u|cs8e2uXU(HTWm8pD>7o}bl;)Y59w7m)Jx{o zU`gf?c$8)em0)KOnZlNwkl^+G=?loENq$-Nt=H+Cfz@>KniBq;U*>3Km7IeJG2`iS zuo;dROqk{zq{K(K^+oktpL4*@Lw%pEWm`oVT(>KplQqq^!@1x{kd9}Vdl5-3mxO*H+W(`(CG4-zwujJvq{6%;4Zww@@LGA+=ATP=aB2ve^qZuU104@je~&qUY~j zpGURmK5k(@O)k6ER8h9@G@Jc{>?6B_Nv`bRvCr~^7TefAV)1$tAHZ2BolWa{4L}@h zcNYLgS(u3rmgN60Ho-CJ2-tgi7u_AaNq;!WoV}k{rE3e$_wEu%xxKVcPGIVJwsihi zznFR9CDmH?-;(=Nm$8V2i-|?m7i0+wrpr_JCG)A2YXK33?%UAz3lJMDLVrBSyyOnq z6yR_QbRepNxMa#lo#$=$iyShO>Vz2vggxk% z!tH+hApH+?*Le`Xs38mK+mOlI&tKd80)}}D##PHtwki!6#hrXxzs^p-#eR7wdf)m0 z$ceF`dZJQ}y?@VrA1+^(F8)8#c8d{mDDGYN`@3Kv-Bu9dd&-4PInil?AM985N9T$* zy$V58aulZYeVgabq166_Y-)m)Hkc9^`|+dsht^79|C6YgsGhqI+GqV8Qdtcgu9v?> z+6X-1P)S#7%9IMMw3;GC+yxHnm?<(hv9i^^{n>6$O>4RbO$?b(jMwVYuCZ78W1o+) z2kw1AV;`g21ya|%tJ-IH4RS= zSvlmO@syo`!n55b)DZZDYjsepZNp)=WF4POt)=tk$e!lPUB=YjDr$p`LAx zp%iYsZ;Uw)s61yESsoG2_HYEe%&EZm0Zumm2VopYN(_piV|TV$)d2P1M4io0KDkQ4`p3Y6~D z$y(6NQlHHV0`5k47Dm^l^SM@ALb%ijD@@db)R~|FoVdUeZ7e5%sfo7ejB9=i|SX6tvpQ z;!;X7*UY~YQn`MstHL!xT|d2DJ7MZY@J5Mn2{rKp$^Ek18wu3B;#-D(v?-)=CYLTf z)*l4lF#55`nXsRn9sXDNorXrVZg8gpu#R|sJ9^u9|3I#fL9bhSY6rw&uDM4>T12@Bh>Mh zN2AkOZcY8w?=q&>lVTe^9$`pMPxy5|%M}KO$qH+=+@ghqiiK^N*HQu{ zmUNPI0F1oSLX8+7LL{|JHdb9a%)3y@BHdiZ0~hp@Bj-#bLwm7s>F)IXAMR9|bXsTU zx+cMBMAPIabA)2Hf2{V6q&#Oyg1F(nI67WQLze>}E~Bs9WOr)d@S<9=lE>AuzO3jW}|6ba9C&JUYk6|^)P&=DK zsA?u85Q|Tc8L?($*_HNvhwuf*{D({(&;{^6uRJ^l$1u*GcUo8ZkF%f=@3NBC zs+Ez`LBZKaUz@iS5utk)Hge5Q_V|hY4Dg6)AW~K~=lN9+ozgE13*;E8hEOqzGaSUZ zrhhg*7FO$GDP}}&G2z{jU-PV0hAPX)*@brj*J4?HWms*rD8{tjAU3WqRM}m5{zLkZ z0SQlI>#K(kUTSnvO|=&MhyK$FqOBiDqSl$V{xxhAFq9Dq~Mg@-pWspXn=Cdil^>a=13=ElW0T(?iIK z@BUjVV8Q;}xSO*pLM1}UF)HfKu8To1DqpyzLeM4kBez?AAF=ic``8Z>-ng@DXH0Mf zGahxQ&)@jasguP!6T+>4`%EF$=i!2RDeSv6VSF5Z3M^fd4SC)f3M6d`89acKfV4kjfQL$73Sq`gpc zf-k{ws|T<-VkAU2-r5c}AbT4Ht@oSG-wnggAUG)=KSzZ9;qx6*fc-1lrrb$wYLMdR z(VXvA%z8AToO%n0 zEK)?~#YX<}Z{$A;X3`5d{6Zg?{GRimT!h9){4#*-{v|RtR~gwy6nq0F!O0KqEjBjX z!+fGd6m~62BCXT){d3RU`O(>f8|%jKy`P+lCY3adUW%y5t4}sG`t>I}Qrht61AHjd zwua7g1tu;f7>b*DsTG|nXfBh=K6u?xWLYmHB2E1_!V7Fu*i=UteI^lWRG8JxVjqN% ztOz-4yDz~N<|SK3o{9q7HX!WWS#T2`9{&qrk2$Mvh^w5F-%tKG8h(=zT{X+0xl2dw zNYDzD?PvUnyh2qbPnSe|BZvF)C{}!Xf_3Gc;XYEocSMsDN4>4jfD?{k2ieqIe3yz~ zXb|WZt;B8zt*$k1qU)(B+^8bQJuJ2AvP}vRk`ef3ajMBAHv^_>a11S7)EMyz$j1^6 z5I8Zz6FwT2o>p-!_@-@b{3b0I&JPp^t5$=PkN339oHeKF-%~kd{xDeE-Ao3MA3hd~ z^r2G^VAh{_h9-P9%`OwABq{JG*LkNew62V-#2&!<0)RacHu-{Iq$KYxRbHzXlctJ_ z&iG?T?|Vj@GAXKlP3ZNy3g(5u^i-539!t$irX$3IiV!iiNh8RIaoe#WT}Jnf!_jm! zw6HhM6Gx4gSK; zMD)%3(5%v4mBs2NVDUMk@u^nn8P7i*_Plkv?WW-0!8>iQccc{lqc~&s+sM)XWrmio zW+;`J((?b2PnesH9s4QMw|zD3v$fv05ll@yV=LE#Cj{~m&f2%?pFC;+qp_CAGQ>a1 zSNSP3zN+ci@#mlN5So0T|tr=mjQW@SaRq&)YZKGOIT7 zZ?*pmXHmNoPRJ6FxbBRw`Nu%l;GPDnETNxoKse*LBzzZi z{X}*#S_PvZXz!SqJvV)y z(#xQ9RB=sCQR6^)!O{JwP+BepP*$39Ob{buS;9!@XSM=87Gc@?BQsNrv-6?+Y^xO zuruiPnio$<^;5}os{eRJ0eQJIAxY6CIk{pdlE%6Mfn8wJ%@AUrVsErU#F>LtHb&6s z_|yV6oHi&cWhxUh+20S?>PgKVt0!Adl%0mc=*Pg5dUOB%pz_K^6uKr%u$*E*vk6S4 zt+F6YCCA=srTO(Iim0rpHU`o9WQ8T|`eXO1hrxBD=7YK`FX-Oh>#tFY`toj&hx3oE zGgFDhO%OHO(G09xBV#*)6E4Mna1B=`GV2CgpXT8CY-=jLmD||Z;S$S}b$3PDKG!#TY79Q52HO~!KADgYs zz*YC+Eu*y=^BcLM^RnTb%CFZZSypAY`sg|+A8vBLQN+0xQ0AiKjRdG|KV(uZV>3jJx~tE6q@{ByTx!YQdOIP^{3 zW6L|l%Vw1SbINfIsTPm)aZi*fh^C_@$5nqUT7KDJbr8)xSlL$x6yTMydu`Rp`BqgR z(ue3nbrkUhZF50+>RAn3!NT(uGQMW`ILgW);>+loV}RxE!=pD|^~i=A%u=7xY5j^* z($1sG`CpDoMze<2&M_QP1Fkx>tW}x7g%VjYpkJ{KAj^}Q0Qcr-%*P*ya&D8 z@_J{^m^kxYRfv0h;mFv6{@B9NaR5&j{w4pWufluOF`1~^7GgRBz&dUM$g+<70SWVL zQIYYv2gK9u@=uEZbth;4%7Am9nU!^an^LKI8Y?%TLg1R7H!T8Xxux9*%6R8dFI?G@j zY^#PAdIPK@^DW*(UJy4KTTBOv+D%Z`J(^z)J1jJ?5Wto@A4X^zE~u9 zE3~ViP3N+8epJ#Z!SYpy2}szp2H54TAkCJb`y{V#hkJ@!Ik?)QS}_NiLBbT~p^=$H zgfb7nCXN7*gZU}-0%I+jd5^U;P^9pbArw8K7by%56sX)`GqCrrsDxzC!`$f1!fJc8 ze){K{V!~!O76b@@Xk7hjbY#7s=j7D~rI|(v(uyZEi5fQ$BR90SaN_KF1YN(?n(J#S z61U`qfg}95way1)PvKq)Wg@h++70aWMqsa88XV?Ka*{(OlIClZ1?!VRR8go{@zeC* zLjwb2fKvfn2d)4Y^>0TB1-7e|m~Z;WC&nL(+%>!VhBdnD-5;Al77^1Ra635B;@Sdn z$((j=HAijBc(SAWR)Jq1-)>@3prxSFI3$i?H zCi2~rAzA#U^l;&`4ZBL6k9YHA>LR{O%R7lW(vT&Myb>1Q1P7YyMX(lpP`4h(>}v50 zQE6F+z1>!JcjL5zG6*p)Sd50v6{JT%GDB^RoneiuZDL96KE68WW`im@fV8;c31S5B4R2dK_NdX7qYqq}XLAQPrv|`F$ zEdwWeqsTE4sBpKfZj=>~Bg@XOK9HnFNLelUAuc11+12V9qA<`>_7rq$LIsxb?BoiL zP{QE|R9v1w%VY^bfV%q=t~Xg8t!|997lAZeHd2Fiuiy@`3vmPy3c$n2re0Izt+?{2 zC}&(e`8opdkstf$C%yQNXjXV5k?*rTHKi?F}@2;0k)jnK2ez0$cbMo?T)98>L9hNoitqt$@@>;K5Y^Kua9T_TYd}vWDdMCd1!d7-%5nd&7EU7hYuQUwGwK_4xGsLjU=B;ljw4z!XBZ9AIn}l+Q{GxDydm zmpry7A<0ok!j4td1se~liZJ3ib#)DoZ9*D4HeOa5lSz#@8uH8g6#ex5Y8DE?7WbtA zfZ&vfV%CQFGLW zYfOhu#g{qP`u-?0ikcrg36ZWHWEAs?*;BL@nvu`_5X@@b4& z1SS?~;_Ekp3xS4+>anzP+DX|g&KwoR1l3L;=?tupb;2_}>75f+%nIpH(LP_x1Jo!- zd!HU~L?04L(IyfSP<{Y+o19qE0Kw35FxmnpR?K%@NUnHgdjRvVwronr~s?>+W@Jk|mGi`y&*7D#BZXd9L^?*5Z5Lw;is z-}X^P-kl~&-lb>RZ6zJ0s4j+I0|7HVEXIT8Q;lwnMlpUGyp9;8rKl?dZI{US8YnSrdz zd{i-+Mz*>TQC0I*xG`L4HH*fn@E{X-otcr^-99tQ`IOZ^Q@|H)%UVSDB;qNfoh{R) z({dLsVM;r;X++hj=~C4@)zn~0BAQ7p3n4y$V2x|jmDi!fyS5W@_{aCnaI5P;;dx&* zC42Z%L`L04W%Bdo?3!CEx$N?W@4jnWF559QO#?bqe>Ssp&QwRPHOW@uXwxbcr`7L80ASC#9p!@dn_C>w851fJF8%FWv9>bKvgLhEeG$wc1a zY726uda(QFfBi9p7wr0acj+da?@YQ#FZS*S=&&6}k})Il1()oBuaK=*U<$28_ms+H zlK1CJ>cm3$lF|(=rBPl!rb#G}#MHZNYk0l9~CH%_!_a0BiZ~i9wykZ<)1SF2AE7_S60UZUV^iyvp}D z1rhAyNDUv;!i#yP-}t6+US=H+3bj^iq0?M=+z!yd`#4_1&ur$ypY1bVGR}k7aiA&k zGD2?gK?gvaUk2WU2f&-4N~=CSXSQQ;;$4gm^-wv?e+shO#oR2 z@$30Ur#IBxhkPmb>PBi)SmTD8_pF4^x%e+?WX4ExmciqmrAmw>6V!Un1Y>;2Hty81 z7`aj=(TIcR@X8~R==pl#P}dI}FP`@UD?BGG!_03);&yi=7znjerAR(>3_QQ$obAx1 z%*XKsdlyL9lH%G12=;z!&*ofCbDMTE>RSCOy`E>@swoQ(QtBal``8oK4nS{<1@*g$jc(Z|!UsI6@mEZa>=gwH?_g zj-QYxO2#J=koqxIaUBuOq_YG}1WLeU!4vSfXy8yNwvhmprtCjIgcx4m zvIi}8;?3P}FbWk1he%3y>f|lxx>DcGihTTy?o6zL+J7)m;+8rOcg00h>{Mg7X|gcq zb?@3Vu19)rEoBLL)yOi@BH5tUq(aVUr@cdjp)?!w3tJ0 zTlbXnYSU3^eLnOzkK)a@O^m8Qil9RTydm;Vt4jESVj^j73zfg{CO_jV?;Q{Q?Y^Lc zJe!fVwiCagl2F!e#yLt;R^r~p?pYya1CAcj_11|2Zx1HPx3%W#_HI2{?#~A-iFBnd z@4rsHBI9$5)S7JygW9sVFcFK*O4#jX8Dz~_D^6D{s9&}`LQ!# zH>C9z7OJgLW|0PPp}mt=yX_E>LtbcAHrm*9N|U=aVKzB#=X=Yg`bX?Sg+9BslFxru zftON(5dF0Yc^%VSB5B4`0$(9}V!nQhCk7tWvVVl$({)Ju$;FjLCIZ-F^+AWtVM+l? zzcCkYs#d)m1F%5s%|abdoQv}I-r2_)?lXk~iSZK?aY$Kb6DH({aubL|`Ghq7wD2fG zKxfe}t#pZBO9z4swSFFFTU?Q@F()S*N2B>OHdkxtM%B87i^<830B?DiaEF6mq)F@k zp!TDGEdz9BA_NJ!3{)9~NwIfhlI3UeN;z+szfU0@|GuRy8b#&hra&o$jtE@SnKZva zdaHA8RM7HhJe*3i={q$rt)qHzPq=_3&#v+QFy!jZ^Wj}KApj9oD9q8mwTjX)y$E6R1o)oJZ^N)A+XTI+S?8-y-Gqg@qIG2 zT2eneE>IDq&5A_=6vrGlV$OlwXo!vz3-0FAi=eqo{9~o(l2e5R&W!y}g;4+)8($w* zAA~=R->XptCH*g*=+o%EAc2;+d`opn>Qd~!W`DU5R|>Y5s7K5zBS~}jQgavI;-kNC z_i;bGvnNei{)0~26l0|PV)N#^fz7t=h~~2mrwI{ z`Jv~%i#`b>KX zV}DfqOSa(24N0&4hmxWxS&T|1M=4HbaB^SDM4!G3r(V4?)<_?J7ufUkWlVZ$Qu%GS za@jsd`t-#;pP#~As7l7R0l_gKxB(U&EcvUVh4nYs0ENHG%Yv8Yv1{Kl@t{j$Gtly#E|y-|#wnsHZx!Y>R^krQqu*9a71UY*oNHcquv&!JrogRd;?N9s_2Bvi_PM{#D-2{y#R(%x zqp^jIPy0sn&<{FgixBk6M#!Iqu}PN`#G`T97jG&2b&dsY0vGKfPN>)rI|HYH%g>8I zT8$YjHg1K`STQzfEg!w6U1$G>j`aC$L4a+aim7# z3!Hk+WF1=;BT9@f)|fz>IBG0gX($Q3(I^xSeWUT>x!-AmH6a;2vVqLnC5_!BvzgT5 z;^CwiU|lXeXb!Wvz^P5-6VYABD_WIDxAdm3k5*D@W|6 zoyD$mdXH*W9>0QN4EiD4A8^o{e~jzl z;H&xR>PA=hj^g(q#T`rKsdhug8h}}+0LY&Guk>yI13>oX2HuV4jS&m76Ywbxx^B_2 z(|1x!Z@+v0CO-J$YD#@}<=#9=dugt8*pgo2t|mNMnqLC^tqU?EnNz#t-ho>d6muS| zi;-AJ!;W}>Ifr=hBsP3K!ce{6PepLNh)HJ=EUZwx{ zfM7-~p)pId4MKVPddGqNhp58xrb1BdNh`@gi9(f0xVZ8(Q=C5g@Bt>0-jPu_ANsRv zpKF{HrjBcfJ(hyI#LKU>%KQ_L>B{g1}34M|_nlG%)IKeo;IGi1)hneEa zaY>;nw6HD*upaI!o|Iyr>*&1MnRlp84$WWgJC1~A*4b*XHv%)4ft9Iro1>&%t zz|uL>)u{x)aIpYn?<)YZIb}YU6tuU*V=Jq6+&8`R79F|K>C~9{{CbOJ{*`ovPPvUL zRdlDtDLwamQHGLlqhXu?D{KSt+}H}-x{dr5_uk}bla$!le)l`Z0WTm8BTo4Wfb9ER z8A_IP9WeqH(&s;*0ChLfh0&UDafo2$m{cDgE{)b!KS6H?FB9E>T!lP^d@a2YL1M29 z%PRUe-&21QtcqZ62aZ8>*iJ>OLIEgtCjwQs@vZ%>xJe)+_7wnGY6FlZK&t5BFn6P( z-7MhKIkcj_IFzeCI&{Yjw@z#B0YH_8;vYD7)$b00xES^ucVg}uteK}r+@#dOP8Oz~ zL>H2uZdd~{DjDh^;7N`y5=g4Ljoy8PO{fB*ol5gBWTfCjRN?W1hLCV1KIe#mRC&{2 z7hn*y*bajDLG2Uu{w79jE;2kOw55mJsb}<(fx_+F;};84c$J;KZ9i|`&+z3Svhf9x zI>58)cHzz=ERtRN%r_aGf(uf8JW7~|r~@w*rY#zi-;vYgNq1zZ48yzz`TF6`My_AD)REhm*JN&*`3(BPH1L7N9` zy9a|kbH4fjPRU*J$ZmMPZ@&DIeQ_vps|UcgSo+=%`-UIcJsKNa?9unD0c!DmTTs2a zxVN9#Jt+1KTABybJ?v)o&OdV-%7A;sD-TLYF=^|5&g%rL+7}*xw6hmE7r|z-q(M?i zY34KoL}PtBuYEvMC8!Rd`2y~OQmwdF^ok*7fa1+EeDvO1eF=L79&l?E`@gAN_eTCB zGaWp)$GsTHiMsE&mdkcsn}_A%cTzB5xDT3>kJc66wT$YS)!wS?Z0clxHLI5|L+w4ya-WD zE*Q#ftI)hXvm;|+tm<)a^8ox#6~d8_gMkZdk1Jy08bnf{D0!fEk&yRtjgX#qb1|>v z`iEz=&rfO*^Ne~@DGS*pkP19{tgv*}D}o5Y&h<{!%Qb(VQ_2dX-j*6TE)&mjdz;8?=>~n>-xcg%8=gvNgvjDU+5hb zU~r#=k;y>~3@SF7kHZxm+sp`bHc^0j(7ay(25-ejE-jr%s$4>;%UY?`Wqc&ya3V27 zec^K;381NeuJNgvozr6w8HnJBY@dK`U~C#q%v!OwUOpIp^ov9%zG7EwAWL9jIe>s+ zMXd@!5V%;bt6MzwXyk>l9S%ERaX8$t6m1S*l;_K$A6qYV)E~A0>@UVy4y+p@2IR^t z1nixcU6Dn+WZqNqB0AJjnv)kY$ti0WK6qS{ihdBxT(Cy%d z-~b;O`gHRPwDAc<<=X@9@Ywlb|NYA49XT+={%kp6Ig8;fz>7-8NV0xeYF^~)l4UO>>Wf}ui?B`%uF+7>S-C5W(I_gx2f6r(<}?Qb68<*~p{zNKY%}1wI9H&9(?Kh_< z!4G{3a{B>N>Qd!#drQ9XgG{I?*@SW!`~kaz01CmD5^4G_zKXTo;R0=o$y#e}NZlwT zy8zPe;e6P|4I@$83#7d0XsM@k5Mf3wD~Rj}2(!)UWsQ;jp7xL4;Gf&)ENYEDyUkY= zt=&Nxb?rJ7`)&fG;{eu0+=}n*n&~nu2ABmm62ok2i%lUYJi_`O<1PhWB!&!`o99OtvHWiLntvfJvf5^MdOU~&c0zRYFVt@r-Q!r`Y-_HpRCj=Sr1531Prs{!jb&v8g= zNSb=w-u)TzHLldvqG@sBK%NFIlQzgT(MFuyyum+j_kfY3t^H|^CqkLZ2+vXHf+7b~ z+8%@Ec$-Z!X}ue_MeoJmvdDbqbnefOIDLq$SNk9ATL3Mc2z1t^+CPbKsEKYcLRmK) z0RQWTP!LzqzP6+~RCQj&6wjnRx;PNrh#}YS!o&|J0kx~`F%wu}ms-nBF}H)4v@^+- z1EAD&lXH(AQ`=1@sHbyjXedlMrA39M+x9WGm!X~1uR1~N!j82-+LC95ePK&?M9F~z zm1Cx{hTIcgMxfD+I3P-ota z3)UF-m0Ljq z+ikU+wAQ>G?9^Y%srm35^%s=65^2E}r{7UiAexDmDTqfwIT^gPEm~_=ZtxNWj_2QT zN|(+IwqdEw5tQd?#%&mbyuoZ~kJ`rPM4AC$7$UXPwV!9p=gf*fd@aKBFU7s%fT%Fe zX#lxHr~T#1TuPZD>X;T9?03NkSvAj0+>fHQjt3q5C0TzjHg4vmOaEH?O^^t}F~I0- zYq9`4xGuIi+76y z2qog)h9e!8+{GQ7H_qmHiY~)?Sfs{$R2`PJT(9YO-dP8zk zf&yK)cfV={xOB(<`p~^`s-%Crr>4R6{QREv8rZ*FY+#?=dc*DHTi@`5%kP2A!CUw7 z)|YuNkJjQA;cI~GjAY%lE|`+@`dtjMKHbi^kk9w?g;8;a<0Zg>d%i1^VZ@9&>~kiHWZJ~x*W5IKAjb$MkS`Ev=Q-ogZnwZ+MdL}MG1pRymE?%=Ufp>#TzL4ICr;G@so_KUcA8Pt zx^hmo51b*|p9+@dNYJsIoKOBgv&@o-+>WU>B5HnAmst1kH7OPS^@oSYAaam7;2#}r zeqd_xw^tWE;Pl^jpM}u&om2bEtcnME7(NXppB4^X^S15?{P*-k6^Rcer`S9T%>AD- zji$|^*1G`Aw|!{cuhMR2%t6MuYO{xhyWYPxHtx(0zWvufKCIrp3wKY={r`vR6|%7< z2CK@St76$ddcSga+Mt7kAFY1j#uE*b)!S$N`u>$CqW#q@dhil`|M+M}XH_f?EmrUQ zYc=R*?{okF>$4A*9TKVDVeA61inI+J`vd?40f;ZT4FCYV00`dFg=umw0m16t>b9NaD=!J>*T<)F7w92 zee~ojDRaBRE-*(qY)e}L^&Xr5N^Kpw$!Y9?)wdte(4h0Sq6OENZ1PpcLfqXxWjjEz z#;h|d#4FAv1#Bq296y=O0tD+2-cF;BSe|sHDN$F-WDv6@U~cn=EPzqx0m%l?lJPMg z>4k}&+g+KRyvY&A5l~0AxJ@8KnuzTIwf^d0#QyeKACG|#)<}@sd+Cg+G8+!u%OMTX z*v<05ebViH+z)jWpfr2u$n3NUaMVu}YjRt!B~>)=W$ZlNAd_&QeqMPxMtvMSJzu&Q z-v-&c-hE6-uW*r<*?Z)Nj&iKe6YaVN0<(dDuzQ7z6a#5fxODHj-@+|T`)m2AdDwdy zv7ygAq_J?{^hpoQhY}7%0?azqu4YS-rui(Iot^91Ses7awsO{m%_4h12ssU>V|tD1 z>%KXPBWg(PuZvQ7J9aiXnx7>=a<=M87kT9N&dL~rbpy9e^kVXS()CO`RDx}f@tyV_ z#yzu)R(q=(e)vWW`FyiQ>9~`Ql!qxFV-zp;ypZqY5M_yE{b;t6j!`Hk?V3HYpV?KD zF*#sf7~ZMM7}KVO5o6XJN8~ecU#`G!jH7qb3AOj~ZauSXB4zi}&}VJQ6s{ElbWF8w znF4UXF`d5kp;@ml+apKs7)$oh4i?cZ5j5!<9Y>M=A!A(4uIP<1L;##MIdPMBD@}`H zk4OzAg`HhIhPX`QpTpC)h?U-4f)!C3*TH52+gpx5m3F`cM?D%r+*=EvLZYyi= zzJ?H1B%{{-2dL|Nn(Q^UE8#3oA$4ght0XmH#DFHxvD2i_pwL6&vBt;Z8G{O{ zj~|MyR#rfNLt_<>VmEb&%aQ&;v>jo^kf5!!8)u@O3~|Af zf=wB5%XdcY;K_czJbjsI4jCvo8@(}u@!m-v)yl7GFG=k2gqeHalIhqzwv2sFM|!+; z1kAeB3h7OhAs;h7A@f!d?7LxSK@w;?`vKXs3E2;wPwcbGF0f(($&!lZ zy%&rr9j&Da`r7TSz6H`bbFXAkcB}aBk>xe4fTd={k1a2OL)_Ri5~i$69S}~>=_~B4 zg7v~)cK7Nfk0*(Y?5DkEdgJzmIo*TyD9yUb`*DqCeO~WHwQ?oBE53hyhn~5ZJ>i?v zj(DZ<>V?+tQ_6aLnzrVH*=_-jnr6NQovdUL-O#%PS`Sc7#U)0(xn;LaMu5*<0| z-^2J%XkQ)Xm?Es~`1e$^%sRMqjrGq>KIzzVV))kL7&p)>rIyS>!2$NZu@@4;!8;23 zq4>|%JGlCV***R*fWHuAzy6I)>CgD%|4k+c6EA~|T$7{D8g|!f-vkl07=#`7Y)*eh za4kVqC|}1mqKyMXY~PnLVv3nh!7SchXo;&z>XMhf`e1&!#P}r z3pBD6li5_z%3LntfG_4tX8I3$zKi9QDm9Y@tjMeuw!S^h8m!yKZPDyTdM(=ENw518 zT;T0K=+l0~Js$CV)X_Lm684D38{=$T4m841$Y-)HgPF^AJ~1WPmE(CikqnNv#^Xl) zXdRo?%9NC`{8d<%3RR*0HQ$&=b9MDYEY#A89xrKnvEd_5i8J6FI9iUI6O*n)qYhiu zcn|Air{PAK?S8v6jkmL7#TqWp>+lXdEpOdiUWV4eVK!gMxA7zVveCxT<)a%$cdkbw zE5^31e|7!G>%U%qc>U@1SJt;~&%+M!P6iR6a3tV#UOUiPXl|H-5Tt|Hh*m z&u+ZFv3=vvCOFO(E5ufDSX?&QIJs={$;soJ1~aKNVD8?uTFL_YO%|0?Y~lH^aN;3K@3I1%-a7Cnt?fZ{ov=rS;9vM z#DQ?)s9*|E6pP;^K^~OD>MnI(nN&b!Rll+;QYDq3=~|+tj{2mY*9XiF1BT2QQ)J$O z9#DcEqELbnK!Jg5)lhw0@2g$?x_Pd7*&J<;wA(GwvTYer6yYIyJcc|}p%q=IKo@pk z1;-J`C>AVY9k#cZtkha;uf6Taj_>xIb2r@s2Rp*CuIy2t>o0h*H+Z|h7#Lwiu!okQ z3XTv9Jpl^7xIXImD!raQUFeOlC!;WRGePT~Z(hxd;AH2&fHJmEhU zao9d*JYd9(`HwFk-5{w*H>pNMJ|uhcQ8JSZlFj65aywewB`1^HS*D(6!Ldp}$yR7>}(PPUUF8sGMJ1j;P^jM9#of;79pm{LfMGMH_-` z0)wDKAQ8NcaT0clG-Ja=PvTO=@5Bd6Hl^Xx29PV$NW{o4$R_2^azcH>UsJL`fuo?2BpDbs5Z13c!pDkIrL5RD*7u%17mN@HrkAh##$rS*lc`_`G!@- z!c6aAUuVM2cg#1k4i#T1UdXzY^=H;69NEILyvg<|St)faoi2To!?%9Qg_OmXP1&~O z?XWeMo0L~ngjU!qTowNk>nbI7dwYf*V}F6<s;%i>PGA2b)$9jEM=A%>mVzHWn{ImnprnkYpjjlEo>Y1QFa8|%AR5W z&57r{#`*4naQAb=xOLp~+&jE2JU^a+*Ul60T6z7vOT6dxdi96v)9c6UZ}7MAgZX{@ z5&jdwHbIzRQ1Dt9DjXDE7On_i3I83|7abHaM6X3(MpVT1;satIu|!-VZV(H^?c!PS zulIu`Gm^(r3u&&@B^5~J(pl-l2Ga)bOc(>Y=njAm+&~0k06=GEaM6PYB9#L=BCF@E z_XF;Q1#rq7Ry80O98{TxMqU`i9H-RYLciEFu^_EF_&eWxZHN7$9s>b5KjVgKO%(X> zE5d>~%xY2>c<82F*(AmC{WD4!lPaZ=@J0BYZeKHg}Do|G7;NBahtEF*n7G)Q z1zDtzMa~FaSAerLfmiumCL`MW(Ftp1+M|~t^BypYBIit!Tx-95!J&-gAV9+84S zd$^-H!LkvN@t9}96|~_*Ju4~HNvJ53nLExR7FZYoTP)UX1FX;^>4LjUgDf*J?xt$J z7ElepfUSVEAZ}H&{%(iphqgm5<~YX8V1Nr%9Yj;1(P{4hK&bsccs&)oUMcK?JsLw4 ze(RM&A!JjRDwX!y#SaU~Rv2+(>2P598Ip=TFJooetsk~A<)K`9EhM; zIf7}?b}ZABAn>Z(IQ&S`Tsf62rr=lkjfqo+_qdnj?S^6Uvk2z37|etbVyG{)XQ zA-)Ut;23o@2dy+t8)XdRY5guMcrfis)V&uxRs=5b-Bcc=d4*0F&|hp)2)4lMny1#J ziFW&vMx#>X`XG&nf@ULOvt$&`gkKyM-JSe8LFOpS5-)PgH#eHS)6C40SddZBgW33_ zb*U{JgQjZ*yI*TfnZj8{@enB&G~=BYe2b&HVDRtLQ4@g* zT~Y}tUMU8MLLM+)Y)8gvyi~d&opz=U72ttli?lNk$a!L+2)Q|GSFEhxM$+8mfcr(S z8d}W`c&>wD(|n9I#xRb@{`sOFT^akgYVe> z;-7~|=I1{d|72!c0;_u8Kl%auQSd# zs%|aOAqSWi=>dl;oa^!ieHl5_rpa7?n6=U6ZUNVWR_#!#%?}L9Xt(L687Qa8gzq|D z<&U@+5K#;x{N4S^`sWny zaasfk8|Mqwy>bFXU;ebAFaDcmi{*#p4kf)_f)@dRXSAg?nXU&H(UBR20jjPQx`vIvPYB!qke0E9B_L9JLMbD&?*c*^<7DSYV};hfrczw&d2W*BNgq1 z&0H*!X;g~+A5*g*Zk4_C{O;#p>Z_rA+X!OE*Z(SZn0WiJ$+cIUzf65`t~R7QC_;4@ zP*N4Sl`&rb?2F#=PV$G%8)chv3N7ff3%6$=?y7X9Oc2lHrl4O{GWgEoCoBhyI%~U$ z?TR~|SVg0CYR`$0hG|IBxAJT)e_9#rJzuCkVA*0e#>c!-#sTYbjLJ3Hzl{^nM)pwl zIV>dD;DboYoYiLN0SmurY>((|fD}1qqUKXzgmJ!#(|aaq!ukwA8?J)~fR5040Qd+M z#MD;>t6C^}!E4zWtVx+U+(7N~L$AWO*W<@Vv4~00u8W1U>oKX>)gq={f0fod{Y8{r zUlsk9pF5-uNm>)fZO;Gb|II%SMhF;OvM@JjAG_EPSc1Mo&O^vp%@~Cs)Er-=&J!}| zZlOpu-B-&`CYX8V(&Qvj7JODVtiTI6M&lWMK2-w^)$ZL^!+9Js^P5b?gpT1Pc({Hu z91T~&mmmN|Ws#dEr;lQ`Cd3d;>Pyco`);2c^sDb6`g1Z>`O)uKG)p=e#G@qPZsoEJ zD*SS9)jYrTAX4|S!?=i}*1mB2zlP0szqj<;TO$F%v5Js1qPLw9!hyv@eO7q9-~xwuk2zS{5@O2}#j_E98U(Pc>H-&fgJ-3TsJ z9tI5mrW=2-`E0LkrE5tsu`%ZV`tlYIri?R{wHsde*?!(x`(;J=h75AknxLUc<($we z$}It(GBW;+6pc`rQ2MX!+*%RR#+g{Wujw=)B2>Bz6G4Z=&YG#7s4oKxal*BPpp{Lw z?>ST&2RyfE6*`RIj=|co)$$Hf9UGKlU}<;AL7dFht~n6LDILK$1cFElnIH@wc*w`Q z0R-OU9%u|T5(~J&uVfTF+=N1Je!o?~XaeP{UkJYZDC#=YhrbLBZ1abp1mSKYxHTiF z(Rd!*<-C|XI&%7}e^5;!#);j)XdVXN0mptMfbH!yXG@mRXqs#g+SNZPOH1&>cPnmrCAJdKKx9UiO-ev@r`Es2gpb8(UPwYkMY$u%t` zxq;0rqH6+=f(jba zXvSMsMTQ!~#;#2e1}aSJ@e+d&tLR=xs7oT8{pW2VpWp7bs4DZXr@i76`&nbHL5PY9 zkZ@}S58(KF^#`IS9)SS(3#LPK^z@yAhnIIqs5t_Z2=Q*qq3!`;qBl}G{nozfHL%OX zAQbtaiU(03?nMnBE;F!m@{;q@1BIYoCC?;GYWfx=-b79J3dG~ImRPFz60UVkmoi3l zv**M2lph>s)}D(1RCviZ2fl9kFtcE2v7LDnKevbYiE_2uuQo!zI{~&&i&f3ANApg; zI#Thep{FTncgqrsYnNrYhA9-1Lc<`IG-@Rnz6 z3D5^;Sw>l(WDhmEuz?VEsHsFPaO6{tnmtJ`x#1Kzos`>1g{Pcrp$?@g4)7 zfak2<{!|UIxzxg-FTUOIeC?mQurx%<;G38522S@>Mc7>dw_P>s*%}STMy& z=jr3R(S!054+ZhHpaG}1&&S!#9-UZuGBc#OB{)=_j`b!6uJ{e|#b41Teuo0?C?+VA zg0Cimq~jPtxuD`U7(E9xDN7#2vltOkSjPK9W#j(#m@R!p@tsCKUT^n|@k3BJKashSXf#nNJ^c6GpwmPPOQpBQ%tE(# z(N=vd-WD9K_JwyEV}W8axf(^UTtivb*(OIrOBV(t@Gwp^rh~>ItIg>7ZeFW#l#niO zJW|gGbI0%p*c)wahrhVxuWup$TcH1($FNS1a%sY11Aa^;!R1=Mg-XGE9=y<^enB?aH@PN-qVGx)XN|u6Pn1u-Ok62c7v2e z^$R40i})-?pWeP@P%`aiczhU{y&>WP$LFrxg?1M=$>m0i#S{Yb#+hSneJDK+8QUv{ z13L$WjqyQEm&A{fp7QR;`o=<+(|A9!L5OO3&MK?^^R}7tMm?ZXwe1@lFTCGq=~~p9 zb~t2PUYs`?@5aOTuWQNfxU{>N1)mthIC}*%*G_`|M)y$WY`g7~fZaG=*Ac2GY8J&U z8ku^RQzq7Mfpk`jTQ{5b9}nsaJB>SE9(|5PJPxFX77u5O(@l2^UE*%qc_9pCW93fj zq9|x$sI-r_eEqXvz(fl}t}z8-MxW#P8a25~+7}&)EIF&o@2|!X#&p?e0*(0Cf#-3e zF%yF)eL>J0-I7jtiq|+7TVlA~wjPC3$8Z}w6l%vjN}RVn9&^S#zU)+cJnGcKFGGdC z+T^K2jy?}G2Q4T)p)~G|P>y~&EWQr$?$~p{JSc#QBI@&vl!?9CTi1mjg5W_I4tk66 zub$&R=7jp~;5%9{WJ+%CIb-9HHr4$n`=n>JFK+BdRCQW3X9e{6c^K}7P;~hcDT-~7j5Jy!xiP7ZkHF$lkjuIRfq1bQi1n%{j+IpYl49=FFRq?{kAWqxA*W3` zFFBxKLtNIlutyFa!YLFMELDLQ57*)$STQ-4&5y$>WzZ2FcBeSCS2yUz+4^?hfcod` zp$1npTFqW&vousdNx4Nm8BSES=3>s9YxvDUb#N~$Vj@fCg0sV;&Z*vklTKQjI&r`$ zpfco56XsfM_Z?BIgpO`r2UldD)ekRvN&{=qb_{qs>NMsE;2TKETcEv05e!n(X6p{C zEFE@DI>jq>nfleXslsESW~0OLfhjzGo=`i{;9|cs)noS8DP_T>U3hCmqDV1C4C{ii zgNT*VN$Sp%!aSoW8Y*J0Aq}Hi1cR#NHCJecuo1bm+7kzfd~r%;%|-$XO3Jjekst$t z0J|sVo7ZX3mC@L5PVrm@58;gz22>4;tuN#iQ5X5vB-{Sku)huWdIyv8+J3j;mLpj1 zfs1`*Dv;+<)PwfS>IkK0T?FR9Yz^_o5-fb#Bk!rAcSWev;z~U?H7XX7hu)l&DBrzW z)_Ekqbm+GM>;b1ys6E3OTmPPGHmZ6l#~XKv?dG!6-GBSsR_?;Z-fjDY2iI?E?npw* zx`N#1;A8$l_`|g641yjZhebgtUw8$qROk#NM=VT%?1hK&q#(a#A>Wy$YP$Q9(~fo- zAO;(xpAE!7M_4C`h%ggqW{=^C6Wx@pa3*y1?*r62_Vu}A>C3z>Q^i5m?R?!$o!7S8 zj5*sq+MRN^IFx%klC^(+H7_{!czyz%MQU`mo(8~WS79Yf0>HP2KR!1JEsh7hKU;jP z;_=oC!0p(^S*8DTsHxA8f3_8K8XBQmg5{GT>)?|Jz#=08>A{z!7ZcwHPqJalsxmDn zq%WI=13#)Xf%y2E>!p-=aXh;R~>+Z9_=?eQ}T%)p;0pf_Y5JWHxC3Pi7@x^G8M+inUXPjtmjaDIV}5G8D**pxkl@7De0dr;-Z<3QMRS1TpN$NBHk!~ zO+`fFO5>1o1`7o#HjP3v)^UoQP7q@rD1n8hW@+rwLZjcDnL@BWcn1zXoAAb)IHup4 znyI^nS|LaK(bn}ji`uIQ%>|4-)Gur3v_F9`+=bn%UqRUqCBIk}Se#YUHGVyvmI}FpE{3poP8aU+ zQ0zdS=x`~3UCRNmSQUT{8VHLSujH7A_83sz#f8&{O?-KgV^q-rP_Lu4#D6Ws*bH_LglR z2`5HW544}~5Vo-6qahJ9CN`G~N%w+%+7o#A#i7gl8jQ1g+Adf1%4Aro7QyOUd=NTU zI>>#FAwrKd%`(`_zm{@X!Yqf5IJ2Gysu;1^{PF4W$h{+v<_!RAGU{?zjBUg5du!i(A)V?|tCYnSxxZ5BK);5$5Jfhg;sLR7mJ7I;8HB|`EZKEm zs`|Ml8xwn56Q45}nhR2XwF9WPbcp->3lS3JsPmj~GFLf)pnGT-eyQTwtzbA3{awl! z?)30m+Zq@W+^|6?kyxq-1IAhP3GozIh_hsQvuJe53e^tx?{~QALn|CkSu89&d+^?l zV=nh+AZAnzm?%blOrq0=8GraNfS~CX7@(#Wv`>zaOr!1{+6l_@I+rL{!rrvpKL}$T4}u?{4m*hm!iq=2&AZ4pq}X7< zM}v;*6=BXORQ-BaZ*99Mqmg#Eg`s}>AYli|V_U_Gmy+W=9w*m`kpbqI%SD}MR)2#X#ww2TYQ}4sX4_IcL!AX)_pcRpSmCH8^Lh>246X)Gz~vplp=x z3A~+MW^_O-3`*Ik*BOj<^b{+R6GiS3c}IIAYwL$gnl>UC{%3FXO4C;G zc+Gydw6T%IoufN5JeB#*gV9Pr|9HXeW9$ zdAady8g7jIbCJ$&#B3Bu5UE13Etf@Ez#k_)kcbB}KWUg3{n12(^7%H2mtWTZlwn#y zI1A0OUKi!m%@>P(3&3L%{`Wu59G1psJsAy{M7!8cq)(TQmW5*VLgk`Nz?=-zw8WOK za7WOl`CY-u5PAgQ@fkrFFd&f-5erN3&s-1ojABO9SN{3;hXmpk4j7_cw-|*e$)m6p zo;M>8S6sX_?KU_X`pY5eghRD-+n`!Y{70(`dd8&c-^>wGx+#l;Z(2~PC!qfQLkYHR zogm}wFl_VsBjeqe-xEyLH^qV#@#`tm5_M9%6f0z1e0WT`_A(Xzj3PrXciJr`UPqsU z#{EMIV(n?I1yxhyOs0|#JLi!-yDGSbf)GuQ z3|7|Lq8n&fz>&q^Pqcr9T)0g!gLyDg3f9>lAwnAr=8T&iEK@f=j=`{a241iHmd(u z9$Re09;OzWq_BxV94wkI_L&F^$Imhw83EILfeM9Qt&_3bXXhPK_+mqRAunW%uyS&q zMgNpJP_SQL)IK;72u0(Gbm!43`R-}O!#Eg3l9iaFuYm+50%Vx+GJA@Ww9mRRm;A#B zF^;Zat#7U{MC34JC?vv&2c4Mp%2Cw`1RvNKJS(M~zh2?tird*3D`1-9p{-alSBYkt znZ^c~_qxBrx&o``61VQ_M9I(SoHF$Atc2Wk*&TKheaU*=u!EcMbTk?-`C;L7IJwHV zAt~oVb=?5lPakWrR$47zG6q1yFiEo3k^C7EN*lByt(VRn67dOdRe*_;>;2Yl9$gt< z3>UpT7@lMsjLp=dYuOCLR#MYze12s3F3y?v=GD=6qjIh$3Et>}g@ymuoyY?}!CXd} zmRvY1tqOg3)f6>oE$-L0Ci-KnVjuucgyk1ut@@?ihB6<>MvDtXIrVUaj`mT0??Ou3 z8#WB_n0Z-tZjfvF_ZM9(r5Q~08g+?PJQf`zu2tGOGn@DJ9NmT4l zl*i)-v>&E0hv%C_poR6(|Hk9zmN{2zYy12nzqN>-AX0DjA@+RFCO6sEjp3nivk7-z^a{Fzz|D5~E&-^Zx@u|$>fU>(P8y2vzQD(Qs8sgC&grsycSSCnP zRFq1xhpMDjc_pc{JO3(h-LonjZ^k2F&#%bcF*^mA@^l+%zGU?Kry(sy_kIR8jC;dN z566o!2TwQ__s+V*g{6W>K}J_+4`pv_W<@ZGRt6X-Rs;?Sxkk=BnF$P$cOxT20w-4d zZG%SiQFLJ|4myaUUT;bl0@oR9yTs3SpITqc0>@h11}ylXJtUISOsO=D@+sNO;xxJp zt`}u`R>lS3f9NpH0=V}N`Rr9c3KkmXK_Q5sVUnzYyWUVL90tGsV)$~usVR16s#(>e zG3#HBs161v7{Q9IAQp2Cxf6-Ujr+px=mG8qtc-?Np5}T{YeF#2&8SPghqw#U1BFMc z*Q-TBty67a$jV1plRLD&rDoe%pnIRN=nu3&<0JVTGEAGGiX#I<`b3I*tztD4kq z^rR^f#!q74X+-}V;=ZC_h$1vd>rjdqYryzUUrxolD=R1oP7qblZS?I={vgXI^{|P$xSi?sPBOCcx+~N8f zoL!Q#5od9#??71MNp1QU_-+WyvG0KCz(yJj7!o3$By=8BD%P)z+8?ob4AfF+TA>9O z&L$cSZkz7&HhhGE@{GzMu}qZ)zakb*SZw#)95QD77+wNt z=r!hX$Z7fdUM-iK0dRb&5jA0G_ zD)hqFpo5&}oIeW8!&;TgYqb(y`jOY6G(402Z4jeJ*tm!)`>WbQLba;L+`*=!L!^Z; zT@4SwAt-}xBRG3$uhD1kM@FekZ#EkP$_5*!=qCIqyzFNL6{ zkh}Mc)udU1f(gC}^U6g(qhKZ|gAOgYJ)}FgOk$~2h@oP=Mkux#x3NDOfx(ux^OGVS z-05G`?-w1)U{@nM_!{an29^;Wk_D0$p?H$4-UsaOxq$-l@GU>N4|9r?-9`?^L&pfW z0qG8=;gX5P*P8V~pRoh+_EH;8;6sb+^!GkOwHr5pcedX~+jq|0HFO0!mB(){lKeGvb1VlJ|ftEj-@w4~K%5aVsk z!DlxxD6*X_3?Kyj;qlEgzitsSaZ~0|D}W==q+$9=pVqC*8|`pl+}udyksK3k_$p2U zKOG!10}JzZNHuhPQPn8d|W3v>D`<#&Ge7OVeM@3H{HTnx^x#C0z!8?>B_*5&v zirj?&=?+mtxad4Ah7zoxRU;GrpA7zMlydwZCs&4q=qJ7+#qDmD)_z6(t*68>yY!L^ z92q(5A`ua$je_rQEY>I>D4;%!80F5cK9k!oHV&Qu+!*XLXDUCyINY`Jj`NJYzN+k= zlpIiNYl$xm|0z0>VBIRk7(Dy7mFr7-jtWBS}u#? zbAM&Ch-lW4ID}_LEmoBmlQCM(Q!FdINF&Kye~Dc&>lG9;I{02*=s|q)%@Z~emX(fwM6q|fmf@fRd#^Aj=f>w zt=K{b=XdkQ2RSHgVfS3X1!>fjtsOk#B67XloOPs-BG)$8w?nGalS;aAuJKGf6emA; zc$x)KV-Hh3qAk!aCtig4P&G;8JZtTV*EVfHyCh;h4c0w9C*+yq7FvDxzSN~ng-Y-U zvNFWz&Ka}b_J4nG^<{8y(BIpth-AvQTnFjitF;sVNSM?%*6+cv=}^*Xe*+q;t^E3# zJ!`ezaQHzzSH>qc3SB{;dAjSk#3fxGp(l&p#G25oaOjph?E$_xSApw0ochk87`&3~ zEP`RopyY<&Ts0OuO$-e295~_t)`&rPEA}Hq+zJ~$Tb3-Nq7*JE*%N~AgqXqz$<9pF z`C(@vP>;04E#4BQ$0_K9^wqpV)eOZPVGgEb!Ub!*aL zCxl?%bZx|87*dyI^mz9*9?C?nDT9j!B*;AB3OAqm{Dm?h7zLBa)9YAS)h!&Z92elL zPhGxe^akEnksP;?S<`PJ9$*^wIf$AxcV;*~3qc-_LPAh7+F;0X%AAb8L#T5e%@O@h zIahIwV~tSB1o8|>!mM}&Kg>3`Hubq2`YmK|gxVKc9WwULKtn#Dr6iN+e2Z^cu@Nut zCYqT|$m1y#EDQV*&X}><24&`kC)eX}(M`XX1$e8*=hu-yV{s`~WgsO1f(m|>ZA=?G zUZQ{(cs)|^18~|Lcn++~_Hi8H!K2{xvnX>$@cZgLQ6V6rG>U=OhKNAwd>EFOWCwO= zC>HRp_=WO=xrLbb?L>pT$DPi|!Er9C5enZ)A~o-zYHCU1tV4I@^Qhn;m@~FzFj@Y! zlw0B>D<^b!f5BFFnT(~{QN0zTU|kGQc3axfG?fk2zT2N3f=(lLH=TA@Cw3&YU0KZ17NTrT)G^HBh zySO#K5Ik~RfCoP3FR9ox7xLD~@v3}Z0oKT{y2Y|BAx_mXGmGK*b{lA*NYw{w@(Um% zyPKkSy@Vj&a?i8Sd^6Z!@LK?Zwv^R^Oq!LIN-2>jO^wb-WpTLyJHWbpv$#ZNi&Xq} z_Qzm`rs%iew{$fyWXUs7oz420&6P^Jw;NpNqQKPU=x=j*QscO40v1k!;L z6y=6_JD&D-c6O-^L0_bf58;zea5dnQM$uOiu>|%VM!d?Qx)G0C4&&FrQ#7J~5$06f zj|l;8f<%e!v^-|L&R%s1asGxX_V@%d5Bck( z6llbPeoc4L(?Zj2=}6}N$ZALe;6QEEOa#)%d+7!d-H_8+Qw@fg)nc&Nv*O`b zl+fdchtL7eQ!>~(sPaArX?(%>B}2y#Dz-dsn=$C~XF3YXj2ayR_PQQ4 zz^Vd53<6Y%@ToY39a-2@A;Cd144+4vHdFKHaoi_dk=&{; z2h8%0CaElcW>~z-JiK$QlsOHRriP{2q`KuD3^u`=m!D+sQpaOd%w=|_#U>6(^2H{Q z@gvuP#4GHHN^L> z@8xQgKdt*GNL9PQTPB8Em+Mt%_Rx|0sn{I`#xaLB&CmKU9X2VK(^Xx-$Pb@>`$=#N z3{&uY#i+0odbFs#Lapnn#EoY4Jt0>=Yhs{?H&Dej#hXc-QMCY!w^H*na4fq~61U2Q z5x<7q^A{`F;FJqyI`;Z~!66RA^};3xfQ$euK-9m%2ZmWWb@gjklmNqr18p(SuznG~ z>>zQ2!4%!F85)vj4_&-wNK$5H1I?lbD6__gg_sdQM!~rQSB8+*X1;!)d^OdQROixg z+Whe&-#)fI5Du9Sys_eqA>%ks73cgbhdT2!+8e($|D)ksZoG>W84}1hc$zmiG4uEc zuox{2gZN4jy_xK>C_k`AZHI>=RBMPnGF5t#qTUqV6 zEwNUP82;$eqiJ|`+^UP!AqCI%XGVSuUhv1zEzIL>C&iJ;?>((v{!6VvbmfmZg=6%9 zO<+b=8h~3!E^pU2vEjJrX+?C5kl1hK&1QSKo4>!mt2IJDx}^#3O`;O~;kVusQlb=5 zGbEvsxGx{F6o*hRid=z!>ya<#*~(Ll1djto5aYLTkHL;w!o8EZ-3;c;uJR3-Av7-k z78!ma@^5-!eu!FmYA7u)H+fGXe+0u6Jx0ZR_9Dl_U4vt}RfYPYJE(yfmYC*SrW)nu z@N-CatP@@vdW<8sp$dEJTyZ_ve#YlBRJE)vp8mijr)F@<*4X0c9gI;JT?^+qFp_Tw z|Ala`=XW~rqVXMdN~l>POCGdQO3}bHM=+jx0%+WX^{lt*$QWYRl-m%0@c1XM5QFSoMVtQCA6k9pd0Hlo zHeyq!*iPEYogTegx(u4&tk*|OnAKo0%(W}|m-twMgO0;&%nc2ndACh=j{o7!FU1wX zj}^J9!9=TiVz4jvm~nPP?vRvZU691G8Q@$`s?D9-_V3ui!K_i|OIr?Pfx{DM1;2aD ze+0+fj_2}X=rU5HYff5=$(fgPSf)GUSblOYYfD}M1EwJQY!(B;$@+w;wF>DnXiQNT z+%Z+X5b>e9MhO0E6{y0~_vl)7`QnV-jXG=)3aNu$=w5}o zr2h5AzjTyK1wa@zlR+aqxlfi8>cg9>RSK`iDH3yeLaB@|JCn`)nOrIq^aD3j2nEX} z_b{1E5mOR!N`_HPcYCSz?A2?mTLT}{$aS6sZ<5~aA&?=4h5K~J>;`4Lpt>Z zwxkeNR_d20{0VhRjCEUFxYguzB(vwWe=Esy$zL2F7Nhjhckde_p=X#N#C({wLpoFdyplI(vs0|J7{i zZUx=&VF(g)Xo_rjFnmgDm;iOK$uPEUs0sSgdrdW&?N+N*uwec{!zwjfA*hjN+tn#z&XAomR=8Tjwmpqh4Vfyt9eR&zs&{Msi*FiO?@+LP{Q@|6cdj@041? z5ThN-%R2n{rE1z5654n|F>0%puEtGB*3V?!nAPERTel1%MfbQ}+~NlI?)*(DO1Rq8WT9qy1)E>)|86mfCm=FnFvE}r za;^&;UfSnZV4-H$p-&2zSAM%d5zIYSy%=71sb<6LMX63AlP+98GmsF!xcnJ_7~4Ws zsZqi(Hj0!cL(eUqrCRI!Iwky9iPtVkh!$C9NxLbeLNfyNvG2+LImw!f$krd-+Q`C0 zo?ponR^!Etg=k(9eODiY%zabbEK<3~N?_*&FV)NEkNT4H0+CzmZT zZj09cn=#y!$Pw^=>#eS%TWsM-UZp(NYCSnk@k;tCNB2X?ChwTSdxb(N3%)J`xog3C zSsiOa!8%$camnVa*8H`I@nS~B#6h@;<9IC&A)Y;pDbFPStBD}-JQ`pMD(-@rcnM45 zBg}|8upIBz>c)Nfm@NhP-igUrlw|>2cq(IpcpAE%_dLuO@7$;#*ef~4Bum{T_-1f< z3J)wEMP-m{F`e~}3u__IgU{R~*1B@Td1NwV$?b>rZ(;{U72_@EdqF2OK2lP1{Qh7d zV6*1?d?pdm5@l9Ia;HVL9y`jY!{M=lo8YE`D9h6sHS@C!wZpd#`R`NU=kQ7Sv>G6W z*>{|)SYOuW(Av0-lm#v>yd=q7LD;dFK0>-} zUo!0o0g8i!m&>CWwS@ePy#PD!Z-dLfK>4qok{h#K{t5%t+GfjNlce863U>N-s)t1r zZW``tQ}j)^ZFM~vh8q^Z21ti2J#MklukB6dR#Ah!j_#7rD@N#CNi|e)H@1z!|6^*f z*73r%xrtsTkwM$P0vX|YjgGF1auH$LDoLQIrJ33(_wgP^9N&oX1U(pkD?kZ4gZS1! zAuXr2o$X&CL5dQ!q*TitdxA)LshINvlVu?dYV7#!#9l#$9oYniiV%fs>4VR&RR~Zo zfh3LLDFx|}r}IW$jcrB8?14JEORef|_AZVjz>+ao&$F1d#4R|Sp2!4Zp;;$MA-I>r zbPsQfQ=D#!ROKl&G`JD}bfgkE5M5%HAStjUh|Kq^P}IkiFubQ?CRe@-idbmlc3LeK zr${j{>y!@(l%Y*B{aXl3J_ruD2zU@}%9|QS>V{k!7Dp20Znu~yG#DrxOZm;Vx+hpd zM^5=mjaWzIZ$*%-i4L|Q4}Ch*;&Fq7c@#S5JWe{JJ)Us7czo=1cRU|r_J(=)CAGXM zp0F7l$Jg-JYM+*O$Mf*lTniwv-g?CnzW*eKvFsjtFZVqcbA!D;P%+U!Q(8kp&1_Zq zRuLOQ5Eq-#U(&bXvj_S4{7V7+&21?$i`t7OsPExg>97~g+9ciPML6&9MT#%A# z0f2|{D>lDyUFqFZS`T~o*P`>;_#5^H9dFoCY!@kVp;IYNGA;uvi#Q;Wsxpq2U%OEJ znRWU3xrJ?uUiX}L|8g9@^IC|N@okPV66z(R7gFR_4i0WE{tyomu(38D+k|~;uN*56 znL}$rSX-3cPb^(=x;HWB{mQFMMwjlY0dimnOc{GTJC-`HkSkg`-}rwEmvd?)G|cnH zxUR+dMN#7!$f#X*_?cXh>LIzO(@UX1vR-VRY!(;DE+Pv_TV<$(ej9)_J&Tk_=lyAf zC6u97fJTl3Vh8NX#@Svs}&-X=Z-6LMp zBo*Z$K7k38M=&|%^_YHMW8eC(O5hcFMfx%WId;alH5MN*uP&)kU14MkcUh>EC$xvWg63x$8-=P1d_nhD_UJqihrdijEN!RqZ!Z6*%!CUH(%S-vV>|;x0*pu?9#Bm3T zOioN=@O3-Ldjnqzi>M|vPG2bGqO2$tvXhzPS{84dq5X(SYlMVoJg-^88!768spf{h z7D0;as2)`C(Gj+j(pJc~;Z7te;$AOZ6LneO!i8<@mbC5FeG1CH+0MTM?cFbbB$LEU zbG^%OF&NkY&n}s%oFfv|Y#<>I1T6Fg^}A|MmVE>Y02hqsZl(JzzP4Y?@k(9oGO}%w z#z>@V<5TGx#N;!(Y~5s>HlkX+Mzw;_ zmE=n1L$RhaqCve2GX_edf$aYWJ4!4p;d-HoVN-;w(wI%ztzXrPZ(X6v2k+}Ut8GvY z5P&y`-;HGON9g5Uq!F`ilf_KT4Yx+}Iu@PGn5H67h7rB2rc*^2OlBjM99T01ziC8v zI^aP z`AEG*s~9|i$mq(4Oz+{1DW|M4A6uK2K??~PbLE_jbYrky zBd~}?hWkYOpUyJUz-f|ay*-=lY-;?Pxsr|*WsYi69;bCeKlOw+$E8zH+sSIS!0Jg$ z3pfpLm|Q%PX}ElC22y%W)hHivu{rP$7-^-M8=lU{!ggCCv!Rt4aU~%cWGTvxL_-f2@BMS7;jQF)H##J>Cjz`g`qAG zc@82FPl4_bow``}9ZuLf9ZJp9)xSJ!-E;Twg|fKW_qWtIRFxos4XaX_{K#^y9WX~z z&wK-V-bDgNr8s>Hd@;XY$&TDNa4g$BxI~{RvOv45_bNd%T9*E#Ntnkh7f6Zoc~X zo!KHmXFzVj?K)A;Una?Q91u=nyZ)xABXOBr>)N*#-rJRsJ0Z7Bh_J8*1y^?1~}bf$k! z1YR{8fnvyL(`1*B4IBGD19 z&VZn!NlKw878Oj(%LvS5Vv?&wnHr&ez&cH*p_9Ms@ARFtyF?tKO>m9#K&41 zW1w6p!h?ULf8`J?{R|^3bz3ZkZV6;xq0-O_mqvO?N*CtgUJE8S+KcthXqtq)f`4R- zAj}(+*=(VQpnq{~$<*XJ1$Xb+Ab=YalBCqI9NNh%pzEhVydeYLh9$ujNxoa!-A6rr zuT!cG$KL1)^7!r`X=!*n9@8yjf5Pl;1Dl+0Zh14 za(Vrkq@P}yTRp>CnaykqoY|Etr#VcfSmq9 zd~MQe(n@S!$ubxG#cd(!TQC;*Vd@HUS}c1fsYQ|OJyWnf*s+3dmJWy3@za8 zkYSg{i%zje$mxOBp+rgT=5E*ZxATT`239!=1*rTt7Xe|CZ@2RXu0IwH`7TG3zNh#2 z{l0fDF{#e4GKF!8vBYT*i`)sNy;tz>1q?TI-Axi zt!Kh+==6YxuJ2rp2tk4}m>0JTokU^vrWXL^#z}I$&Zv3gYk@w@YgLLWM)?A=3 zpTS2E9-~iSg^gPppFm|KJGJ4sLYV|rsirf$@J+EjZudo1(_AXCl4S5?>hh9;Q45Tt zbbDUDH`!K05u~Uvl50f{^>ZKzg{#_U2Ex1Rk_<#RkW_?CiDnDew)X?Q31XpieqM86q1H@s`6sz zxT8LhU+P7m;pVhd#4!RgUx^^oYngJvZbi;K6AfyhPNy{xjQ{%Bb~zk6E!Y&?%*pXA zXx_~>39^$(31xgD8S2n*F~MSg=h=kK83+d>BogJSB0ttt>?L8Ut8$l*n5RLTrYkz{ z$x2dpC1gm3N?zQ@d&rjMtN<^DSU zT^U%HqJ5wE^C_P~Bq(|=pTm0h!z1t@j#7RugNiAYpZM&Dp|S&kOQUjGRheX!s$9F{ z|IpO?DJ2vh59l9Y_x|s!cGrTN*YP>y0S0lp{{T!-BbztvSH80kNdRb;;RfFxMS*%^ z*uXp3BkZh)1^jPaA&rGWghbd<#qvo!D2I1Oh$yVmZu_k6&8Wnu zQbmYqhMo}|&l~3V|Vu zslX3uQ1-|>cBppzPTp;q)?4lKDfk&96OP*P(SzYJqgKEmLL!XAnN#gR!XN3sj0y0H zA=!1BwvrkTre z$MzKYe8;P2Xr##FsiWquofe%l?lxtrcTtI;6oWCg<26@pfuzye4|fR0nDAyPqsRTT zlr4!h%08Wx1!OsbdMCQolj>U)o%l=+rgSkIS^9n-V^n zgb`0PRegSp)Djbx1C9z7BuR>k=f#r`ui{AweO^m^ar6iGv5t>RyjSzOnDP*_fQNDD z)(G2b;)3PHOR0*$r^Jpzpd_#rjSl#NoT=`pz1XQRT{#km!UYbe({uR;9)nF?;Frt1 zI32Rs9ukUsSi17_*Fu_i&WGF=p3_8Ss~!JynT?sR4f&=;y()lsXJIU7Fw+E z-{@DhTN$CO!v(2^`%0bKtRj(>kJ)v7B~3g+UrmI27$V}HNNTY#<-%6>SXa`r{m6qC z;yCkI8#d;pcW}hpE;wP=5;r=kZ;c`qss9XdR^gB>I2T>4CT@~y6!5w$X(*)$6|n~X z?6gy__s~bnyRyEmB!dk)V!?8QW+hHGU&{t`2No*&Jh!5hm-8vX`TZV>m7s7Q#hIa^ zIFB1m2S${ONS*?GnkdZWmZ{`+FDH16N$HqB_@sz_nVodiWcT916dVy;> zQe^-2AqJlWZ@~G*O42+NjSwgv4se{^(mH$Rtchd>Tp`X%Ijuqt0&U8DQn5ljaAg`s z@4Wf0iDNAiy3B_vGeCuEWg&QrB;>ypr*wl-(XvbVkXrY-t8%Ep67}mv#|8qH8+z?J zMk}~*-eM_CT_k~SV>FG~k=;QR|jL}4(y`7007JqvBvjW2HPEOxZ6Q;SY$)2Cc{Qh|N zMqr^@CFZhlvAB7mq4K7hk8B?YMXPOBS1mO9wWmP%Kw{WRHx5T09|3COHxLs|>Mw_sbsHEgzV!!s(4#tp<3%ITn7>#2@rohD@S~ za4qOIwgEzp-!LE%S3FkLzl1Pcs-Ww|LgP&S6E?r5tb9|v5|&%!Rj4OPvg)zadIND1 zvivUX4L7v9%@RJjf-MhOtu_g&d@WdZ3`RNq z|EDD0P&n3<@ISFwLe+C7Xpt44t49f+dQjQCZUj-K#!lVDU7$V`A@7@E4{+*ePmrJk zcKf}z7Ysg9*1LqHa(6kCE+;MFB{T?{mXZ|t;PA_%NSl~Q{thu0t?{D_WbG#v5I6_d zDvg=%0+Y$6lf17TGgcf};HE-(?e;0a^Xhos?xG^DS93UQmTSmgH5*DN@+NR&`)y&4 znHQT`Y}|kdrP-_&Cy29>l%DJZ&jlqmB*RZ!#l$31O*m6rW}Z2jOW@FYnTTqoVSJuM zwnm5F@*BR6xcxp6MiKtDvnCMmxW*7pUfv&py{0j}(<4!^p=_^b7Mq%RPPFcv!y!Z^ zvDwX-<-%zbCymkN+9Cbjb)HVn;pR(q;*nH=mT>m;W$Rooqu|2quOu^40d>^;2z?{0r=_Lv=O_Y+fC`4vw3s(bDQs+{+q_hziXw zh#f8a^U)Qy)ia~yp{x5Cp-)g=ukRR8trx zOX~6FZQn|hh?N?{<7FEelP==ikHW9HCT~FTM}?#{t?PNp2MVvt`Z7Z&s9hmP?C9`@UHo)1ePD3I_1v#DbCo^|-k!QfqOPvQ6^A za!u{ePtf!}mz ztnw4nR>cN+97r7WCdmZ0??(j=P3H9oDjdi)D)F>FH80h|W&P)d#Ny^LtQ@#GtE?@6 zFpUx{*shNwVB_PGOanP0SXTffRE*I$;P7Vph3b{58WhFrzJ!gb+BplVN(plU%oCbJVQeTE#|qCrRs|n(IMlqz&ln&aRPv(o zMl;^lJZ>~mt|}dDJ0v0d>oV$HIw#d0YQ{{kL-re?mJ+jb{U_Hf-~2EzxzM1Bpd*le zA}}Np_!^57=0H3XU${h3rXE%kv0bZ&uOItYAo&8WoD0n82yXUVo6l9`v+;-wdZu}F z>f6)eCyGD$?2g*kA0EZc=gme-PIL>9>n#+zS)45^`!=S+VPWfh zCC;%OOkljrjN=|zYxUqfIKi^u!%NR}+t+6YfIWyqT#q}^Vj3$9LHnsCny_Caz>w%o z6=GYZ@lMBgWA$<(E*ItCvyOutsN7BBycq5RRPoc^Mkd0?CNA&yqcG9}tnFbD4kd67 z8_uxYP^XF4p;F@8ME}tVONT8IHH)F6wYbq5%#w`jMb7tcaET80*^a!KdY2IMySN(0 z2S3yeT-eW2fVNVMqfgt87M`*m0ZgwnwZ0h}lUp=i%dEA>Ih~vNSK$N~u<W%!KE zq;SXqU+&QK(%nbO=#~G?o%BsVtsWj)11KBE?Of6jT|ohdOvi`n?K4=2@Fj-i9-byo z9HS`lT@(HhjP|Inet2{egX!Vx=u_4+`uipbjTfP7 zE@{=az-DVEXe>=xAcek5C?r#o*H>u2pob4(pIT%sxp0_m*r4%~Sl+Xz(v`*pOYwEQ z{a=acSS}(Olu9ulfsN7ahLp4Yw%tynMNH&|-7gp(p7eAnCqOBgoIF;HE$x28Fe^6* zlaCWcb`b(k7~A~yEwA@?%qr$r4EHOL`g@}nR!k&jP!uhmpfZ-FeU(`;&|%`6#Mg*V zAj3>IC?;a!LVB=(9NDzC;wUQxwZzb~ed-}?5M2py@L_ni+t(mLQA#KTMRA2};NX%L zry1gTNCz1p#yC>cNrkDl-Q`1EIhRaslq73rcs5aHTFNYb1u;1tCl5NCp>=$`n#R%C zlr0UCz#JMv&{FijT4W{*phk)`KxKM->~+{~pY%+>uZ0ugP_Et)+Mi<*IOa8cfvxMh z*KW}h9@r|Q6JC=$J@JtH{Pe$))zjf<6w}612;xJp`;xJ^KkPBN%zw{&!{)=hISwd% zgmpEMPHqL$7Wy~_TCh)+ZHMxT)5FWjr5M~Hc6xQ$+8mJ4@#0d7b98*R1T~Z=EhbaR zT#t+&yt@;^(8&pF>l6vf@F@7h`vMYxf~mOdjqKkG2@G7!5&Y2FY?hHfJ^#y%QWBvV zhRL~x><*KBO_lQbehTFRg5vVYd&sF)qcwJOe3x)ck> zNpl8bY!355E*tWGOefNKCFa@XHa0pgNj#EKI-Q8Lc&GW)hnN!vHnWoHeRP23<+~%< zw#lh;ye%ReMhWh|gLp`6=LEkF_UGl)jORzVUtkjQM?Sr{P+|*=P9|=&JMGR-k?DO} zYzusQL62*pq>g726yyx4<&k-tM5wYBZfvFU1G7pc(+;^ID$HN!bA>0J$TPU%Es!J< zeIQ@yEEfGLvC%$f&Rc4cn!-?(vo7TmeZ?kGIJRM?LRESRF6~sT2NE6noOVAlbR`8rkG(b3m&d;rim%?R&;$dBYiHkAyghpC+yr3+!N*% z7Zs2oyVdjeyyi8t1vLnMryU6nQR1~j>rw&wG6&@_Cg)dotY)bO$-DmqN;1KJ*~V7ce-1oixXHzDFHL3hYhjcf zOEZW`Z_sM=7_0>CqVn6&t!V(^1b7ao3+&J8CKNoD!^q=FSV`&-Nft;F9;rm|Dz<$3 zs%#wbXQE@CIGn9m`OA%^Lf#EDoIw+vP=5t&LQQ~hMX_7NhM8kAvMA{zP8xip`{S;4 z`<9S!Rj>vpz)eF}FWPaqEuNseQqZ>O7tDjcV)Ffg~ShuA0eGamx(_7_uSZt1C9z@^AS`@JO)wW(fv6q`WAW~ zMM{ccRoUC0uj9AfVmSSxhlx&j&^MRQrpxJ^4$pNyzoQAe*6{ey9qY775P9t!0m7u7 zB>DXH0?=oZ!P>dFW?@Xq!WkS6NXp=+{7!^;>5Rt2<{~Ep40}ykE4Q3pT3_T~ArRzZ zwOkFF;}(uFM(3OyEupe2B4e}$qsfbp1_S@{%!Bz4R96oJ1yh5auDrBC_?39|*T)O) z^Xlo4AX28~gS9t|#wSeTLHL$X3qPxa;MO^|t11^Ypiq$b_E66yxGTSdhYdnkOLMXO~^D&NT$+s&cn zN|0onozI(%Z3h5~kOS>0Rd%p}^OT{3&UU7j_}9W_r2L#W!HY78-}w|iFnvn~?S$UR zx2NP-t!6V*)^0}A5Blf33Wy-VrF*p;dtT5q6TQP|M-s1xwZyt#HKJH%0Cn$0kE0je5UZ1u@pfJ2LtDUf+W99<-^7wey)&2%Sq(%E zbc0c&P)YkHH&d4T>HweTUCbp49Hzpm!Ru{&S_OG2ABd-GZL7%mp1p)TL_Iy4;YN$X z;;U6EiJ*O%g+#aKC*sY|U1oxTrRkYWaL@+OZO4p3Q6z&C8u61<=AH3?OU8WFyuU5w z$NM!>>6CULJ(Y-ki~11rFky+Wp_fpu(F)1+Z>WN06z$z;jU?w)zM;o2R-2%XX*CVx zmnX-C2ciOjP-Rp&IctDqX(m(5^7KtUy!3_QK!q*-CkY%MtQOZVJGD}<@kA}DNOc4F zYgQ>PEbFIrYs}`WWOu?91oX$ulr4w$4l9xc2E4|91#yc8`(mmr&hvQ|3TzY?cT1@A zUAl_jl@OCC$Pa<5NjTudPP5mpVj$@?L?M`e>Qf34I@_B6S)?iU)pLh|-SBwr>z|on z%>n=sYf>q#Q4)684*M4re`<_|1-1RN2)LfQZ@H%5Kiki{O*@?7o)};s3M>RjJXKQ? zNDcmai#8$}-y;gX3FP2VHq>U59*$P;EVn8K0wACOsek9rEC?8UoeMS6UG)#lct{2k zG-ekO@{z)KJw^y0!8F*>E7DE~K{3%fB1-Z;QD5w1!t}^=7n>c} z#K8Kn|4y`@**vq?b4?9v+DO*Qbvyygy&X6N>q)Z!hf(xx1TP}XFX~xr(G74QOC(dj6D!y%6DWZvgQ(z>(s&NzK2t#8g;bMBlIBG=x(5`aG}lG z;-no0UyE%t-!v&lz{8k~EZfDSW9c$jcVh|8n%}azzLekQq1JGMW+FV3dQw6ch&D8% zS+B)zZYYQq^fQTdyoF695l5Q_YlI94K^yA&euzHnk+%ru#@X2WcU$mhVfA_`sC6 zak*>?GSU_CIbUwYmbZ`{1<_A0YRo**m-2H{FpEpzt%RUHP-(aRGv$aLs;=%vd9q^SXhjU#(P(NRMR@-ZE*iCF%;^gni=Zmjmletu52u353{gg$J41wEZvQKTB zB?=+w!d;Xx;FypTO599bID~+gZb^4N;lHw?M#VW7tr(;zQj$Qg)|BiL?MJQ0lcQ0i*R|en{^E z;jlO_kFx9@(b0S=m)7XbM>~%K)DN=R7|qFZS3<_2-Y&lvj5kH$>9bv1rWQ;OO4qUf zxR`8wD>0}E7BLjKkHfy{sZskH^E4lJmbgqGR=B|7Xh!&kAu>Z(0&16ZJuMdl8@zA> zufHYt1cQoY@LwPWQfPcJ#xtfVtuh#jL_8!!tM&RIyy-QVD(w@;gq{oq30hX5M@s#z zXI)yPpwTnk$5OIFOIDc4G|C4*xNHo$g*9*z(PbyH=SX#E!v)(0^KDQOo#aYLD*Uc6 zPnBY%DJtw z?(k}NmXhuGdhDH%cu{6WOt?8CL6k`@M8VeGSxn(@ghDcIL>}=9rXm_Hl&E;Uo#l{T zSa{ynD*eLca3lhLFVI7onSlO0==M70Ra#d=5G;9&1h5=mHPp@2hDXv57GD&}r+vY2 zGB5O4X3|lT#?QhZydLYQGSlf)eA1WECAWCX6gY%prOqUU@PftUr`NF4mkU)NJJ`(= zHvtVr7$Jhzwy@GYx}l+1y;j`ZMW>0FH7dtZwU4iC{v4ZSQv+nImPH zAY>FH>&{&ZmK#4dE0oIr715tu-8?as10X5whQSYP^tYNA@inf2ipNXUW|f4P`(rHdICK4i1G@WSWz4D}e6t}PXb-)cPq zQ`>;}kq3V~a%~J~R07AAaf@`n)9VfRg2_xYmkRp=en-$&7MeHrqfKl&s6Sr_l>8{x z!!}a793|`^H`{M`ryIbO!5Xw3#aE3gU|S-^Qd`E0PfG`4iFm^2O}awaLbg}}5p2d) zl1|(tGi>od!Y`vA+8`Xxxp|~;rh-8s5OA8ik)4N>X!B8OrfeG)lUZ&9G@#ZiLn7Gh zg&eB6;(8pRx;!Q4RlA|2#4xaW3!BZ5Kme1|T_7`jM~k0VnNJil^D4^;%@D9L8{(TF zUyd(PGwJP|j13;sk`q}_-BN}2$VYes3*Vv~RKx~lVk z#j@%xOlEynn+@s89+m?*Z!RXRRx6R$&w52F8B4!~fm|k;PQ&YTZxAv)VesaXN~!89 zf@DZ8&)Xv1?X+?1EoK!RjsV0ES=f`9pwz2-4vTBv-2qig3Z_vp&X%?QCmDRf=_T`k855qjZFwfYj zr(C%XRyiFsDOrNJpc11PM4w)U1y&~&YIDLPj^3+sB`FRW_+^Bn`G0BdV@A6&g)}=` z)hlWHj9F)qP#>ZjG|rS+!WBq0Mg^B*=Ccw~Aw}m2a_%8*$fZ%E+VTu3*q>2cAB32l z;(?q#kD%GotMNG0-5@^sHnZd15TKK48Q7wbe)15%SpHnClyQ8_`XzY>PDw{IG zL9Wm=Hc4etqfgmhU$NhNPi~Z{H5ekW*%Yf(W^vV61sQYk5U0eL+{dk+b$f`5haeS@%)T|$-NxPDxi8-Wk>2SvA2 z`rfq73Zt0IvHHOIaFB_oYL&Zp+uFLK;cy6bAx_6dQ1(Wwhm}h*vkrv<&s?&6&9sWp zfyIHt%{lHQTm=e5vDlWLN4iok-SW8Yc8kN7`O>^ntx!s(!uvmn{Bw&;KF-f>cQ{>h z@JVupHV9YqI|f7U>}+sp_iCaGKF*=+C&iv}p-}dSrMwDAK!0i9b~22h@w2&X`Z#2B zJ6FG@)oIsW@c0=;*W7R~(7Fvf@l+4HV9koiB4k)#*(XkPVDU9dCE0F|pGj>&WtaG7 zgVtLL)hZX0^xGaH0HONM0|RaT!+c=DD1WN*fHI-RD@ zyaNcpJRtI#Y0TxO(pF0R?yweuf*~f*{u)6VD@RfkoO7$_ltH6j#)7MQ*qg=0Y~#8j zVk5Z{Q09S@rq*QcGpO`-12!(aNy%<|175d}odAXyNhvd3loG)i>G-qxc7s8~9orzR zB$w!}foLU$NC+Z~;f!+7k-;W6Uq^zfj*T9OBF2>{GpIM7Q~m9M!+A}PZ-B)0cykpA zmx7%qx1HN?uk$|^;hBQtv)t`W*~6!d!^5wbZVx|WBGvzbqi~c)_^O8W24Ycjm_*cM zfA(aN)w$U$O^XG%_+b(@8S7%``=^V=_*@|-f-$M+9bV9)BP0e1z>o2x+Vc*M^nlf{ z+G2CyJ4-H6YfEcr@PmCOfv0{eb}Ysl-5_X;9Ov(i5Ysq4hdqOsdEFYe;mI7faR7wD zVH5h*DHU6WKkjUQSxL|jZw}*1&L_@;Dzx>mBBh@M>QU+6`F9J2D$K3EQ3UDSN_ZdZKRO{5Fe zTLnT{{9uig9x2N4@M|GiqS<%%RfdR8sjtZzySt^kjdvkt40tnm1^3O+%`oBVAC;NZ z?-^MI76yWq68&{~C*$|bdx|*$5Xj-pyabTI#IS4rAy%+Of9%TMoo}oD>Hl4Ce4nk2 z(kfx}1HWkLOCFW@?Hk*n~ zqqPb9uvWQA#vjKuXE_o&r=tJjpL5?7FOjJ<$HgrAw+w+kFlnsrcdo={ED`Kv1_X5e zKo$y;ZD@+;lgQwkM)Y}}6P)=0M~Oc5*-lWth2E z3dr?EG8&H?jU7j8Ep=hhO&8PXpop({R7GiUW^)EnTd?#7Y(6f0Kx6(P`J}}>eC18# zJS%bzZ2G#*xD_Hob9h`%oi73fDON3|eYRywDy3~E>{G&}%uISd3I-^pYmQcu)h!AJ ze9Q4`m^)b!O+~3}0|V_ctOm*n<8e=7{t*4aqu8Mct~t={a)ik(iaNFGCfYk zOSa&MLlA;FgQa+Zuq=pW%5)an+0ISkIMUS>>4G~%KT+dk*&hux3uKb)4uiF_MyxPB zh$~Z9Ih0B#wA!DRA+*xYkeTu`hW5KL4iju{5Qr%-zd;ahDp)}-zvp*#m+{MJe`=7e z6Jip2l{dlc#OKL;zSlJ|tBpaR8Hat9VFsd3JG?Jv&QGcO(z0dtA7VQ!>9is=&9G6y zqP9;r;B}c^k3vwx2~Y!4FcIh@Rr0~>4ynvU3!9V_J}vUS>GD{_@^K2U&D!|t?8*mo zS2rpU)&%Pm*(pR|9dr9=#`m+~i9*7)eEOo6p6$oybvP97iMmvsAmZUorf=wH74`|l zwbqHn`d5RUq8Zwfv#pQQ2vA}w-z44oKhrp&goZcxZgDe$O<5Tue==9%P0yd$spc)8 z*&RKVH3fYpJ-QJoNtu(u2+fN@A0~34K$Tv1{O~l(E>2vf9A&)Fggb(GpKsfB)0kJd zv`X|aasS+)sq9s7#dPBzvxnPr3mi01vXnVtiKaSb`6eh}3dZ)#l@G?ra6VVAy$E_= zK3-@p)I?G>T4J9Gy2hq9PXp~4Rz_J^VQSB;?lmUjXrFvxgCY1TG{K-o z!*_7cLe7_?k)(OBSW@MR|72_>t5)M!@8XZpXy0}(%G{GC=y1z#Y|A#ys2;MMA%_d@G? zB=Ek#aD_h^B~Uvb$XNBOJei5#X0si7dzZVx;C*Df7p3nZg|bYLD6v2#XfE*4MiE$k zCKl+#-1LWsjSS9M6ew*j&=P(^&uuOhIvDh`rW(PgU+XjL8`mTs$^krFa#ETtb7n8t zUje$#EOzY)5$S1zUnOk70B(}-euK$N`WXN@K*qm4pC-Zqda6fQv`&%R&GLRkpYD1k z!&Vv7L)=V6vLLf|8GR@M)I^PL2Q!FJ5wyt{bGnDZu)Sd zu?B@~DtY1cNI=0I?k7rV2HZ4dp@K;o{d%{0j)PyF%76=Yu(19(mD5~TgHE)1Xzr@) z0Di3mbKNM{Ut<=e>mcgS@7}PB>a$$e+Gvs20ISfuF8_En7;a{u-z)4@)QZ+ zB=z?BXAB&{4hm3*@l8b|JE4)!b}3LsJt}lXX6%rg^9oyurenaQKWu|ObN}$y!L*Y_ zC(M^kgHz@O7o|{7h>JfdUi$1R*OCEcNc<*(Dj5y>%#Fb~{FdSK>vaw~I%dr?FmBxo ztWk|a2>J5Y*p2HMKD)E~5p#O90fA#1IdjsK&6KY@2(-G=$4sBHOh}9+vWlp>6j{g8 zFgU>)gR<3%8|kpjjug^k)$uY-?0^^})an)Ql5#A`{l1W$s>zB6Yj@bMkKoa{!VCv7 z;|1zdOdHfD^O1Ul{-JS<);DmIRM^!qS#+pxK+MTKefT#BCBu|ujwTwjSwIcbZVPKI ze^G_2+>-8Uj>KpXp#JexC$R%Cll|tDb$RZ*Py!^l4E9_J&C)XXzX#V{;g5ipkK@on zS%YSNKXJ`vKdPZjk2_OM^q{s&%%v0<47o*aof>Bv!ze=Yu@xMU=m=wmV`}HYyQrK} zvKi}h7*S($ptDpyzG-wzO-Tt9NO>7TFCl26R<*F*Ph`%I9mcB$D_#&{u$VG|G?i4P zzYTgu;h7ppgg_LEOTolgDFRAD8-rq_&|T2oP-q)cq~6TlNAPguvXvVK!|`?_#EK9? zK5@!tkXJP z^hMz>4WfSN6eOrb!;&zZ8|T-p{g^V(KK7{XOdH*{Jm+`m!iHqhoTJ%r!y+(7^A_KH zP;;=nd;fGb+`?NJ%@nvihqGuF2i(bS(})~?u#)Ya8VhIZZgfw!8%II3_1CO4s-t#8IprKjT;vUvJ)O;LGaUH+W|@iKFwP{9u&o{)^)7X!Q+pi2Ny$S7~Y>Jc4 zsMHQpWwf3F3aIX>^SUyF^lqeBWVsblx?+hwPqCNa z!s1~q78qc!WWfhqH9JgJf}g!+W< z55W%`KsY*n*8@`MBL6|OglKFv(r1C#D8ld-Ve~rq_92!*4m~U)aZ2|LkifANL%Ha- z-&tm+f>V=N%UJKjxZu+P7v?onJ`6O`pf*uznDw;GjlX{`3m2)oG-wo>W%>iFTtSE$ zBc_Fje6V;~Fw2ak`C6jIcLCz*qObgcp9m%@G}$_w&rEY^&Sx0<7e39V06KBz5LXpM zPOVt|HHQ^k);eM@@glSV6(sN)CUl%nxjg!t5Rw-3G~y*FPw9*8guFoZfgrPV(+?W* z>fWMY=U_$ZA48<=W-DE%WN0mI_Sg<%MZ_VIzUv&MJX5FlJUaYJ?_40~UpXP<3($js zX3Tzm`{|eiZ>FNN0I=0Da6%STtUg zDa><0bGUFTeeJcn5Ny`{jT-VTix|eu_Vby{Sl?w zOiG3hH(uIh2`_1aG`(3B@9dhH#X*nZ!zCz}AKBhHL^{a8(Uyn{%2d`Gzr(^q&<5!*gd$rW#>>>BWDxTt7_`o4ukd=A*@w z>A)qT(A-gbxFlRmf6dwMoS}rA1f(fK6#kgh-al@PkmZR}w4Y^lxR%VRXvtu>t{rOW zhN+zDSV6w|1tAQ=%#1PH{e0}mz2{FLW*6xh=|vbvP58&*+UQuUQjRj3nl;=+s31Xm zwAR28&8Tg+IXLpb?Xh5BvBD6a1QH{KQ+G&u+ZrkGK`(4rRwy|z#@>`v$84{-Suv$B zdwa_BxT3fqAj~P}%x>Wyx_Rn!H8s@++N-l_+MV|1x|*YBg#bUj;1ml1m1@r3=5G+Y zi9N)t&=zPjGy+B8=lTOYFyi!riHwF|pL~!6|Iz`%XjmTrQaFa`x!rbdTDcaG(hCs8 zypduK1mq}_WK~UT6#6_I8v8W;2(m267=)2PI4={8H2*$9S%^ahS<#Q-zR>ClBsXZc z%_kZfa<++spm=LV6V=}K5mVz})Yx`5_ehWwe{}0advvKFJeBHNc+^KhcpgSd4zZ z*tVI+r@ls1c}Vy1?s3{T4q!gJNt`j(>d!zA4h!qMjz~|eSrR(E*FYHEv0nn$Nt+b{ z`0D#=9Ei0C2-*%@8A)f3(t*~-`qMDx>Y`Dt`~Ut{ zmYE}gPwgMW&3r{T=B-2;Gn=@MBH}h8s_uuczvKD?lfyjwn(UO5F7ORx$u0x&4W+ib z0;Ri6kP^CjjCa7PbkEGBJnX9<2V)H{z)ztDIx)syM8Thf4F#iXyX5PYh>dHGfQ6r@ zu8)WpEAF>87l-Fg+=KKai6W!?Z(>@}=8Cye1yd6p-Qctz%Vw?I0)`-{1Y!T|;sHqo z&)q(!`i#$W9N!e46}A81KicgfP5l1~VuXcUVz=a^7LE~Fzf}v1Zwot&&Tt%aTuNF3 zO(IT1Oz`!3pJ!#jML~WzK|qffg25w*13b7JHAE?ZRLfa_;PAtpkz+GWIdT<({8^6U z-HpUsoDlZTDe_d4tg^zO)c;jP6q(Z(t>R>W^uYS1=^mFH2UuV*85anVq~eBz+ii%e zGgUVHy8V$$@mZ0JsgiSC!m4}S5FgYuw#C2-W<8;q4E}5gm9$B44t0GUp8nEAVw_J5 zA1|8{Qmo}lyG-hTLEWQTTAZv*jr@mFm1|TiBsp?1TmrijahT!Rd=4 zbXxBS1Z2HR6h?BY|4PM%TFibnt2WeEo-%o!oX&LUfXiD92PHTnIRWC(54|3tpm`B`WdC~G0M4uFb-4EY-tV)!oHAAA8bMCt6_5?b=00VV( z@7=dszq~CDKY2ReUQCK971U|fFDTMPyZQjbE`OrbU$;GCfE%i<`t@ z4)vK@*CK{7W$5oSq-5%x7ld+oYjS66Egp}xnsuwhnhsu0_#_qEXbWhM0p2B|4 zjFsj>rI`6(!BuS*PI?6(4J3i*#9KT99FTyN03p;=(KV1Mh*=;o4Wfd#jltBA2yc=U zRk){IO?^PxG)|CKZ5g0*xdMqRa+*K@HPT&}K}Q%_^AN=USwAO>PlK0V$9wtYqErhQ zz&K(snpvMrO7#b3<(Pm$YlOe0rpEWO1 zuIc8L=_KNjK&0upt^S}(aNhL)A=vyK)4L>iU7;4UJDO)GuePYOo}q1B7!Lnl2F~tk zT?@`$Q!3ecbW4HnK@P#QBw&^c7I@NFGCmD+5JzROL{lC3T_~FLX}RjWd3&HjMr)CN zO;nt$#?$6Sg;>S$8*rfE10s-38tVn&sUX|ex%Qu@Bd1xHMjF^{3&-FoOafiwVPf5B zNDJTr+ai9&pyQ~6aL_xP!Rqt}lO3JI0YRR2$`cJg{Rh8-oY)ESZ^aximAL z*b#>ud7KV|-vxaYn5VClLU-INa_aAnK%lv*3cC^MM1P!XN4sBgl}s zYZu4jky!G*E&e?g+GQUXxrO~He`BuiqyG;gu6Y;xSv1_U`Rg<#aE?Tiefk?qY(Kd0kKbZZNsRepy7O82AeiD0Z2e!6m6pu+sjn!*$(4}z4EQOTj?&jO`28njVZs$jc^**Fmyi)kO zn1cJkm^l=V^R`b0+5gfzP*~R?q7LmdCY{MI#O_2{JrHP^_`I9#4t~7-#J(jbYfST9 zwNbP${EQ330R3~a;)0vLIiGDmM6EFJ`HwttktP%)YDDR*{pj-G3qLXYKgn-`+UUyG z;_-iugGpb560^CHAU%lgdCRwJPkQ4K^e*N;>Jw?as`HgIIw|p5A@ApalVTPh zH?Sg9L5v2EIEqD(M9_oSAN2V`F~;U0t#%bNn||d|;W)^@(r>oru2HeQTrMIAwcPV> zEoOkj14q!QA!edXAGe(mD}-tQYE;Q%If71zedsW3KQ`)*7{$K&axK-V|2CULiuhE0NXD52P!d`w zYLw%@KIW~3wGDE^7g)HKa!m?W>*h1%vrJ$ZkHX}FWQ`ISNn8(Q+V>C>-0?0c=<7xN9mx}d{n!2x`iG9W zWT_#BSvK9=g|07^8WhsRVEupgXbJdM8oaF;TH{aITn@37op47{s<~n{lM?2s`+Jyj z_-)(&5H!MqSj_w3Lw`O)n15pFVSC>Y4`*@&6QU-nbI@xr6kqj+6B4uxp$C3Kuu+M2dA7NI=u%A!Tew5@vVNkJs zG_WP}M6|G}NwF*!aZxi*6etm%ygYHV8Jv_Tj+<}jq&rBZvVtiK{Vb?<1UBea|mWj%?*3slqpYJ9z zh#k3C3a`NL5^9F=I~Pdo9bn?|v}FS{6e}nFei{6(5jZtjrRi7}f&c!m9kwz^UzX$8 zhN_xySbp9TsiGlIB6*PjA25m~q$kGVE=2#J-_WsSEXe0_0q7ZldQ$&c=0!!@p>14j zJ(PkNJmCVDf;QQ2&!+G_Do!JZpnCkSnzBgccDJN-l0Q^-%$lPwo6QZ&N&2?{5m{#x zjZ;(rVHo+HL?FXyYaM2N00jfsvkLI zUNdnAXVj-2&jV#NSn;E&EH^pL{~##V_eBBDiFLJy``#o87%gtX^xKc2`0eZ$DP?b0hu|0FgxwBZ^dDbSTXNk~Eb+m(evdTdih7 zIkl4lW4yZpQp#LVg7_zmuyCQ06$q=Z!Sx73vceS5mmc^jFb=9^$N;6>Ai*qfL#wkC z(d^r?4XJ+*4F&B<$R5O@Gq4=KIXfzY`_@(!288<2ei_7kf_M39NZOV@Gb1u<;UfjhM}6f^FdQLz z1baw$L^vzl7G|q!%%<-~i{(fCo1M4YWak0lBP;)0`A7d#f4l#o|E|B$Uq2F;(zp42 ztN(XJEj%bZE?g1L2p5GL!e!w$r?KXmZ)Q1b%ube1Go(XD(v`?ZY)Va8ba+oF8L1(hTF&PouS` z-=39y4FU}CQ75q?!AGB5ooz7&8RxPP0+JdX9a|NXoq*LH%89%Wl1RapUNK1xOpSKb zKY#%TQEIb@8hM&gfebHmaZ__cCe!{J5#V2RAvzOMSZ-J{Ra2=(j6l+98RWCzObCeC zZ{BRJTF#--0&gOcj6`IfM^^dvJw5BC_&Hc+#h@Qg%IJ&S$3-q;P}A|68KvbC_AQ$E6PjWCT*TuiMg_&L{xaklikUM_ z_7TxkWWpn0S-e`(?Wp~#2WOW=<27+5!_uok*djYP+FK*vSsgI6AN1BId-PkELbk}C zt+)F_eyi-{a8HcyTBZTpaDvW)GyJsv%|`SQ|4^}`7$8R<-l9!nmaRLwEjlc7Bb9H( z+Mw7o1ZjFUPcb`Gdunj>@7lA$Q`pk}fwevpY((sW@)MLhOT?bDFc^N9+(s?U4z;Kp z-Z`x)XHU7x5(velZY6c{|IKLyAHeQ7_uy?X+%Zn(N=wt@OtQ7NZcnzGhbCD2j{hbe zUj;|w`FRPRX2T`#RPmX*%#eR5zESzEoqA%-h8hvfbUg;5rl0q`APAXd;5cSQ-gS)ktSzE+78`uK zfl^8x_6$cTt{l)<#Ml|nDXF`|aE(D@#|ZDhI=-{Q#`l_}RXY}YZ+~q*&my?DXxgqC zv>7zIvnT

exyvT}NFz;RN&nEfjlkfi9a;$oZjrERziBZd=ITgw_@x?tpYr2A13 z9vW#PRI#BR=Cg&D`~m{b!>ORwpVV944Ht3-?o=gVA^tuak9>6}(>je9yKprywmws5 zn>H;~t<|TN2T6uK#*dj5$+(-%+>vmyTFpL)hN4~RSVlu`Q5%RcPJgIdBb9YB>NsPp zadH}9Gn|*Ry<=BGg*ZH`8WGt(=(uksSF~GW47Poyb=0O|mec4*LE#YW6obPmddTYrVw)^5}shulZHv;1sH<6@XBnHdjsuZ#f}+W z3K0e?g2xz?sU`=e)pD*|f^sOEmCfy{rJL=l@9w3xlNuIYc5jEWea1Zt+Ww(n=+4L> z{leXeewODsPmHvO&SVf=gmY;GrBd($v#!3=NBR%@0!!0Fn9O>-8ih1R!-!p4N6YAe zrz)8Q>}fqB3&u7Y7uS)4WYcay!Rag*?gd2}Y$ylSX?!}X=hoRuu?WKls-pXs;Y1%8 z25#7tOn+=U_c8FHH_;dj!wE4CN5KDWNtN6^Q_u`|%m=(f>tV|=+l;rHOw{@!32b)F zRlMynR^yw;LO-zW2gq!MYv9d*e_@;$Q_bR@XNj0#!PP;yHC#2E2b8 zUrPcnIxr0fz`zE2MR7wt_%Yn{D+zA_5#TS>^m4+oab!rbptiCf>1U>LeafT2!CwzW z631yN&kh_6Z^6zac)khj#Npq5Q`Im1c_?}-oj?@xOpJ42Ex0<}tr zoNh5^Fojvu4QrP(;Skt*PIp5(e`%2HeSIW_pc)@UBbx)|!Em9{6IhU_t^qR+q~U8X z)-|_e%uZ_@!)uS}eAb2+7VJX$yaQV)uvlhN3-K`c)p|9y( zT-bAV&p{EP!4?}cXHu1!v^K@{i|IMkN3zQ#qE&O0w8K2i=;;-EkYZPHMNbkR z6Hh>L+63@eFeh%pjmvpoOmJ~qQK*9WJ3&Azh*uys^Z+zUdQ|7+$L*!g!hz-g9d;2~ zHW^X;1}d9^Y5v{lfpUP`wry#>t$WQr|F4q(t6)R9m{SkFD{i`o7jtUW7(VMpv)7+X zII~#skk2w~lt`D8U%TNZm9qjSjIw&X>SaHfRt9snNAhPWu87zX%l&?NVdcnaY zEjI6jHNv#M7YdaB^hPQgf>hINq}adl-hGA~vnH#}&N*_37e)$9HJGET7|8Ks@f=m0 zO`yam1MzVRze;7nYtNB)TkX@mN zdH4Y1T*JWq)#bjfW@Zmqh^Mrt+18s!i_G7#O&bV?BI!XF!`lcZVM|_qG=Q};S1{7b zCK21}i9G-fi_U;+ZreqoypB^%DwQFxnp%M2ceWEYyGG_UNHH?ZTVcd6HF)#N?6$-K zJ_6?wyv%TwOucuTkCH@l(aZqpD|aN1Pd!i-bGf`4kaGAIb=AmtkuneN~qV2SM5uz^KQDij(}!S*mf_E(e`pQ-qtFxPaHbED<_~oeqOaM-+;+ zqkf&r;BXo)3itPp)#el&a0&fvN#O*Sk>K$LEQ5uZ?6)OEqzX!ELhn-duTb_b2)KtL zq1fWJT{iI%AvPV00>plS8=lH6$f`RmeK>fngnc4(m>hOwU>_|{q6WrzjDnU-=t!Hz ztv(;G%~a@ZzVE>2v$7}V>Q0)7I<3&>GJDprutFCn)Z-7@lpElQr1Co=!OhrljEignn&VOLx-l?4gE!^ZL4cvH- z{Y{AUSe%b`k8^w_r?Df&W=0hR1kWGkg1O<4J4T!NT?yy?fjU==j`ux@Nje$bF=atn zg7G2v8ScuTRs|<)5&9f>h-m>SqWQB$CYpm@1Te)vAEVir*j>e259YcdOl>2B5?g%{o$CZzqfj<0dx!G` zm<(%n0|^iuB33C?zX`t5G`1kEI{2qte{FXq!*xlZTAw6w=fB~G6b0q&KC`;mJ{-p| zjnpeoL3I29SFJjxW9GaK$Nv9pdw+I5e)^RkMZTXokZv|z=Jp=fwZB!@k&Jt6Aj z%|`H%G&f6-RHoUkFL?fZ|0^%Xp2zKSs`chj`3Fva-PMsT`h6a^OZLH>ads~|a;j;B zDH^q~6)-Wkw^)tEEpV=;Cl8d$8X97TDVW6_jJ%s_6!t8yzeSheC-h@qQV-MCgnfa4 zOU-aPZa*RRZ2{Ma)~p^skBfMKS5?N+Y{Q81BhnxArDQ-{zPN50_o}z> zbx|}8|ty0Eq?5P-b`Y!L*NAXgVvLsP12}taMgQDwQb=4 zCjC+}ue{4NZwA1>3?Bqvy)5hp-@9zWDAJZhW%+Je5Kj_Ej+h`R4}r$_C6L31E%fC; zLf&v2*tYARfHegOWg#!Uw)jiRYw0dsgpGfm0Ku!kR9B z2DU4)quA~bF)W;|moiT3*1{9(8<#|)8TO1uDnZOTrx4g@Rxtl{@artD8I2T-ZQTP$e6!ioZ`ly~H@Oh! z4jbyO+0jDVsWl{sv^7)2H*y-K!srlhhQ?viltz_#`~tGF_B7+gA<24&lUY~-by9Cy zZNBeb-6e-+kgRhjD?+)f4m<*bD;iBWrsi?ovjyX{TjmXK5U~u`wD}|OlbP8hOk}FT z83=rdmbMfs(UoKkv>AqzAimUtT&_SYA^F=C6Ne_NZZBb(;wA`heL+w5^x@lVn`9|kBX*Obaxi5& zj0M~Q{6G1|F&+v5!JkvjmtgN|X1WMUKl%72-&sS?_JE6@rY0e$Cs3c~?AHSk59bbe zT#>YJWW_M7=&eoytDp2h(1}y88Q9V#qp5>!^fozruo;%wgTB7oWsnM=GkMkjnJ0|dw$YTmD z*;1#X*u7BDDX_UY^DKU_AXkgKW#DLut)`shds5Dx%c?31XbpjK)3g+H+~p07W@tJC zZc%!TH7M7#TI@n|LLnN$7lVvDU;N6A>h}_{7^mhy)}THnD*K&+o6&ulZL3e!vQ50k z9I<`@CkMX{^-Gt;-JhbRzXh4fI1)`L}yN>DfCayMNI-*!OdF=0S+Z)x-@AYxZ zThWT2kUD^c2}_If;XxWa%uR3sO8NJSKOc=Z9Xqvz5)MJR7UdE&lVgo@47#g07&u92 z2?*{$DYDPh^|O|*($u?;Tv-Qd`~G(Cob++_V_m-lu~vo8lQzlyu-BZj63rSgYe2^- z?;6M}PxDRHDrahCA(u%}?ZqzwZib>ioa>{p&3l|cIg=UTlU1$%Zy&f3zlUq;(~(ym z0>G5z2Q6RMou;z>d)5m(=iX=j@tWXYKY(w`p1F620o+^U-NX^1hR_e`2s2}FDzM$* z&79o48YoP{F%)S5F`ME#S)(r{=11g8U&YS7g@Vp4M3g_UizI2fRLM7PT$}pblmtlX z7emUz{&d-{Bn2~lwTUR$7}ezLgICcimw5{}AHVZ#%U+m9G-bA0*i7@GfdFYc64Njl zd-7`MOs+Y6fF3!o*cgR9!)~zK>#s!oJlhy1 ztSO;&qY)iI+DZ22+pRBakWe81o4MzHoL#G}yx%@v&zpgSi)5R2WG~8YFu;XgvRB4V zu%-k0>LQ4v7-7UwY5tC!G{*b~EZd}Ynt*J*EqtJ5k$F3ZJHqh69G^VLU^W|az$ymp zgfavXf)NtvJ2J6M>v1QNe1nV9Vyj01=jz;v3PIfpvRc98e+u?D+{Ne$!`si+>D_O; z+-z_LgC>Cl|CA3L+SR^7F61tWboIe}pOe5*yGeW7|)jQX>5Qsog#65H2=Mv}zv7B)lf8p45(%Xs>IIVm9MIbysEJ^*pb-fLbwj2d?4C~O&FTVQYqle(%tdD23e}U^d z@%2n=V(aklfJ3{$;gbondZJwzgA2Yw-lhph*#PpQd8c3cpP6flRea37 z7te3MF$g+MSKl1IvSZ-Jfu3sBK_nm=v*^3w`eqBw8#gxsW` zG&$nMfLiYYVK)cPjpllnjYe|U>OWVgQmLgDS87eO<1U-i;|qC1k6A;@NXCN~ms%2?HK46ZI)gR$SYc-|HsqoFVujna zWXZGye-HYJv556Xz#2-D%8+FMl&qRfB*kzI)(ZyPbkHk{J@CVeM7vQ1&i=)tah7kb z5Z(|SbsFznB^r}SYOjEpF}sCtgY+LRj1?7RPsveFT)aP$nQ0CewZyqX|FWHE%0b{{ zr@j*Rs6Z0oZdp;!VUTA_fR1phCJd2h_X8Nl2q976Uh!nI%!tCkcC7T7jSUJ*LS zSrL@WX3nk4B87vD(Di(AK*Nj%xnzebOw9AqaBy7GR4H>ZI@%R1?*;AdLkekPCn@pB-`i?M?9X-KvB!}Ugxs?3=Dq_z%X2T zfAA9c#SuqyRJqzOlgnk!#l~2N1UCLMb+M7-t+(54TkJSaKxuh`!hWoxurVy)`c=dz zE)ai9U-ae|JIcL@bdOW+D9b{YaT*`Ofr!y}3JIHFe8(ys#!zu}!v`?m0=&3z$yB|S zD$qzqcm(eD35mwgE0srtK7Ee)JS<#N1%defQv-# zS^|wDxma1Z_=G=6rHtPXco19fVo#!@ivfY!tOVPS4vDT4U6Y#?-gh2|>x8R}}xd zg0m@~<95HnHS>dz^UDI7NDY!s*dnqMh|Fv=72swo?Vr^0^<@4#j=|)*Yhb2xWsGn+SDEYj#^k<0wEt^W4L#B8=irBX@QZ1{mUT8CNczHt+RiVBn< za%~s+OO{QSM+=Nxk4Dv;I3Cu7XYTEy*|b7M1nniB=R5Y!beaYi4H`XHqd*{-p<$tt zhbcvt}R;wAo-`|4B0+% zOqUNM8tR?E7jZC%!)M7b7SW;HEK9!E*%y|hF1}Ucz32-_i<^v29j8O3ypCg)rCMFva|BBIB!6zdCLlhImawNcJDN$7V zM1Lpnuv#Vvn+LN>&e-vYbe!YzTi1Nh*(}OtMH}_JrO&P@j?Ert58ZagxQD!-1H=B* zjCPvvNt1FPrep;&(i7cBLx}Z30+p;91sGR;*H1ypb*B=L+xFTDrnttD+IM3rDLy&t zSr_>nJ%4jd@h{QWYKMvuc0zNB^jk>)f~gkOa;FO1K^F|zjcBv0cvx+l_0z(kRuKV- zhkZ#wfq@8%NH^}}bGmEqCz@u%y}mH+KI8k@Ph751I_Pj(hqx)j|#}gNLk=q z+I%~k@XWqb<3`#V{5p4iW}RF8A)Dw(V)B*cxh<_ve_~n^^#e7Z6s?2!b!YS5XYS7&Tr!PAz*=i0*OR5plKaE^hd>E=QI0c`*SV!q z(*1g$P1kED$wG|RN7QOFGynH|jr=fs&gitxzbI_6bof(mQwn-5UhkOkig2=9UY@3~ zlC8mKo6kISQ1`O%R@*9(JuliJ3^`#9Ncy@gW=J(j_-hOkqxg4p3Y*iR?oCBIesV(eq_DZEMB5FOdLT3!hZ~(?TY*cfhB}+MiX*rU zzHnXVONR=u3Eh^s#mhK2)xu0@&cdKr0L+vZJKo>^4q_wLjcokS>wYL`tmU3jTlW6xJ!_Rx(x2B_AD4V2yniiEwfc5%xe zw{eEvQ-DgJ53F0cnKv^5?kJ{K?RqT2j|Pg&{q5JezCW7z(lOp_chlK(u6_8`nFLz# zF6#boWVlq+fh-q*5s<6o2~8Ii!Mb zPpeqgDCVldF&VOJEi@WkE+caY3d?&;HPpov^q4?_L}rG76X`32vuq#>lk6vD1SQ|0E;^Pa|BbgfnTg< z0zZhM1JO8u2fQHluy|vuf96m`O#9Gz zg_4fWNahGS@=v#pB@$s2LbmT{PE02k%qM|A84LUd8R-7`eEE z0WP)5B~=l&@#PlWH?>WjAl z5yQ4IW~1_`XmI(lY6QtxUXw#bJA=nofT3U5p8S&dO9ce-g03c3&5KbWyKER?XeD_H zM6qJvJa(2Oz5e2grC*r+nnCL^_D6sthR@$r%qwEk$XzzSsTV}-VZDnXx1NpH@-25; z0Rv@77__tT#>%o2sCqOIXzv3jE;|Pcit)x!*dh17Czg|4F95VVXSbrl$m(P$!5thG8SQc3y@TAOMH{3HTl#_SHb4PqL!X9DV% zMwq2f${`|20{|s)By^eB@a7ZD5etyu!2M&Jhud(O>>bQEsW5Gur z1KnDk9eMV`r{x9=2Uh5Ev_M0^Qxq+yzGY36LN$KZ)Z)BbE_i+1^F!3_%&lXENyJ+? z!2O4j73zMYu0jPWE8~9odvAdsiYem1Q8FI$sLz`(B(t-N$0SXKOHsu|g9*TPp->r< zJi77eYR0SHa2?ETuE=O09&FEcm_bmSsv*9D%N3~>e8X9TBfy3Wna%A!w^hNvvf1Mq zH8^_cv{+vtC{h{ntIv##neeUoSAb?cz&%=UM{Ru<_@fEyge+RgRyXe@h~KG@Fo>?{npC&g`0=!>bf$LjC7wA7I4M~@ z*2^(%HT~I(f=dZNhO~ZP_j1v?Vq48xH1;VHP^cuRlldT8wwna@d)n<`$~9SMVw}`m zXA$j(K5oI_4cE=Z#r4*7&7xHm#fzA0^E^-K(0%0S7=2O!XL{Jy%v2c+~J( zgb$d6$@3_>7+&(ocDn5$3u8eyw6@w#);Mdjp7*y=K%Gm zWb97ycs0f6uJP-e%Qhxvzf3e*h4hu2?-ey$zZ^lyaT0&)WZhrMTIugx6=Y3wwqtJR ziQXftDR43%na?PuoE3L89)6^cYU~p$wnJ^~FEro0lWb9+wZ2#YxVbut?rPP%e6qdW zZ>`X7_b?FO%d7W`iGW`#SJ1qzNT1NEl;SaH6)Ih-AbVw|VU5Q+j}-L9DU;!)rUKKM zA~VYXlorjtAIEF<1TCJ|HV5nKCGuMewmID`R4PC@;MS^(;nkyloKIvW1f+XC60Sdv z?sqAJs)5z{&PA9qgYk#@WTsJBo43P*E^nxU z;z&mJC{g9ssd9GmSkYr#=KZPPxF)Z!7C%Y)^);d+YlXRsCd#`9#3uye$fcXQl#0vx zO7Y`=ioQbqniuQ+9>HP`++u4~`z?e|F^mX?q28gxZ*G;P&tvFmtSPCz1grL<^_Z1X zH!C)eHdMfh%}wep-q)y`H*MU7*IKdaRlgp|uS*1+B%%j{XkJL#W7Q0*b3Je`_faz~ zV*O}yVj3B&Nr@|bUT4`dTMJSBN7UNX6^mCY@ezq?Eks)-Ld<=W%+7i)tIY8r&eyDw z2u%cGJ8XArR;kBc$h#HuVP2DFlUQRff05QEwM>LGX|0OezF4yW&s|TeLGbmAw65%o zpW3#gje7>5rmEras%@|tdchXB0@lF<_p9wrV@(=Z*sQ0msQ2=EPiXnH2>L_IkJ82* z>;QZ$`bcwIErC1YMJ!@eD6s`;>*)<`P0daW`@;t}(*y%o;) zm^X#Geof?kTkMZg7UCO!aj_#TGqsjqME%$IY*^cc*V1TGH~{?B*W0rKisdi_5EUs% zM8kscMNQ;f&7%TPkc0>T=VoWV5`m=Zl@JvbuSDS_U?m3a*sjDPFel^I2brt^D$b*Q z5Co8E#Y#2;^(#4ODpqolC>+CU+lttoR;91xqljKr1gVKkrgEM#4M|&K)m_9X^wo(*h;o3DHA2NbYzkC zEf$pgSFv3xd53DCrliz}jmV6yRnWQ5)K$e;zO?#?0se`?@dTHPwWdf9Q~`N6bqx}+g1FS|g(%*=A*3$ZQ4NH(G#v`NRExqdNbe5m5mUCPYp; z;aVVqA{YdV;1E1QK!^wlQ9{VOlPufmTunIXV7Per1nCKzav(0NCnd{3PC-dUO(Tbv zjy@v;BNH)x!BXO=sIw}grK4xSGdAJM z%)**YJ$rTyoLt;IygAI}7Z4N@7U`~^h~>0QLNb??(lWAg@(PMd$||`%siv->sijTO z(bdy8a03QM;NarnBMAtJf_aIAl&lP|QBYD*)6mkN;nJLFdaf@qA8u!yLbxCFL7mvMeU{R=>ZNj@H6ZE~TZ zlrO?p)X_k|AcQEyKrF;TJS0FOBtaz*zz-@z6{rd+I51p1d;&ruViMAoIYLfBxpEQI zG#j^vmX4l*k!cl@SXkNEIXJnvd3gEw1q64^lfoi$<;fQngMx;Eg@Z>xL_$VEMMK9J z9TN*12Nw^2jD6-C1cXGyB&0wxatcZ+YML==>F604nZ{yP%%Vgot1>p_Dpay_s8T() z8nx=wb83LW5jePb_(%dmB4QF!GI9z^sx3E2LrX`$l|~tvm|0la*f}`4xOsT___xYA zK_THSjCNC0Ok9VA_QTV% zg8?eFMhjVv7eq-`z8M<`;6I)A2BQgu#$YLNIU1>@rlF;yX9%Ue7@3$^SlQS)IJvla zc=`AR1cih}M8(7E8BdwqU_qyj;j356rkSUkZdx!)gfhsF6dK+{0Snfn%CEBzYMj zz?22O;@hg`84rEUYg*jCO zjq5RMW$9hvM`v0Uk#lGr%-F*x;{6TxKymLg$zD20iFugUvnJUkmXE_x1XmRjk zX|9!mFltRebzSd~edgsTn6TC#@PIQ_HysN(74`Zksp`Cm{bb&$ed-XLvQyD22jGX@ zldW$$brN5M2u8P2V`DHC#}HtYCT_uYgFqtBovu?c%#}DUO8=sL(FP{<2F$)!Ujewt7!br4ZASKt-#I)^ZgjCfcw2AXRwJrb=s)l zGZND!M9kDit^3C~tJJbZKB%gQCVp28#sL87+nEcnPOZ-BqiLk|^p6 zgS2)5SI^)94x$;1m)iir=m5qSX-AJkj)@o60hE@J|nMyu`+nP)^WQSE6 zxBhBbT(r0M4Exev$CDSv*E(d|?&Op3k_yJ?b;RxxpShF#K6^i8N^Z zI;k_@5nZA{=a)YCHIi%e`B`niT9mlJc$=0;M=-h#CH`!Z$eyP~vkORQHv$|QD8!rWY1vUt&|;TVwL_A9yeN7Kg!C9RnA|wm)lDirQu8jgAk0);Eqp7-0b&C zBl^fX&Rac4nOL=(+*r?Mq|R!chiLUQ?~S#A`mMnSyWgMZ(avcg%Oci#Y3DYaxz6r; zYs~Mp?0J%Ipe@IM0ByZ=OX|9t`|Q{O(EpMBfJFz+=|5Dh?hj?c|GTGZ-}do~Q zck4{We7QV|JgmY+4Mq@dN8WJa&yuM^5p8Vz{99oLb2>F{SgB3VPs zBiO8c17W_K&F{WFZCfgh&wt~K&5Rru-7~(PH|qJXs!1(wdna7{6lugwGg7N4m@}kq zi)R6}5#>AO0#O!uz&3Ji=n@wkxvRS7n3k;lg|>bkMka5BAL$+Pa^2hxqFg$N5BtPz z$qM=CB=cuvwad}cYKouoC+#&NwClt6WCG^-w4BtIg`8{Dv|1LUzw5J_pjn6Q5iVy* zyKN%fCa={?*zquBkLz8M!3clgzda~?lMV{1fMG=?eTc7n!_Kjq&MR1A>8Pj1&wVL+ z6Mp*rO*QJ&sPrDAb=G}=+R^(0$vl0+qga;S8EQDCm9e!pO%mRJADGXlLZ`S&p-H=& zZojS8+ye^lW=YFYz49yGHIwff8@AtVG~F!ZzI+Mi9_AVMj_pCppXmJXHkgzR& z@*Q7BL_Hg81cG@?S$S3fgkS{4=s1JPB9ge9eE&4$asKtPrEk$Ktz#W}9Q&u{Zif6u zm&aeP?neO!m|)y%Pi74;#vQhhG?PbCyA$`_0Yo zQ!2tGS^s7Do*;(k!ywzBhc4qrnxd3c?m!)iUq~5dkP60Sy#9EdGG^(rWmF{>gvIV) zI;qzj*O;mj1@y~O;K45=OHO95^R4n_b;@2A8?>bG%jaLOR&>OLPuLF%MNO3`=?hS5 zZ>)S);6ykcFMUmoX$cl!^LK{$18DtmQhui`zY5!93;W)|@A*$3M*U;@jA9O!=zjVKMe_r_eTH;W^`e7h7;dk{x{3ufM;)ITr$|tL}W$duF9x_5B7VJm)`iQwa^c3fdC0 zaR1$AtF%E-yr-wx`YZSqcojv`q_UpEnJ$m!DyaZ-bIrDcr6n$5O*Ow{2(*2nkq{Dx zFVS|4cf=72=gujxqF^aI+7y|?MFZsnJZ`ipQ6q7`AU9B}Qbf#{7Vu zYgugrpEip+v5?okK>VuU$>*|i(H*^e1;2M&c)->x@ZofE2_|c}yQH&$&iCJK5|tg` zgsQO>h~0xBbNwvf<;Xi~szO7b5!nPHMMqUWu&f;dMEtHH$Q36#W`+=xhEw$ZXw#t{PG>zB<}tYXepA3qgR}BuW3hnGnoQgn1RW+ z8DDER$by~nW&cq3x~CyOLiUtUkEP$w@_xLx&PYE*TvbSxyZ z5%K8Pz@b6Y*TA{ia`XwBNB?}GnQPtPF==_Qmd6*)I5;1d-r=TFwZ~dam4bw>I#q}?- zI#0v?RhOF|5@W8Ps1?C^12x4#sIW1EJsu0_gNm-(el6bQ^%^6Ul|B$3e+>&cf*%8V z_2cD>VRpb516~EN@WZRq%0HXrjcLe|#y!GCYqdJ{z&sme`AkUp@3Z7-p!3|QB>QsI zlxJ`EwWn+V3mC3Sv(g3f4IUR}ZcV{LZ97PjP4PYqdD)X1Pu*!ARwj>F!*6nqxTc#6&?>MF^wG~pFZ~3dxI`C zUD%hB#q~!NYe~5*IMWn_OVWU>jKqz<+uYCT#or$FC=m$UA7_B^npT1{4YfXM#jrsgQTjz3%c$s^dc^Vyd;UJ00iCm+G%xoQn6+Ttll7W z1cC{II2a+uJQ#t~0B3Lb!)MA^#`WvXr)d7Jd&9%F42J{+5fKtem?Xys!X+}TrL; z*CaKDCQQ)^a)261L=a+(^NA(3GLl$Hw-tXwS<~ra$TnWVPavV|=WX6C;Ere-F+@J0 zNj^nv-e|5M?K5A16C)6Wo|(}WZaTz??1teMsEPWq>{$RlXsw!+F3D49|G(AW| zU-l%7LkHsYZjm0{DyYH&BxSX>-+4Je(rt$#9H0s~O32z0%ewrab_LeJR!H7fB&ZS5 z9?Bk~o{=Y=aB#7GeZ!dT2t&aWvU5VOOFs|1z>gl+8i|S6>SM6kH>JHcM?$Jwa zx9fAa<&Dm-U;C;$hOhnGz{KY{@k#N-DAsQ(&%M362S!@XFVW$on>s~~*2D2bDfTM# zs^IFu%tofRw7OJZ>Ex+5e<2bdfT`Vmvd;&*Q$2C9mn$F4EZ`I7*q=+f}OFXQO9CZ@pi(vP&spbw&xro^5yo53wjSQ4j2F=U#4B0 zs78qkTQEU6Y{c~K{o5X62zi28g26g<>LFxNfAGnJ!ce-fvGO9+#0=CBv|s^iT2+if zn_vO!rob8wfdCf_7ZpU`4hunF0Wos^Yj5=8;Kw~8Zs5dX7e8bQ`qmog)SUkeR$iWL znSyI{hSn=lPXD;L;x{Eqz853rZW9NBjGfi94X~x4BhX=u982%?tX|YyqQN*GVvtmF zrWK&l zj*LC@OU)ak_qDy3 zllo(dZ~7qb%|NOA+Q(sIXx432i?(BYLv9NyqN;O!L$)g4aT_^T2=AnU2gN|`cWeZG z^CW|*)~kgjZ@n_6=8SPKNFd3=gj#y9wLnc5kF`umYb3UmMASQC7_WwjIHqyyu}{Wy zopAOs;z1N$00FM`$NGb_jdS1oK6s$zMkzb$BwWlNaYx-$Q{UISN3Rd&r;;A2u< zU@}IET2O^5zFfTtl`c*?5yI4ylHM}}&BHo>pt);i{sNgN51Qyz-Eut4(1(}+b{G#JQdPcgjiz9rT^?^WB6L@{yfRK z%uf{)o_CzBIjFWu^JCxqZnsI(uLxUk4LR$S>`h+CV6%jV;p!XXg~qTuRGSa7uG-vD z!N0s7N|lGZP}b~Y7Y?*Xb*nox?rh6rLY#zk_fKP#1QVfNQp`;xN8kW!h)~(#1>OiR;_0uH!DbSQLDa} z?1bW2nhbWf-Z9r7y{|SfQ9xh@HVkG>nDiJ7T9A5;SKcc~cJ7~tyFdD!wr8U}xICbUouOlMAYr+q!#U_@KXX2=sNw5bFwi?ecL zp~ed;)lN9`OTYIgJHqxAtPJpYw*h>H{$Bvv=5HaZ%Z$mE0yS!~ zG97Fiw~rY39T2E0g@Vo%k|^Y-W*jZtV2u`%WQo)d3uT1mYN%1Qw=ZI{6^74_(`JGK z5XmfgQ%}gCGlbJxW)!;TYZHOq?cqEFi0gcLYwLCE=$YMMT|b0)kCH^y?G+i=j{H}o z4A(gp&pr0t%vINopABn5x!Vnc5w^YKc&!GsfdHKx;0vdhRe05y1VPledt_e&lQlX^ zp9DzkeC!&PAIYk;V@bn0Ha3zA{De9EC+^|ZJyGA;`PhEUZYX-s3 zBuxMEOGWa~j5MV?#|&|WzUAcxQ~}hziO~%1L#C|Z93#|(J-YL3eF7uyyG@Q4{8}v( z@b43})T7^A|A6|AaEW}q<`eP?XX~TgR%pJtdQY(3gpfPON}@L8TcsHzx6KL59XHk! zrMe;EV92mYZQ?H-RwoU~Fhy*a1c$2vtQ+S(}8^Q!53iYAQxb+UlW#5+9k;7+f= z54AY#NpClT2}_}GuFQ1C7x(?|3*weUmyna_7_~_;ZnN7z4d%6J6_vAWd(UeJHXAGs zRaU|nmh6ucH?3ADS zmwuU!Dh+>oD$BEQ`enWn!rko^riq_Ovz z&3y8D!{`pm^<=|gU|U8{dOmSxX`Zv`tbB4@2b3B-e+4VHG5+LGv7+Oox;3 zS}H;#Q|$t8piZb7mpr|)TP(Z|DEyp)JX@@ZJ?r)gKXvd4=?k3~GIp0WJ>e6s)Zz;Q zCcoGCXoXE2K2ZCYZ;=RvZ0hyCVB>*IX8J$^U3_nThU9JS-*T(_33=ZCy-m{wm0ei8 z#X8-&r!a(Lj`td2CBfw)WXfwFmyCu0BcV6mh1ur`X&4*`CZVBQ46vUY{l*U^=xR&; zp^(SX-DV=<&e83-C?ZAmwQzMt$lpHEsj?zWMmvl9T9|8g>-qL9tf|yd-WVP?Uxp@+ zRkSwV@zhbs(xb|(<<@TM#JOBhLon!iUbmF~^Wtso3&9Yro(tIHl*u|`gj|C{P{@2D zSk$;a!fE4?UFZ3xESloa2F)1w&L*i9InE8P6CSh{XHoB(=(`{+4DphmT*R43dCkB` z$6gBq`7w!E(n=iV8VumB_4oayYRNCjiw^$x&9jOX+`F)Sb^B-ple>~MT{=1g{`Yn3 zGsgX)34XsOk)LLQRS3^qn>$!n#)5PXW`YfmFM2gM^l>E z=Z-kcv?;B!O^U4lkP7!8gxIy`7Zt{9)JnDiCRzVr^I(nvNLuCC06@FT2q0R#1bR> z*>ij0tD@<AtjzuyB*~&-r7*!JS+=ou)7BbvIs_4jjD&dvtMk`xirZ4T zU)TMVYkr5jWgF?^vmZqJ&snxL)5`*5CcyMG|LXK7rp#Y<8&5y%H z;=oT=DYh6*A;|Zukj~tozf_!JqjV&Znb4otgzRAH%aN_6K{&Tsa;l?}GTKZj$d8o- zJ>?Kcc`;4FXa=>kBqTk{KnyHkE&3EOB}_>8gim7Hk({w{p1<)?o^&eUcFLU!*3;Y% zfM%fYu*Fp;?1GrkRRMuR#nmZ<1azDb;DNG_g{m$F9H~zb2be8Hww`7@b}V$5gKtVQ zj|n=8p17bt%0Gr5^hjR=U?CW9%DosoKo(gb6Ex{;T?K#)p5so>RKNu7U^-Wq#oGgbzFe>n`JHHgqBx>1h) zvZ=L+#Wt;X{ultNbnei3jFt`dsa+#jx|+_5wOCqSIoeQF18y$b@RBgy83+!&cD0Hs zY}rjkBlsaL^(2fmXbzSNMh@-NiXyhXoF&LCQ5pl@p(hwx?WaKr#09>BT`(>@9S_l< z0Uv5XL)M%=IE0W!wFR!?v9b4RGIZHlMdlNN6cW@2#flcgmEp#IcAA5c)NI6+{(8~h zBPqh4?v@Nez4hCRkJ6Eo$0_&C(l=tN>Mu~St0eq%C4n1)5``d4FdJ>}`ze~Gcs9OI zf8iO=q;Cl_YL1!xBMAdE6+CqV$b5sXhvLhnF}=<0xl1bXlMViwkggBQLZuDc7#KdCpy zx|@{$*IfUFS0azmH?Q>}4(02fO(cbk{h&&~9stSQO%bxS?db8c=g#R)l>)o*o~Rjy zuLol+B^-xO0#oH;S*HZGtfIhEm&n3pBJqqund_$s>~*%>MD7SUaf|_3z|nm>cE?A2 z6jlbK)&wD9t?&sy%#xhJ14XJHlp}uYZ#`ZYiv#k|M;0kYGs#?o;4SvfO;Bu{8Wsfs z3&{BgThjA9rI^1N^`>rN}1zw7^ zc-?#*;yu#wM8&);7k3%nwY!G-T2pTNZ#=G?{|Yr4`i@K56t)*+mPH(hDY!}IMsVwLPDS1#l#j(n)o?an?lP+9~HS50V}AvcfFu z>iAs~ccf>TzfAMklhfG8$Zt{=spg(d-4&_NE84+f;b%9!Rp(-|kym58MR-Ee)^Ejo zG*xx{Z&QSiBQtq0RR{q2?uF$<#2_Lu94|i+uDAIYr@7}JcdH%!ME~9=ts|tiujm!X zAu5*xr}xGg%%-2^43F0~3_azT9-oe#xj9X$=b%J^k`@?81!t9v;KXlx-CG)@qoix@ zNLx?UBY>`8zN#@QM`dDb?~M=^g2@-_5|M$?HpL&*hl~IkF101ppFd`YHBGHHfXwi3%yJd19$$-H`!FIW+=!BJRfvLgG)g&{Z~PG zVc+Z++CGz=yTlaWjb7-WY!0^rx@CY39ak^P`;@I!V%@~91o?e4p4`_;ie%um{iz`( zK+R1-30jW#H&XEkWF1qw_2bL$`BHPpAaS+VwZ+=WTol)cWKm7P4X-cIgIYU#J?#^^ zag?e#&TtfvoaK{eKrPn3xGwQ)ju87`l1sn#NeJe{ zAliZw6#cKrjsw4C05km^kCuG&b1Ma9B<8goxKW#lnayS`;v0h%!p^L!xeHMz&@jQi zE$|yPz{8)5z)wI`edk5&nMt&zxBqyydX5CGnOnmG?ve8ZCC0cUjl22>B`MgT)IA!2 zl>fjQtu*_z{=m<1VfBhd4h7x8lUZuGz~{T+$*k4aJR<}CLirq54^t|%cjPGyP1Y(U zbap-f(m)yN3axIKtY_=AIWnTpWc~x*o9GVpM$XrPHfE zMuyQb?5Bxr9iI8x7WR7VQ`oySQ%I5X*{peDb@eA>y-0oftQ~D3HLP@<4zx7{zx;wn ze)YCmMtYz%j%~nGnZwHQeF8D+H-)Oj-+QXB6!(qkk&I!NFA4m@U;EpyF1crihZR6m zF+hq|?wC-5zYpes)7xyTyj}ubbsozkk6_5%F55l1G>(3z@<(<~JS?K=pLoetr3URq?b8>8Nc)u-Ex^6DfdG_8}=!vq` zoC%SdBWhQ@)#q(j&d=uRl3L&xZfq`4)_bkidvqU`tHsDzwc$~xN7|;;zsiY3{o!DM zn@>8{N5Wp-LON{NA5;ik`HzlP`ZP;M<+#X4VR%^&Y%OYbHu%Jx9}u?<$LL(2L|nPH zTD1z)Y#wT+`lF{dH=hUq_12CA!)8XQtiHrC1 zFe=g$Q8Df#!)n|^h{A0fy;BP+*`SCKJCW|i`ZB%-J5hG?HBEj%{g3Ji$nwDV} zWz-YuTVbwJG*~C3SEjd$IP`fk9U7rHQ9YVhB1Yrh*7Y}-aj{ZX6?y-3^|Q*hZb9BS zV6Z}2p+OLe4LW951lMFbB>1AUfOkVjMS5!QWdHQZJOD5s0e8A4x;QCaG@zMgf z;`s1+)st^!8rzy9ZB4qK4aR}I->lUQdve1A)kW{*xbOXSXo|aEKJs}qOzCpmER2t& z+gz-*Qte*}qM_;l9S%vwlR+RuqQd0(%VoOY&S0@PF?yR$STGoD2a7G3Oq&qmMcVgq z(f?_{4>`>l9v+$j2S@M|DU$! z35$HvB+eci#1Hgl8hbtT1RIZDN}PulAt}Dep8&f(Ux{ONk1BHe7VXgee52hDmp z4_f0H#e|R&!FiEDh*XFqnc|Bx)h3!CK5K7R?4@5pH`3YDc!dg%fBXQs39?gbY_+e zUr6h$bww}{O0;D};}SbSjz+!3=zu{Rwp0DA(&w`*i&I1OtM>Saj1M$RSzA zjSx!0nN*xeoQdg7YO{mZPSYvIxgTii<_ROI>R59L{!;<+-hRW6%o&7h*wJK7BbHpl zB6C+#cqsnV0SM9gAco>NB5)y53Kq^_Nh5G!L+#xkW7`f$5Fx`Y;|2CODWYcd8rOCo ziO*xn-|-gNn2tRI=8Rg^t!VtX5d9Ve$&qrXSUCg64e&jVj5z-L`Tg0!{}rXsj*u*3 zN~duxUNm+LQ7lLkc{= z(;_c(oTCdX5O_H7@1&s3an)F<*VJqxV zn&W;Ol&b4~?PJ?L9m|I6>2>q@cNFHui&f{O7%ARIyG9@Go9ul{*L{AY&dXR&aW#u_ z2LTeXakj?ecNnYRR^IxGvX}D>!TGML<(>9|JEYObHP&>gIh~4JjzOv-u7yWbC)e5w zNZF=F_Qgf%)xHPY;}7Ai>)-v3QHq|QARkd!C@fZ;0`%pPTloRYuJ5qDLaQ#Ol zpG*-sUk2a9z3edV881+ru7)?vPryE`s9R7TrnoGovF-kVOd^e!OGP9yxooj$CZ0uW zR4N>iL?V;QA+>6~;dDHm(pBC4F*&Q3uU|0e5sC5-oDfQYf&Vp5I2n>*qEfuSog*T> zxzW3{rXt)!PGzi7Ey?~)+Y2@g`;#>c`{JI9#aNgE4wXvU!PsC(BpQWRFu9z;P&6u+ zKq0F`)fEDsO+(3xQPt%fp*riSDn=X$F+oQ(&`97oSK?ZVA#@!@HKl~kSMzXD zseb#z2=`8yoNMJ`*16Rw=S~p4D;U9iB{S~8I6Ym_0i4PYRVq=HwC9-AR9h!30|OZg z0K{XYIOKOxdn|L*S4BHiR=m>EB(j?RA>AMq(Da`5QMO|y*{)mu%&M+ltBPK{Bxqm)33m!#roCti4`y9xE%M8ta zPrkg>bPo0eLykCZVRbn>Mm>I+EIWY^za)@^9D7KWnk&u|X$6C)%99u`3bHpBtT~+L zB1$}L(HrX$f;#<;3aqSWCk{lg#*zdj60jKrD+WP?Ub{EXPPAbMr@tWpHbISVCY5`sP%A-q25MNkAa#+Sm&i z^k3q$D>mpqa>pdPm05m)s5C1rM3m-kEV;12R1-~ZlxCW6u)=&3D(Q95M0m7;Rgf%5 zbFg#gY$3TuQ5dETZ#$B)Qyv=>Q##@VT4Q|PmUeEW;i4Q$8GT(3iv%Fd_Lt$P<_=3% zoubU{)=0`EhNRPl^erc=0{~ppxbG*u%mGO;dv@LV_UaP3f>H8TDVW6Z}Bd z=fg$pa3v4^$tML69BTENZGSiZxP_jz@zq=rr7ou#yD!;YX`jRRS5Yt$P+gxuK!!-7 zI~W>2UbOC(+j&Ox#2pnBbH73_IK1|zS36RPwL1xALVxbiI|R^o)-g#0w@9o>Qs0~=t z52ogvs6-jo7L;hk%q854za*paI+QwuI1{7LO2OII0*wxs$WRMpkjGLgF;k@L-hz#`iWksNMISG&!et(;dA>-K zPBE9`D(seZHmu``hP}eKZ)nyucD6Xg0&;fp6Oaq1aa2RWFdsECKhmZtlLX`8y+Tp! zAJ!^}@Nk^AvZAcSSqT&CutFjlzv_u^5~jM#pOQc;@dmx#Ca?hs+~w1(l;%dvi4ukpbpxSND>m@D~_m6{H<$u&VldQpf{I zi722bM&;B>Hudb>f*7^lEa4bNKrjjKRkZB#m(}^Qu zYcYojnZ$a1Lqb;3!1IS?eXmk{uT_4BU%e+UlzUU7Z{AC4z5`;z1fOFMVy?wrbhk`- zkHKwcjp!U}n6Y2ai=9chXXb+eDXd)+B9moin;)<=9iJ)x{H$180$OTZO{jJ6G*i_V z3I&nWwC|!6e~sEx`KQ0r%)1*zaUJ57O9(O$gYm2lk0J@(-2*^5r)D=?Gw3?zHQ+KD z7od=LZ;;M3t!pPlv23$gQq%wCZ}6gyT!yC4QmQ$87^kT!8dRnVZb%|3y{i>_o0NbE zs@MO7aSt`0^D+MjMa;`ErJy*%uOurC8Y@PS1;SlY5Qj03%>$=o+BAw6WODBDPh3({ z_p!*Z$ZNHvsA${$Bc-B}M6P5LJl}^L&Rr4Ki+vnfMg*5oF?<+CQE}?L7dJnC(99r` z5toU-X$lEp?y^?SD;7(pW@>6mA^`-DUs*{- zM3mBkla-N?p>ZpjB%TNYz^|gBA}nkxoJb<^fA0SyfhO?%KY{;}K>l|ShL7Qk%xNVnRVEY&?NhBip=aj5~tA^uw%MEk=?-^~kH%NXzE-(UFOjF5=cRlk(hJMMY9Q zZVe!gXBSTnoRAPu08+L3zYYKZL*TOD)s%5Ghwes@hzjzN@w%WFYFNKvDn*_xm8vv` zDGWTB$`kFSQbFz92Frv&`va3y4nWrF1+nVMEVSQ8$Y0PRzI(N*73nKv&lU-va8(IE7>dNaL;n6?;7OP3ulGm6;<5wD7aQy&$GvTqJ-jc0c<)|c;qp=Z zB;Z~qPb7o_iyKP>0vH(P0+4tb-&YWd0AOnxhd&qw@PkBxc!FZVudh{6Per=fZ6)J! z==JcqdLz_{7V1;ccdEOVxZ?T_8%9xf*k#tH;mITuS)tz~{gGR4t zFmE_)Nu^L}OwF`3y*5oV=c!*8cDSW}{VYTZ#y0zPVzn!O^+eRS5XFs=Tt90N5(XJk zo3T{psFaUIaT11P38n5H(@#)HMC>2NpwQ;;$gdqN)|po|VNB8&2dD-c6)xpBl0_mc zn~+5|4#~VGis1iGjgFg6DVwZAqrerRIe`P?&r6Gw7=ICl)|npNY+I`u3N zA@u3%?S?cB=)+@!t@lS~@8y_>|9r&UkMkyb?|J1PS@NwZ3$ofXPDEi&i0z!oWvv$F zPs^Lt8umID99NdUUC(%z-iZdTL4M$<7UD*@5p$U_b+=m`{GBlim~h5|U1^`cJnVk& zXm(-cwGCZH9rXXb)k2iNHc7y^)NR z_ulGd7D{wiAcJCF70(S>SPZ9G=uRLxWz5nrLoZT%`-eV*`vR-3?kcS5A8XcoDa?xe zRQ@i;R4baUFjA~6lNF&|Oa6hKKE>kAR7$BBq2CR+I@RUxVQb} zNn0>PuWe(#GC+}1b&;&*1mSXxPllqssyPs$^`Uo_t|Qnr@MSV!>Elq@v$N z)OGD3T!B2P!f{83uH&@ihsFJ@-h_tVY`NBjiZ3N%ruKbmU2q4*N32lYpp2nE^7UN0 z23_hm{A_HA_1liMFHG(^#Tz;so$Y9gnp5ao4Ca8#b+mmp17UszJO#Yja3~m5eprK% z6$;7P>+YOR61`uDSmS?<$sB@^$55((J=jn6?l`!MBYHKcx@XSOaC1$gh!BA!q$CQ= zX2NDghQ^h}C2xlWgBu)%UgfpWFap%HDmRf8yTVgh7O{h8?9sr(?prtS{0dX?9?=q$ ziy?|(h=M=#Wr&EOwLBYHUygIrHmI!6g+|4s%Ok_fVe>fPZzir%Jteam;q}KMRY)8q zxK6|dfJfOd1571Zi~_>*v+wD>eaIE;DvScHw1F{^{co23^IHP3ltzX%I2baafO{O@ zEV{wi8_SK-#g*g=JP}zwpAF@uxc|E@o#|1o+kfn$a@%KB|Cb%zc&?*z&$#ib`|dzYojiJv#;QN@StgQ4e>940_4gFg4 zd@aP;uG8a-&n-1OXO`!Bfq2slwflU03a+>IS%z(o=P#is&+$IW)pw@!Zt}0;hOgm_ zyqQnsLn+PI^lk3sNA~HO?a=7HDx2|+VT?%1uO zQ&KMM_0M~k9t@K%`#xPZYc^A5`iFyDFP^TD7GZC~OU!}6BBE2dA=|^^ucVNAmztOQ zo#k5Pe5GWKX_a`jY&U-=x?RUp&B5>J_fL0L=sy0l){xlqDPs)J#?Ru{XjgO$^)Ka~ z<-7B|vq)l*#0IWKa+BodJqESzq%YTHZl&XZ=k>>pul#j?AQrsr#ru1K96wELRh~z< zW=@Lz*ALLRO=c*A3C21N^pw;jXV`jgnq}-PQ-rUHL1yj*_BPRvLB(mZz$06<#f;olIMD(3UV-v9&w7C;VNv zxti$28lX6GHj|F-=YLI8-%y3-lHwaWB#7YQLcC%588h#H#orfXJz?}RbCcoZ{>lHLz>>spK{99^ceb`{3#d@2u@eYWeKB zl{nix_#U1E=M63xjVEI|3AJO5#z?)zpwbAJ^8+qGGEV&ub6264G_$%zuqWyP^=+N^ z1Gj#a3|01H*iYKFT<$XTa_zYEKkU=A8kckWr7WPktQ+r}GfVQVZK|46IZUc30VrWD zLl`0CvF*HRmef2h%}ULg{(IquXd_4K$j&;PAJdi;2PW6PP*c%zOM{XI|6kXv4RA7| ze=9qGEZ|fRsD90rKPfy|6e|D?RI;yB>ZY`%=~)7qXNBVqc$qMDINFWlR#G2tSxqJnT5$BggnUV@u`j}JrKHA!R z*$sxG`|0A_e=%st{Di-SVPU3u+F1!pkPjwo1}s<@ETO^VtQdBf4BZ++eK|c6 zc4-@ETwA@s)Iiui1H?3&99xDbX}OOlA#oS)&a0W_gVP)Huv(j~Nmm)+4PW0>uTCcq zl&;<%7)D`C7bnYG8WuA=tb|6>Dg2IJtwjk-{ZYtSb!oecg=5<;5kU|}R%1363FF-1 z(@jKo(v#fs>X|5?Qi$c4?p@3M^Vi!k}k4qYt zMG-MILBJ2`;alRt;M~JSMsgDlfx#v zrhExS-U>J$@vS@e##fpWmFcVa{)naRoHR6QfR?0dZH(YhEQxNK$!PpSsO-eq#V3$v!NxNo=(TDm5tV zFzQ)Gs#=%z|e@ zyHcCy_!zngjxfe(YI)7*w*}PgtidK)uY!LJ>c9GL8YwqPUsLSJry=9VLWOzYk(m#) z0^2r8i3m-%g%jYOtVn^ZH0M&TvVJHl+)uJ7MJ=$548s+>m;&Qj4rCvR|BMfdF{Bw} zD$R2%Wrk5qpz1{?xxYzU#b8q4R-(1{mBeK~5bd6riSAU)%YolL5vqLUUbXj7Z!1Gr z+uhlCz@1HixTt-+-pkpY!{`XeO;MzeAqC6(^0daA`Wm(?$CoI9=xQVb%6 zQ)!a7#=6%{Rce>R4tlkan5`^vJVfM4EU}NQ<1F*FIAU$_95bU3v^cF942w}=-N$~* z!O3G#1S3h4-_Ub`Wm|rDlNJuX8%u`*uw zrpN&Kid&J!*oIOI7uY%u@#21tuxBpCwsKTApTO2(y9r-594MSE$O;S_l-xi{fD-lF zofmdn+v63t{Ma4OQ=Hh&+an%tVXhU~RaG1E6GeEp;*I(4y)X#<`%qEBe*z_ynTf1*G4gNaSz_i4kp>f0?oc0E1~E?X+Rz)9vpWL#-41jQ*+1} z6BYO;C8vINBsatA?m5b8>S5X$3smJbh-XDWXd8VP>*D;v?^xcIcrxwT+<_EHp}>ZY zwQ%;#o#$+Gu9eT#Sf6>S96y@*sb%M z{J0yMx#5;Cn^HHye)U!&=Er}`(L&bau_;nQcDfLJ5o)5S!ZaU`DZG29a*sxdj=*F6 zc$0Y}roxN^xy2w_D2*iu0Z>9dH9+rnLYRy?Jym-&psx-cs;i|ADeYx0<6D->Z!UVi zfj7LqE{~_+Bo)i&twz&N5$LXr>9OL(>es#1m_i1sM*rw%erk`VRJEUAr`_KVHm2U5 z?hkEnKK!Q>A+kFg7b=I9p0t89Nd z=~SZj7`mlKEWJM{`*2HZU}Loxso$qL&oG?2^9uZn2jP_LH$OY`D*_=eBF{t{=;Knp zPLGov99i>-2U+Y=r7HZg#CLxvSgLF>J98Mw+Plt4xjGUee0T#3P|<@G3a2g~_E+T0c}g~qhWf{)g^Q25 z5AFYRG27kmsBrKuJhjrp(z)~J$S+73un%P7n;ww!Wbgi4kafZzc8~M*$`y>4X(eU= zLZ8|_uuw{_?wSU-MdRFHGz?PLWNI`J)a0zF0UI+A&2<@w@B_8UCfunfy8wS9`ZzBc z%Ic$8WxvxMyMF+WGxf~?*w#H8K%8fuJvE^6i#~s51W1syx>mLJ|3(}HXW1^%T9OfG zK1BBYZ>wv4#XiYlqy%Y9`ta50TQy!9?UMHVKT@#-z`UN+z4pd!+;+bH1)oa{t?&k)H3LjkEyjq%_~pW|(_>rh33%fXZGvb61`@ zS17^g6(r_yfJPpE zes<*SFV99kU%7GQ)_-{G*jnIby4gKmS?vwGzP}%YJ?8 zm|s>C*V6&D<(#zdL@(@n`_tOtOdpk3$y&f0b+M1yOL}$Rz=RX9Wt0;F(yUBYX2)GF z*pSwsTHnG=m(3}IdyjB7Ao8H<&~{hip8Zy)Ewx*8;hf=&Y{(~j)EE`L1HwMIowx1G zmYR^G63;a3b$v3KtWO`qS01rZY`bJ*@neH}L#g%FE(>lY} zl{F))V6J;sFRZQ@Yzu*S-M&0VfBz$32QRH39y#3pqD5;pJ7rQYercahK(xls^gaoF zXefAMHWxhmz&MpREYY+vk<9`DvZ1_w+laPPgFgD+10PP%#SMc0*+(uDbYGzE`l zaqokYsS~5knpP~zz!##b+lYhtI+fG&w6F)fz5Lv_Ip*c<`s>>`83o-izO)aOR>mMQ zh2|K>-uZ~}gW%SI2#fLDm`r||MtqWlWjlP zG=d6$-0i&j0EPK))Dk3Wg)y*w*Xy%7aMw+`an14iAA5*iot~#0SolxS7;OD{?zrAMv4Lr~3Z3F~;RHzp3 zERWZh<3e%q=@F^_tGg#PQ4)%K8TU-X+1KpjOnhadJsTqk7kuac(j$mXS=p)uf=q8r z@oVUZZYK4pUlG+$Njn}wg?xC;&p8uR6aE7q1fivM5hz-!?UI#f=ZJlSzxAVbczFv9 z8_|Ui2FDR_*-bvdke*aXC}jrhNiW)tEc;4_t6y%#M@n)c=}cufp1f}Y5g_d-nGQ`x zv>vEsB%i7IXtvuP%3+(MlX|inX#_p?^aRO8>?E)|iriKV#gLJ)akLy?@W@R*$=8x+ zw2+4nv$>o^hXT}OiipOoB)?jao!vmg>#^y$hzyy8?_H=a?`pZH+j9)2Lj4u>k06SlRo#KW#HwPfQza^slCFR-35n89)Ho2lOt~~#4W2!@hdIGK()XB>o&udiHQo^kN@lzPQ*4> zbDo^0WOrM0q7~S&dWlrpmPs+cIB`lKLnGP;^kk?Tr^0xF00Oebr;eU-SeM^sq?kHT zEF{MT5q|RVJt&95W!(drOZtVxvYeofG$Wo?4$rKcFgAU-I~2>WLKoCMF;u*rp49&L z)M6>9!sAkdch65(w3{xx<~8TbEF!{`t_;6mk>$u+3h;}?D#CP2CSaZIsnfe*T8(GK zsmms#a!e#%ZoRqqj;XGrlxf6~%;1wZ7sOykiM%)kR*(4&+K4pgrcUe({Tj@|ME&WvoXB~hBreZFR)ZPrWD-|68sm-va{so4k?I*|w$Cr@H z{FKM_OOW`>z30uT340H2k1X3Inp;W|yh@u-WCV^nU+*c}78YZ7M!dNY2d`9O*dM-3TNOgXE4CI|M*otOl>xvp1Ta zM{(#K{uprp2Hyeav^;;nBMhfMcF;+msagMR^wI{36tq0pW{Il%A~ z9azYgtT89@-v68Iht746MO!a{xTF%!2*Wu5L!ECVbZ7c7p$+QnzO!@~AR9N<^+O@%_fvJBV|<}Qd*yKB&1My#0Bcm`KGb_r!zfe zKi;j^bM-Miu5Q=i)SCC+e>ln`>hNC z(}Bf;D~sbiD-62~Fg;0n zi2kF;M|L@O_Xm6rPKmyEWeW@IqjfksNm&`s#%9`LjaXXSzN@Fo~CvipEK`p;Fk)))Nk%eXPENU&B zE43oNW38^4eV$cgxm}dMC^ytjE4}Q+j&&LM6JlM>>Sqd27INBe9aeo$^H5pYuNpRn zqyb{kBA_zBajtnJtC+JF!P4{qO`itaal~fwA&NR^{w&^|GtPVp5l!H}n6Q zx34S`G=|WsHY*M9w_7Sc{-~~ND5Xuv=}b#y9&h2NVAU|bC`^MAusYjB;I_Zi)BYdN z^;v(O7szz(`dnUhNh_xG)#S4sw=X?tT+)=3&OMNsYj9pPb0wOprM!dNnT|F2v_7%6 z`qJm}6X&zqkaRVJ!!dLaMPg%@W8g4o>JDVq3PYQSS5hdLLR~zIZFEc_z9VCm6^S6$ z*?1$Xa(=hw^1e(ujpiLz5id zvT>)Na0Oc$#TSKZ(8=uMts+rMtANufN@X6m@Ie=Be6_rve>QkudcIoJMKw@{Ml*fq zl~qxO(H3&8Uim6DgSNhteJ;O3XMS1cbX|J3=5v|fu@v#~;QTHF5UY(IG43K3rqjoR zb2k5YP>R^^Sk9+q>Cz^f+D-@y>z;-7kg*iMKxT?f*onoo18`U~J#kY^-u9_)+(z;izKq@d)Y zDwEODtQDYM_YeFYM1v8;sVoF9ID`pDL`eCC(U^cw;xAx>42hwectV&Z>^jd=6rW4x zw+pcmDnZ66|JSoIWHpY2Q&c9fg#$!WJ!Q3g@;K&7a^byrBK;)|+(y;-@fz> zf=-W?dIW-oqSIh4cS((Hbu-s&L@yI`T90UQ`Gpf0)^;|+j%Ouf{ZPI_9UqU(E{w*; z6@(FTY}qR|m73|RB2D#5cHV4>Hg8-K`&%i|J4d*a|A7A#UFMw)uoGE4tUnJQ98#)? z#(0Q1HXglZ=95jU(!80?k-jv7cdh`tX^5~?^9Npt2hiCnGFdlGJyXnyBOf)xoD?Cv z*=fV`>Z>4qpWs4aScF5>(N&{}Lpw9wa(C2Zl(heY+N=7<;G=y&FtGLH$6)I#AAbNg z?t52TSFTym28Abj<6m$bl;s1y_Uo_9l3zd3vcCM5rhohpUi;q1dG6i$d!OddH58~} zT2B$FWqYq#qBPIdq@9rCk5$GqJwnxp-hy zl(M2v2gXXF?p*mbL&>Jmgp6zY^0IZkdedYy7V8GDx0qUS>w&gn+j(7=U#h)#4_~F9 z>G!m(zPXgExc2}A;$1zq{^6FTz=7yF!1&|r8v}=wqvNA?onH@+4g=QzcMHQmzA)4} z1mac$0bf+(Am$pWX|< zCalD^ZRO>6%T7Pj0Su_qjXoOq^;*T0ulId5l>tv(yVZOJHV6*SuS2V>-bbxnGgIy+ z@aWrcO__aqQ0dk&>ICCcuCnbr?!?okfj4!ROk00cM-}43fvD53g>vNbld~%9&&kNqJJdvF6 za84vF>6{4Exe-B!MdJGiHyo^}<2A%GmF#qx^lT7kJ7asM-PiBhVEL3}z6=}J2lb?s zh}!+BQDv_3M2s>ecu2LwWMUJ|`t@0K59oEA~9AH55Ck_UMi4XHPy(j zUCOVlT+YwAR%0?U>`mXwk<($-3`S&4K7+$9sTwAumhqhfWPIUz&ei7aPf(uE5iZmR zdjyIBPR``_y{;##ww_g!SjyH8qf_rMG@gJ!5TybXFGyy??R}+HKCZ7*ZoJaMX-Xy|I-Ep^+~YRzt3(PbjZcU!mQrxmK4=6+$!NWI zerRC!TtH`+pO++6CX?jxNKxTrVx*7TAPOp$MJQvFViht1$`<-ILUZRwh%*`|$qtr} zgsxZ?+TR0r`L_GO&zyq^Y?Pln{)4}PCwwYs^5piHu=`;J*fzJif@A;dU$F-~EfGf$ zB*KSEE;O`vE!5_EIisT}(o|Mlw_@9(1>ghanY}UM+%347{do~2dS*gsxI95bt)SAf z;=_V@2rNDmerOmJq~vwSi8I>c896AdG=*)qb+NrNgN763_s4@m*mmQ%R0ZnU-RCy$ z-R*zU)z$y>&fUJv?m8;Dt-g`mLB)T{J=)MfZUyqJprCW-cdY%@*RKci0w*XjmKzdE zjtq_X)qT3KN3YVIs7Zr(GKFQy>3M29d_8!R&8Z2YCzA(qnVw;>3`7WwfTeK_+-Phf zET}d-kPnGC70*gFMN)YsNpacHcw*WcJKheqjGi@K17_(>nBcrM%$dz9|)j# z1p#ditsIU^3p^c;4G4^5P!bY(T+FToWs7Hw_GUfqz=dtE#r+Vf28Y$s=v1AV09x50 zii26qq%)>Y;aX>^kgAQNOYM-opQ6GeDd~FsP9JGB60gGG${3n~^Oou)E-xvb!9zlk zK2!L-ByF&B6AptIwX2pRfl7PAsT$Vg1UWEpmJ z;bH{iz}yd=+#Xmp;eXKEt`fuQ`;@PdMuT9EC?0gi}A*CC0Hao zIWd9815~45l^^G+)>jL<$7>o6+G^vhqxD<29k}wpO zf0S5C{{_U+Ba7lk4m2Q3$%m13M*~rqW#3yBrPN=@W#F3~!Qa~#1wiV7Umw)3ue3Dc zCida^r1WYwx{*z1V;UZLVo4Pn)i9|?H&%V$sHP_5V(93&JURuLho)l^b5WQN%090q zHgZGKE}4t6?Kb>qf!sL)0Y>T{*9g6K6x~0oZw+V#CbJg=@A_e}^8wQ#gO!k8%JfCK zwUgZ3PLM0C(%4FnY~i1ps8k#8c~=*ia^b7pYzOvsf2$!YfA)5^W7ledh?K<^v85aD zmFrUWfp4Tl*{-NHS_jG3zW46#DF(oOl3$~)S$Vp9dY(9Rez2MehA@^m@#P>1CNO78 zMeHoLh*Ypz&vp#C0IMOZfK=$vunMitH5Em8`M?*;VgXMhLCLTxB};#HJXgRjVsTLS;XHan!b9P0mrA-49v}#BoBSm3aRowaMKjaSazc>{R2$+l+O0MCV{Je z*4-^xhiYOuSnq8dDKh0&Xa3#b5PjGIE<-K>o7m-l-z3QwP2M~ch`rS%m-a5M&M{^E zt#t%{_$4$c5gTi7cL0PVJ{E&G*1C1b#El8Ga^XXNEqr7;l)1KU1~MEkq+A;6^Mt?Yy6P>x$6fO%#_g+-I93UWv;VYtW<> zMb8dAE?-KX+6lO5M80d(Hd;^;^L-}Xvh>LHC3IjbtF~B84aUOmWop}Nk05wB`O3ss zC-kq7erTn6{i`>3nNc)N*SBwdHaf=soSVZMzQdTcA83w10Du5HU|vZzE)TAU4A-KL zYw!$rqWo$Q-vLmqgBg4EJ1oZ4S3Li{@TnVj0eaOsssPg(+AmoMwn6^WLnwSVo@$5$ zGV;PEZz8`7$Baq&WyPJ)#2sKub)a1$G;AB(z#HSWeIr}a=HJBei;P3w^GjtpHw zk)sS8@XmBoSIxb;zqppqaSg2EPJT7l^C!8EAGh7WC3L}B>U`mp)QRHkU!Pd=v7<`9 zgfHZq8ot&KIl-d&q0BODEiO#~j`7F298{0YYXspaAZ5VgIk<*Mxf54#9UA#NTwoq$ z@qw6biO{GT;CLTahVi>%?fAgN;u9qhzR=8UV6K@7 zikVrS3hsbnu7}^b4te|?j>UW9eLMjDwjcRvZa@!bcJaaOven3uTRD(2ttC@(a19x; z9k?}R$Eea$Ljp3YHF%h~17f)j_S#yMrZR9$8G`YX$v{-=*!>%-2*In;+TZ*DWIJK= z7mFSDx*{MNJ>rnjo`CXV!*)VdV!M@8a5a~uDPc19bn2sZ1X${i1P7_66f0D^YU04I9G$O3 z<<@@(F}PmWKdt4hc|f#=JNfcz9e>(q(A~OqjFPRPU{Jm?>Ss4B-+<%@RUIHxRV%B3 z^CwHtlPpikd8NqMKDXEzQzk4{JHZ#W2cy+H!mD1{V>Ip=Cen63 zBV#rxiz@I`&QgU@DzX~Imb9DA-}9f0tCzI*j${NM@gGoTaO&^CKPGNPzkn^UcRLmX z9l)bOG7Z)|3h4$m&a3Ag8Z80FD!S=d@`!~o)t+?wSumy<(3pO2(u}W~+2Ju(k;Q7( z*xG9Zm8dm&cP@E#;h<4Q<%-{iJaOK6Qe@)1j?}l3-g6| z)dX=hULfTu0syBPnY1=ZdJQEOS`-6RiIWjL>9^1n&@c+IYL^j2Bn%GB74Zt(Ey!Hy zuQYs;PXj<=8Z#gh4yaY8$^x#2HLwTP!a-wyo|NGMJcx&|7!P9!9>Jq{3`_Aimf?v^ z`EjrnIuP$8;VEr7NHr$e4lSm_vWKue__FoTNtjw4I@PPwb<(q@6?|Z^0p7rU4?NW9 zktUBl@l>;C9ArH2umu>&`-y~k4FG+9-_8%#ob>2v@BPH-SgQNVkGo%I)l~Jvx!dn! zm&DGF$4A%R*a$lRogd?S!TNBaYWXj+4gkPQ%{_wL8m`uLS7?i;RcrEST3M4_3(6 z;}+qg(qVAq>NBJSoI^fDgs@V*PXXS?-}{n3Pjb& zODdx-GJe`nGHYy74s2EFl_4z)rW=lNQXs zH)I2-FJ3mC>}r33%;1$w3uxzx_V!f&=bNgT28gOvfKL4&f@W9+dUcyxvHuV7dHt)3 zU_Xkv9zQ`;JniBl5_{)Tt8FmfKd66Whe3*v`ch~MUX@t_JRvAQ2-u8$7U<5Cpsh=F z`ICq<)l4pcc9x|=aEV(e%jr4LRv_8#gyeKQ^&`Z2zq5*VfotlaSCc~}!Pgnpis&Pj zphHezd*#`nQz5;Zk|0Y8*6d(}_H{7~9GtM0ZqPwGo;H?+1oSHUU+7L->7|qgLVS8T zeMRSj_n|*RJM(ktg+0lY-c6N5AB(Ywz7Mmr)biPUcpET)bz~1Es?1sf5j=|rxtJT(C{2!FxO9?2PZ$twbt;l;j z(sq70CJx{M2lamp!Lq*Y2lNqk%;f%r#}-ks(*He;x$5T+H0WZ(^0^ti)vWOT!L9;3 z^IQs;AEiJ)X2bNTJi#}*g3>MUtlAlVskZ_E=H6aoNxmQE%enc`tOxYTWeGdZ;`QHV zXfO%$unHUTitWC&(+M=x(`ZuqdZSFuAcn2(#a+_vZS6oOd!WlY+I0i0w^A14pD(9z z+Gl?5Ps19ZO_qLTt;Axiw3WZKtA1rjW8~B@zyfml1zl;_SyD)^Ch7H?H39>xYm zm2+aSez0w@dvJ7!saKg79ee%QXU9$r^$(Mc9J&YE&U-iS#BjrK$8hf!$jq?DSO>G7 z$bT#UlL7<#NcQO`pFa8K$yoEBLx_&8c0dM1{TE0cXYOGn}iOJKT~pGtTTR zI?k=*wsP-t(>sxzgs11NI@`s2w2P51ZJg7%vT;M>tHs-kzbXE!_$dD(znS03&+JAE zK0#hnRnwM|_e#Dh`K#op;G(dwd0O-0=I={)m7WmR3)@5iQDMu}mdcjLT3%>*qijdn z_hq}vYDAaC@z&DTU&|jHl{p%%Y;1dJ+55|pYI*yj_Q%_QUw&};S(!_gBb(4Mt7An+ zRmYYUzpXg5;=DX0FYcV)xw!N3&O0L{@p6p7k`fb&LRc92eX7w6& z>#3e!*BVvtuf0Xk#^(z<)ME9f4cP8Z%_;4~fiE`JXfJ8owcXnE>5M%^I<3y7i|UF8 zXACYM+%TBh^v0%b!CSo$k_{<>=pbfDE2In351E84L+Oax{sQ=es2i*_#frdj9 zp=78KnhVuHYoSM>=b+Qj73c%QOZpF9quzJY_d}D&?}gdPAMG#lFZKV-9+TOQ)Ww#1;3l0lL1~Y>t!Rp}J z;IqNw!Iy&HxBp=OKiP(OhlGXTLqs73A^MQvko%6$9Dh6QLxVyUp-rKWoNt`pIR9|j zhV2PE92OiF7e)#bg%yMy3%l=j3Ri~TasTDPM=V8djSP#-jx@puFez*%$}P$-Dm%&) zbt5|v&WDdhJ4OdY4(Kf*R~yW-sA{NvzpQwf(7zRfw5csp>cV&&!^6(b|thzH?!;m_e8;lFilKRrK_L|QAOSr#CoK_gpu1@$TN;$Go9=Qu@bFyjD3Tzs&sh$$OrBvGTpj ze{Soefew%aD0l!u8~_rjRjy>iFTwU1M_PWMF_#`cHkp9Id~T7V1a@iscnS&0QJOf`jfcfb*x(=E9eSnT?+Yyn-pPj&}BX`#YoXYHP^;AO!hri)8z$JzuThB>d;3 zoUf=m3KfL?qkoQp-^7Rq|nA-o!HBLzrr4H+WJ$!1l{ef#ft;VDKGY+sSiRWW=v0lc|n99s5 zMxW$j1ZulTxdg5@ba`J<`>}DZ5g5}n<)pa|Xx{++xvGE)SZ!##2X$GqW{yM^)|Jf92}M#RbOtq9&r(g)I4JTwMVgSM2RB%a%LTP*S1}=>Og2IW zI`_(0qFH4Nm%jnmOTQucXwAVc#fFa2m0o!e6z^boOgJb&=zouvX{rHP0R1v8O^mw;|OgD83*Tm}a zEVb7Yo;4J~GBX?7OJ2dfl1DHnc@f7-2H+Vh?{8L%d-StKC8lN`?BT386D$qjfrW$} zEThh{jQU?{c4v$635eBEuG=7%AO7bFJ~uNeh;d77o@NR@{>hq`cek9d{u#ST zg^nKa_hvtCNN5)0|ITp+m!%WLnM zmFC{Nv2NdOU;=-ZPcKJ;eiEkp{FUfob`52M<_wW2O0ElFwH?<(?e$3v^PS^_2NI)J zj6GT~!$m-+P0Mh163r5rd_I~-OsAmA`YYNt3Aq^I1^iH8k9~SOoFv)fbL%b&?U$7cC!rIGdsMh5Bdu#4 z-2r{Q0Kt0@*aBOtK(#tv4=nozdfPu0y7>3Ewo)9?&ArKoV^_kEggAHG;aIp}3`Q*wJ(qWC(?8(lptEGdEO-GwsCdcQcfu7E`!Y$Oz zVSKQ>I=xVlKnNijDe|JK0H0@HS)Sk_jE76em6^#v$@Q`TFK^gf&#Q$_FRv%==jtFM zPoBlz9aR0*uM2-DdKH=wJ#=@ms15R3LF*0?R%6~hqP6bjQkV`i_9IlQH@&hW77Xya zG|sR5v4+=-h`O>c!1^TiXi32_=YRkngE1i#r~fIt z{<#|H^ztHlX@xIpH%D~;cg{=ewFZX*dw1z}Us>Cze3}A22d{9AO#- zH=ne)pp@(uY)e2uq)Y4VhUSJlP-bT1eo1{iAbAN}OCH4rlK1di$=`5Dz*HwSt}Q04 z<-k3^YeWPGuY9B#J8o6;qBF*39&8CuO*S@^C-cDZiV`2%r3Wto06)DuMP(P5iUA^$ zN}=uKb*_SUoruhw+4*k7N`7}|TrQ{1++l_PBG3(m2PDH#Gm=4F?vR;TGWWH53Do_i zK%QYY>ZvIsb!j?1GmZgH11-RYK)Y4ZTYFoIgvm}NCH?HliHW!qgS|b#3ACf}0kP*3 zC|)*B&vuTU$zG5R0b+g3yxz`~@l{V=IGg>ovfr#F+}iWikD$%?QcUS+ zi)%nn5V>K4#$WO~ce0}54pZDwNu*FCqNbAw*BtF@Ij3fIU|t^DL>CUcfhMiCLU;8F zI)-L&11f4Myhd#m4+CdEaTkT}iw!lZO{PKG8$Hvb%Llgj}C(g;=I8 zya+nE!)9=o0lDiZ>-OCR>)>SzL({{G$@0G1oIKR1=o{fu4{71uEm)nn>wwO<#e{4K z9?`*qEw9j~At7h}8&+gH=*e9q2r?Mv-Y2BIt)JlfZQ)2aQ2G{TPtA9)8@`j_zN3fmwXdK4((l2v3Byo87I}XMvo^UmXhuO0e=#pns*!Lo=2%`qdVU4!2d0@rf zTQvOVf!tUG@j=`A%9X|SOUb5qkJY@ET56@MN-YIXo$)l+_)ew!Q-XVKWlyP@t}Hvx71I0u6MoruV;C`J;=0P&js$ z!w55_YsTCynm}zz%SsWL4VXS-+!BGVa5>NXAv%*nhin*;ORUyUb@Et4Qim*DcRT$! z-a%E~Z%_dJjz04a{9y%L@V`zc4zw}C1*$eN5U?plLnOfPq&~p_pd1z)XG-|#Q$4PJ zUH?aOCedqlT8ta36$;qmV#q(kUI#SS5^L!jFPhBl2+*M8 zmkUP@8i6L2IXi2WiQL|%%%$?aswX6E+CuQmV8u$xw3`UN?A{tcVHg~Y1O&kK4nS;e z*&05wuK1-n^;=v(3n~3f38F^8+Zo!RIFCM)7WLrmixOg=KY#HH>Xw$2^N6kIxr}g- zgE|hjBFfL&tHA4}XH?@;_3!KeoYhX_ONf?;NG$e*v(GU=UtGlJ=r08iG(0QO7w4c> zZQg-fS}cSJ%${F8Q_}@zkyGa=R1X_=w{mn5i^3xTD<3xRRaIcZNOt+`RSG(pD~7SZ zjM?~kI3*Vm+$lcv=FN!wY||BjL6`lPg?k_&WsC$)wuTA`&Iy3M=))bF0Rmo~RJW1R zy{9V;lsj3jv!{sltEQOd2!Q0$7W>=F5-&e&#!$*b*BIs;^kMLt*_IztqnAL9f|0A+H2=J z@l=d1^|=#H9x@kFk1_hme0+M3$Xlmn{XY7~?24Z9&lyzoLA`@~p-qgS1wt}O-eSkgo6a@>| z&o3zPNS4DatyBj>6LOhZ5li22Q0z~P?p|mvI5A4^@Mlg)meFKaX3K(`48GLi^20$G zlgplIL1)BEMmrlIRBUGBet_UvuXfJZ?*6^jd>1+cjCLr)AH%Vlm<9)>Kg%#SkE=#Ho)vCBPvOCn+ zGtqutvl$-BgN3PMA0NK&1mj~9I}}m0F+1-5_J(mrn0o?Qw(cAYa|?$6uBWB;r1iqr z_k);sBoJiOdAt}s5?rg2`fA8!s#_g!O%fb~I4%mE@J?q$AZ_E(ZpcyCD$r-WYWT{Q zl&8MU?D76pFN~LLiB(h)&@LB}zPH+Au@pF!O)yKVRgZ{t3O@8_f^1#jUZza0l1bI# zLaL2ox#mBx6?=Grzj;;X)p%(gn@D9W5o~{#9_nbF_XqpP7n0uwc8Lm0xnSI*=VAjl z<1jnm2PlIlZJBD@y!(t^?+vCeNF%k6g;{a@68Ja0&bVc zN8_2ZO10}bFe|I&_&@*drH9n<46Gzdd)95d4f5*BA?lN3<&X&YrO`CgPm8=Zx850( z5(13pE;)GYsQlVo8p}YwU?R}AdUf8uAf&9fPF^eco!2kH@yg)$F|XNB29@oqsI;9{ zyo3)cmD}~pBnG(z`;rLLi-(|WL|g~!liogE(z%F<`u+gR;6;Db;3cb~QxG(TPjsqf zqOmU%KiIYI??Dvo#k@wX%IUURcc1-@+3ipoZW}u`&hW0z!3!DK$0~CZYvp zz(t$snAQ~y45r?%oVrhWVgmeo^NFS-VB@M1*4|w{T-S0dOoh1_bH7%vw1hrXyiG{T zEw-+jV_T*UnFXaeJm+Y+8cYyZB*p}AKIkTfB_|zA_`15fYN6C_;!}lPytcX=2?(@E z29$;gIt{+g;STwyysxj84FlK7?H{*gI(1g}OueV;9F*^D zm>ZsY{jCM33e~8CzHS8MLeUa;#C2@RAF)XCD!wPV7f-02V^*;HpnHq<++pUy8s`mj z@Ks?3NFV~a%7w4&?Dy(K=w;Jxf@7dxHpB!`U(YpRRbUN`uLiVq>HY~DeSSbuh-7Bv zD2x2uM6D^a8l6F+JNo%J0VHRp_%bwPM8Pk>rwNYvp*7`KogIY+b%CyUsY9*T{ny-R zsDe$Ee475|wkmeDPURDA{&hyh{TV5sN5_leezExf$;BrTQZw(Nym{a_&>`ykL0kUn zK2iDYquQDtYK@5=2*6)ZF4?3ZC2Kl2s`33 zwpa9|qbw~cZSE^SrIdsIoNY>4Hq)h|wl;lEh_4i6owoEog#XZuzNl&c*BUScNvLV|6@1xaPTbIQ`3}kPcDAH1 zR!IJfS;+zXM6wx=k<7;O02Y`WGo6)|E{lRqsb$IY7vRf@*j9FtWnE1&D8V>mse8HC z;~OZFNS(dzGvKaKT4k*;%D80O6T-pZPTv)Atx{E_2M>t2%O$**=7L??i+Yo4nkN>$ zD!4o5WkbOPo{H3wBTA+pABN94Cx^|r;b#a_0W-~`ra&P}lWHjFfBug6`fjbWUySSQ zR80-;ejJ>iI|=772B^wtUenU{Ra^Thw8y*J<%@6jG9=U8`da>Bda;CwkU6Xcbr3>& zEE!Dk@z7O|`$MdgfP+?1c&k=?S~A&fQ@6_ACLO>GcqwXqu<@;%qJk}n)OaY0A;AC^ zum;^NF3?7S8MIB5^hah%2Dliks8+`6M_IqI!Mw(A6=zhZ`6=ea~9B0;0L|FaL5i%2@M1{Fat(x zY{}UXsy1S-tMc#JhECDmp~d#3Ni2lU=)tonsQcwCefDWBy&e4Un!{(%n^5eByN7>9 zpFv#0VlDdKtJ|PNU?s0Vs~S^09K$LCD_3pSGS}Onfoe0vt=N(TTW)jIm#~74-kMLK z0OqVxySk}}c{M~gRwy^~JGy#DyzInjFd1|;L#JUAvr>$ni56m`1wSGo=~A!adGyCh-WGpDR1CBv{hg zPI8}#ldZjq1fr;7yj{@vTwcIE@jiBdvKE21ZitZe-3O_QabYXxIWxgB$=CReukk5xC^XBVHU- zcB{6pQTi?B>C6r#lI?zsM)zDUsP$&904l@I;AJ7kk5H&j!k&2cIIoXULIG`DoRmOb&UV7}Q|<`2Ve%lZf|cAVlN z0@_@yW8r!-!&bjP8edT}Y1@C{5}rQrvl4zMx2Nv%&!7@E>P&ADis5W@R@Wuq8g}X2 z8UvCq=(B&(IcR(dYu&C{eQZIc0Bzg|*arb4G`k9Ma%nj^y)TLW)@;7!l)Qw{divN> zbe|X>@K@q0iRRgAX2tLUm21it3=HR<<6LOC%u&`L4H(WY^3X#Wb(Qins~mqs*=JX9 z8U8PeH?f|Bv2;Xl$l?P%ahP)>qKf{V%R=vQG0#@dD9U zffpwvNLcq*e`Ca!?L21WSs=_dp0xYS0jU=r9jbj_vOTvS(dsp_SN%(4sxG=|xZz_n zgVQt7Lk`l9lsYUZv9u@2Y4R2pz^DOzJc7eLxid$oAbuevs;F#Zpwa9g<4C0*qCrlD zdO%$)brE)QDv*NOoNi)BvOIQELtluq?P7Scy*p3cB^ON;f}Suk9q7aKtW(osXj3qP z)7yyOR6DEQ=W-gqxwBF2ars0)tfup1X4h`S14#*e9F&G-GkPd5O@k^INTl-d6b-Wv zszw@jZ9>RLiPP8txiB8q$Mj95n&v8YU{cVXWGq9H!U^M9EW4_s`;2qi?LJB47<+fe zVYz<3jzyGl>WIn$W45}tbA(*jVZd48SIDBA^6_YXn<7+n*SF5w5vHOY9D8;<#8Z|n z^_eMOuJqPur~y&?2pGFDh$v?u#FSMOs9cZ)KTJU#nk>67&?OXzHLok>4aJwDwkK|p z&w0tr#<(N}KUmHU2g6a`4MW7bR8ln8^Hh31j++Dqut5RV-zZ}a#|M+%0Njt5lCJol z{tL_*V{I*+%I70vA_DrOafFsdY?PYYRH+6W;J!cp8`R0&ItIV!|MXLDOmhwBzfQ8i@;z`d z>h5>wc%duRW5-ge9{i#CZw>ygqMqx1%g!tF(GM=8Qc@BP<(Dcr{u^}S0*qxbZ89VD zSgpoR7~x_-ALBpDqpkdM`OTqOU+2f$BVytOI|YlKbDTm{7>~5z0!7>|;x9 zB6H_*<4s3s1ovXrH0{=?-l1>f5g|&Hz~ZTc&19aak?RPM0fQNVV#>{$5YkCw%|n#? z`fXl@-~Yb$G^6A1yOBq46OcgHU=To4-VFc?K9USmEuDRYW5=XF6zrqx(y9M7J6mTZ z8AaE^qQ9UP$nEw&ldM-9qltv~KO&S?&o-yBuk{$*etEwOug8)mR!P|(T0;O`CVmW(=<0|*I0BouaaX$)I?+!~?*pc&y8^YWy6nOwmzK_Cgs z&-L!G55m#v*1J*ne>nId&KP3ZuD|K-3Fo9c*~VdtTgbX}(q;ov{rDrDE*@xW{ zW2P_kGm$yk%xC3yAAsa^4joYTu2dz`;{oH;V`Q)VX9`)d-1OPO#R5DZywo2EWD!iC zCiH*B>$5I1H>^fmH4MvOV$`J7X(y*s+e& z*Bnsb;LOCjYxh>Un7$pwp4U&<4|_r(El(wzsuzXH3G0exz;s|>=DKD)1N2N} zN1UdkBDv8-lVY_?jjr(H5Q1s7z`ByRdtqhq7#4?4}}o2@&Wi}}^D0X0GBcg_WO0$IL6+22I- z(682QEDKUF-Mven0L)i+9wIwY-}SDR7nk390(7wRdYbn9QvgOd@>jJzl>M8V&n01} z73QJp`2cnt*9W{hjfm9GN1bLJ+x&o7G}*$Daka@U5cD4#3p%dHnyb}F6VciHwm=XV z?V*FPhYGc!^56_(oHQ-yS#&6Xz(N4y7%na%Tu`>6ejTTP_b@|EhB*;EQbbq z9n%;{@Hn;;YV|B}!BLV_w|mUo3_YZV$-TeCc8uOiio_wksnY&y9xz&ONcpFAX}VS> zXv}O!M=d`=pt*_X{_H@oZD0tgr-D(pd8#Z@?x!jwtV|6H?;fA1?&4 zF7F>`6Rz6SBgNrT`Td|!opX{oEjLroA6&0K_}A(J4fKX-qO1{g-N{o*+cg&(vtft9 zG?7^Se`r}~PWY-(69?Wn<@Do@Av?MvgC70>#`W_XbUJ1Tofh$5iX0Z_fDH+qc?a7= zd6H=YZ~p~rt1I=uk;jh>jU8=)MRXQ+2z}_mkI})PuJ1-Qp~od z&Ht&3aI{b71{68Q$0qwe5L|sAWRt-NApO7g{HOvf124bhISe*d6r6>506hOih?npo zL_#A{X!~Q-w^`H9Uq(DXpNv+fX=$rHDW5)Rp9qBA2=1B z?q0k>@gN0h%Fo@&?!a+oTsz#O1HT%Bp05%x!K&uah(0uSjAlr|++ZB_u2;M;^a{l= zhnDMfTt_reR%Vp5_UY(@AsuCyGEdXl+=s>Tto>RE9hF3ueB63sSfR9_Icn}yv zoglb-eAaftwKyDXstt5*;Ps z_hQ$%Tf4KYWPPy>(q!GNp>2w6PIw@6VsV|uV$rxCv>06vVWF%&B!KW7%=g-2=yZ2N zjeF#oH-msoa5|cYmUwJHw9&F#sKk>Pc5EHw*TIGD;`7^!>;*sS-`_a^H4fn1t~~^H zhchotLW91YabP{xg7OVk{h#u9b{VMuG#l_#j!%Lzguzl(gnbs=)@-rc=T7cES0k|EzTjHv>k zGvwTfa*!cwzcn}C4zPyLv#!SvJhSMVTk4BC^~-%_Ax=XleIfWR(4LpC)m5nHCvv?j z!G%#T2IIIVD%CXBY{9F1segcO`FDi87T#!U*{J^3<5wz-WZ0>#2f>j5eyunLky<_` z2;rWt)bb3hO`9f}Usbs2Xdr=oikAkXcoHMRzjB~M2PM+YlbQ|UL70m2zQtUU0ICa9 z9DLkvo}0~vWe^d>hZ|=vG`%b>#1}!cc)n7Vy+lD$(u>tX`KW!Y4N<~YC1g%dW-Rym z_+9oBD>OPW-T8)RVJn5!*i&GI$6zG5*xsn%m?kj0u4>+B(5uxl*s7yyi;`!JETvb1 z-~cWq&ck-sf?Eu`o6&k-rvu20GI>gFuXSZ^bSnge9KR8geey*@73{FE1`~V>eet%f zKT#j|W1*+7bN!nyz;g@xdLkYUCediQXHuwx!dgyaZfv_%TeltT*^LPc0b-Rw+n}J`_{j5WONb~JC+cT*m4j7J~yFV_*Rc{UrGvQjL_DtD(#P;2WI0I;UxN6 z>(Eeuhmr`_pn~P?HO4UsTi|nJ++9dy9ztbyyREKRA_5a!#I`{MNixu!AlfIm);>kV zBx!r-KphdD<+`>Y#zwiwVd?z(4yr(X&^%HscMEdJDJzG7b1PZTu?cT_t|-RJ}a6+-T7SMJ2<{QtzT!bVE8p~ymj z{bC5MSj`a$nvP^Rd0e!Tftd`Y$<+#x`eDN1<+12o1|sZGl`zf5uAq5TmB~q+hu(lk ziF0eF$@|`D#SJ!=cpP4_iJxok zDw_{wjiXeB^TbAjQe?~QPhD%aP0F~f(CYkt+hioG<+EbiYqQN>*)5Yf`yS~#AvF5` z|DQK9eZ$6bTua&!xea1U3{*XI(TWxhfm1KxhpcbWUdig+8+v5D%fN_AI?lm5P?*j= zAtLS`w>puac_rR9!U%S|VPchmq2(2-wohvo@Seb$y>naa6ZS67?mNGr!PjA?m1;PT z4$ugc1=5@OhuN4{>Y#gD(^Y_|G$KQ2rY6K~Zso`*7x??wpnuZsEeyrot{UV+g`pnZ z|P!Q-%8Ghz1$p6l}V|q6G>tr&S{vFDjj@O4@paCsG>fKKB zX>Iu_lSxr$xa$B*o#LzGIMsrGJ0ys|ngK#7Fz|wOXq^H;0m`lcJH-dCJ`WvW7R0vN z2#l#iUvHm=0DdQcv>{JADCivxz2NVO^_swTgm+VjmjVM++-AceqF9Zvq^1Q(KsmGe z09O1R=0Ii6I$5n(u`fF@0>de^FIG6YZsdT1hlkUv)q<`@Jq0hvX*HO-x%*&SEb+_) zIRoSS!*2a2Oo|n|W4)|n^3eqh)5urolkow#sZ3?BSy@MkJ~4c38|NNZJ#>-o zHI`g)?-o%Fr$P{S63&`; zII$M}4w_jBmj&k@%}-kowQ#t$?ZJf(am^E7+0jN9S$oxN(F6X0x8OTN*ghtn4f!ZZ zQ(LqOvHOzwUwoQpg(^RKqaN}TwURC&_wWsemarKGQ%B_U5u6q^Y^!Yf(b0A!CIJg= zFxz?TlQ6*-ewRaIVcg{Ss~WTP#KH7N^N#%1rw(bFKMi2I<;0M zCFV}Rk-crz%QB_Dk+vSPm*S+&irdVw#YJW|ohG0;bN%mWJ_FILI>M!<{&t5+MMK~R zl^tG?k4O;$a0XQ4opgZKXb(|BZ>1ouV7d|rX@4i}hmBI6!OX^9vNd;m5nNw(^?O4k zGa~laK6%pbvn<40jvr+%-eqBc!_lLnR!`>%i0X{*P%o*pgS{v#6v_>4f?N$dJm<6E zlK4Fz9|Gf{)ob5@b?XEG5M@yGUNUX|GRNNR`3ywvp|vPr+6{h5USGw_X3xrd9?LR! zzyO3VCm@{U`q75&EvreNV@{92l#N607`{h+Qi{>u3(x|m*dgwr52#7rB3~71W@nKAt2%}Bf+93+-DSw0`lXh#Xr}(^aK6{aCbX%16cZ|p z#b(<$aDt117$1>3QZf9cAqA{-(wO`9&rFyQWZUd{v~7O)YzDRXAr!HDBQ4J1n#5cV zlDT(r5;?8ktJyI3+A`hEWr*CRSSnvuP26Lv$P6o>TBmM}9~BM2)*jVXrtUbV{^d257~M+dLI>qiiOcO+N8JA~PuUOm25{E| zE3F(bF-c9whv#)$6KTWa_{zslFu`$-Ft4>;0<&S7LX|U+p$k9gcExu4!-!cq#?&)z zWI#yUNwhgfKm(upcCx#%tSDA{C07|EI1rrD(vmbfEP;;G4zvuqWeNe>(WOr~iRfI0 z;aC{?%a#Fm6=ybjJ}C3*MgBmu{dM5doiiwv(Gww5wEHHGIg$7YuvOUM`NXdOG_qdt z^*a|AX6x~Z867CMCm`v^jA2;3B|*s8S2f&0`@gJyaw#ft@n3zltjw3d@ya7wcXugqF0sk3w~Tv_du|I z%^_yyj=NdU$ZsR3?7BKtE(zNcPj^3nq-$!;S*U65<@6HC$^xV2`svL%n)Ho{1Mr%ayAWY1gz zn>l_4+NZ>GHNv5UhbiIA?og=&QU^$I@Br!D6#6 zb@0{`2MszyXu9xx0J;O#){VS0R0SR2_Z-xqF2nWv&Ym3}tuddn`-dwOKuMgQb?)3{ zgO%^hnJZF7SN?s~^A`C^!n85}n!ok6Mcoe=y(#<=GULkVU)6TC4TY7kkg{r+j1x@! zh&YNMey2ru`adg|)$5Unx))gxb4{0bY?W6%ayn8evcDZNUbRNtv!?bBlZ}GgD8%#I zpI?`H=D?=usW$J1LGbh!=~KVQuE4qv-7Wn6&~KwhU;8cf=mhCTmc!}DiWG5blRFR$ zxJ_zK#xfABjN>%MgVb;dg*LBMB=SU;p?DaN%K#&N^8%Mk3B%Aw0V}2JfV1-GF66dd z`KA|PV-Q+Z1Pnm!FeN1=0#IcE2PxA0{5kk^Ei%{QQS$Q_;;`{i{h@s>p}8Q(_HPR0 zGBJR}(Uv`+a5b6_0M8@dbbJB;QM~2D77H?i zAHok!p#UNTMPvQYN+ury3*cZUc6~;ntd4E+5s?7mZw)>fLn<{U*nj{Y#nSE52pG)> zzlO4ssz|v@0L$m9u6sbvo1>or*0osjWD3gN1?4r%&wE;{&ax^lH<=pPX(Boc8Zp=7 zTWA2kPedJXnUX7|($C_MdJ$|d80b(BXo!u@wZH}baFj?ieBMq%zcL)$o`Ni_5};-_ zboCfyK1x%{HM;Zx zWOImwE=~K$IQ}Xc){p5&LW^#5Q>9|+7?1~08#%f80#KVkID{0RGqyylIVnxcT8Mh}pVcv4HlY6raI>Nj|Nm6~LI2V}r?xqIr&oLZ|k0TmgsD z?u-(eLto6(S>I)tV-7lZq{p_XLV(L*!vR8y5QT|g!tH2Le- zHD_rUv4d{R?jM}s9wCPKGZz(@N%ljk0s`;?@$pf?S!T24t;(;#s3FIJ5qW2D@Vf?C zfa#t)`9|*nr_;-~`~f&wlr{WvIA&?`+v^iSU~vrF9Y*G9a%xYWo>|(QSViLdl5?b-!(X%| zPbCfwzJjRF%vtuYiA*8uM=%%tR@$aMjf--1c{VXJks#w9~{H^evc#Jo$miG4DX%ix$1YGyoeqi zHVi2j;4iGJSN@tTHheqUd+v_^-7ty+=G9l({R3;rhHu`C1Ie^wN*^Hy<;)XMNVF12 zD6Y#COp8aG|E5BtQAVY)VIFpb1fyB$?wNN-@QpL6d5=TuP+Y6kO9WU=hV!kd)tz_Z zg}tmS7E6P5SokrsM?K-PIwGap)<_JTJF`cwo-|d#=}g9vqn@qbC74Zf(Mc1XhCu?2 z0)#jh^(;G(8siry|GCn&Y;z8LXu>NwraP|!10mssWXVHpe~qewHD6hM@d5I@(DoMr zcNo3;959L1p-n)C(2t-6MPKUii9pX*M#91z+;Mm&EeEj4%FNE5qQj!OP?_djzLFVt z`p(sTa1vgEhfa{Eq0LQDE?#q}-K_*OgpUW`sktR8Y`LXzUbuGjo!w`TzIFlp8-y9P zTn4u^9Mdz8A?Jh3Bcs(&f+N6B(}$n64)NUB`XhhJlqGR{e_F5&0 zf+Ar|sH>r3h>@S6iUMd2HF+JI;dZKH*NFo|VoG5E&QMCHwwbB#+|g@TAr^B+xISvs zdV4CV1DP<-PC1_MX+Bh-31`Y>WDGH&Vc;v&`>4#eL@bzmnjT?)qgKZYj8h`-wNi=& z;vfN#eUUuhW{Z`}mVxGP2|`VhsndFB(~jga@kdkyJ`hL-aCLQ*HIhu8i2u$0Z;?m( z9d7hpERK?G-!6Ny^&t~a(b=r?AFZp$`FyJ)k=$T-ay2p!7Hsd1>`TPdMD_n*KEIs2 zEUctZ=$uzizu*TcV<7lGT_ORxB-oUK3Zew$b=F`>oTf<-5ZU2am)wW)=zV$~jjw`% ziZ{Xjfc+YULR7e3Bm`=R<4Q5M`vOQY(N9hnC9sc_+E|mu4`z%JJu`l7PMi-zuWiWbXg2H z;r@+M(bb<#rr?FWc!$-n+VBo*v4TE#nzoGg$t^l-p>b;o(#H`3S+L+=CXzAx5ke&+ zxP*c8x6xiZ=*(S%HGklG?a^eMDn?Mxy1B0MOm-h5Ji2rG)L-UEz~^xp zp|0`Y~p`%A)0m38f5*nx5TL6aS zU8o@gNe50`c20m<9VY~xPvc_$!3RRC0yA9?hvUQ;N;a?sK@jUjOWd|WAu6PR`aUR@ zNbn&y?y?ZBxX|1^m*^W7s3pBc>v1rbwGXRN5)6hMi@_jBg#UudKijC}TVc|z!}wtp zzMh?k9E8}hRE{jdp<=tPMPfkM>L~XtUa43k@*&Vy-{SkBq+>)ZfOmZNa{bZIUItN3P zDl3sc7wAYSOGp(`3!iIFfO6Y7e0U)ms~>5`d|FIhhbC<6s{?pR76`NlW3Vp-IJKTk z8@0L@?a>^jeg6qmUCIu(oU*%OsoOsSqi=J-ALt?*V8h#F9OPx^`AVfCj3D#X2=vz$ zOvoTyxoZI*k2Rc$tVY*pGnDxcuoS*&U0rD1<;ysvOQTZz2T>x%9XY(ikYxP6++cPa zW7+}B5AB_fy+JF6oAl<7r|b>MJM!D2H|QAA#w8R5_#MkyN8CE;q9G=Z0Fv9eeK*5=FTmw!rjJdR2gfqYsbla20DYm%b(qf&Re z*?rf3X>a2YsjH`YOYe7p(^Me7*7L{4mf6F*d?J<~Dkt`1t-kxZlv?Y#HcS)t6NCS&t z5z~47zaEizyFNA37?8GP{DUCuTX{UDDE1al zAxz|Z4X9C&bWMWjXQ+wDR#9kCDnv@)jW8>hy4|3r_se(tgj!@X+K3wO=N3lgV3vFpi@>QiTaRvYwk3gr=6tqDk402_V5b za5N`pSZyllZ|Z==0+e1P#ls&8KsNZY(x#D8gyDqg|3cfLa$e|5IL2B1AmQ?{vA$d^ z3?q?iq~Cf*bA49);T_)n_;Lf*5w;p)^97NCH!9=|;Yo~DFd=9u%g!rd@G%2LqXZTc zoYS_|(G+SpQPtaY42qKDNx=bw@i5Hh(4~4qc9HbU2G@`b&}^VJz3pVVsgwm`5T-=R$a&f!P&F1YSYi)Y{~sXi7)`z@8!jCY{Uy7wg@?+B!v*_c`tBf*x7>xFpufD zcDtpbZyVBcjk4tJx_)>;rOfUL&r_a!#7~Acr-Nv|0KP1{7o>d4*cb_b<@*sv=~jU} zdBRK-6*G~J#jr49Kgn@CpDnO#zLKVH8*Xj%1W#Ac65azDsklOAYm&{$gQE1p8JI2w zMGGRA1Z4}81H?)6Mta@p48{;VM*avI7kFcR3_){TGpF2>91TGq%hGF7h8&;={c-2A z%mdrn2EK2wShA=9@7O@V1)9_Kp_^hS&w5S;jJ8nd)9f2Gb-s;$jK5H_p9Qn?#Oz_0azeqULBc;b*QmQd zgEH;)cwzftjeLRB6XOtcB(%js@mupBqw zmhW3bJuD}T7rH>8P68pjUBbj2&MpawXE!Gha>6Kj z;w{7B>`$A(NRTY2#Zq5?L3Q?RkB4QCk!FFhAXyK1{zPS`hTv&<$_UjE%stu*CtT6`^SX|PGu6t?jncmjf1h=KQ`7cceqTJV>mXG#=@+| z$v?3(8Ll8l>FjGULz&xEGBElfq$!=QPL#js5-9P5IpB|@MQk@Dws!D2!f4u^6T zr>*Ja<_pbVFmBp_^J(Ae1U$NCg5OV(Pl8Y!oO+uUCoa zz6?b~=%rFVbyVVXE(xTnYF}vQZCz?_=OsUT(&L$06s61rN=8&9WpgMMFshl!xny3$ zMBVSB)(My+z-RR4VKJA3{twYvDGEhAn`|ob7>tCiEBkA8DLDRYsL&-EvP@1|54QN^ zE?2lQU}TV8(P+Fh&uqgBl3Y&GjJ^OfOUt7USSnRF2_GpP&|8pJOtsPIm?)uBiK0%i zO#w^MGBUMZ!3LZ~#ibs-kk9GiCS{(&lL{t%KP}f_b%gd%*$FP7be`9DhJ>6N?Nph4h_8voW&n_uQ-)GN69o7D_7`#ON#^uUB_{7l@Tfl$}48UbuQc!tWM`d1| z7VU3fEBM2O46+4|M(I8V>iH|fVQcN8y1Eb&-YqtfRS5-`eth2of2EKr6O1vUQJH06 zjL0dWS)9kRim2cR5>C_z%efoRTcZ z0m(JERk8y6Bsb#`$wfSNvEDBZACp{$4@oY+ut#}t^rHMlwipX9-Fxfg?w)@fOuO`7 z5bn$<5gQeM&D~4i;MT7@{feFd3~F%v;zMfKXmL?ZcY<5u zSAoZIJvmU6f{l1qm`nV4fC6^HS2@`qBWaR-QtoLTA8)GFM-!I^EJPdLw?H5N-;3Rq z6CjlKqnT|~U_g3^6JdSKlc0*KbDJ2Z6ikls=zg`uW&l`N)3qtPcXA~SL&Tt zuU2;_9XdgaS<>zg@hvPOK>CX`N)TA!pEm1<)(LR5pT%i*S3|}pGtITD zrY32ci*7E7a^OwjQkfByZQVTM9s^3CC~?!t0h;c@HA`c8F{Y)!%6cblxlK>Cu&DIn z=M0Ar2fBQ|czJW{Z2lljhi&N1H}yq(i#8ot49H^SDz7)!98fn?kM#yFHLCnDlr)wd z(k2}r_mnqFZPdO{PPb?@QRGvy)CQWg7a_Oh*MjoQTbNaamf&;M)M@PY;Gu{OH6kVu)W_zasv=TtYtsc; z09-zlq$KTmY^0``YOO%j>!>u+c{ z3cX-9J6BdVEq zrY1&-(RelLJ7~;Kk78)IVpuKQL_obEiknjTY&Gos2f!k~(kg>+vQ%|sXq2mI8S0R+ zC&2R5U@c4Vc2MX>AfGeIjUIsPkb;+-n!yzvgs0J>$bX+)#<$o=N&0*R)Y^(!xOY1nDLNcglRv_m!yJ)lU45v84Bs@FURZCkA@FvP2>K#vx#Sb&Q(m*j9c zK@OurOPoE@`qK`sR$4in>+fM>SaruwJ01p6CWRfYY2$DM5;-2Ow*02FPKSC_z-<$n|3~ z1&Xu$X@WoX`vj%rA0?1OpukC-D6@TDV$l5=2(5>|Z}~jBZ72rlK<}j9TK{`YpXH74 z)`GBr?2YOZfo3CMq|>=B@P)RQJ#fI0%Ebwk*J%XOk@p+cmb{W=h5nx~@N25zdKZ91 zV0t)K9Ed}lF?ZX-i-wd#ZfB!Bc_gW)km=hBNa#I}6_F^xWW_1;54jewQ}EU^E z@2CM;azdaabV}Kd4shk?9c8lRIkfIX4@NXW1y9;RKb)ARnUP>oGbf|62vQzX8^P;H z=|h$i{e!Gsyx_^3)5k+`PFJ^4XsnADyDmawU2Kf=zW>-Yum$Z38(8-G`U|)u$SN1C z$hDS*Vna!SXg6BOxz^e~P0kOaBqS)bU%0I(5XK8PRBV5AyO{vCIS=msuL`}#Y5*wc zk;%nG!gMWYn=?C)=^ZSR)UWplKL#QE$h9+#V;hc&{XFw00yO>=v?lOl>&w#Z+GrnR z$6-4>X{RbX<&>WK=<(W&=93OFM76l%qVAApp=#ap6gdjyIsXaE!qAIO<5yyOq@Gxe zUy!-DvNIn8lJ2<37WwPc1)-k@z=DQEqIHEMdgOBIw)$kyu_;6l^@^@9)Jo4i+jJ;L zamF}(I!udA%=&ygv+M0DQIFN@9fIV$0G8Co>cT4ciuHQs3Tt&@VZWc}Q%q$?0Bkw2&k zek5X`=Xj8~0)0kJU|#*O7%k)pRS=&d;K&JxjUA~Hs|qI+y|nwbijQ5*v2`gDIYk>! zQUZZR#CHKuDq~v8G_TG-h}O=#@8`WIEANV|x=)HN+^n{RW?yEv`!wy#_-7XN>z7d? zxpz;vuaQ5IL)!4PRvp!ZP-}Fjei2pyx|2iSR1b&I-YV+0zEmFDvYR?dnJqOEcZ1~yGi--0AFrc`Zh*U?#{ z;D#{p4-d|$NeM6!vvr2VVb;C8*PT|N;ks|}ci-N8vP~|4#S2vMnDngkXBD^avpoIY z|NV_=c?2cy{Mnov{K)Z^Tkc*1IeGll?qgTkrpg z8P;`|{{fx?DgpvpKR~0t!W$dc!0K_p?YodNGMb3%889rQerw#<=Y&l}RpYcQ?@d+D zsJ0I!9y4d{u>(kI;4>Lm>lRgI0%IC;=h8(A;ZHM01r z-6su)RLKMvf<~xugVcrqb6()Ts4|yff_9v+dCI8geJ%B37_wgOW)Ryr;d^NNTydk) zLg(izIYyP=DAso@f={@l*k?#rtwF`EF#_6FGGP(XYec$XoyO8b*6%A0`6bIytx#(1 z#EMh!)LQacM=Ts~s%f_KlmADj-n+0`L$P|;+7@H!BY&@|SSgZoIjsmFvLdO)Kl6Tx zd#?*Vp^5n^?k&aQRkEpJpYqmVq54xwbgX5p)*X@u9`y!=tco(LePn;TX6+Ctv#rW$ zzsqX%=Crr69$iD2Z8yAve_%JPg0rv(s zu$%4XtjzK;x8?ho#M$M?x9RE^g$;ly(B=fp)5wZSRMUqVYO;Y)()6axd@tTMzcvYl zE=N!@o|hFy{L^JuEtW)6L>raV6fsa#!WVcA*8&^h&c#vY-rLLS2K93yn-#1a{4>Y@ zc}Wwd@^(UG9i*)e0rj;>IU%N2nAJ8Uw`N(T$lTf}rFK}5#vP`1nN$v%P=1QaJ3vzP z5?B6`TJ6i=n?kBBOse*lbF->Ckbl6YT(FU*F*VA$#OH?-<1G`${IU~ANSeITQZ&k; zcei9EtJ0l~W(Tk9m0_Y^={PUS#^sh=~zLnWzPrr zz}g1z2-(hD62O;L#~66q=3&E!V-)L6s@#q+%LBIp7Xq6C=L3%c-))gf(hBJzt2(6( zz^~mwv=1NCmd&!;8EmT+nS8PS-#hgao)DA~Vu{3Jpj)h(nH6KtBbpGv-BI+-NR&;@ zgfyAW6pxCVY34ba8QyxES>~Rr(g>FiKm>_{Xm-ch+3Z0fr+GM$^f8_>6XZC z6WcrjC$ia_oTk}_hEQ zVofVeUAZjt_&0TSkXs^1=2l&)w7=zAm88|FnT^XVG9et2)HG8k+VvJ#C^dBSG96{% zIw#q5^ALKIt8a=Q`Epm6TW+3Y^XvL#sggqr^~Xnb3wl;sV7xs@Zlz%&Tjv64qGgLk ztIi)S3e8tibK@~`!;Q8;YHB*>O>*e*F;|_#D6Zuw&7rwSQ-$9bc64mBG1?~#S-ZV*2BYJwd#V$72v(rynu42nmn^Z}aw=jk;lx7Y$bBiBy_f(hN zQFld{Pjg1xUfb*g1rDi<0K(oJl}@X5%iOEzNkUg#6a!T1%~PW;IViqp zpKfsGa@jsfL;L-3btfhMbKAcuy zWy8h%^w(#|ml36;iAWGgj<4#tREKo(V~g zZ=y#sB9JCk`USY8gyU>+=_dd61(G8A%}kLQ=>>${=aJS}>xe9?tWIuu$;N-pU*bF+{NlJv2n`ajmcr%sdh1L0o1;UWNfRIc3D0U#P$;-B{aucE2u zT52sph<1#vqr@b}(nvImU3*KFE>m0WbzuENZl?FfkvZ#}&FQSG?s`-^PlQqBcQ;&5 zZ+-L`IK{GmSh?n+OMY>ZH5*D&ZQ5P%v)O-BuD=A1G}_+wwO=WJe)Muro_qz?JES;c zjoV^VCOX)pzcba}305?`Sn(1iOO?J9A^O+z`s-Yb;-oJPSx&B0`+Yb-W{JWjB-1FX zx}oWJq!1-pQ8nE#E!%NDTs(XNLLy=kQZjNlMaXg@6@r?EmX4l*k%^gwm5rT)lZ%^2 zmh_KUt?G7X*YLPDX;zf_xU5uZfNWujGDg`t9(vSMqS`quLn%Q<$zmI|Ko#U%s#0~7 z5)x#8Lh7?Dipo0*@V)0K>ng*YFs%2Y z^h5o5f^&lHsQFl@WT;;t*-9{C9r>?UZiN6aeEOAd~sq9UJatrh!SW+^UJflDg) zd`xTLe5}ngJF-ejRV>4uFt{FJq{t^oaQpW@#*fs2UBZ8##pU52pt3iQ59dJTD0E$Z zOQ`2XtP^v}O7`Z0J{x6^avEiytj&7kZ1a(n+SU7_3-2xMx(*?#T}&+x^7+cd*TIG| z5fv^<5q!35^f+iV&6r6=k zQjy#T)$yU%H>BjD6K&Jtwz6Oqb|(kln2&e$Dw;w28mglq_&M`E@n{Xk*Wml4s2qJh z${cVN9ILd}jw2L{DLR<<_>dye`o&^8g|*f9k4El8-dUS@`&QZJCmA2A$4aTJeO*NE z_Pmp~aTj2X2 z43^}<7665C|EI85(bPD2k4%80Il`KA3%cU-zKQQy#p|4KRRpyPzW<< z8~_CD6fgh)2LPaZ09wEwK!OT91r2hKP5p7>-i&d$KR@G?xW|*oi__VI@+%Eq2x8^P z8NyV4YPa6)8l(qAo_R$hpD4q-REdV@M0mOAo9>TU9BA*WF#S*0ER9+=E=sqYz;hmO zJ7%rm>2Z@+)NR>B{c_iV4h=-cJq%LEqKW$&RvfcxlGL>yj0PT-7|SM_LXbS>n_;!i zzp=V}^s-yi#kOLlOjuJsMgOUAX6>SG?7G(I8T(%3Wb(xJr@(u%Y^O2qv9J5tM9vYP z&!uPaDys0Lp}y3aH;9+y*iK@*3XVr%H|`DLS?l1>_Umx3v+A2z#(u)Hm#f;FNWqS( Tp~gD%=1~4;zp%;UV+#NP+I>lo literal 0 HcmV?d00001 diff --git a/theme/assets/fonts/roboto-mono-latin-ext.woff2 b/theme/assets/fonts/roboto-mono-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..91f4f8c04d2bbff4340c2fca7b57d1434f7a1978 GIT binary patch literal 22868 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 HCvznL8q}O> literal 0 HcmV?d00001 diff --git a/theme/hooks/image_metadata.py b/theme/hooks/image_metadata.py new file mode 100644 index 0000000000..a64fd9fbad --- /dev/null +++ b/theme/hooks/image_metadata.py @@ -0,0 +1,231 @@ +"""Add stable, lightweight image metadata to rendered documentation content.""" + +from __future__ import annotations + +import posixpath +import re +import struct +from pathlib import Path +from urllib.parse import unquote, urlsplit +from xml.etree import ElementTree + + +_IMAGE_TAG = re.compile(r"]*>", re.IGNORECASE) +_SOURCE = re.compile(r"\bsrc\s*=\s*([\"'])(.*?)\1", re.IGNORECASE | re.DOTALL) +_DIMENSION = re.compile(r"^\s*([0-9]+(?:\.[0-9]+)?)\s*(?:px)?\s*$", re.IGNORECASE) +_CLASS = re.compile(r"\bclass\s*=\s*([\"'])(.*?)\1", re.IGNORECASE | re.DOTALL) +_STYLE = re.compile(r"\bstyle\s*=\s*([\"'])(.*?)\1", re.IGNORECASE | re.DOTALL) +_ADMONITION_TITLE = re.compile( + r"(?P<(?Pdiv|details)\b(?P[^>]*)>)" + r"(?P\s*)" + r"(?P<p\b(?=[^>]*\bclass\s*=\s*[\"'][^\"']*\badmonition-title\b)[^>]*>|<summary\b[^>]*>)", + re.IGNORECASE | re.DOTALL, +) +_UNTITLED_ADMONITION = re.compile( + r"(?P<container><(?P<tag>div|details)\b" + r"(?=[^>]*\bclass\s*=\s*[\"'][^\"']*\badmonition\b)(?P<attributes>[^>]*)>)" + r"(?P<space>\s*)" + r"(?!(?:<p\b(?=[^>]*\bclass\s*=\s*[\"'][^\"']*\badmonition-title\b)[^>]*>|<summary\b))", + re.IGNORECASE | re.DOTALL, +) +_WIDE_SCREENSHOT_MINIMUM = 280 + +_files_identity = None +_files_by_destination: dict[str, Path] = {} +_dimensions_by_path: dict[Path, tuple[str, str] | None] = {} + + +def _has_attribute(tag: str, name: str) -> bool: + return re.search(rf"\s{name}\s*=", tag, re.IGNORECASE) is not None + + +def _has_inline_dimension(tag: str) -> bool: + """Return whether author CSS already controls either image dimension.""" + + match = _STYLE.search(tag) + return bool( + match + and re.search(r"(?:^|;)\s*(?:width|height)\s*:", match.group(2), re.IGNORECASE) + ) + + +def _format_dimension(value: float) -> str: + return str(int(value)) if value.is_integer() else f"{value:g}" + + +def _svg_dimension(value: str | None) -> float | None: + if not value: + return None + match = _DIMENSION.match(value) + if not match: + return None + number = float(match.group(1)) + return number if number > 0 else None + + +def _image_dimensions(path: Path) -> tuple[str, str] | None: + cached = _dimensions_by_path.get(path) + if cached is not None or path in _dimensions_by_path: + return cached + + dimensions = None + try: + suffix = path.suffix.lower() + if suffix == ".png": + with path.open("rb") as image: + header = image.read(24) + if header[:8] == b"\x89PNG\r\n\x1a\n" and len(header) == 24: + width, height = struct.unpack(">II", header[16:24]) + if width and height: + dimensions = (str(width), str(height)) + elif suffix == ".gif": + with path.open("rb") as image: + header = image.read(10) + if header[:6] in (b"GIF87a", b"GIF89a") and len(header) == 10: + width, height = struct.unpack("<HH", header[6:10]) + if width and height: + dimensions = (str(width), str(height)) + elif suffix == ".svg": + _, root = next(ElementTree.iterparse(path, events=("start",))) + width = _svg_dimension(root.get("width")) + height = _svg_dimension(root.get("height")) + if not width or not height: + view_box = root.get("viewBox", "").replace(",", " ").split() + if len(view_box) == 4: + view_width = _svg_dimension(view_box[2]) + view_height = _svg_dimension(view_box[3]) + width = width or view_width + height = height or view_height + if width and height: + dimensions = (_format_dimension(width), _format_dimension(height)) + except (OSError, ElementTree.ParseError, StopIteration, struct.error, ValueError): + # An unreadable or unusual image must never make the docs build fail. + dimensions = None + + _dimensions_by_path[path] = dimensions + return dimensions + + +def _destination_files(files) -> dict[str, Path]: + global _files_identity, _files_by_destination + if files is not _files_identity: + _files_identity = files + _files_by_destination = { + posixpath.normpath(file.dest_uri): Path(file.abs_src_path) + for file in files + if file.abs_src_path + } + return _files_by_destination + + +def _local_image(source: str, page, files) -> Path | None: + parsed = urlsplit(source) + if parsed.scheme or parsed.netloc or parsed.path.startswith("data:"): + return None + + source_path = unquote(parsed.path) + if not source_path or "{{" in source_path or "}}" in source_path: + return None + + if source_path.startswith("/"): + destination = posixpath.normpath(source_path.lstrip("/")) + else: + destination = posixpath.normpath( + posixpath.join(posixpath.dirname(page.file.dest_uri), source_path) + ) + return _destination_files(files).get(destination) + + +def _add_attributes(tag: str, attributes: list[tuple[str, str]]) -> str: + if not attributes: + return tag + insertion = "".join(f' {name}="{value}"' for name, value in attributes) + end = tag.rfind("/>") + if end < 0: + end = tag.rfind(">") + return f"{tag[:end]}{insertion}{tag[end:]}" + + +def _admonition_icon(attributes: str) -> str: + """Select a solid Ionicon that matches the generated admonition type.""" + + match = _CLASS.search(attributes) + classes = set(match.group(2).lower().split()) if match else set() + if classes & {"danger", "failure", "bug"}: + return "alert-circle" + if classes & {"warning", "caution", "attention"}: + return "warning" + if classes & {"success"}: + return "checkmark-circle" + if classes & {"tip", "hint"}: + return "bulb" + if classes & {"abstract", "summary"}: + return "document-text" + if classes & {"example"}: + return "flask" + if classes & {"quote"}: + return "chatbubble" + return "information-circle" + + +def _add_admonition_icons(html: str) -> str: + """Emit status icons at build time, avoiding client-side DOM mutation.""" + + def enhance(match: re.Match[str]) -> str: + icon = _admonition_icon(match.group("attributes")) + return ( + f'{match.group("container")}{match.group("space")}{match.group("title")}' + f'<ion-icon name="{icon}" aria-hidden="true" ' + 'class="docs-ionicon docs-ionicon--admonition"></ion-icon>' + ) + + def enhance_untitled(match: re.Match[str]) -> str: + icon = _admonition_icon(match.group("attributes")) + return ( + f'{match.group("container")}{match.group("space")}' + f'<ion-icon name="{icon}" aria-hidden="true" ' + 'class="docs-ionicon docs-ionicon--admonition"></ion-icon>' + ) + + html = _UNTITLED_ADMONITION.sub(enhance_untitled, html) + return _ADMONITION_TITLE.sub(enhance, html) + + +def on_page_content(html, page, config, files): + """Reserve image space and defer non-leading screenshots in article HTML.""" + + eligible_images = 0 + + def enhance(match: re.Match[str]) -> str: + nonlocal eligible_images + tag = match.group(0) + source = _SOURCE.search(tag) + if not source: + return tag + + path = _local_image(source.group(2), page, files) + dimensions = _image_dimensions(path) if path else None + if not dimensions: + return tag + + width, height = dimensions + attributes = [] + has_explicit_dimensions = ( + _has_attribute(tag, "width") + or _has_attribute(tag, "height") + or _has_inline_dimension(tag) + ) + if not has_explicit_dimensions: + attributes.append(("width", width)) + attributes.append(("height", height)) + if not _has_attribute(tag, "decoding"): + attributes.append(("decoding", "async")) + + if float(width) >= _WIDE_SCREENSHOT_MINIMUM: + eligible_images += 1 + if eligible_images > 1 and not _has_attribute(tag, "loading"): + attributes.append(("loading", "lazy")) + + return _add_attributes(tag, attributes) + + return _add_admonition_icons(_IMAGE_TAG.sub(enhance, html)) diff --git a/theme/main.html b/theme/main.html new file mode 100644 index 0000000000..515ca7aff3 --- /dev/null +++ b/theme/main.html @@ -0,0 +1,43 @@ +{% extends "base.html" %} + +{% block fonts %} + <style>:root{--md-text-font:"Inter";--md-code-font:"Roboto Mono"}</style> +{% endblock %} + +{% block site_meta %} + {{ super() }} + {% if page and page.meta and page.meta.git_revision_date_localized_raw_iso_datetime %} + <meta http-equiv="last-modified" content="{{ page.meta.git_revision_date_localized_raw_iso_datetime }}"> + {% endif %} + {% if config.extra.self_hosted %}<meta name="robots" content="noindex">{% endif %} +{% endblock %} + +{% block libs %} + {{ super() }} + <script type="module" src="https://unpkg.com/ionicons@7.4.0/dist/ionicons/ionicons.esm.js"></script> + <script nomodule src="https://unpkg.com/ionicons@7.4.0/dist/ionicons/ionicons.js"></script> +{% endblock %} + +{% block analytics %} + {{ super() }} + {% if config.extra.segment_key %}{% include "partials/integrations/segment.html" %}{% endif %} +{% endblock %} + +{% block content %} + {% include "partials/notices.html" %} + {% if page and page.meta and page.meta.source %}{% include "partials/source-link.html" %}{% endif %} + {% include "partials/content.html" %} + {% include "partials/integrations/disqus.html" %} + {% include "partials/integrations/feedback.html" %} + {% if page.previous_page or page.next_page %} + <nav class="docs-page-nav" aria-label="Page navigation"> + {% if page.previous_page %}<a href="{{ page.previous_page.url | url }}"><span>Previous</span><strong>{{ page.previous_page.title }}</strong></a>{% endif %} + {% if page.next_page %}<a href="{{ page.next_page.url | url }}" class="docs-page-nav__next"><span>Next</span><strong>{{ page.next_page.title }}</strong></a>{% endif %} + </nav> + {% endif %} +{% endblock %} + +{% block config %} + {{ super() }} + {% include "partials/integrations/zendesk.html" %} +{% endblock %} diff --git a/theme/partials/actions.html b/theme/partials/actions.html new file mode 100644 index 0000000000..b85217e351 --- /dev/null +++ b/theme/partials/actions.html @@ -0,0 +1,2 @@ +{# Page-level copy actions are intentionally omitted. Code examples retain their + native copy control via the `content.code.copy` feature. #} diff --git a/theme/partials/footer.html b/theme/partials/footer.html new file mode 100644 index 0000000000..ffb34eb5c4 --- /dev/null +++ b/theme/partials/footer.html @@ -0,0 +1,12 @@ +<footer class="docs-footer"> + <div class="docs-footer__inner"> + <div class="docs-footer__brand"> + <strong>Code Quality & Security for AI-Assisted Engineering</strong> + <span>Full scan within minutes <b aria-hidden="true">|</b> Free trial for 14 days <b aria-hidden="true">|</b> No credit card required</span> + </div> + <div class="docs-footer__meta"> + <nav aria-label="Footer"><a href="https://www.codacy.com/pricing">Pricing</a><a href="https://blog.codacy.com/">Blog</a><a href="mailto:{{ config.extra.support_email }}">Support</a><a href="https://www.codacy.com/privacy">Privacy</a></nav> + <span>{{ config.copyright }}</span> + </div> + </div> +</footer> diff --git a/theme/partials/header.html b/theme/partials/header.html new file mode 100644 index 0000000000..324c2bc9bf --- /dev/null +++ b/theme/partials/header.html @@ -0,0 +1,35 @@ +{% set class = "md-header" %} +{% if "navigation.tabs.sticky" in features %} + {% set class = class ~ " md-header--shadow md-header--lifted" %} +{% elif "navigation.tabs" not in features %} + {% set class = class ~ " md-header--shadow" %} +{% endif %} +<header class="{{ class }}" data-md-component="header"> + <nav class="md-header__inner md-grid" aria-label="{{ lang.t('header') }}"> + <a href="{{ config.extra.homepage | d(nav.homepage.url, true) | url }}" title="{{ config.site_name | e }}" class="md-header__button md-logo" aria-label="{{ config.site_name }}" data-md-component="logo"> + <img class="docs-logo docs-logo--dark" src="{{ config.theme.logo | url }}" alt=""> + <img class="docs-logo docs-logo--light" src="{{ 'assets/images/codacy-docs-logo-light.svg' | url }}" alt=""> + </a> + <label class="md-header__button md-icon" for="__drawer" role="button" tabindex="0" aria-label="Open navigation" aria-controls="docs-navigation" aria-expanded="false" data-drawer-trigger> + <ion-icon name="menu-outline" aria-hidden="true"></ion-icon> + </label> + <label class="docs-search-trigger" for="__search" role="button" tabindex="0" data-search-trigger aria-label="Open search" aria-haspopup="dialog" aria-controls="docs-search" aria-expanded="false"> + <ion-icon name="search-outline" aria-hidden="true"></ion-icon> + <span>Search documentation</span><kbd data-search-shortcut>⌘ K</kbd> + </label> + <div class="version-select-container"> + <select id="version-selector" class="select-css" aria-label="Documentation version" title="For Codacy Cloud, select Latest. For Codacy Self-Hosted, select the version of your Codacy installation."> + <option selected>{% if config.extra.self_hosted %}Self-hosted {{ config.extra.codacy_self_hosted_version }}{% else %}Cloud (Latest){% endif %}</option> + </select> + <ion-icon class="docs-version-select__icon" name="chevron-down-outline" aria-hidden="true"></ion-icon> + </div> + <a class="docs-header__cta" href="https://www.codacy.com/signup">Get started</a> + {% if config.theme.palette %} + {% if not config.theme.palette is mapping %}{% include "partials/palette.html" %}{% endif %} + {% endif %} + {% if not config.theme.palette is mapping %}{% include "partials/javascripts/palette.html" %}{% endif %} + {% if config.extra.alternate %}{% include "partials/alternate.html" %}{% endif %} + {% if "material/search" in config.plugins %}{% include "partials/search.html" %}{% endif %} + </nav> + {% if "navigation.tabs.sticky" in features and "navigation.tabs" in features %}{% include "partials/tabs.html" %}{% endif %} +</header> diff --git a/theme/partials/integrations/disqus.html b/theme/partials/integrations/disqus.html new file mode 100644 index 0000000000..6e60ad9323 --- /dev/null +++ b/theme/partials/integrations/disqus.html @@ -0,0 +1,7 @@ +{% set disqus = config.extra.disqus %} +{% if page and page.meta and page.meta.disqus is string %}{% set disqus = page.meta.disqus %}{% endif %} +{% if not page.is_homepage and disqus %} + <h2 id="__comments">Comments</h2> + <div id="disqus_thread"></div> + <script>var disqus_config=function(){this.page.url="{{ page.canonical_url }}",this.page.identifier="{{ page.canonical_url | replace(config.site_url, '') }}"};!function(){var e=document,i=e.createElement("script");i.src="//{{ disqus }}.disqus.com/embed.js",i.setAttribute("data-timestamp",+new Date),(e.head||e.body).appendChild(i)}()</script> +{% endif %} diff --git a/theme/partials/integrations/feedback.html b/theme/partials/integrations/feedback.html new file mode 100644 index 0000000000..21f14154fc --- /dev/null +++ b/theme/partials/integrations/feedback.html @@ -0,0 +1,54 @@ +{% if config.extra.user_feedback == "true" and not page.is_homepage and page.content %} + <section id="docs-feedback" class="docs-feedback" data-feedback> + <h2 id="docs-feedback-question">Was this page helpful?</h2> + <p>Your feedback helps us improve the documentation.</p> + <div class="docs-feedback__choices" role="group" aria-labelledby="docs-feedback-question"> + <button type="button" data-feedback-value="1" aria-pressed="false" aria-label="Yes, this page was helpful">Yes</button> + <button type="button" data-feedback-value="0" aria-pressed="false" aria-label="No, this page was not helpful">No</button> + </div> + <div class="docs-feedback__form" hidden> + <label for="docs-feedback-text">Tell us more</label> + <textarea id="docs-feedback-text" rows="4" maxlength="255" aria-describedby="docs-feedback-count"></textarea> + <p id="docs-feedback-count" class="docs-feedback__count">255 characters left</p> + <button type="button" data-feedback-send>Send feedback</button> + </div> + <p class="docs-feedback__thanks" role="status" tabindex="-1" hidden>Thanks for helping improve Codacy documentation.</p> + <p class="docs-feedback__issue" hidden>For more detailed feedback, <a target="_blank" rel="noopener noreferrer" href="{{ config.repo_url }}/issues/new?labels=user%20feedback&template=documentation-feedback.md&title=Feedback%20on%20%22{{ page.title | urlencode }}%22">open an issue on GitHub</a>.</p> + <p class="docs-feedback__links"> + {% if page.edit_url and not config.extra.self_hosted %}<a href="{{ page.edit_url }}">Edit this page on GitHub</a>{% endif %} + <a href="mailto:{{ config.extra.support_email }}?subject=Question%20regarding%20{{ page.title | urlencode }}">Contact support</a> + </p> + </section> + <script> + (function () { + var feedback = document.currentScript.previousElementSibling; + var form = feedback.querySelector('.docs-feedback__form'); + var thanks = feedback.querySelector('.docs-feedback__thanks'); + var issue = feedback.querySelector('.docs-feedback__issue'); + var textarea = feedback.querySelector('textarea'); + var counter = feedback.querySelector('.docs-feedback__count'); + var value; + feedback.querySelectorAll('[data-feedback-value]').forEach(function (button) { + button.addEventListener('click', function () { + value = Number(button.dataset.feedbackValue); + feedback.querySelectorAll('[data-feedback-value]').forEach(function (choice) { + choice.setAttribute('aria-pressed', String(choice === button)); + }); + form.hidden = false; + issue.hidden = value !== 0; + if (typeof analytics === 'object') analytics.track('User Feedback Sent', { url: window.location.href, value: value }); + textarea.focus(); + }); + }); + textarea.addEventListener('input', function () { counter.textContent = (255 - textarea.value.length) + ' characters left'; }); + feedback.querySelector('[data-feedback-send]').addEventListener('click', function () { + if (typeof analytics === 'object') analytics.track('User Qualitative Feedback Sent', { url: window.location.href, value: value, text: textarea.value }); + form.hidden = true; + feedback.classList.add('is-submitted'); + feedback.querySelectorAll('[data-feedback-value]').forEach(function (choice) { choice.disabled = true; }); + thanks.hidden = false; + thanks.focus(); + }); + }()); + </script> +{% endif %} diff --git a/theme/partials/integrations/segment.html b/theme/partials/integrations/segment.html new file mode 100644 index 0000000000..dd1ab64e7d --- /dev/null +++ b/theme/partials/integrations/segment.html @@ -0,0 +1 @@ +<script>!function(){var o=window.analytics=window.analytics||[];if(!o.initialize)if(o.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{o.invoked=!0,o.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"],o.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);return e.unshift(t),o.push(e),o}};for(var e=0;e<o.methods.length;e++){var t=o.methods[e];o[t]=o.factory(t)}o.load=function(e,t){var n=document.createElement("script");n.type="text/javascript",n.async=!0,n.src="https://cdn.segment.com/analytics.js/v1/"+e+"/analytics.min.js";var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(n,a),o._loadOptions=t},o.SNIPPET_VERSION="4.15.3",o.load("{{ config.extra.segment_key }}"),o.page()}}()</script> diff --git a/theme/partials/integrations/zendesk.html b/theme/partials/integrations/zendesk.html new file mode 100644 index 0000000000..f48b942611 --- /dev/null +++ b/theme/partials/integrations/zendesk.html @@ -0,0 +1 @@ +<script id="ze-snippet" src="https://static.zdassets.com/ekr/snippet.js?key=3d46eedc-c17f-4ae6-8385-a62571296d54"></script> diff --git a/theme/partials/logo.html b/theme/partials/logo.html new file mode 100644 index 0000000000..897c849135 --- /dev/null +++ b/theme/partials/logo.html @@ -0,0 +1,2 @@ +<img class="docs-logo docs-logo--dark" src="{{ config.theme.logo | url }}" alt=""> +<img class="docs-logo docs-logo--light" src="{{ 'assets/images/codacy-docs-logo-light.svg' | url }}" alt=""> diff --git a/theme/partials/nav-item.html b/theme/partials/nav-item.html new file mode 100644 index 0000000000..ea26c23360 --- /dev/null +++ b/theme/partials/nav-item.html @@ -0,0 +1,122 @@ +{% macro render_status(nav_item, type) %} + {% set class = "md-status md-status--" ~ type %} + {% if config.extra.status and config.extra.status[type] %} + <span class="{{ class }}" title="{{ config.extra.status[type] }}"></span> + {% else %} + <span class="{{ class }}"></span> + {% endif %} +{% endmacro %} +{% macro render_title(nav_item) %} + {% if nav_item.typeset %} + <span class="md-typeset">{{ nav_item.typeset.title }}</span> + {% else %} + {{ nav_item.title }} + {% endif %} +{% endmacro %} +{% macro render_content(nav_item, ref, level = none) %} + {% set ref = ref or nav_item %} + {% set section_icons = { + "Documentation home": "home-outline", + "Getting started": "rocket-outline", + "Codacy Guardrails (IDE Extension)": "shield-checkmark-outline", + "Codacy Cloud CLI": "terminal-outline", + "Codacy AI": "sparkles-outline", + "Repositories on Codacy": "folder-open-outline", + "Configuring your repositories": "settings-outline", + "Organizations": "people-outline", + "Enterprise Cloud": "business-outline", + "Your account": "person-circle-outline", + "Codacy API": "code-slash-outline", + "Managing Codacy Self-hosted": "server-outline", + "Troubleshooting and FAQs": "medical-outline", + "Release notes": "megaphone-outline", + "Special thanks": "heart-outline" + } %} + {% if level == 1 and section_icons.get(nav_item.title) %} + <ion-icon name="{{ section_icons.get(nav_item.title) }}" aria-hidden="true" class="docs-nav-section-icon{% if not nav_item.children %} docs-nav-section-icon--standalone{% endif %}"></ion-icon> + {% elif nav_item.meta and nav_item.meta.icon %} + {% include ".icons/" ~ nav_item.meta.icon ~ ".svg" %} + {% endif %} + <span class="md-ellipsis"> + {{ render_title(ref) }} + {% if nav_item.meta and nav_item.meta.subtitle %}<br><small>{{ nav_item.meta.subtitle }}</small>{% endif %} + </span> + {% if nav_item.meta and nav_item.encrypted %}{{ render_status(nav_item, "encrypted") }}{% endif %} + {% if nav_item.meta and nav_item.meta.status %}{{ render_status(nav_item, nav_item.meta.status) }}{% endif %} +{% endmacro %} +{% macro render_pruned(nav_item, ref) %} + {% set ref = ref or nav_item %} + {% set first = nav_item.children | first %} + {% if first and first.children %} + {{ render_pruned(first, ref) }} + {% else %} + <a href="{{ first.url | url }}" class="md-nav__link"> + {{ render_content(ref) }} + {% if nav_item.children | length > 0 %}<span class="md-nav__icon md-icon"><ion-icon name="chevron-forward-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--nav"></ion-icon></span>{% endif %} + </a> + {% endif %} +{% endmacro %} +{% macro render(nav_item, path, level, parent) %} + {% set class = "md-nav__item" %} + {% if nav_item.active %}{% set class = class ~ " md-nav__item--active" %}{% endif %} + {% if nav_item.pages and page in nav_item.pages %}{% set nav_item = page %}{% endif %} + {% if nav_item.children %} + {% set _ = namespace(index = none) %} + {% if "navigation.indexes" in features %} + {% for item in nav_item.children %}{% if item.is_index and _.index is none %}{% set _.index = item %}{% endif %}{% endfor %} + {% endif %} + {% set index = _.index %} + {% if "navigation.tabs" in features %} + {% if level == 1 and nav_item.active %}{% set class = class ~ " md-nav__item--section" %}{% set is_section = true %}{% endif %} + {% if "navigation.sections" in features and level == 2 and parent.active %}{% set class = class ~ " md-nav__item--section" %}{% set is_section = true %}{% endif %} + {% elif "navigation.sections" in features and level == 1 %} + {% set class = class ~ " md-nav__item--section" %}{% set is_section = true %} + {% endif %} + {% if "navigation.prune" in features and not is_section and not nav_item.active %} + {% set class = class ~ " md-nav__item--pruned" %}{% set is_pruned = true %} + {% endif %} + <li class="{{ class }} md-nav__item--nested"> + {% if not is_pruned %} + {% set checked = "checked" if nav_item.active %} + {% if "navigation.expand" in features and not checked %}{% set indeterminate = "md-toggle--indeterminate" %}{% endif %} + <input class="md-nav__toggle md-toggle {{ indeterminate }}" type="checkbox" id="{{ path }}" {{ checked }}> + {% if not index %} + {% set tabindex = "0" if not is_section %} + <label class="md-nav__link" for="{{ path }}" id="{{ path }}_label" tabindex="{{ tabindex }}"> + {{ render_content(nav_item, none, level) }} + <span class="md-nav__icon md-icon"><ion-icon name="chevron-forward-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--nav"></ion-icon></span> + </label> + {% else %} + {% set active_class = "md-nav__link--active" if index == page %} + <div class="md-nav__link md-nav__container"> + <a href="{{ index.url | url }}" class="md-nav__link {{ active_class }}">{{ render_content(index, nav_item, level) }}</a> + {% if nav_item.children | length > 1 %} + {% set tabindex = "0" if not is_section %} + <label class="md-nav__link {{ active_class }}" for="{{ path }}" id="{{ path }}_label" tabindex="{{ tabindex }}"><span class="md-nav__icon md-icon"><ion-icon name="chevron-forward-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--nav"></ion-icon></span></label> + {% endif %} + </div> + {% endif %} + <nav class="md-nav" data-md-level="{{ level }}" aria-labelledby="{{ path }}_label" aria-expanded="{{ nav_item.active | tojson }}"> + <label class="md-nav__title" for="{{ path }}"><span class="md-nav__icon md-icon"><ion-icon name="arrow-back-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--nav"></ion-icon></span>{{ render_title(nav_item) }}</label> + <ul class="md-nav__list" data-md-scrollfix> + {% for item in nav_item.children %}{% if not index or item != index %}{{ render(item, path ~ "_" ~ loop.index, level + 1, nav_item) }}{% endif %}{% endfor %} + </ul> + </nav> + {% else %} + {{ render_pruned(nav_item) }} + {% endif %} + </li> + {% elif nav_item == page %} + <li class="{{ class }}"> + {% set toc = page.toc %} + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> + {% set first = toc | first %} + {% if first and first.level == 1 %}{% set toc = first.children %}{% endif %} + {% if toc %}<label class="md-nav__link md-nav__link--active" for="__toc">{{ render_content(nav_item, none, level) }}<span class="md-nav__icon md-icon"><ion-icon name="chevron-forward-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--nav"></ion-icon></span></label>{% endif %} + <a href="{{ nav_item.url | url }}" class="md-nav__link md-nav__link--active">{{ render_content(nav_item, none, level) }}</a> + {% if toc %}{% include "partials/toc.html" %}{% endif %} + </li> + {% else %} + <li class="{{ class }}"><a href="{{ nav_item.url | url }}" class="md-nav__link">{{ render_content(nav_item, none, level) }}</a></li> + {% endif %} +{% endmacro %} diff --git a/theme/partials/nav.html b/theme/partials/nav.html new file mode 100644 index 0000000000..5d4b705fa2 --- /dev/null +++ b/theme/partials/nav.html @@ -0,0 +1,21 @@ +{% import "partials/nav-item.html" as item with context %} +{% set class = "md-nav md-nav--primary" %} +{% if "navigation.tabs" in features %} + {% set class = class ~ " md-nav--lifted" %} +{% endif %} +{% if "toc.integrate" in features %} + {% set class = class ~ " md-nav--integrated" %} +{% endif %} +<nav class="{{ class }}" aria-label="{{ lang.t('nav') }}" data-md-level="0"> + {% if config.repo_url %} + <div class="md-nav__source"> + {% include "partials/source.html" %} + </div> + {% endif %} + <ul class="md-nav__list" data-md-scrollfix> + {% for nav_item in nav.items %} + {% set path = "__nav_" ~ loop.index %} + {{ item.render(nav_item, path, 1) }} + {% endfor %} + </ul> +</nav> diff --git a/theme/partials/notices.html b/theme/partials/notices.html new file mode 100644 index 0000000000..cf27375016 --- /dev/null +++ b/theme/partials/notices.html @@ -0,0 +1,19 @@ +{% if config.extra.preview_pull_request or config.extra.preview_branch %} + <aside class="docs-notice" role="status"> + <strong>Preview documentation</strong> + <p> + {% if config.extra.preview_pull_request %} + This is a preview of <a href="{{ config.repo_url }}/pull/{{ config.extra.preview_pull_request }}">pull request #{{ config.extra.preview_pull_request }}</a>. + {% else %} + This is a preview of branch <code><a href="{{ config.repo_url }}/tree/{{ config.extra.preview_branch }}">{{ config.extra.preview_branch }}</a></code>. + {% endif %} + For production documentation, visit <a href="https://docs.codacy.com/">docs.codacy.com</a>. + </p> + </aside> +{% endif %} +{% if config.extra.self_hosted %} + <aside class="docs-notice" role="status"> + <strong>Codacy Self-hosted{% if config.extra.codacy_self_hosted_version %} v{{ config.extra.codacy_self_hosted_version }}{% endif %}</strong> + <p>This documentation applies to a Self-hosted installation. For Cloud documentation, visit <a href="https://docs.codacy.com/">docs.codacy.com</a>.</p> + </aside> +{% endif %} diff --git a/theme/partials/palette.html b/theme/partials/palette.html new file mode 100644 index 0000000000..e0b5937869 --- /dev/null +++ b/theme/partials/palette.html @@ -0,0 +1,13 @@ +<form class="md-header__option" data-md-component="palette"> + {% for option in config.theme.palette %} + {% set scheme = option.scheme | d("default", true) %} + {% set primary = option.primary | d("indigo", true) %} + {% set accent = option.accent | d("indigo", true) %} + <input class="md-option" data-md-color-media="{{ option.media }}" data-md-color-scheme="{{ scheme | replace(' ', '-') }}" data-md-color-primary="{{ primary | replace(' ', '-') }}" data-md-color-accent="{{ accent | replace(' ', '-') }}" {% if option.toggle %} aria-label="{{ option.toggle.name }}" {% else %} aria-hidden="true" {% endif %} type="radio" name="__palette" id="__palette_{{ loop.index0 }}"> + {% if option.toggle %} + <label class="md-header__button md-icon" title="{{ option.toggle.name }}" for="__palette_{{ loop.index % loop.length }}" hidden> + <ion-icon name="{{ 'moon-outline' if 'light' in scheme else 'sunny-outline' }}" aria-hidden="true"></ion-icon> + </label> + {% endif %} + {% endfor %} +</form> diff --git a/theme/partials/path-item.html b/theme/partials/path-item.html new file mode 100644 index 0000000000..fb57dcd89e --- /dev/null +++ b/theme/partials/path-item.html @@ -0,0 +1,16 @@ +{% macro render_content(nav_item) %} + <span class="md-ellipsis">{{ nav_item.title }}</span> +{% endmacro %} +{% macro render(nav_item, ref) %} + {% set ref = ref or nav_item %} + {% if nav_item.children %} + {% set first = nav_item.children | first %} + {% if first.children %} + {{ render(first, ref) }} + {% else %} + <li class="md-path__item"><ion-icon name="chevron-forward-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--breadcrumb"></ion-icon><a href="{{ first.url | url }}" class="md-path__link">{{ render_content(ref) }}</a></li> + {% endif %} + {% else %} + <li class="md-path__item"><ion-icon name="chevron-forward-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--breadcrumb"></ion-icon><a href="{{ nav_item.url | url }}" class="md-path__link">{{ render_content(ref) }}</a></li> + {% endif %} +{% endmacro %} diff --git a/theme/partials/search.html b/theme/partials/search.html new file mode 100644 index 0000000000..f6bdf8b66e --- /dev/null +++ b/theme/partials/search.html @@ -0,0 +1,40 @@ +<div id="docs-search" class="md-search" data-md-component="search" role="dialog" aria-modal="true" aria-label="Search documentation"> + <label class="md-search__overlay" for="__search" aria-label="Close search"></label> + <div class="md-search__inner" role="search"> + <form class="md-search__form" name="search"> + <input type="text" class="md-search__input" name="query" aria-label="{{ lang.t('search.placeholder') }}" placeholder="{{ lang.t('search.placeholder') }}" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> + <label class="md-search__icon md-icon" for="__search" aria-label="Close search"> + <ion-icon name="search-outline" aria-hidden="true"></ion-icon> + <ion-icon name="arrow-back-outline" aria-hidden="true"></ion-icon> + </label> + <nav class="md-search__options" aria-label="{{ lang.t('search') }}"> + {% if "search.share" in features %} + <a href="javascript:void(0)" class="md-search__icon md-icon" title="{{ lang.t('search.share') }}" aria-label="{{ lang.t('search.share') }}" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1"> + <ion-icon name="share-social-outline" aria-hidden="true"></ion-icon> + </a> + {% endif %} + <button type="reset" class="md-search__icon md-icon" title="{{ lang.t('search.reset') }}" aria-label="{{ lang.t('search.reset') }}" tabindex="-1"> + <ion-icon name="close-outline" aria-hidden="true"></ion-icon> + </button> + </nav> + {% if "search.suggest" in features %} + <div class="md-search__suggest" data-md-component="search-suggest"></div> + {% endif %} + </form> + <p class="docs-search-hint" aria-live="polite"> + <span><kbd>→</kbd> Accept suggestion</span> + <span><kbd>Enter</kbd> Open</span> + <span class="docs-search-hint__close"><kbd>Esc</kbd> Close</span> + </p> + <div class="md-search__output"> + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> + <div class="md-search-result" data-md-component="search-result"> + <div class="md-search-result__meta" role="status" aria-live="polite" aria-atomic="true"> + {{ lang.t("search.result.initializer") }} + </div> + <ol class="md-search-result__list"></ol> + </div> + </div> + </div> + </div> +</div> diff --git a/theme/partials/source-file.html b/theme/partials/source-file.html new file mode 100644 index 0000000000..4d018191f4 --- /dev/null +++ b/theme/partials/source-file.html @@ -0,0 +1,13 @@ +{% if page.meta %} + {% if page.meta.git_revision_date_localized %} + {% set updated = page.meta.git_revision_date_localized %} + {% elif page.meta.revision_date %} + {% set updated = page.meta.revision_date %} + {% endif %} +{% endif %} +{% if updated %} + <aside class="md-source-file docs-revision" aria-label="Page information"> + <span>Last updated</span> + <time{% if page.meta.git_revision_date_localized_raw_iso_datetime %} datetime="{{ page.meta.git_revision_date_localized_raw_iso_datetime }}"{% endif %}>{{ updated }}</time> + </aside> +{% endif %} diff --git a/theme/partials/source-link.html b/theme/partials/source-link.html new file mode 100644 index 0000000000..3d0dcac02d --- /dev/null +++ b/theme/partials/source-link.html @@ -0,0 +1,5 @@ +{% set repo = config.repo_url | trim('/') %} +{% set path = page.meta.path | default('') %} +<a href="{{ [repo, path, page.meta.source] | join('/') }}" title="View source: {{ page.meta.source }}" class="docs-source-link"> + View source +</a> diff --git a/theme/partials/source.html b/theme/partials/source.html new file mode 100644 index 0000000000..69360a42aa --- /dev/null +++ b/theme/partials/source.html @@ -0,0 +1,4 @@ +<a href="{{ config.repo_url }}" title="{{ lang.t('source') }}" class="md-source" data-md-component="source"> + <div class="md-source__icon md-icon"><ion-icon name="logo-github" aria-hidden="true" class="docs-ionicon docs-ionicon--source"></ion-icon></div> + <div class="md-source__repository">{{ config.repo_name }}</div> +</a> diff --git a/theme/partials/toc.html b/theme/partials/toc.html new file mode 100644 index 0000000000..56cf6f8d12 --- /dev/null +++ b/theme/partials/toc.html @@ -0,0 +1,10 @@ +{% set title = config.mdx_configs.toc.title if config.mdx_configs.toc and config.mdx_configs.toc.title else lang.t("toc") %} +<nav class="md-nav md-nav--secondary" aria-label="{{ title | e }}"> + {% set toc = page.toc %} + {% set first = toc | first %} + {% if first and first.level == 1 %}{% set toc = first.children %}{% endif %} + {% if toc %} + <label class="md-nav__title" for="__toc"><span class="md-nav__icon md-icon"><ion-icon name="arrow-back-outline" aria-hidden="true" class="docs-ionicon docs-ionicon--nav"></ion-icon></span>{{ title }}</label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>{% for toc_item in toc %}{% include "partials/toc-item.html" %}{% endfor %}</ul> + {% endif %} +</nav> diff --git a/theme/stylesheets/fonts.css b/theme/stylesheets/fonts.css new file mode 100644 index 0000000000..5ea4f0933d --- /dev/null +++ b/theme/stylesheets/fonts.css @@ -0,0 +1,36 @@ +/* Self-hosted Google Fonts subsets. No external font service is required. */ +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400 700; + font-display: swap; + src: url("../assets/fonts/inter-latin-ext.woff2") format("woff2"); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400 700; + font-display: swap; + src: url("../assets/fonts/inter-latin.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: "Roboto Mono"; + font-style: normal; + font-weight: 400 700; + font-display: swap; + src: url("../assets/fonts/roboto-mono-latin-ext.woff2") format("woff2"); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: "Roboto Mono"; + font-style: normal; + font-weight: 400 700; + font-display: swap; + src: url("../assets/fonts/roboto-mono-latin.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css new file mode 100644 index 0000000000..fb66ba1a9d --- /dev/null +++ b/theme/stylesheets/theme.css @@ -0,0 +1,496 @@ +/* A deliberately small visual layer. Material remains responsible for behavior. */ + +html { font-size: 100%; } +/* Keep anchor, TOC, and search deep-link targets clear of the sticky header, + and glide to them the way Mintlify does (respecting reduced-motion). */ +html { scroll-padding-top: 5rem; scroll-behavior: smooth; } +@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } + +body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } +.md-grid { max-width: 90rem; } + +/* Header: stable product context, centered search, and quiet utility controls. */ +.md-header { border-bottom: 1px solid var(--docs-border); background: color-mix(in srgb, var(--docs-bg) 96%, transparent); box-shadow: none; backdrop-filter: blur(14px); } +.md-header__inner { display: grid; grid-template-columns: auto 1fr minmax(15rem, 30rem) 1fr auto auto auto; gap: .65rem; min-height: 4rem; align-items: center; } +.md-header__button { color: var(--docs-text-secondary); } +.md-header__button.md-logo { display: inline-flex; overflow: hidden; } +.md-header__button.md-logo img { display: block; width: auto; height: 1.75rem; max-width: none; } +.md-header__button.md-logo img.docs-logo--light { display: none; } +[data-md-color-scheme="codacy-light"] .md-header__button.md-logo img.docs-logo--dark { display: none; } +[data-md-color-scheme="codacy-light"] .md-header__button.md-logo img.docs-logo--light { display: block; } +/* The mobile drawer has its own Material logo template, so it needs the same + light-scheme asset swap as the header. */ +.md-nav__title .md-nav__button.md-logo img.docs-logo--light { display: none; } +[data-md-color-scheme="codacy-light"] .md-nav__title .md-nav__button.md-logo img.docs-logo--dark { display: none; } +[data-md-color-scheme="codacy-light"] .md-nav__title .md-nav__button.md-logo img.docs-logo--light { display: block; } +.md-header__button > ion-icon { display: block; width: 1.2rem; height: 1.2rem; } +.docs-search-trigger { display: flex; grid-column: 3; align-items: center; gap: .55rem; width: 100%; box-sizing: border-box; min-height: 2.25rem; padding: 0 .75rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-tertiary); cursor: pointer; font: inherit; font-size: .82rem; text-align: left; } +.docs-search-trigger:hover { border-color: var(--docs-border-strong); color: var(--docs-text-secondary); } +.docs-search-trigger > ion-icon { flex: 0 0 1.2rem; width: 1.2rem; height: 1.2rem; } +.docs-search-trigger kbd { margin-left: auto; padding: .1rem .32rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg-secondary); color: var(--docs-text-tertiary); font: inherit; font-size: .66rem; } +.docs-header__cta { grid-column: 6; display: inline-flex; min-height: 2.25rem; align-items: center; justify-content: center; padding: 0 .85rem; border: 1px solid var(--docs-link); border-radius: var(--docs-radius); background: var(--docs-link); color: #fff; font-size: .875rem; font-weight: 600; line-height: 1.25; text-decoration: none; white-space: nowrap; } +.docs-header__cta:hover { border-color: var(--docs-link-hover); background: var(--docs-link-hover); color: #fff; } +.version-select-container { position: relative; grid-column: 5; } +.version-select-container .select-css { width: 8.5rem; height: 2.25rem; padding: 0 2rem 0 .7rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); font: inherit; font-size: .78rem; font-weight: 500; appearance: none; -webkit-appearance: none; } +.docs-version-select__icon { position: absolute; top: 50%; right: .65rem; width: 1rem; height: 1rem; transform: translateY(-50%); color: var(--docs-text-secondary); pointer-events: none; } +.version-select-container .select-css:disabled { opacity: 1; color: var(--docs-text-secondary); cursor: wait; } +.version-select-container .select-css:hover, .version-select-container .select-css:focus { border-color: var(--docs-border-strong); } +.md-header [data-md-component="palette"] { grid-column: 7; } +.version-select-container + [data-md-component="palette"] { margin-left: -.35rem; } +.md-header [data-md-component="palette"] .md-header__button { padding: .35rem; color: var(--docs-text-tertiary); } +.md-header .md-search { display: block; position: fixed; inset: 0; z-index: 100; width: auto; visibility: hidden; opacity: 0; pointer-events: none; background: color-mix(in srgb, var(--docs-bg) 55%, transparent); backdrop-filter: blur(3px); } +.md-toggle[data-md-toggle="search"]:not(:checked) ~ .md-header .md-search__inner { width: 0; height: 0; margin: 0; overflow: hidden; } +.md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search { visibility: visible; opacity: 1; pointer-events: auto; } +.md-search__overlay { display: block; position: absolute; inset: 0; background: transparent; } +.md-search__inner { position: relative; z-index: 1; display: flex; float: none; flex-direction: column; width: min(40rem, calc(100vw - 3rem)); max-height: calc(100dvh - 6.5rem); height: auto; margin: clamp(3.25rem, 7.5vh, 5rem) auto 0; overflow: hidden; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); box-shadow: 0 24px 48px color-mix(in srgb, var(--docs-text) 12%, transparent), 0 0 0 1px color-mix(in srgb, var(--docs-bg) 72%, transparent) inset; } +[dir="ltr"] .md-search__inner, [dir="rtl"] .md-search__inner { float: none; } +.md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search__inner { width: min(40rem, calc(100vw - 3rem)); max-height: calc(100dvh - 6.5rem); height: auto; margin: clamp(3.25rem, 7.5vh, 5rem) auto 0; overflow: hidden; transform: none; } +.md-search .md-search__form { flex: 0 0 3.5rem; min-height: 3.5rem; border: 0; border-radius: 0; background: transparent; box-shadow: none; } +.md-search .md-search__input, .md-search .md-search__suggest { height: 3.5rem; padding-right: 3rem; padding-left: 2.8rem; background: transparent; font-size: .9375rem; line-height: 3.5rem; } +.md-search .md-search__input { color: var(--docs-text); } +.md-search .md-search__suggest { color: var(--docs-text-tertiary); } +.md-search .md-search__icon[for="__search"] { top: 50%; left: 1rem; width: 1rem; height: 1rem; transform: translateY(-50%); color: var(--docs-text-tertiary); } +.md-search .md-search__icon[for="__search"] ion-icon { width: 1rem; height: 1rem; } +.md-search .md-search__icon[for="__search"] ion-icon:first-child { display: block; } +.md-search .md-search__icon[for="__search"] ion-icon:last-child { display: none; } +.md-search .md-search__options { position: absolute; top: .7rem; right: .7rem; z-index: 3; } +.md-search .md-search__options .md-search__icon { display: grid; width: 2rem; height: 2rem; place-items: center; border-radius: var(--docs-radius); color: var(--docs-text-tertiary); } +.md-search .md-search__options .md-search__icon ion-icon { width: 1rem; height: 1rem; } +.md-search .md-search__options .md-search__icon:hover { background: var(--docs-bg-secondary); color: var(--docs-text); } +.md-search .md-search__output { position: relative; top: auto; right: auto; left: auto; order: 2; flex: 1 1 auto; width: 100%; max-height: none; overflow: hidden; border-top: 0; border-radius: 0; background: var(--docs-bg); box-shadow: none; } +.md-search .md-search__scrollwrap { width: 100%; height: auto; max-height: none !important; margin: 0; padding: 0 .35rem .35rem; overflow-y: auto; scrollbar-color: auto !important; scrollbar-gutter: auto; scrollbar-width: auto !important; } +.md-search .md-search__scrollwrap::-webkit-scrollbar, .md-search .md-search__scrollwrap::-webkit-scrollbar-thumb, .md-search .md-search__scrollwrap::-webkit-scrollbar-track { width: auto; background: initial !important; } +.docs-search-hint { display: flex; order: 3; gap: .9rem; align-items: center; min-height: 2.5rem; margin: 0; padding: .5rem 1rem; border-top: 1px solid var(--docs-border); color: var(--docs-text-tertiary); font-size: .7rem; } +.docs-search-hint span { display: inline-flex; gap: .25rem; align-items: center; white-space: nowrap; } +.docs-search-hint__close { margin-left: auto; } +.docs-search-hint kbd { min-width: 1rem; padding: .04rem .22rem; border: 0; border-radius: var(--docs-radius); background: var(--docs-bg-subtle); color: var(--docs-text-secondary); font: inherit; font-size: .63rem; font-weight: 600; line-height: 1.2; text-align: center; } +.md-search .md-search-result { border-color: var(--docs-border); background: var(--docs-bg); } +.md-search .md-search-result__meta { min-height: 0; padding: .35rem .75rem .45rem; background: var(--docs-bg); color: var(--docs-text-tertiary); font-size: .7rem; line-height: 1.35; } +.md-search .md-search-result__item { margin: 0 .15rem .2rem; overflow: hidden; border: 0; border-radius: var(--docs-radius); } +.md-search .md-search-result__link { display: block; color: inherit; border-radius: inherit; } +.md-search .md-search-result__article { min-height: 0; padding: .62rem .75rem; } +.md-search .md-search-result__article h1, .md-search .md-search-result__article h2 { margin: 0; color: var(--docs-text); font-size: .86rem; font-weight: 600; line-height: 1.4; } +.md-search .md-search-result__article > p { display: none; } +.md-search .md-search-result__article > h1 + p, .md-search .md-search-result__article > h2 + p { display: -webkit-box; margin: .3rem 0 0; overflow: hidden; color: var(--docs-text-tertiary); font-size: .72rem; line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } +.md-search .md-search-result__article > ul, .md-search .md-search-result__article > ol { display: none; } +.md-search .md-search-result__icon { display: none; } +.md-search .md-search-result mark { background: transparent; color: var(--docs-link); font-weight: 600; text-decoration: none; } +.md-search .md-search-result__link:hover, .md-search .md-search-result__link[data-md-state="active"] { background: color-mix(in srgb, var(--docs-link) 7%, var(--docs-bg)); } +.md-search .md-search-result__more summary { padding: .35rem .75rem .5rem; border-radius: var(--docs-radius-sm); color: var(--docs-link); cursor: pointer; font-size: .68rem; } +.md-search .md-search-result__more summary:hover { background: color-mix(in srgb, var(--docs-link) 7%, var(--docs-bg)); } +.md-search .md-search__form:focus-within { box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--docs-link) 55%, transparent); } +.md-search .md-search-result__link:focus-visible, .md-search .md-search__scrollwrap:focus-visible, .md-search .md-search__options button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: -2px; } + +/* Navigation: quiet, compact, and without layout shifts for the active page. + The primary rail deliberately follows the Aikido-style documentation rhythm: + generous usable row width, small group labels, and feedback without card + borders. Material's disclosure behavior remains native. */ +.md-sidebar { min-width: 0; border-color: transparent; } +.md-sidebar__inner { padding-top: 1.9rem; } +.md-sidebar--primary .md-sidebar__scrollwrap, .md-sidebar--primary .md-sidebar__inner, .md-sidebar--primary .md-nav { min-width: 0; max-width: 100%; } +.md-nav { width: 100%; min-width: 0; font-size: .875rem; line-height: 1.45; } +.md-nav--primary .md-nav__item { font-size: .875rem; line-height: 1.45; } +.md-nav--primary .md-nav__link { margin: .06rem 0; padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius-sm); color: var(--docs-text-secondary); font-weight: 400; transition: background-color .12s ease, color .12s ease; } +.md-nav__link:hover { color: var(--docs-text); background: color-mix(in srgb, var(--docs-text) 4%, transparent); } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: .5rem; padding: .5rem; color: var(--docs-text); background: transparent; font-size: .75rem; font-weight: 700; letter-spacing: .025em; text-transform: uppercase; } +/* Navigation rows share a 24px rail gutter and an 8px inner text inset. + This makes the background a deliberate hit target in both sidebars and + drawers, while preserving the existing nesting indentation. */ +.md-sidebar--primary .md-nav--primary > .md-nav__list { padding-inline: 1rem; } +.md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; padding: .5rem; border-radius: var(--docs-radius-sm); } +.docs-nav-section-icon { flex: 0 0 .95rem; width: .95rem; height: .95rem; margin-right: .45rem; color: var(--docs-text-secondary); } +.docs-nav-section-icon--standalone { color: inherit; transition: color .12s ease; } +/* Every first-level entry uses the same rhythm, whether it is a page or a + collapsible group. Keeping this on the item avoids selection changing the + gap between rows. */ +.md-sidebar--primary .md-nav--primary > .md-nav__list > .md-nav__item { margin-block: .25rem; } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: 0; } +.md-sidebar--primary .md-nav__link:is(:hover, :focus-visible) { color: var(--docs-text); background: var(--docs-bg-secondary); } +.md-sidebar--primary .md-nav__item .md-nav__link--active { background: var(--docs-bg-brand); } +.md-sidebar--primary .md-nav__item .md-nav__link--active:is(:hover, :focus-visible) { color: var(--docs-link); background: var(--docs-bg-brand); } +/* Standalone top-level pages are links, not section labels. Preserve their + interaction states in both the desktop rail and the mobile drawer. */ +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active { color: var(--docs-link); background: var(--docs-bg-brand); font-weight: 600; } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link:is(:hover, :focus-visible) { color: var(--docs-text); background: var(--docs-bg-secondary); } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active:is(:hover, :focus-visible) { color: var(--docs-link); background: var(--docs-bg-brand); } +.md-nav--primary > .md-nav__list > .md-nav__item--active.md-nav__item--section > .md-nav__link { margin-top: 0; } +.md-nav__item .md-nav__link--active { padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius); background: transparent; box-shadow: none; color: var(--docs-link); font-weight: 600; } +.md-nav__item .md-nav__link--active:hover { background: color-mix(in srgb, var(--docs-link) 7%, transparent); } +.md-nav__icon { display: inline-grid; place-items: center; } +.md-nav__icon::after { display: none; } +.md-nav__icon .docs-ionicon { width: .8rem; height: .8rem; color: var(--docs-text-tertiary); opacity: .72; transition: transform .16s ease, color .12s ease, opacity .12s ease; } +.md-nav__link:hover .md-nav__icon .docs-ionicon { color: var(--docs-text-secondary); opacity: 1; } +.md-nav__item--nested > .md-nav__toggle:checked ~ .md-nav__link .docs-ionicon--nav { transform: rotate(90deg); } +.md-source__icon .docs-ionicon { display: block; width: 1.2rem; height: 1.2rem; } +/* Level-1 section children align flush with top-level links (e.g. Documentation home). */ +.md-nav--primary .md-nav__toggle ~ .md-nav { margin: 0; padding: 0; border: 0; } +.md-nav--primary .md-nav__toggle ~ .md-nav > .md-nav__list { padding-left: 0; } +/* Deeper sub-items keep a subtle indent to signal hierarchy. */ +.md-nav--primary .md-nav .md-nav__toggle ~ .md-nav > .md-nav__list { padding-left: .8rem; } +.md-sidebar__scrollwrap { overscroll-behavior: contain; scrollbar-color: auto !important; scrollbar-gutter: auto; scrollbar-width: auto !important; } +.md-sidebar__scrollwrap::-webkit-scrollbar, .md-sidebar__scrollwrap::-webkit-scrollbar-thumb, .md-sidebar__scrollwrap::-webkit-scrollbar-track { width: auto; height: auto; background: initial !important; } +.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { background: initial !important; } + +/* Table of contents: a separate, simple reading aid. */ +.md-sidebar--secondary .md-sidebar__inner { padding-top: 2.1rem; } +.md-sidebar--secondary .md-nav__title { padding: 0 0 .65rem; margin: 0; background: transparent; box-shadow: none; color: var(--docs-text); font-size: .875rem; font-weight: 600; letter-spacing: -.01em; } +.md-sidebar--secondary .md-nav__list { padding-left: .75rem; border-left: 1px solid var(--docs-border); } +.md-sidebar--secondary .md-nav__link { padding: .26rem 0; color: var(--docs-text-tertiary); font-size: .8125rem; } +.md-sidebar--secondary .md-nav__link:hover { background: transparent; color: var(--docs-text-secondary); } +.md-sidebar--secondary .md-nav__item .md-nav__link--active, .md-sidebar--secondary .md-nav__item .md-nav__link.docs-toc-active { position: relative; padding: .24rem 0; background: transparent; box-shadow: none; color: var(--docs-link); font-weight: 600; } +.md-sidebar--secondary .md-nav__item .md-nav__link--active::before, .md-sidebar--secondary .md-nav__item .md-nav__link.docs-toc-active::before { position: absolute; top: .26rem; bottom: .26rem; left: -0.81rem; width: 2px; border-radius: 2px; background: var(--docs-link); content: ""; } +/* Material's scroll spy updates independently of the custom reading-position + state. Once the latter has started, only its selected link is highlighted. */ +.docs-toc-scrollspy .md-sidebar--secondary .md-nav__item .md-nav__link--active:not(.docs-toc-active) { position: static; padding: .26rem 0; background: transparent; box-shadow: none; color: var(--docs-text-tertiary); font-weight: 400; } +.docs-toc-scrollspy .md-sidebar--secondary .md-nav__item .md-nav__link--active:not(.docs-toc-active)::before { content: none; } + +/* Breadcrumb: a quiet, legible trail rather than Material's tiny default. */ +.md-path { margin: 0 0 .35rem; padding: 0; font-size: .8125rem; } +.md-path__list { display: flex; flex-wrap: wrap; gap: .1rem; align-items: center; } +.md-path__item { display: flex; flex: 0 0 auto; align-items: center; white-space: nowrap; } +.md-path__item, .md-path__link { color: var(--docs-text-tertiary); } +.md-path__link { text-decoration: none; } +.md-path__link:hover { color: var(--docs-link); } +.md-path__item:not(:last-child)::after { display: none; } +.md-path__item + .md-path__item::before { display: none; } +.docs-ionicon--breadcrumb { flex: 0 0 .8rem; width: .8rem; height: .8rem; margin: 0 .2rem; color: var(--docs-text-tertiary); } +.md-path__item:first-child .docs-ionicon--breadcrumb { display: none; } + +/* Content: a readable measure and a restrained documentation type scale. */ +.md-content { max-width: 38rem; } +.md-content__inner { position: relative; padding-top: 1.25rem; padding-bottom: 3rem; } +.md-typeset { color: var(--docs-text-secondary); font-size: 1rem; line-height: 1.7; } +.md-typeset h1, .md-typeset h2, .md-typeset h3, .md-typeset h4 { color: var(--docs-text); font-weight: 700; letter-spacing: -.025em; } +.md-typeset h1 { margin: 0 0 1.5rem; font-size: 1.875rem; line-height: 1.25; } +.md-typeset h2 { margin-top: 3rem; padding-top: .25rem; font-size: 1.5rem; line-height: 1.35; } +.md-typeset h3 { margin-top: 2rem; font-size: 1.2rem; } +.md-content__inner > h1 + p { color: var(--docs-text-secondary); font-size: 1.0625rem; line-height: 1.65; } +.md-typeset a { color: var(--docs-link); font-weight: 500; text-decoration-thickness: 1px; text-underline-offset: .14em; } +.md-typeset a:hover { color: var(--docs-link-hover); } +.md-typeset code { padding: .14em .32em; border-radius: var(--docs-radius); background: var(--docs-bg-subtle); color: var(--docs-text); } +/* Crisp, bordered inline-code chips; code inside links takes the link color. */ +.md-typeset :not(pre) > code { border: 1px solid var(--docs-border); } +.md-typeset a code { color: inherit; } +.md-typeset pre { border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-code-bg); box-shadow: none; } +.md-typeset pre > code { color: var(--docs-code-text); background: transparent; } +.md-typeset pre > code, .md-typeset .highlighttable .code pre > code { overflow-x: hidden; overflow-wrap: anywhere; white-space: pre-wrap; word-break: break-word; } +.md-typeset .highlighttable { overflow: hidden; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-code-bg); } +.md-typeset .highlighttable .linenos { background: color-mix(in srgb, var(--docs-code-bg) 82%, var(--docs-bg)); color: var(--docs-text-tertiary); } +.md-typeset .highlighttable pre { border: 0; border-radius: 0; } +.md-typeset .md-code__nav { top: .35rem; right: .35rem; gap: .2rem; padding: 0; } +.md-typeset .md-code__button { display: grid; width: 1.75rem; height: 1.75rem; padding: .35rem; place-items: center; border-radius: var(--docs-radius); color: var(--docs-text-tertiary); } +.md-typeset :is(.md-code__button, .md-clipboard)::after { display: block; width: 1rem; height: 1rem; margin: 0; background-color: currentColor; -webkit-mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/copy-outline.svg"); mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/copy-outline.svg"); -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: contain; mask-size: contain; } +.md-typeset .tabbed-control--prev .tabbed-button::after, .md-typeset .tabbed-control--next .tabbed-button::after { display: block; width: 1rem; height: 1rem; margin: 0; background-color: currentColor; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: contain; mask-size: contain; } +.md-typeset .tabbed-control--prev .tabbed-button::after { -webkit-mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-back-outline.svg"); mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-back-outline.svg"); } +.md-typeset .tabbed-control--next .tabbed-button::after { -webkit-mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-forward-outline.svg"); mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-forward-outline.svg"); } +.md-typeset .md-code__button:hover, .md-typeset .md-code__button:focus-visible { background: color-mix(in srgb, var(--docs-text) 8%, transparent); color: var(--docs-text); } +.md-typeset .md-code__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 1px; } +.md-typeset .highlight span.hll { display: inline-block; width: 100%; background: color-mix(in srgb, var(--docs-link) 18%, transparent); } +.md-typeset .tabbed-set { margin: 1.5rem 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); overflow: hidden; } +.md-typeset .tabbed-labels { padding: .25rem .5rem 0; border-bottom: 1px solid var(--docs-border); background: var(--docs-bg-secondary); } +.md-typeset .tabbed-labels > label { padding: .55rem .65rem; color: var(--docs-text-tertiary); font-size: .78rem; font-weight: 600; } +.md-typeset .tabbed-labels > label:hover { color: var(--docs-text); } +.md-typeset .tabbed-labels::before { background: var(--docs-link); } +.md-typeset .tabbed-content { box-shadow: none; } +.md-typeset .tabbed-content > .tabbed-block { margin: 0; } +.md-typeset .tabbed-content pre { margin: 0; border: 0; border-radius: 0; } +.md-typeset table:not([class]) { border: 1px solid var(--docs-border); border-radius: var(--docs-radius); box-shadow: none; } +.docs-table-scroll { width: 100%; overflow-x: auto; margin: 1.5rem 0; } +.docs-table-scroll > table { margin: 0; } +.md-typeset table:not([class]) th { color: var(--docs-text); background: var(--docs-bg-secondary); } +.md-typeset table:not([class]) tr:hover { background: var(--docs-bg-secondary); } +/* Normal prose tables read at a comfortable size with airier cells. Tables that + carry an inline `style` (e.g. the wide supported-languages matrix) opt out and + keep their deliberately compact sizing. */ +.md-typeset table:not([class]):not([style]) { font-size: .8125rem; } +.md-typeset table:not([class]):not([style]) :is(th, td) { padding: .6rem .9rem; } +.md-typeset table:not([class]):not([style]) th { border-bottom: 1px solid var(--docs-border); } +.md-typeset .admonition, .md-typeset details { margin: 1.25rem 0; padding: .7rem .9rem; border: 1px solid color-mix(in srgb, var(--docs-link) 28%, var(--docs-border)); border-radius: var(--docs-radius); background: color-mix(in srgb, var(--docs-link) 4%, var(--docs-bg)); color: var(--docs-text-secondary); box-shadow: none; font-size: .875rem; line-height: 1.55; } +.md-typeset .admonition > :last-child, .md-typeset details > :last-child { margin-bottom: 0; } +.md-typeset .admonition > :first-child:not(.admonition-title), .md-typeset details > :first-child:not(summary) { margin-top: 0; } +.md-typeset .admonition > p, .md-typeset details > p { color: var(--docs-text-secondary); } +.md-typeset .admonition > .admonition-title + p, .md-typeset details > summary + p { margin: 0; } +.md-typeset .admonition > .admonition-title, .md-typeset details > summary { display: flex; gap: .6rem; align-items: flex-start; margin: 0 0 .3rem; padding: 0; background: transparent; color: var(--docs-text); font-size: .875rem; font-weight: 600; line-height: 1.45; list-style: none; } +.md-typeset .admonition > .admonition-title:only-child, .md-typeset details > summary:only-child { margin-bottom: 0; } +.md-typeset .admonition > .admonition-title::before, .md-typeset details > summary::before { display: none; } +.docs-ionicon--admonition { flex: 0 0 .9rem; width: .9rem; height: .9rem; margin-top: .18rem; color: var(--docs-link); } +.md-typeset .admonition:has(> .docs-ionicon--admonition) { display: grid; grid-template-columns: .9rem minmax(0, 1fr); column-gap: .6rem; align-items: start; } +.md-typeset .admonition:has(> .docs-ionicon--admonition) > .docs-ionicon--admonition { grid-column: 1; grid-row: 1; } +.md-typeset .admonition:has(> .docs-ionicon--admonition) > :not(.docs-ionicon--admonition) { grid-column: 2; min-width: 0; } +.md-typeset .admonition.info .docs-ionicon--admonition, .md-typeset details.info .docs-ionicon--admonition { color: #00b8d4; } +.md-typeset .admonition.tip .docs-ionicon--admonition, .md-typeset details.tip .docs-ionicon--admonition, .md-typeset .admonition.success .docs-ionicon--admonition, .md-typeset details.success .docs-ionicon--admonition { color: var(--docs-success); } +.md-typeset .admonition.warning .docs-ionicon--admonition, .md-typeset details.warning .docs-ionicon--admonition { color: var(--docs-warning); } +.md-typeset .admonition.danger .docs-ionicon--admonition, .md-typeset details.danger .docs-ionicon--admonition { color: var(--docs-danger); } +.md-typeset .admonition.tip, .md-typeset details.tip, .md-typeset .admonition.success, .md-typeset details.success { border-color: color-mix(in srgb, var(--docs-success) 35%, var(--docs-border)); background: color-mix(in srgb, var(--docs-success) 6%, var(--docs-bg)); } +.md-typeset .admonition.warning, .md-typeset details.warning { border-color: color-mix(in srgb, var(--docs-warning) 38%, var(--docs-border)); background: color-mix(in srgb, var(--docs-warning) 6%, var(--docs-bg)); } +.md-typeset .admonition.danger, .md-typeset details.danger { border-color: color-mix(in srgb, var(--docs-danger) 35%, var(--docs-border)); background: color-mix(in srgb, var(--docs-danger) 6%, var(--docs-bg)); } +.md-content article.md-typeset blockquote { margin: 1.5rem 0; padding: .15rem 0 .15rem 1rem; border-left: 2px solid var(--docs-border-strong); color: var(--docs-text-secondary); } +.md-content article.md-typeset blockquote > :first-child { margin-top: 0; } +.md-content article.md-typeset blockquote > :last-child { margin-bottom: 0; } + +.docs-notice { margin: 0 0 1.5rem; padding: 1rem 1.1rem; border: 1px solid var(--docs-border-strong); border-radius: var(--docs-radius); background: var(--docs-bg-brand); color: var(--docs-text-secondary); } +.docs-notice strong { color: var(--docs-text); } +.docs-notice p { margin: .35rem 0 0; } +.docs-source-link { float: right; margin: .25rem 0 1rem 1rem; color: var(--docs-text-tertiary); font-size: .78rem; font-weight: 600; text-decoration: none; } +.docs-revision { display: flex; align-items: center; gap: .35rem; margin-top: 2.5rem; color: var(--docs-text-tertiary); font-size: .78rem; } +.docs-revision span { color: var(--docs-text-secondary); font-weight: 600; } +.docs-revision span::after { color: var(--docs-text-tertiary); content: "·"; margin-left: .35rem; } +.docs-revision .git-revision-date-localized-plugin::after { content: none; } + +/* Error page: useful recovery actions while preserving legacy redirects. */ +.docs-error { max-width: 34rem; padding: 4rem 0 7rem; } +.docs-error__code { margin: 0 0 .55rem; color: var(--docs-link); font-size: .78rem; font-weight: 700; letter-spacing: .08em; } +.docs-error h1 { margin-bottom: 1rem; } +.docs-error > p:not(.docs-error__code) { max-width: 31rem; } +.docs-error__actions { display: flex; flex-wrap: wrap; gap: .75rem; margin-top: 1.5rem; } +.md-typeset .docs-error__actions a, .md-typeset .docs-error__actions label { display: inline-flex; min-height: 2.75rem; align-items: center; justify-content: center; padding: .65rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text); cursor: pointer; font-size: .85rem; font-weight: 600; text-decoration: none; } +.md-typeset .docs-error__actions .docs-error__primary { border-color: var(--docs-link); background: var(--docs-link); color: #fff; } +.md-typeset .docs-error__actions a:hover, .md-typeset .docs-error__actions label:hover { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); color: var(--docs-link); } +.md-typeset .docs-error__actions .docs-error__primary:hover { border-color: var(--docs-link-hover); background: var(--docs-link-hover); color: #fff; } +.docs-error__actions a:focus-visible, .docs-error__actions label:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } +.md-main__inner:has(.docs-error) .md-sidebar { display: none; } + +/* Block screenshots are framed (border + rounded corners + soft shadow), + applied by docs-theme.js only to wide, standalone content images. */ +.md-typeset img.docs-image { display: block; max-width: 100%; height: auto; margin: 1.5rem 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); box-shadow: var(--docs-shadow-1); } +.md-typeset p.docs-image-block { margin: 1.75rem 0; } +.md-typeset p.docs-image-block img.docs-image { margin: 0; } + +/* Homepage: task-led landing content with one canonical documentation card. */ +.docs-home-lead { max-width: 36rem; color: var(--docs-text-secondary); font-size: 1.05rem; } +.content-columns-wrapper { display: grid; grid-template-columns: 1fr; gap: 1.75rem; margin: 2rem 0 3rem; } +.content-link-column { display: grid; align-content: start; gap: .75rem; } +.content-link-column > h2 { margin: 0 0 .15rem; padding: 0; color: var(--docs-text); font-size: .78rem; font-weight: 700; letter-spacing: .04em; line-height: 1.4; text-transform: uppercase; } +.md-typeset .content-link, .md-typeset .topic-card { position: relative; display: block; min-height: 3.75rem; padding: 1rem 2.65rem 1rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); text-decoration: none; transition: border-color .15s ease, background .15s ease; } +.md-typeset .content-link::after, .md-typeset .topic-card::after { position: absolute; top: .95rem; right: 1rem; color: var(--docs-text-tertiary); content: "→"; font-size: .9rem; transition: color .15s ease, transform .15s ease; } +.content-link:hover, .topic-card:hover, .content-link:focus-visible, .topic-card:focus-visible { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); text-decoration: none; } +.content-link:hover::after, .topic-card:hover::after, .content-link:focus-visible::after, .topic-card:focus-visible::after { color: var(--docs-link); transform: translateX(.12rem); } +.md-typeset .content-link--primary { border-color: color-mix(in srgb, var(--docs-link) 32%, var(--docs-border)); background: color-mix(in srgb, var(--docs-link) 5%, var(--docs-bg)); } +.content-link h3, .topic-card h3 { margin: 0 0 .35rem; color: var(--docs-text); font-size: .92rem; font-weight: 600; letter-spacing: -.01em; line-height: 1.4; } +.content-link p, .topic-card p { margin: 0; color: var(--docs-text-secondary); font-size: .82rem; font-weight: 400; line-height: 1.55; } +.topic-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .75rem; margin-top: 1rem; } +.md-typeset .topic-card { padding-top: 1rem; } +.tc-icon { display: grid; width: 2.25rem; height: 2.25rem; place-items: center; margin-bottom: .9rem; border-radius: var(--docs-radius); background: var(--docs-bg-brand); } +.tc-icon img { width: 1.25rem; height: 1.25rem; margin: 0 !important; border: 0 !important; border-radius: 0 !important; box-shadow: none !important; } +.md-main__inner:has(.content-columns-wrapper) .md-sidebar--secondary { display: none; } +.md-main__inner:has(.content-columns-wrapper) .docs-page-nav { display: flex; justify-content: flex-end; margin-top: 2rem; padding-top: 1rem; } +.md-main__inner:has(.content-columns-wrapper) .docs-page-nav a { min-height: 0; padding: .5rem 0; border: 0; background: transparent; } +.md-main__inner:has(.content-columns-wrapper) .docs-page-nav__next { grid-column: auto; } + +/* Release log: compact, scannable chronology without turning 132 entries into cards. */ +.md-content article.md-typeset:has(#codacy-release-notes) .release-series { margin: 2rem 0 .45rem; padding: 0; color: var(--docs-text); font-size: .8rem; font-weight: 700; letter-spacing: .035em; line-height: 1.4; text-transform: uppercase; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul { margin: 0 0 1.75rem; padding: 0; border-top: 1px solid var(--docs-border); list-style: none; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li { position: relative; margin: 0; padding: .58rem .65rem .58rem 1.35rem; border-bottom: 1px solid var(--docs-border); color: var(--docs-text-tertiary); font-size: .875rem; line-height: 1.5; transition: background-color .12s ease; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li::before { position: absolute; top: 1.05rem; left: .55rem; width: .28rem; height: .28rem; border-radius: 50%; background: var(--docs-border-strong); content: ""; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li:hover { background: var(--docs-bg-secondary); } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul a { color: var(--docs-text-secondary); font-weight: 500; text-decoration: none; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul a:hover { color: var(--docs-link); } +.md-typeset #tool-versions + ul, .md-typeset #tool-versions + p + ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.5rem; margin-top: 1rem; font-size: .875rem; line-height: 1.5; } +.md-typeset #tool-versions + ul > li, .md-typeset #tool-versions + p + ul > li { margin: .18rem 0; break-inside: avoid; } +.md-main__inner:has(#codacy-release-notes) .md-sidebar--secondary { display: none; } + +/* Page navigation belongs with the article. The site footer remains global. */ +.docs-page-nav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; margin-top: 3rem; padding-top: 1.5rem; border-top: 1px solid var(--docs-border); } +.docs-page-nav a { display: grid; gap: .25rem; min-height: 4.75rem; padding: .9rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); color: var(--docs-text); text-decoration: none; } +.docs-page-nav a:hover { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); text-decoration: none; } +.docs-page-nav span { color: var(--docs-text-tertiary); font-size: .72rem; } +.docs-page-nav strong { font-size: .86rem; font-weight: 600; } +.docs-page-nav__next { grid-column: 2; text-align: right; } +.docs-footer { border-top: 1px solid var(--docs-border); background: var(--docs-bg); } +.docs-footer__inner { display: flex; justify-content: space-between; gap: 2rem; max-width: 90rem; padding: 1.4rem 1rem; margin: auto; color: var(--docs-text-tertiary); font-size: .78rem; } +.docs-footer__brand { display: grid; gap: .4rem; max-width: 31rem; } +.docs-footer__brand strong { color: var(--docs-text); font-size: .86rem; font-weight: 600; } +.docs-footer__brand span { line-height: 1.5; } +.docs-footer__brand b { margin: 0 .35rem; color: var(--docs-border-strong); font-weight: 400; } +.docs-footer__meta { display: grid; align-content: space-between; justify-items: end; gap: .9rem; text-align: right; } +.docs-footer nav { display: flex; flex-wrap: wrap; gap: 1rem; } +.docs-footer a { color: var(--docs-text-secondary); text-decoration: none; } +.docs-footer a:hover { color: var(--docs-link); } + +.docs-feedback { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 1rem; row-gap: .25rem; margin-top: 3rem; padding: 1.5rem 0; border: 0; border-top: 1px solid var(--docs-border); border-bottom: 1px solid var(--docs-border); border-radius: 0; background: transparent; } +.docs-feedback h2 { grid-column: 1; margin: 0; padding: 0; font-size: 1rem; } +.docs-feedback p { grid-column: 1 / -1; margin: .25rem 0 0; } +.docs-feedback > p:first-of-type { grid-column: 1; color: var(--docs-text-tertiary); font-size: .82rem; } +.docs-feedback button { padding: .45rem .75rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); cursor: pointer; font: inherit; font-size: .8rem; } +.docs-feedback button:hover { border-color: var(--docs-border-strong); color: var(--docs-link); } +.docs-feedback button[aria-pressed="true"] { border-color: color-mix(in srgb, var(--docs-link) 55%, var(--docs-border)); background: color-mix(in srgb, var(--docs-link) 9%, var(--docs-bg)); color: var(--docs-link); font-weight: 600; } +.docs-feedback button:disabled { cursor: default; opacity: .65; } +.docs-feedback.is-submitted .docs-feedback__choices { opacity: .7; } +.docs-feedback__choices { display: flex; grid-column: 2; grid-row: 1 / span 2; align-self: center; gap: .5rem; } +.docs-feedback__form { grid-column: 1 / -1; margin-top: 1rem; } +.docs-feedback textarea { display: block; width: 100%; box-sizing: border-box; margin-top: .5rem; padding: .7rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text); font: inherit; } +.docs-feedback__count { color: var(--docs-text-tertiary); font-size: .72rem; } +.docs-feedback__thanks { color: var(--docs-success); font-weight: 600; } +.docs-feedback__thanks:focus { outline: none; } +.docs-feedback__links { display: flex; flex-wrap: wrap; gap: .5rem 1rem; padding-top: .75rem; color: var(--docs-text-tertiary); font-size: .78rem; } +.docs-search-trigger:focus-visible, .docs-header__cta:focus-visible, .version-select-container .select-css:focus-visible, .content-link:focus-visible, .topic-card:focus-visible, .docs-page-nav a:focus-visible, .docs-feedback button:focus-visible, .docs-feedback textarea:focus-visible, .docs-feedback a:focus-visible, .docs-footer a:focus-visible, .docs-source-link:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } + +/* Desktop is a deliberate three-rail reading layout, not Material's fluid flex row. + Fixed rails keep the article measure stable and make the generous empty space useful. */ +@media screen and (min-width: 76.25em) { + .md-grid { max-width: 96rem; } + .md-header .md-grid { box-sizing: border-box; max-width: 70rem; padding-right: 2rem; padding-left: 2.8rem; } + .md-main .md-grid { box-sizing: border-box; padding-right: 2rem; padding-left: 2rem; } + /* Footer copy shares the logo and primary-navigation baseline. */ + .docs-footer__inner { max-width: 70rem; padding-right: 2rem; padding-left: 3rem; } + .md-main__inner { --docs-primary-rail-width: 16rem; --docs-layout-half-width: 33rem; position: relative; display: grid; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 34rem) 12rem; column-gap: 2rem; justify-content: center; } + /* This belongs to the full main grid, not the sticky sidebar: it therefore + frames the primary rail continuously from the header to the footer. */ + .md-main__inner::before { position: absolute; top: -1.5rem; bottom: 0; z-index: 1; width: 1px; background: var(--docs-border); content: ""; pointer-events: none; } + /* The grid is centered, so derive the divider from its first grid line. + A fixed left offset drifts into the rail as the viewport widens. */ + [dir="ltr"] .md-main__inner::before { left: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } + [dir="rtl"] .md-main__inner::before { right: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } + .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } + .md-main__inner:has(.docs-error)::before { content: none; } + .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } + .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } + /* These two-column pages start at the main grid's inline inset instead of + being centered, so their divider keeps the inset-based position. */ + [dir="ltr"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { left: calc(var(--docs-primary-rail-width) + 2rem); } + [dir="rtl"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { right: calc(var(--docs-primary-rail-width) + 2rem); } + .md-sidebar { width: auto; max-width: none; } + .md-sidebar--secondary { margin-left: 0; } + .md-content { min-width: 0; max-width: none; } + .md-header__button[data-drawer-trigger] { display: none; } + .md-nav--primary > .md-nav__title { display: none; } + + /* Breadcrumb and article share a text edge. The primary navigation begins + slightly earlier, while the outline aligns with the page heading — the + stagger used by the strongest Mintlify/GitBook references. */ + .md-path { margin-top: 1.25rem; margin-right: 1.2rem; margin-left: 1.2rem; } + .md-sidebar--primary { padding-top: .75rem; } + .md-sidebar--secondary { padding-top: .75rem; } + + /* The navigation list owns its 24px hover gutter, keeping row widths + symmetrical without reserving extra space in the sidebar shell. */ + [dir="ltr"] .md-sidebar--primary .md-sidebar__inner { padding-right: 0; } + [dir="rtl"] .md-sidebar--primary .md-sidebar__inner { padding-left: 0; } + /* Material narrows this inner viewport when a section is expanded. Keep it + pinned to the desktop rail so grouped content retains the root-row width. */ + .md-sidebar--primary .md-sidebar__inner, + .md-sidebar--primary .md-nav--primary { width: 100%; max-width: none; box-sizing: border-box; } + [dir="ltr"] .md-sidebar--secondary .md-sidebar__inner { padding-right: 2rem; } + [dir="rtl"] .md-sidebar--secondary .md-sidebar__inner { padding-left: 2rem; } + + .md-sidebar--primary .md-sidebar__scrollwrap { margin-inline: 0; } + /* A long expanded group introduces the browser scrollbar. Reserve that + gutter from the root state as well, so the navigation content never + narrows when the sidebar starts scrolling. */ + .md-sidebar--primary .md-sidebar__scrollwrap { scrollbar-gutter: stable !important; } + /* Material reserves extra space on one side of desktop navigation rows. + The rail already owns a 16px list gutter, so remove that offset to keep + active, grouped, and standalone rows aligned to the same right edge. */ + .md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; } + [dir="ltr"] .md-sidebar--primary .md-nav--primary .md-nav__link { margin-right: 0; } + [dir="rtl"] .md-sidebar--primary .md-nav--primary .md-nav__link { margin-left: 0; } + /* The TOC begins on the breadcrumb's post-header baseline. */ + .md-sidebar__inner, .md-sidebar--secondary .md-sidebar__inner { padding-top: 0; } +} + +@media screen and (min-width: 80em) { + /* The main grid expands to the 18rem navigation rail at this breakpoint. + Keep the header and footer in that same viewport frame until the 90rem + desktop cap applies, rather than centering a narrower 80rem shell. */ + .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } + .md-main__inner { --docs-primary-rail-width: 18rem; --docs-layout-half-width: 38rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 38rem) 14rem; column-gap: 3rem; } + .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } + .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem); justify-content: start; } + .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem); justify-content: start; } +} + +@media screen and (min-width: 90em) { + /* Aikido/Lovable/Replit converge on this centered wide-docs geometry: + 288px navigation, 768px article, 224px outline, and 48px gutters. */ + .md-grid { max-width: 90rem; } + .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } + .md-main__inner { --docs-layout-half-width: 43rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem) 14rem; } + .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } + .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem) 14rem; } + .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem) 14rem; justify-content: center; } +} + +@media screen and (max-width: 76.2344em) { + .md-sidebar--secondary:not([hidden]) { display: none; } + /* Match the bottom rhythm of each root entry while the primary sidebar is + presented as the mobile drawer. */ + .md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: .25rem; } + /* Material adds a second arrow to the mobile group heading via this + pseudo-element; the inline icon is the only back control we need. */ + .md-nav--primary .md-nav__title .md-nav__icon::after { display: none; } + /* Keep the breadcrumb aligned with the article gutter after the desktop + three-rail layout collapses. */ + .md-path { padding-inline: 1rem; } + /* One computed rail width is shared by both transform states. This also + keeps expanded navigation labels from changing the drawer's footprint. */ + .md-sidebar--primary { --docs-nav-rail-width: min(20rem, calc(100vw - 3.5rem)); width: var(--docs-nav-rail-width); max-width: none; flex-basis: var(--docs-nav-rail-width); border: 0; box-shadow: none; background: var(--docs-bg); } + /* Material presents expanded sections as panels. Give those panels the + same horizontal gutter as the root list so the navigation rail doesn't + appear to widen when moving between levels. */ + .md-sidebar--primary .md-nav--primary, + .md-sidebar--primary .md-nav--primary .md-nav { width: var(--docs-nav-rail-width); min-width: var(--docs-nav-rail-width); max-width: var(--docs-nav-rail-width); box-sizing: border-box; } + .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list { box-sizing: border-box; padding-inline: 1rem; } + /* Group panels use Material's own list. Match the small vertical breathing + room of the root list, so each entry sits evenly between its separators. */ + .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list > .md-nav__item { margin-block: .25rem; } + /* A drilled-in panel must sit above its root-list siblings. Otherwise their + section icons bleed through the group heading and look like extra arrows. */ + .md-sidebar--primary .md-nav__item--nested > .md-nav__toggle:checked ~ .md-nav { z-index: 2; } + /* The root heading is omitted by the custom navigation partial: its logo + duplicates the header and its back control overlaps a drilled-in group. + Keep the repository source hidden in the drawer for the same reason. */ + .md-sidebar--primary .md-nav--primary[data-md-level="0"] > .md-nav__source { display: none; } + .md-sidebar--primary .md-nav--primary[data-md-level="0"] > .md-nav__list { padding-top: .75rem; } + .md-sidebar--primary .md-nav__title { border-bottom: 0; box-shadow: none; } + .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list { box-shadow: none; } + .md-sidebar--primary .md-sidebar__inner { padding-top: 0; } + [dir="ltr"] .md-sidebar--primary { left: 0; transform: translateX(calc(-1 * var(--docs-nav-rail-width))); } + [dir="rtl"] .md-sidebar--primary { right: 0; transform: translateX(var(--docs-nav-rail-width)); } + [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { transform: translateX(0); box-shadow: none; } + [dir="rtl"] [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { transform: translateX(0); } + [dir="ltr"] .md-sidebar--primary .md-sidebar__inner { padding-right: .75rem; } + [dir="rtl"] .md-sidebar--primary .md-sidebar__inner { padding-left: .75rem; } +} +@media screen and (min-width: 60em) and (max-width: 76.2344em) { + .md-header__inner { grid-template-columns: auto auto minmax(15rem, 30rem) minmax(0, 1fr) auto auto auto; } + .md-header__button[data-drawer-trigger] { order: -1; } + .md-main__inner { justify-content: center; } +} +@media screen and (min-width: 40.01em) and (max-width: 76.2344em) { + .topic-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .topic-row .topic-card:last-child { grid-column: 1 / -1; } +} +@media screen and (max-width: 59.9844em) { + .md-header__inner { grid-template-columns: auto auto auto minmax(0, 1fr) auto; min-height: 3.75rem; gap: .45rem; } + .md-header__button.md-logo img { height: 1.5rem; } + .md-header__button[data-drawer-trigger] { order: -1; } + .docs-search-trigger { grid-column: auto; width: auto; min-height: auto; justify-self: start; padding: .35rem; border: 0; background: transparent; } + .docs-search-trigger span, .docs-search-trigger kbd { display: none; } + .docs-header__cta { display: none; } + .version-select-container { grid-column: auto; margin-left: auto; } + .md-header [data-md-component="palette"] { grid-column: auto; } + .version-select-container + [data-md-component="palette"] { margin-left: 0; } + .version-select-container .select-css { width: auto; max-width: 41vw; height: 2.35rem; } + .md-content { max-width: 38rem; } + .md-typeset h1 { font-size: 1.75rem; } + .docs-feedback { grid-template-columns: 1fr; } + .docs-feedback__choices { grid-column: 1; grid-row: auto; margin-top: .5rem; } + .docs-feedback button { min-height: 2.75rem; } + .docs-footer a, .docs-feedback__links a { display: inline-flex; min-height: 2.75rem; align-items: center; } + .docs-page-nav { grid-template-columns: 1fr; } + .docs-page-nav__next { grid-column: 1; text-align: left; } + .docs-footer__inner { flex-direction: column; } + .docs-footer__meta { justify-items: start; text-align: left; } +} +@media screen and (max-width: 40em) { + .content-columns-wrapper, .topic-row { grid-template-columns: 1fr; gap: .75rem; } + .topic-row .topic-card:last-child { grid-column: auto; } + .md-typeset #tool-versions + ul, .md-typeset #tool-versions + p + ul { grid-template-columns: 1fr; } +} +@media screen and (max-width: 27rem) { + .md-header__button.md-logo { width: 2rem; padding: .25rem; } + .md-header__button.md-logo img { height: 1.5rem; } + .md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search { background: color-mix(in srgb, var(--docs-bg) 42%, transparent); } + .md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search__inner { width: calc(100vw - 1rem); height: auto; max-height: calc(100dvh - 4.5rem - env(safe-area-inset-bottom)); margin-top: 4rem; border-radius: var(--docs-radius); } + .md-search .md-search__output, .md-search .md-search__scrollwrap { max-height: calc(100dvh - 7.5rem - env(safe-area-inset-bottom)) !important; } +} diff --git a/theme/stylesheets/tokens.css b/theme/stylesheets/tokens.css new file mode 100644 index 0000000000..ba7e2db9f5 --- /dev/null +++ b/theme/stylesheets/tokens.css @@ -0,0 +1,114 @@ +:root, +[data-md-color-scheme="codacy-light"] { + --docs-bg: #FFFFFF; + --docs-bg-secondary: #F9FAFB; + --docs-bg-subtle: #EFF1F5; + --docs-bg-brand: #E5EFFF; + --docs-text: #171D26; + --docs-text-secondary: #475776; + --docs-text-tertiary: #5F7399; + --docs-link: #005DF0; + --docs-link-hover: #0048BD; + --docs-border: #DFE4EC; + --docs-border-strong: #8AB7FF; + --docs-success: #339950; + --docs-success-bg: #ECF9EF; + --docs-warning: #BD7600; + --docs-warning-bg: #FFF6E5; + --docs-danger: #C8282A; + --docs-danger-bg: #FFF6F5; + --docs-code-bg: #F6F8FB; + --docs-code-text: #24324A; + --md-code-hl-color: #EAF1FF; + --md-code-hl-color--light: #EAF1FF99; + --md-code-hl-comment-color: #6D7B91; + --md-code-hl-constant-color: #0550AE; + --md-code-hl-function-color: #8250DF; + --md-code-hl-generic-color: #24324A; + --md-code-hl-keyword-color: #CF222E; + --md-code-hl-name-color: #24324A; + --md-code-hl-number-color: #0550AE; + --md-code-hl-operator-color: #475776; + --md-code-hl-punctuation-color: #475776; + --md-code-hl-special-color: #116329; + --md-code-hl-string-color: #0A6B3C; + --md-code-hl-variable-color: #953800; + --docs-shadow-1: 0 1px 2px #47577626; + --docs-shadow-2: 0 12px 28px #47577633; + /* Documentation surfaces share a deliberately restrained 4px corner. */ + --docs-radius: .25rem; + --docs-radius-sm: var(--docs-radius); + --docs-radius-md: var(--docs-radius); + --docs-radius-lg: var(--docs-radius); + --docs-space-1: .25rem; + --docs-space-2: .5rem; + --docs-space-3: .75rem; + --docs-space-4: 1rem; + --docs-space-5: 1.5rem; + --docs-space-6: 2rem; + --docs-space-7: 3rem; + --md-default-bg-color: var(--docs-bg); + --md-default-fg-color: var(--docs-text); + --md-default-fg-color--light: var(--docs-text-secondary); + --md-default-fg-color--lighter: var(--docs-border); + --md-default-fg-color--lightest: var(--docs-bg-subtle); + --md-primary-fg-color: var(--docs-bg); + --md-primary-bg-color: var(--docs-text); + --md-accent-fg-color: var(--docs-link); + --md-typeset-a-color: var(--docs-link); + --md-code-bg-color: var(--docs-bg-subtle); + --md-code-fg-color: var(--docs-text); + --md-footer-bg-color: var(--docs-bg); + --md-footer-bg-color--dark: var(--docs-bg); +} + +[data-md-color-scheme="codacy-dark"] { + --docs-bg: #0B0E13; + --docs-bg-secondary: #11151D; + --docs-bg-subtle: #1D2430; + --docs-bg-brand: #091E4E; + --docs-text: #F9FAFB; + --docs-text-secondary: #D6DBE6; + --docs-text-tertiary: #96A4C0; + --docs-link: #5784FF; + --docs-link-hover: #8AB7FF; + --docs-border: #344056; + --docs-border-strong: #5784FF; + --docs-success: #66CC83; + --docs-success-bg: #12351C; + --docs-warning: #FFC157; + --docs-warning-bg: #472D00; + --docs-danger: #FB615A; + --docs-danger-bg: #3D0003; + --docs-code-bg: #11151D; + --docs-code-text: #F9FAFB; + --md-code-hl-color: #2D333B; + --md-code-hl-color--light: #2D333B80; + --md-code-hl-comment-color: #8B949E; + --md-code-hl-constant-color: #79C0FF; + --md-code-hl-function-color: #D2A8FF; + --md-code-hl-generic-color: #F0F6FC; + --md-code-hl-keyword-color: #FF7B72; + --md-code-hl-name-color: #E6EDF3; + --md-code-hl-number-color: #79C0FF; + --md-code-hl-operator-color: #C9D1D9; + --md-code-hl-punctuation-color: #C9D1D9; + --md-code-hl-special-color: #7EE787; + --md-code-hl-string-color: #A5D6FF; + --md-code-hl-variable-color: #FFA657; + --docs-shadow-1: 0 1px 2px #00000066; + --docs-shadow-2: 0 12px 28px #00000080; + --md-default-bg-color: var(--docs-bg); + --md-default-fg-color: var(--docs-text); + --md-default-fg-color--light: var(--docs-text-secondary); + --md-default-fg-color--lighter: var(--docs-border); + --md-default-fg-color--lightest: var(--docs-bg-subtle); + --md-primary-fg-color: var(--docs-bg-secondary); + --md-primary-bg-color: var(--docs-text); + --md-accent-fg-color: var(--docs-link); + --md-typeset-a-color: var(--docs-link); + --md-code-bg-color: var(--docs-bg-subtle); + --md-code-fg-color: var(--docs-text); + --md-footer-bg-color: var(--docs-bg); + --md-footer-bg-color--dark: var(--docs-bg); +} From fb45a6f959cc74f5c7b85ed41d7dfb84dff834aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 11:09:23 +0100 Subject: [PATCH 02/20] fix: preserve untitled admonition content --- theme/hooks/image_metadata.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/theme/hooks/image_metadata.py b/theme/hooks/image_metadata.py index a64fd9fbad..d300f76235 100644 --- a/theme/hooks/image_metadata.py +++ b/theme/hooks/image_metadata.py @@ -25,7 +25,7 @@ r"(?P<container><(?P<tag>div|details)\b" r"(?=[^>]*\bclass\s*=\s*[\"'][^\"']*\badmonition\b)(?P<attributes>[^>]*)>)" r"(?P<space>\s*)" - r"(?!(?:<p\b(?=[^>]*\bclass\s*=\s*[\"'][^\"']*\badmonition-title\b)[^>]*>|<summary\b))", + r"(?P<first><(?!/)[^>]+>)", re.IGNORECASE | re.DOTALL, ) _WIDE_SCREENSHOT_MINIMUM = 280 @@ -180,11 +180,21 @@ def enhance(match: re.Match[str]) -> str: ) def enhance_untitled(match: re.Match[str]) -> str: + first = match.group("first") + classes = _CLASS.search(first) + is_title = ( + first.lower().startswith("<summary") + or (classes is not None and "admonition-title" in classes.group(2).lower().split()) + ) + if is_title: + return match.group(0) + icon = _admonition_icon(match.group("attributes")) return ( f'{match.group("container")}{match.group("space")}' f'<ion-icon name="{icon}" aria-hidden="true" ' 'class="docs-ionicon docs-ionicon--admonition"></ion-icon>' + f"{first}" ) html = _UNTITLED_ADMONITION.sub(enhance_untitled, html) From e3969a510eceff3eeeadf6ed8c058b4a461ac526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 12:21:13 +0100 Subject: [PATCH 03/20] fix: address theme quality checks --- CONTRIBUTING.md | 29 ++- requirements.txt | 1 + theme/PROJECT.md | 368 ---------------------------------- theme/hooks/image_metadata.py | 14 +- theme/partials/header.html | 4 +- theme/partials/logo.html | 4 +- 6 files changed, 29 insertions(+), 391 deletions(-) delete mode 100644 theme/PROJECT.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3436385ae5..6d606565ed 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -59,22 +59,21 @@ The theme is intentionally plain CSS and minimal Jinja overrides: - [`mkdocs.yml`](mkdocs.yml) connects this layer through `theme.custom_dir` and loads the small supporting browser scripts and stylesheets. -There is no SCSS compilation, Webpack configuration, Node dependency, or -frontend build step. Edit the CSS, Jinja partials, or supporting JavaScript -directly, then use the normal MkDocs preview: +There is no front-end build step. Edit the CSS, Jinja partials, or supporting +JavaScript directly, then use the normal MkDocs preview: ```bash mkdocs serve ``` -The theme self-hosts the Inter and Roboto Mono webfonts under -`theme/assets/fonts/`; it does not contact a third-party font -service. Keep the font license beside those assets when updating them. +The theme self-hosts the Inter and Roboto Mono font files under +`theme/assets/fonts/`; it doesn't contact a third-party font service. Keep the +font license beside those assets when updating them. -The dependency-free `theme/hooks/image_metadata.py` hook adds -intrinsic dimensions and safe loading hints to local documentation images at -build time. Authors normally only need to use standard Markdown image syntax; -explicit HTML image attributes are preserved when a page needs an exception. +The `theme/hooks/image_metadata.py` hook adds intrinsic dimensions and safe +loading hints to local documentation images at build time. Authors normally use +standard Markdown image syntax; explicit HTML image attributes are preserved +when a page needs an exception. Before opening a pull request that changes the theme, build with warnings treated as errors and check representative pages in the local preview: @@ -83,12 +82,10 @@ treated as errors and check representative pages in the local preview: mkdocs build --strict ``` -Check at least a Cloud page, a Self-hosted page when relevant, light and dark -color schemes, desktop and narrow mobile widths, search, the version picker, -and any changed content component. Preserve the behavior described in -[`theme/PROJECT.md`](theme/PROJECT.md), including -analytics, feedback, preview and Self-hosted notices, source metadata, and -existing URLs. +Check a Cloud page and, when relevant, a Self-hosted page. Also check light and +dark color schemes, desktop and narrow mobile widths, search, the version +picker, and any changed content component. Preserve analytics, feedback, +preview and Self-hosted notices, source metadata, and existing URLs. ### Markdown conventions diff --git a/requirements.txt b/requirements.txt index b5d9b9d1c5..bf71b890f3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ mike==2.1.3 markdown==3.7 mkdocs-material==9.7.6 Jinja2==3.1.6 +defusedxml==0.7.1 # Markdown extensions Pygments==2.18.0 diff --git a/theme/PROJECT.md b/theme/PROJECT.md deleted file mode 100644 index 2933123832..0000000000 --- a/theme/PROJECT.md +++ /dev/null @@ -1,368 +0,0 @@ -# Codacy documentation theme - -## Purpose - -Replace the legacy `codacy-mkdocs-material` clone with a professional, -Mintlify-inspired visual layer while keeping the documentation static, free, -and entirely owned by Codacy. - -The visual reference is the previous Codacy Mintlify proof of concept at -`https://codacy.mintlify.io/`. It is a direction for information density, -navigation, typography, and polish—not source code to copy. - -## Architecture decisions - -- Extend the installed `mkdocs-material` package using `theme.custom_dir`. -- Use only plain CSS, Markdown, and the smallest necessary Jinja partials. - No vendored Material source, SCSS compilation, Webpack, Node build step, or - copied upstream assets. -- Source colors and elevation from `../ui-components/src/theme/ColorSchemes/`. -- Use Inter for documentation text. -- Use `navigation.instant` with custom scripts bound through Material's - `document$` lifecycle, so dynamic page content reinitializes after every - client-side navigation. -- Do not change `submodules/chart` as part of phase 1. Its content is rendered - by this root site's `mkdocs-monorepo-plugin`; its standalone preview is a - separate, secondary migration. - -## Functionality contract - -The replacement must preserve the existing behavior before shipping: - -- Search, redirects, RSS feeds, metadata generation, content inclusion, - macros, self-hosted version deployment, and all existing MkDocs plugins. -- Cloud/Self-hosted version picker and its route-aware navigation. -- Segment analytics and feedback events, Zendesk, Disqus, edit/source links, - last-modified metadata, preview notices, and Self-hosted `noindex`. -- Responsive navigation, accessible focus states, code-copy controls, dark - mode, and the existing documentation URLs. - -## Delivery sequence - -1. Establish the new visual foundation and move the functionality contract. -2. Browser-test representative Cloud, Self-hosted, preview, search, mobile, - feedback, and version-switcher states. Fix regressions before structural - work. -3. Review information architecture: Cloud/API/CLI, maintained Self-hosted, - and improved release-log sections/tabs. -4. Review the chart's standalone preview and decide whether to consume this - theme as a submodule. -5. Remove obsolete theme processes and update contributor/runbook docs. - -## Continuation checklist - -At the start of every scheduled continuation: - -1. Read this file and `git status`; do not overwrite unrelated local work. -2. Run `mkdocs build --strict` and record new warnings separately from the - known content-link warnings. -3. Validate a representative page in a browser before claiming visual work. -4. Keep each change small, testable, and documented here when it changes an - architectural decision or the next priority. - -## Current state — 2026-07-10 - -- A fresh theme layer now exists in this directory. It has no frontend build - tooling and only overrides the header plus Codacy-specific integrations. -- `mkdocs.yml` points to this layer, uses product design-system tokens and - Inter, and enables native Material capabilities for search, code copying, - navigation path, and linked tabs. -- Strict build passes after migrating Segment, Zendesk, Disqus, feedback, - notices, source links, and revision dates. Existing content-link warnings - remain unchanged. -- The original Material-like shell was discarded after user review. The - replacement follows the measured Aikido/Mintlify pattern: 16px base type, - 36px H1, a narrow reading column, centered desktop search, quiet sidebars, - and a plain TOC rail. -- The static header now owns the version `<select>` from first paint; the - script populates it in place instead of injecting a new element on each - page. The page title was removed from the header, light-mode logo contrast - is fixed, and the palette control is intentionally icon-only. -- Page navigation now sits below article content. The global footer is a - separate minimal copyright/link footer. Responsive tables retain Material's - horizontal scrolling, and no theme scrollbar color is applied. -- Browser QA covers desktop, 390px mobile, dark-mode color tokens, - header/version/footer DOM structure, code cards, raw data tables, TOC scroll - state, and the search lifecycle. Keep representative browser checks in the - delivery workflow whenever these components change. -- Follow-up shell/component loop: verified the custom search opens and closes - correctly; suppressed Material's sidebar scrollbar treatment; raised the - minimum size for legacy inline-styled data tables; and softened callouts. - The homepage now has a product-oriented title and introduction without - changing any destinations. Rebuild and visually re-check those latest edits - before moving on to structural navigation work. -- The displayed `⌘ K` search affordance now works through - `docs/assets/javascripts/docs-theme.js`, including `Ctrl+K` on non-macOS - keyboards. Keep it compatible with non-instant Material navigation. -- Restored the custom 404 compatibility behavior for legacy Zendesk support - ticket URLs in `404.html`. -- Runtime alignment: `requirements.txt` now pins MkDocs Material 9.7.6, the - current supported release. Validate the exact pinned environment before - shipping; the desktop environment previously had 9.7.1 while CI declared - the obsolete 8.2.3. -- Consolidated a second visual/functional pass: removed the obsolete - version-picker stylesheet, rebuilt sidebar hierarchy selectors to avoid - recursive indentation, restored browser-native sidebar scrolling, moved - article navigation to the final action after feedback, and added runtime - wrappers for raw HTML tables so they scroll safely on small screens. -- Parallel audits completed: the contributor guide now documents the plain-CSS - workflow; a clean temporary environment builds with the pinned Material - 9.7.6; and all audited Cloud, Self-hosted, and preview behavior remains - present. Version selection now waits for sitemap data and degrades safely; - preview branch links, keyboard-accessible search, and detailed negative - feedback are restored. Remaining phase-1 work is visual component polish - and browser verification after each change, not architecture rediscovery. -- The superseded `theme/` prototype and its unused stylesheet were removed - after explicit user direction. `theme/` is now the only theme - source of truth; do not resurrect the old full-template approach. -- The Mintlify reference currently redirects to its sign-in page, so visual - comparisons use its established direction rather than live DOM inspection. -- Latest refinement loop: the search is now an intentional full dialog with - backdrop, focus return on Escape, and an accessible trigger state; code, - highlight, copy, tab, and all used admonition variants share the same quiet - component system; Inter is loaded at the exact 400/500/600/700 weights used - by the theme. The mobile header retains a cropped Codacy mark instead of - losing the brand at narrow widths. The pinned strict build and static - Cloud/Self-hosted/preview functional QA pass after these changes. -- Live review completed the final responsive details: Material's inherited - floating search inner element is explicitly neutralized so the dialog stays - centered on desktop and full-width on mobile; the search trigger synchronizes - its expanded state with backdrop dismissal; and the secondary TOC has a - restrained active marker rather than a changing card/padding treatment. -- Wide-screen review now uses the Aikido, Lovable, and Replit documentation - references as a measured layout system: a 288px primary rail, 608px reading - column, 224px TOC allocation, 48px gutters, and a 28px desktop wordmark. - The shell is capped at 96rem so those rails stay stable at 1280px, 1728px, - and 2560px rather than stretching the text. Browser checks at those widths - and at 390px confirmed the desktop composition and mobile header remain - intact. The root navigation link remains available; visual work must not - trade away existing navigation behavior. -- Scheduled review on 2026-07-11 additionally verified the 1728px dark theme - and the documentation landing page. The shared color tokens retain readable - header controls, code/data surfaces, callouts, cards, navigation, and TOC - without introducing a dark-mode-only override layer. -- Sidebar interaction pass: removed Material's inherited wide-rail end padding - that restricted the 288px desktop rail to a 168px navigation column. The - usable navigation is now 250px, active rows use a stable Mintlify-style tint - instead of a shifting left rule, and nested indentation is shallower. The - mobile drawer now uses a 320px maximum width rather than Material's 194px - default; its native flex/chevron behavior, overlay dismissal, and route - selection remain intact at 390px. -- Right-rail/article-ending pass: the native MkDocs TOC title is now “On this - page,” so the visual label and accessible navigation name stay synchronized. - Scroll tracking retains the restrained active marker. The feedback surface - was reduced from a 243px card to a 142px desktop row (192px stacked on - mobile), while preserving Yes/No analytics, the focused qualitative form, - GitHub issue fallback, edit link, and support contact. Mobile pagination and - the minimal global footer were rechecked at 390px. -- Search command-palette pass: the site now uses Material 9.7.6's native - `material/search` worker instead of the legacy alias, while retaining the - custom Mintlify-style trigger. Paste, autofill, composition input, and typed - input all reach the same search pipeline. The opened surface is a single - 680px command card with concise two-line excerpts, stable result spacing, - native scrollbars, light/dark treatment, and viewport-bounded results. - Dialog naming, live result counts, focus containment/restoration, background - inerting, and platform-correct keyboard hints are part of the theme rather - than injected page markup. Wide 1728px and medium 1280px browser checks pass; - the 390px rules cap the card against `100dvh` and safe-area insets. -- The strict Cloud, preview, and Self-hosted build matrix passes with - `material/search` and `mkdocs-exclude-search==0.6.6`. Each build produces the - worker and index, retains 708 searchable documents, and excludes all 502 - intended release-note records. Existing unresolved-link notices, the one - release-note file omitted from nav, and the monorepo plugin deprecation are - pre-existing cleanup items, not theme regressions. -- Shell refinement pass: page titles now follow Mintlify's 30px desktop / 28px - mobile scale, H2 is 24px, breadcrumb and article text share an exact left - edge, and the wide TOC grows to a useful 256px allocation. The primary rail - starts slightly above the heading while the outline aligns with it, matching - the intentional stagger in the Aikido/GitBook references. At 960px the - article + outline cluster is centered instead of leaving an unused right - gutter; at 1220–1279px a compact three-rail grid avoids overflow; 1280px and - 1728px use the full 288/608/224–256 rail system. -- Sidebar cascade/accessibility pass: inactive and active rows now share the - same 14px type, 33px height, and 5.44px/8.8px padding, so selection no longer - shifts text or changes row height. Group labels use 12px sentence case, - native scrollbars replace Material's blue thin scrollbar, and light muted - text was darkened to a verified 4.77:1 contrast on white. The header logo is - explicitly retained at tablet widths and becomes a 24px Codacy mark below - 432px, still larger than utility icons. -- Mobile navigation preserves Material's nested/back behavior but now opens - from a real named button. Enter, Space, pointer activation, Escape, focus - entry/return, focus containment, `aria-expanded`, and background inerting - are handled by `docs-theme.js`. Breadcrumbs have a distinct landmark name, - the current primary link exposes `aria-current="page"`, and empty outlines - are removed from the accessibility tree. These are attribute/behavior - enhancements only; navigation destinations and hierarchy are unchanged. -- Article-component pass: all 229 callouts now render at 14px/1.65 instead of - Material's inherited 10.24px, using a quiet full-surface tint and restrained - one-pixel border rather than a saturated title strip plus heavy left rail. - Note/tip/warning/important variants, nested callout content, and mobile - layouts were visually checked in light and dark themes. Three capitalized - `Important` declarations and one malformed `notes` declaration were - normalized without changing their content or links. -- Code blocks retain the dark Codacy surface in both page themes but now use an - accessible GitHub-dark-style syntax palette. The current Material 9.7 - `.md-code__button` is explicitly styled as a visible 32px copy control with - hover and keyboard focus states; the obsolete `.md-clipboard` overrides were - removed. Copy interaction and long YAML/Bash rendering were rechecked. -- Data-table pass: the supported-languages matrix no longer forces 8px text or - white links in light mode. All prose tables use the 13px baseline and the - native Material scroll wrapper as the single overflow owner, including the - 1,134px language matrix inside 390px and 1,280px viewports. The runtime no - longer adds a redundant inner scroller around Material or highlight tables. -- Screenshots wider than 280px are framed consistently even when several occur - inside a paragraph; small icons and table imagery remain untouched. - Blockquotes now use a quiet two-pixel rail and 16px inset. Native - `pymdownx.details` and `pymdownx.tabbed` support is enabled without custom - JavaScript; a temporary fixture verified pointer/keyboard disclosure, - Cloud/Self-hosted tab switching, code tabs, and table tabs, then was removed. -- Article-ending pass: revision output is now a semantic “Last updated” row - with a `<time>` value. Feedback is an `aria-pressed` choice group with a - changeable selection, described counter, visible selected/disabled states, - and a focused live completion status. GitHub links use safe new-window - semantics and encoded titles. Next-only pagination occupies the right - desktop column and resets to the single mobile column; mobile feedback and - footer targets are 44px. The footer has a no-JavaScript 2026 copyright. -- Homepage pass: the landing page now uses a dedicated 768px desktop content - track with no empty TOC allocation, while ordinary articles remain at the - 608px reading measure. “Get started” and “Use Codacy” are real navigable - sections; all seven destinations use one card system with concise copy, - stable equal-height rows, a subtle action arrow, decorative icon semantics, - preview-safe relative asset URLs, and a clearly emphasized five-minute - quickstart. It collapses to one 364px card column at 390px without overflow. -- Release-log pass: the intended no-TOC state now uses Material's supported - `hide: [toc]` metadata. Year and Self-hosted version labels are semantic H3 - scan anchors, and the 132-entry index is a compact divided chronology rather - than generic bullets. Release detail tool-version lists use a 14px two-column - desktop grid and one mobile column. The index is 704px at desktop and remains - a single readable stream at 390px; destinations and release ordering are - unchanged. -- Edge-state pass: 404 pages now provide centered Browse/Search recovery - actions and no empty rails. The exact legacy Zendesk path matching, - destination, visible fallback, and five-second `location.assign` redirect - remain verified. Header drawer/search controls are enhanced labels tied to - Material's native checkboxes, so pointer toggling still works without custom - JavaScript while Enter/Space, focus return, inerting, and focus trapping work - with it. The version selector enables immediately after `versions.json` and - fetches only the selected version's sitemap instead of all 34 on every page; - initial Self-hosted builds render their actual version instead of Cloud. -- Cleanup in the same pass removed the unused empty `overrides/` prototype, - dead header selectors, and the obsolete legacy search-plugin condition. The - active custom header, search, source-file, footer, feedback, and 404 partials - remain intentionally small overrides over Material 9.7.6. -- Asset-delivery pass: Inter 400–700 and Roboto Mono 400–700 now ship as - self-hosted Latin/Latin-ext variable WOFF2 assets with their OFL license. - The rendered site makes no Google Fonts request, so Cloud, preview, and - Self-hosted typography is private, offline-safe, and independent of an - external font service while retaining the exact theme families and weights. -- Image-stability pass: a dependency-free MkDocs hook adds intrinsic dimensions - and asynchronous decoding to resolved local content images before first - paint. It leaves the first wide image eager and lazy-loads later screenshots, - preserves author-provided attributes, and skips remote or unresolved sources. - The runtime framing pass now uses those declared dimensions immediately, - avoiding a visible border/radius change after a screenshot finishes loading. -- Wide-shell correction: live 1728px comparisons against Aikido, Lovable, and - Replit exposed that the previous 96rem shell left the three-rail composition - 112px left of the viewport center. At 1440px and wider the shell now uses the - shared reference geometry—288px navigation, 768px article, 224px outline, - 48px gaps—inside a centered 90rem frame. The compact 1280px article remains - 608px so the transition does not overflow or abruptly squeeze the rails. -- Contextual-sidebar pass: removed Material's `navigation.sections` expansion, - which exposed roughly 90–100 navigation rows on every desktop page. The - current root section now opens by default while other product areas remain - compact native disclosures; all destinations and the existing mobile - drill-down behavior are preserved. This is the phase-1 bridge to the later - Cloud/API/CLI/Self-hosted/Release top-level information architecture. -- Rail-alignment pass: desktop navigation and “On this page” now share the - breadcrumb baseline, matching the Aikido reference instead of placing the - outline beside the H1. The outline stays hidden until the full three-rail - breakpoint rather than creating an asymmetric article+TOC layout at - 960–1219px. Sidebar group labels are 13px and active rows use an 8px radius; - header search/version controls are the 36px height used by the references. -- Article-header pass: every page now has a native 36px “Copy page” action that - copies clean article text while excluding navigation, feedback, revision, - and permalink UI. It becomes an accessible icon-only control on mobile and - announces success/failure through a live region. Pages with an authored - frontmatter description receive the slightly larger Mintlify-style lead; - pages without one keep their existing first-paragraph typography. -- Brand pass: the header now uses dedicated dark/light wordmark assets rather - than flattening the dark logo with `brightness(0)`. Both schemes retain the - Codacy blue “Docs” accent, while the mobile crop still shows the 24px mark. -- Sidebar reference pass: aligned the primary rail more closely with Aikido's - compact 288px documentation navigation. Desktop rows now use the full rail, - uppercase 12px group labels, quiet chevrons, a border-free text-led active - state, and contained native scrolling. The mobile drawer keeps Material's - native behavior but no longer adds a separator border when open. -- Instant-navigation pass: enabled Material's base instant navigation only. - The version picker and theme enhancements now subscribe to `document$`, and - the custom TOC listener is cleaned up between page injections. Prefetching, - previews, and the progress indicator remain intentionally disabled. - -## Self-paced loop — continuation log - -This section records incremental Mintlify-matching passes run under the -self-paced loop. Each entry is one small, browser-verified, strict-build-clean -change. Note: `mkdocs serve` does not hot-reload `theme/` assets in -this setup — restart the preview server after editing theme CSS/partials before -re-checking in the browser. - -- Loop pass 1 (2026-07-11): fixed anchor/TOC/deep-link scroll offset. Added - `html { scroll-padding-top: 5rem }` so in-page anchors, TOC clicks, `#` - permalinks, and search deep links no longer scroll the target heading under - the 64px sticky header. Verified live: a fresh load to - `…/supported-languages-and-tools/#docker-images-of-supported-tools` now lands - the heading ~134px from the viewport top (clear of the 65px header) with the - matching TOC item active, versus being clipped under the header before. - Strict build passes and the rule ships in the built `stylesheets/theme.css`. -- Preview watch: `.claude/launch.json` now runs - `mkdocs serve --watch theme --watch docs/assets`, so theme CSS and - partial edits rebuild live. Restarting the preview server after theme edits is - no longer required (server log confirms both dirs are watched). -- Loop pass 2 (2026-07-11, user-directed): three composition fixes. - (a) Sidebar alignment — section children were indented 13px more than the - top-level "Documentation home" link. Removed the level-1 nested-nav - margin/list padding so children now align flush with top-level links - (both at left=45px); deeper sub-items keep a subtle `.8rem` indent for - hierarchy (measured left=58px). - (b) Header regroup — the version `<select>` was floating mid-right by the - search box. Header grid is now `auto 1fr minmax(15rem,30rem) 1fr auto auto` - with the version selector on `grid-column: 5` and the palette on `6`, so the - version picker sits directly next to the theme toggle (measured 5px gap) while - search stays centered. Mobile resets both to `grid-column: auto` so the 6-col - desktop grid doesn't leak into the narrow header (verified intact at 375px). - (c) Type sizes — breadcrumb (`.md-path`, previously unstyled Material 11.2px), - TOC title (12px), and TOC links (12.48px) are now all `.8125rem` (13px), - matching the ~13px norm used by Mintlify/Docusaurus for secondary text. - Desktop, mobile, and strict build all verified. -- Loop pass 3 (2026-07-11): table legibility. Normal prose tables rendered at - Material's default 10.24px, small versus Mintlify's ~13px. Bumped - `table:not([class]):not([style])` to `.8125rem` (13px) with airier - `.6rem .9rem` cells and a header bottom border. The `:not([style])` scope - leaves inline-styled tables — notably the wide supported-languages matrix, - which carries `style="font-size:.5rem"` to fit ~10 columns — untouched (and an - inline style would win over the rule anyway). Verified live: the 2-column - "Docker images of supported tools" table is now 13px with 9.6/14.4px cell - padding while the matrix stays 8px/compact; strict build passes. -- Loop pass 4 (2026-07-11): dark-mode verification + two small Mintlify touches. - Verified dark mode across content, code, callouts, and the restyled tables — - all tokens resolve with good contrast (e.g. dark table th bg #11151D, text - #F9FAFB, border #344056); no dark-only override layer needed. Added - `html { scroll-behavior: smooth }` with a `prefers-reduced-motion` guard so - anchor/TOC/deep-link jumps glide (pairs with the pass-1 scroll-padding fix), - and gave inline code a hairline border via `.md-typeset :not(pre) > code` - (scoped so block code inside `pre` is untouched — verified: inline border - 1px/#344056, block code 0px, both fonts unchanged at 13.6px) plus - `.md-typeset a code { color: inherit }` so code inside links takes the link - color. Verified live in light and dark; strict build passes. -- Loop pass 5 (2026-07-11): framed screenshots, a strong Mintlify signature that - was missing (content images had no border/radius/shadow). Added a JS pass in - `docs/assets/javascripts/docs-theme.js` that tags an image `.docs-image` only - when it stands alone in an empty-text paragraph (one `<img>`, no sibling text) - and its `naturalWidth >= 280px`; the class adds a `1px` border, `.5rem` radius, - and soft `--docs-shadow-1`. Note the content root is `article.md-typeset` - (the article *is* `.md-typeset`), so the selector is `.md-typeset img`, not - `.md-typeset article img`. The empty-paragraph + size guards leave inline - badges, emoji, and `.tc-icon` card icons untouched. Verified live: three - screenshots (705/1172/1240px) framed on the organizations page; on the badge - page the 825px and 1280px screenshots framed while a 260px badge-like image - was correctly left unframed. JS syntax check and strict build pass. diff --git a/theme/hooks/image_metadata.py b/theme/hooks/image_metadata.py index d300f76235..be9f83849a 100644 --- a/theme/hooks/image_metadata.py +++ b/theme/hooks/image_metadata.py @@ -7,7 +7,8 @@ import struct from pathlib import Path from urllib.parse import unquote, urlsplit -from xml.etree import ElementTree +from defusedxml import ElementTree as SafeElementTree +from defusedxml.common import DefusedXmlException _IMAGE_TAG = re.compile(r"<img\b[^>]*>", re.IGNORECASE) @@ -86,7 +87,7 @@ def _image_dimensions(path: Path) -> tuple[str, str] | None: if width and height: dimensions = (str(width), str(height)) elif suffix == ".svg": - _, root = next(ElementTree.iterparse(path, events=("start",))) + _, root = next(SafeElementTree.iterparse(path, events=("start",))) width = _svg_dimension(root.get("width")) height = _svg_dimension(root.get("height")) if not width or not height: @@ -98,7 +99,14 @@ def _image_dimensions(path: Path) -> tuple[str, str] | None: height = height or view_height if width and height: dimensions = (_format_dimension(width), _format_dimension(height)) - except (OSError, ElementTree.ParseError, StopIteration, struct.error, ValueError): + except ( + OSError, + SafeElementTree.ParseError, + DefusedXmlException, + StopIteration, + struct.error, + ValueError, + ): # An unreadable or unusual image must never make the docs build fail. dimensions = None diff --git a/theme/partials/header.html b/theme/partials/header.html index 324c2bc9bf..a2459b569b 100644 --- a/theme/partials/header.html +++ b/theme/partials/header.html @@ -7,8 +7,8 @@ <header class="{{ class }}" data-md-component="header"> <nav class="md-header__inner md-grid" aria-label="{{ lang.t('header') }}"> <a href="{{ config.extra.homepage | d(nav.homepage.url, true) | url }}" title="{{ config.site_name | e }}" class="md-header__button md-logo" aria-label="{{ config.site_name }}" data-md-component="logo"> - <img class="docs-logo docs-logo--dark" src="{{ config.theme.logo | url }}" alt=""> - <img class="docs-logo docs-logo--light" src="{{ 'assets/images/codacy-docs-logo-light.svg' | url }}" alt=""> + <img class="docs-logo docs-logo--dark" src="{{ config.theme.logo | url }}" alt="Codacy Docs"> + <img class="docs-logo docs-logo--light" src="{{ 'assets/images/codacy-docs-logo-light.svg' | url }}" alt="Codacy Docs"> </a> <label class="md-header__button md-icon" for="__drawer" role="button" tabindex="0" aria-label="Open navigation" aria-controls="docs-navigation" aria-expanded="false" data-drawer-trigger> <ion-icon name="menu-outline" aria-hidden="true"></ion-icon> diff --git a/theme/partials/logo.html b/theme/partials/logo.html index 897c849135..bfaf2ef990 100644 --- a/theme/partials/logo.html +++ b/theme/partials/logo.html @@ -1,2 +1,2 @@ -<img class="docs-logo docs-logo--dark" src="{{ config.theme.logo | url }}" alt=""> -<img class="docs-logo docs-logo--light" src="{{ 'assets/images/codacy-docs-logo-light.svg' | url }}" alt=""> +<img class="docs-logo docs-logo--dark" src="{{ config.theme.logo | url }}" alt="Codacy Docs"> +<img class="docs-logo docs-logo--light" src="{{ 'assets/images/codacy-docs-logo-light.svg' | url }}" alt="Codacy Docs"> From 364ad2ada43912ab8b7eb87610db51b8e78b84ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 12:23:18 +0100 Subject: [PATCH 04/20] fix: add homepage icon text alternatives --- docs/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index b56daee076..0d00b61b5a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -42,7 +42,7 @@ Everything you need to set up Codacy, integrate it into your workflow, and get m <div class="topic-row"> <a class="topic-card" href="organizations/managing-people/"> <div class="tc-icon"> - <img alt="" aria-hidden="true" src="assets/images/icon-user-management.svg"> + <img alt="People" src="assets/images/icon-user-management.svg"> </div> <div class="tc-content"> <h3>Manage people</h3> @@ -51,7 +51,7 @@ Everything you need to set up Codacy, integrate it into your workflow, and get m </a> <a class="topic-card" href="coverage-reporter/"> <div class="tc-icon"> - <img alt="" aria-hidden="true" src="assets/images/icon-checklist.svg"> + <img alt="Checklist" src="assets/images/icon-checklist.svg"> </div> <div class="tc-content"> <h3>Add coverage</h3> @@ -60,7 +60,7 @@ Everything you need to set up Codacy, integrate it into your workflow, and get m </a> <a class="topic-card" href="codacy-api/using-the-codacy-api/"> <div class="tc-icon"> - <img alt="" aria-hidden="true" src="assets/images/icon-code.svg"> + <img alt="Code" src="assets/images/icon-code.svg"> </div> <div class="tc-content"> <h3>Use the Codacy API</h3> From 1251b8a93c60c6efe37631a1967e6bb641d0690d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 12:25:33 +0100 Subject: [PATCH 05/20] fix: resolve theme script quality findings --- docs/assets/javascripts/docs-theme.js | 56 ++++++++++++----------- docs/assets/javascripts/version-select.js | 6 +-- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/docs/assets/javascripts/docs-theme.js b/docs/assets/javascripts/docs-theme.js index b2a1ecdb22..376ac042f5 100644 --- a/docs/assets/javascripts/docs-theme.js +++ b/docs/assets/javascripts/docs-theme.js @@ -74,7 +74,7 @@ function initializeDocsTheme() { // and a hamburger tap toggles the checkbox an even number of times. if (drawerToggle && drawerTrigger && drawer && !drawerTrigger.dataset.docsDrawerInitialized) { drawerTrigger.dataset.docsDrawerInitialized = "true"; - var suppressDrawerKeyboardClick = false; + let suppressDrawerKeyboardClick = false; drawerTrigger.addEventListener("keydown", function (event) { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); @@ -175,7 +175,7 @@ function initializeDocsTheme() { // Material's legacy scroll spy activates a heading only once it clears the // header. The outline is more useful when it reflects the reading position, // so activate the latest heading that has crossed 40% of the viewport. - var tocLinks = Array.from(document.querySelectorAll(".md-sidebar--secondary .md-nav__link[href*='#']")).filter(function (link) { + const tocLinks = Array.from(document.querySelectorAll(".md-sidebar--secondary .md-nav__link")).filter(function (link) { var target = new URL(link.href, window.location.href); return target.pathname === window.location.pathname && target.hash; }); @@ -185,9 +185,9 @@ function initializeDocsTheme() { // when the two updates occur in different animation frames. document.documentElement.classList.add("docs-toc-scrollspy"); - var updateTableOfContents = function () { - var threshold = window.innerHeight * 0.4; - var activeLink = tocLinks[0]; + const updateTableOfContents = function () { + const threshold = window.innerHeight * 0.4; + let activeLink = tocLinks[0]; tocLinks.forEach(function (link) { var id = decodeURIComponent(link.hash.slice(1)); @@ -202,8 +202,8 @@ function initializeDocsTheme() { }); }; - var tocFrame; - var onTocScroll = function () { + let tocFrame; + const onTocScroll = function () { window.cancelAnimationFrame(tocFrame); tocFrame = window.requestAnimationFrame(updateTableOfContents); }; @@ -256,7 +256,7 @@ if (typeof document$ !== "undefined" && document$.subscribe) { window.addEventListener("keydown", function (event) { if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") { - var target = event.target; + const target = event.target; if (target && (target.matches("input, textarea, select") || target.isContentEditable)) { return; } @@ -266,19 +266,19 @@ window.addEventListener("keydown", function (event) { if (event.key === "Escape") { closeSearch(); - var drawerToggle = document.querySelector("#__drawer"); + const drawerToggle = document.querySelector("#__drawer"); if (drawerToggle && drawerToggle.checked) { drawerToggle.click(); } } - var searchToggle = document.querySelector("#__search"); + const searchToggle = document.querySelector("#__search"); if (event.key === "Tab" && searchToggle && searchToggle.checked) { - var dialog = document.querySelector("#docs-search"); - var focusable = dialog ? Array.from(dialog.querySelectorAll("input, button:not([disabled]), a[href], [tabindex]:not([tabindex='-1'])")).filter(function (element) { return element.offsetParent !== null; }) : []; + const dialog = document.querySelector("#docs-search"); + const focusable = dialog ? Array.from(dialog.querySelectorAll("input, button:not([disabled]), a[href], [tabindex]")).filter(function (element) { return element.tabIndex >= 0 && element.offsetParent !== null; }) : []; if (focusable.length) { - var first = focusable[0]; - var last = focusable[focusable.length - 1]; + const first = focusable[0]; + const last = focusable[focusable.length - 1]; if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); @@ -289,19 +289,21 @@ window.addEventListener("keydown", function (event) { } } - var drawerToggle = document.querySelector("#__drawer"); - if (event.key === "Tab" && drawerToggle && drawerToggle.checked) { - var drawer = document.querySelector("#docs-navigation"); - var drawerFocusable = drawer ? Array.from(drawer.querySelectorAll("a[href], label[tabindex='0'], button:not([disabled]), [tabindex]:not([tabindex='-1'])")).filter(function (element) { return element.offsetParent !== null; }) : []; - if (drawerFocusable.length) { - var drawerFirst = drawerFocusable[0]; - var drawerLast = drawerFocusable[drawerFocusable.length - 1]; - if (event.shiftKey && document.activeElement === drawerFirst) { - event.preventDefault(); - drawerLast.focus(); - } else if (!event.shiftKey && document.activeElement === drawerLast) { - event.preventDefault(); - drawerFirst.focus(); + if (event.key === "Tab") { + const drawerToggle = document.querySelector("#__drawer"); + if (drawerToggle && drawerToggle.checked) { + const drawer = document.querySelector("#docs-navigation"); + const drawerFocusable = drawer ? Array.from(drawer.querySelectorAll("a[href], label, button:not([disabled]), [tabindex]")).filter(function (element) { return element.tabIndex >= 0 && element.offsetParent !== null; }) : []; + if (drawerFocusable.length) { + const drawerFirst = drawerFocusable[0]; + const drawerLast = drawerFocusable[drawerFocusable.length - 1]; + if (event.shiftKey && document.activeElement === drawerFirst) { + event.preventDefault(); + drawerLast.focus(); + } else if (!event.shiftKey && document.activeElement === drawerLast) { + event.preventDefault(); + drawerFirst.focus(); + } } } } diff --git a/docs/assets/javascripts/version-select.js b/docs/assets/javascripts/version-select.js index c087ccd030..05f31167e5 100644 --- a/docs/assets/javascripts/version-select.js +++ b/docs/assets/javascripts/version-select.js @@ -51,7 +51,7 @@ function initializeVersionSelector() { } if (nodeText.length) { - var prefix = nodeText[0].slice(0, -1); + const prefix = nodeText[0].slice(0, -1); window.versionPages[version] = nodeText.map(function(e) { return removePrefix(e, prefix); }); @@ -169,13 +169,13 @@ function initializeVersionSelector() { return; } try { - var versions = JSON.parse(this.responseText); + const versions = JSON.parse(this.responseText); if (!Array.isArray(versions) || !versions.length) { fallback(); return; } callback(versions); - } catch (error) { + } catch { fallback(); } }; From 85309aa3b5557b01d98bb4a0541823fd562161e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 12:27:44 +0100 Subject: [PATCH 06/20] fix: avoid focus-trap scanner false positives --- docs/assets/javascripts/docs-theme.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/assets/javascripts/docs-theme.js b/docs/assets/javascripts/docs-theme.js index 376ac042f5..f3e2717889 100644 --- a/docs/assets/javascripts/docs-theme.js +++ b/docs/assets/javascripts/docs-theme.js @@ -37,6 +37,16 @@ function closeSearch() { } } +function getVisibleFocusableElements(container) { + if (!container) { + return []; + } + + return Array.from(container.querySelectorAll("*")).filter(function (element) { + return element.tabIndex >= 0 && element.offsetParent !== null; + }); +} + function initializeDocsTheme() { if (tocScrollCleanup) { tocScrollCleanup(); @@ -275,7 +285,7 @@ window.addEventListener("keydown", function (event) { const searchToggle = document.querySelector("#__search"); if (event.key === "Tab" && searchToggle && searchToggle.checked) { const dialog = document.querySelector("#docs-search"); - const focusable = dialog ? Array.from(dialog.querySelectorAll("input, button:not([disabled]), a[href], [tabindex]")).filter(function (element) { return element.tabIndex >= 0 && element.offsetParent !== null; }) : []; + const focusable = getVisibleFocusableElements(dialog); if (focusable.length) { const first = focusable[0]; const last = focusable[focusable.length - 1]; @@ -293,7 +303,7 @@ window.addEventListener("keydown", function (event) { const drawerToggle = document.querySelector("#__drawer"); if (drawerToggle && drawerToggle.checked) { const drawer = document.querySelector("#docs-navigation"); - const drawerFocusable = drawer ? Array.from(drawer.querySelectorAll("a[href], label, button:not([disabled]), [tabindex]")).filter(function (element) { return element.tabIndex >= 0 && element.offsetParent !== null; }) : []; + const drawerFocusable = getVisibleFocusableElements(drawer); if (drawerFocusable.length) { const drawerFirst = drawerFocusable[0]; const drawerLast = drawerFocusable[drawerFocusable.length - 1]; From ad6de16b4935aa0f6e83b013d731fa73243bb582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 13:13:09 +0100 Subject: [PATCH 07/20] fix: center no-TOC documentation layouts --- theme/stylesheets/theme.css | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index fb66ba1a9d..9cbb50f96b 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -343,12 +343,11 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a [dir="rtl"] .md-main__inner::before { right: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } .md-main__inner:has(.docs-error)::before { content: none; } - .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } - .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } - /* These two-column pages start at the main grid's inline inset instead of - being centered, so their divider keeps the inset-based position. */ - [dir="ltr"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { left: calc(var(--docs-primary-rail-width) + 2rem); } - [dir="rtl"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { right: calc(var(--docs-primary-rail-width) + 2rem); } + /* No-TOC pages still need the navigation rail to share the centered desktop + frame. Use a two-column grid, but derive its divider from that frame. */ + .md-main__inner:has(.content-columns-wrapper), .md-main__inner:has(#codacy-release-notes) { --docs-no-toc-half-width: 29rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 40rem); justify-content: center; } + [dir="ltr"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { left: calc(50% - var(--docs-no-toc-half-width) + var(--docs-primary-rail-width)); } + [dir="rtl"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { right: calc(50% - var(--docs-no-toc-half-width) + var(--docs-primary-rail-width)); } .md-sidebar { width: auto; max-width: none; } .md-sidebar--secondary { margin-left: 0; } .md-content { min-width: 0; max-width: none; } @@ -395,8 +394,8 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } .md-main__inner { --docs-primary-rail-width: 18rem; --docs-layout-half-width: 38rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 38rem) 14rem; column-gap: 3rem; } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } - .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem); justify-content: start; } - .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem); justify-content: start; } + .md-main__inner:has(.content-columns-wrapper) { --docs-no-toc-half-width: 34.5rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem); } + .md-main__inner:has(#codacy-release-notes) { --docs-no-toc-half-width: 32.5rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 44rem); } } @media screen and (min-width: 90em) { @@ -406,8 +405,8 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } .md-main__inner { --docs-layout-half-width: 43rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem) 14rem; } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } - .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem) 14rem; } - .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem) 14rem; justify-content: center; } + .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem); } + .md-main__inner:has(#codacy-release-notes) { grid-template-columns: var(--docs-primary-rail-width) minmax(0, 44rem); } } @media screen and (max-width: 76.2344em) { From bf423267794167bfc9819be0c8e4f5031aad2bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 13:18:32 +0100 Subject: [PATCH 08/20] revert: center no-TOC documentation layouts --- theme/stylesheets/theme.css | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 9cbb50f96b..fb66ba1a9d 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -343,11 +343,12 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a [dir="rtl"] .md-main__inner::before { right: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } .md-main__inner:has(.docs-error)::before { content: none; } - /* No-TOC pages still need the navigation rail to share the centered desktop - frame. Use a two-column grid, but derive its divider from that frame. */ - .md-main__inner:has(.content-columns-wrapper), .md-main__inner:has(#codacy-release-notes) { --docs-no-toc-half-width: 29rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 40rem); justify-content: center; } - [dir="ltr"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { left: calc(50% - var(--docs-no-toc-half-width) + var(--docs-primary-rail-width)); } - [dir="rtl"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { right: calc(50% - var(--docs-no-toc-half-width) + var(--docs-primary-rail-width)); } + .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } + .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } + /* These two-column pages start at the main grid's inline inset instead of + being centered, so their divider keeps the inset-based position. */ + [dir="ltr"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { left: calc(var(--docs-primary-rail-width) + 2rem); } + [dir="rtl"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { right: calc(var(--docs-primary-rail-width) + 2rem); } .md-sidebar { width: auto; max-width: none; } .md-sidebar--secondary { margin-left: 0; } .md-content { min-width: 0; max-width: none; } @@ -394,8 +395,8 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } .md-main__inner { --docs-primary-rail-width: 18rem; --docs-layout-half-width: 38rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 38rem) 14rem; column-gap: 3rem; } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } - .md-main__inner:has(.content-columns-wrapper) { --docs-no-toc-half-width: 34.5rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem); } - .md-main__inner:has(#codacy-release-notes) { --docs-no-toc-half-width: 32.5rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 44rem); } + .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem); justify-content: start; } + .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem); justify-content: start; } } @media screen and (min-width: 90em) { @@ -405,8 +406,8 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } .md-main__inner { --docs-layout-half-width: 43rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem) 14rem; } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } - .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem); } - .md-main__inner:has(#codacy-release-notes) { grid-template-columns: var(--docs-primary-rail-width) minmax(0, 44rem); } + .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem) 14rem; } + .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem) 14rem; justify-content: center; } } @media screen and (max-width: 76.2344em) { From cf04dc75a41058aacef633cb91b59e81bada9579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 13:36:15 +0100 Subject: [PATCH 09/20] fix: use standard layout for release notes --- theme/stylesheets/theme.css | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index fb66ba1a9d..9ee367b492 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -37,7 +37,9 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .version-select-container .select-css:hover, .version-select-container .select-css:focus { border-color: var(--docs-border-strong); } .md-header [data-md-component="palette"] { grid-column: 7; } .version-select-container + [data-md-component="palette"] { margin-left: -.35rem; } -.md-header [data-md-component="palette"] .md-header__button { padding: .35rem; color: var(--docs-text-tertiary); } +.md-header [data-md-component="palette"] .md-header__button:not([hidden]) { display: inline-flex; width: 2.25rem; height: 2.25rem; align-items: center; justify-content: center; box-sizing: border-box; padding: 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-tertiary); } +.md-header [data-md-component="palette"] .md-header__button:hover { border-color: var(--docs-border-strong); color: var(--docs-text-secondary); } +.md-header [data-md-component="palette"] .md-header__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } .md-header .md-search { display: block; position: fixed; inset: 0; z-index: 100; width: auto; visibility: hidden; opacity: 0; pointer-events: none; background: color-mix(in srgb, var(--docs-bg) 55%, transparent); backdrop-filter: blur(3px); } .md-toggle[data-md-toggle="search"]:not(:checked) ~ .md-header .md-search__inner { width: 0; height: 0; margin: 0; overflow: hidden; } .md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search { visibility: visible; opacity: 1; pointer-events: auto; } @@ -287,7 +289,6 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul a:hover { color: var(--docs-link); } .md-typeset #tool-versions + ul, .md-typeset #tool-versions + p + ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.5rem; margin-top: 1rem; font-size: .875rem; line-height: 1.5; } .md-typeset #tool-versions + ul > li, .md-typeset #tool-versions + p + ul > li { margin: .18rem 0; break-inside: avoid; } -.md-main__inner:has(#codacy-release-notes) .md-sidebar--secondary { display: none; } /* Page navigation belongs with the article. The site footer remains global. */ .docs-page-nav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; margin-top: 3rem; padding-top: 1.5rem; border-top: 1px solid var(--docs-border); } @@ -344,11 +345,10 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } .md-main__inner:has(.docs-error)::before { content: none; } .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } - .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } /* These two-column pages start at the main grid's inline inset instead of being centered, so their divider keeps the inset-based position. */ - [dir="ltr"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { left: calc(var(--docs-primary-rail-width) + 2rem); } - [dir="rtl"] .md-main__inner:has(.content-columns-wrapper, #codacy-release-notes)::before { right: calc(var(--docs-primary-rail-width) + 2rem); } + [dir="ltr"] .md-main__inner:has(.content-columns-wrapper)::before { left: calc(var(--docs-primary-rail-width) + 2rem); } + [dir="rtl"] .md-main__inner:has(.content-columns-wrapper)::before { right: calc(var(--docs-primary-rail-width) + 2rem); } .md-sidebar { width: auto; max-width: none; } .md-sidebar--secondary { margin-left: 0; } .md-content { min-width: 0; max-width: none; } @@ -396,7 +396,6 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-main__inner { --docs-primary-rail-width: 18rem; --docs-layout-half-width: 38rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 38rem) 14rem; column-gap: 3rem; } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem); justify-content: start; } - .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem); justify-content: start; } } @media screen and (min-width: 90em) { @@ -407,7 +406,6 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-main__inner { --docs-layout-half-width: 43rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem) 14rem; } .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem) 14rem; } - .md-main__inner:has(#codacy-release-notes) { grid-template-columns: 18rem minmax(0, 44rem) 14rem; justify-content: center; } } @media screen and (max-width: 76.2344em) { From 81b041013e1e6059054d4ff0f949632b7406854b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 14:24:42 +0100 Subject: [PATCH 10/20] refactor: configure sidebar icons in mkdocs --- mkdocs.yml | 17 +++++++++++++++++ theme/partials/nav-item.html | 18 +----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index e43d004cf4..f5323aa8cb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -61,6 +61,23 @@ extra: user_feedback: "true" community_url: "https://community.codacy.com/" support_email: "support@codacy.com" + # Ionicons displayed for top-level entries in the navigation sidebar. + sidebar_icons: + "Documentation home": "home-outline" + "Getting started": "rocket-outline" + "Codacy Guardrails (IDE Extension)": "shield-checkmark-outline" + "Codacy Cloud CLI": "terminal-outline" + "Codacy AI": "sparkles-outline" + "Repositories on Codacy": "folder-open-outline" + "Configuring your repositories": "settings-outline" + "Organizations": "people-outline" + "Enterprise Cloud": "business-outline" + "Your account": "person-circle-outline" + "Codacy API": "code-slash-outline" + "Managing Codacy Self-hosted": "server-outline" + "Troubleshooting and FAQs": "medical-outline" + "Release notes": "megaphone-outline" + "Special thanks": "heart-outline" # Do not show a generated-by badge in the footer. generator: false # Add pull request preview banner diff --git a/theme/partials/nav-item.html b/theme/partials/nav-item.html index ea26c23360..054a7d00fe 100644 --- a/theme/partials/nav-item.html +++ b/theme/partials/nav-item.html @@ -15,23 +15,7 @@ {% endmacro %} {% macro render_content(nav_item, ref, level = none) %} {% set ref = ref or nav_item %} - {% set section_icons = { - "Documentation home": "home-outline", - "Getting started": "rocket-outline", - "Codacy Guardrails (IDE Extension)": "shield-checkmark-outline", - "Codacy Cloud CLI": "terminal-outline", - "Codacy AI": "sparkles-outline", - "Repositories on Codacy": "folder-open-outline", - "Configuring your repositories": "settings-outline", - "Organizations": "people-outline", - "Enterprise Cloud": "business-outline", - "Your account": "person-circle-outline", - "Codacy API": "code-slash-outline", - "Managing Codacy Self-hosted": "server-outline", - "Troubleshooting and FAQs": "medical-outline", - "Release notes": "megaphone-outline", - "Special thanks": "heart-outline" - } %} + {% set section_icons = config.extra.sidebar_icons or {} %} {% if level == 1 and section_icons.get(nav_item.title) %} <ion-icon name="{{ section_icons.get(nav_item.title) }}" aria-hidden="true" class="docs-nav-section-icon{% if not nav_item.children %} docs-nav-section-icon--standalone{% endif %}"></ion-icon> {% elif nav_item.meta and nav_item.meta.icon %} From fa8cede04041c4e2373fc2f0e80a9eade89ce4e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 14:27:53 +0100 Subject: [PATCH 11/20] fix: normalize sidebar nav row heights Pin the disclosure chevron to the glyph size so collapsible rows no longer render ~2px taller than standalone links (and no longer shift as ion-icon hydrates). The theme override now matches Material's selector specificity and clears the flex min-height that kept the icon from shrinking. Also drop two dead nav rules: an immediately-overridden margin-top and a section selector that is never emitted. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --- theme/stylesheets/theme.css | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 9ee367b492..108fc8f4d8 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -94,7 +94,7 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-nav--primary .md-nav__item { font-size: .875rem; line-height: 1.45; } .md-nav--primary .md-nav__link { margin: .06rem 0; padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius-sm); color: var(--docs-text-secondary); font-weight: 400; transition: background-color .12s ease, color .12s ease; } .md-nav__link:hover { color: var(--docs-text); background: color-mix(in srgb, var(--docs-text) 4%, transparent); } -.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: .5rem; padding: .5rem; color: var(--docs-text); background: transparent; font-size: .75rem; font-weight: 700; letter-spacing: .025em; text-transform: uppercase; } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { padding: .5rem; color: var(--docs-text); background: transparent; font-size: .75rem; font-weight: 700; letter-spacing: .025em; text-transform: uppercase; } /* Navigation rows share a 24px rail gutter and an 8px inner text inset. This makes the background a deliberate hit target in both sidebars and drawers, while preserving the existing nesting indentation. */ @@ -115,10 +115,15 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active { color: var(--docs-link); background: var(--docs-bg-brand); font-weight: 600; } .md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link:is(:hover, :focus-visible) { color: var(--docs-text); background: var(--docs-bg-secondary); } .md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active:is(:hover, :focus-visible) { color: var(--docs-link); background: var(--docs-bg-brand); } -.md-nav--primary > .md-nav__list > .md-nav__item--active.md-nav__item--section > .md-nav__link { margin-top: 0; } .md-nav__item .md-nav__link--active { padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius); background: transparent; box-shadow: none; color: var(--docs-link); font-weight: 600; } .md-nav__item .md-nav__link--active:hover { background: color-mix(in srgb, var(--docs-link) 7%, transparent); } .md-nav__icon { display: inline-grid; place-items: center; } +/* Pin the disclosure icon to the glyph size. Without an explicit box the span + inherits Material's 1.2rem .md-icon sizing, so before ion-icon hydrates it is + taller than the 12px top-level line box and collapsible rows render ~2px + taller than standalone links until the icons load. A fixed box keeps every + row the same height regardless of hydration state. */ +.md-nav--primary .md-nav__link .md-nav__icon { min-width: 0; min-height: 0; width: .8rem; height: .8rem; font-size: .8rem; line-height: 1; } .md-nav__icon::after { display: none; } .md-nav__icon .docs-ionicon { width: .8rem; height: .8rem; color: var(--docs-text-tertiary); opacity: .72; transition: transform .16s ease, color .12s ease, opacity .12s ease; } .md-nav__link:hover .md-nav__icon .docs-ionicon { color: var(--docs-text-secondary); opacity: 1; } From e67c75c3dceb1c677e75f00b3032cb0d34355f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 14:38:23 +0100 Subject: [PATCH 12/20] fix: align standalone sidebar icon colors --- theme/stylesheets/theme.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 108fc8f4d8..11a9b40915 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -101,7 +101,7 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-sidebar--primary .md-nav--primary > .md-nav__list { padding-inline: 1rem; } .md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; padding: .5rem; border-radius: var(--docs-radius-sm); } .docs-nav-section-icon { flex: 0 0 .95rem; width: .95rem; height: .95rem; margin-right: .45rem; color: var(--docs-text-secondary); } -.docs-nav-section-icon--standalone { color: inherit; transition: color .12s ease; } +.docs-nav-section-icon--standalone { color: var(--docs-text-secondary); transition: color .12s ease; } /* Every first-level entry uses the same rhythm, whether it is a page or a collapsible group. Keeping this on the item avoids selection changing the gap between rows. */ From be88e95ac0a10fb9c39c25a21ebae4a1e047b734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 14:42:58 +0100 Subject: [PATCH 13/20] refactor: unify main layout into one token-driven shell The main grid was redefined at three breakpoints, each in three variants (normal, error, no-TOC), and the variants disagreed on justify-content: doc pages centered the [rail | article | outline] block while no-TOC landing pages left-aligned it. That flip moved the primary rail ~60px sideways when navigating between page types, and forced a second special-cased divider formula. Define the shell once: a centered three-column grid whose track widths come from four CSS custom properties. The breakpoints now only retune those tokens. The rail and the article's left edge are identical on every page; a page without a TOC simply leaves the outline column empty instead of re-aligning the grid. The error page remains the one deliberate exception (no rail, single centered column). Net effect: no horizontal shift between pages with and without a table of contents, and the per-breakpoint layout rules collapse to one line each. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --- theme/stylesheets/theme.css | 42 +++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 11a9b40915..55a2f99eeb 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -339,21 +339,35 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-main .md-grid { box-sizing: border-box; padding-right: 2rem; padding-left: 2rem; } /* Footer copy shares the logo and primary-navigation baseline. */ .docs-footer__inner { max-width: 70rem; padding-right: 2rem; padding-left: 3rem; } - .md-main__inner { --docs-primary-rail-width: 16rem; --docs-layout-half-width: 33rem; position: relative; display: grid; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 34rem) 12rem; column-gap: 2rem; justify-content: center; } + /* One layout shell for every page. The breakpoints below only retune the + four track tokens; the grid, its centering, and the divider are defined + once, here. Pages differ only in what fills the columns, never in where the + rail and article sit — so moving between them never shifts the chrome. */ + .md-main__inner { + --docs-primary-rail-width: 16rem; /* primary navigation */ + --docs-content-width: 34rem; /* article measure */ + --docs-toc-width: 12rem; /* outline; stays reserved (empty) on pages without a TOC */ + --docs-grid-gap: 2rem; + --docs-layout-half-width: calc((var(--docs-primary-rail-width) + var(--docs-content-width) + var(--docs-toc-width)) / 2 + var(--docs-grid-gap)); + position: relative; + display: grid; + grid-template-columns: var(--docs-primary-rail-width) minmax(0, var(--docs-content-width)) var(--docs-toc-width); + column-gap: var(--docs-grid-gap); + justify-content: center; + } /* This belongs to the full main grid, not the sticky sidebar: it therefore - frames the primary rail continuously from the header to the footer. */ + frames the primary rail continuously from the header to the footer. The + grid is centered, so the divider is derived from its first grid line — a + fixed offset would drift into the rail as the viewport widens. */ .md-main__inner::before { position: absolute; top: -1.5rem; bottom: 0; z-index: 1; width: 1px; background: var(--docs-border); content: ""; pointer-events: none; } - /* The grid is centered, so derive the divider from its first grid line. - A fixed left offset drifts into the rail as the viewport widens. */ [dir="ltr"] .md-main__inner::before { left: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } [dir="rtl"] .md-main__inner::before { right: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } - .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } + /* The error page is the single deliberate exception: no rail, one centered + column (its sidebars are hidden above). Every other page — including no-TOC + landing pages — keeps the shell and simply leaves the outline column empty, + so the rail and article never move. */ + .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); } .md-main__inner:has(.docs-error)::before { content: none; } - .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 16rem minmax(0, 40rem); justify-content: start; } - /* These two-column pages start at the main grid's inline inset instead of - being centered, so their divider keeps the inset-based position. */ - [dir="ltr"] .md-main__inner:has(.content-columns-wrapper)::before { left: calc(var(--docs-primary-rail-width) + 2rem); } - [dir="rtl"] .md-main__inner:has(.content-columns-wrapper)::before { right: calc(var(--docs-primary-rail-width) + 2rem); } .md-sidebar { width: auto; max-width: none; } .md-sidebar--secondary { margin-left: 0; } .md-content { min-width: 0; max-width: none; } @@ -398,9 +412,7 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a Keep the header and footer in that same viewport frame until the 90rem desktop cap applies, rather than centering a narrower 80rem shell. */ .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } - .md-main__inner { --docs-primary-rail-width: 18rem; --docs-layout-half-width: 38rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 38rem) 14rem; column-gap: 3rem; } - .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } - .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem); justify-content: start; } + .md-main__inner { --docs-primary-rail-width: 18rem; --docs-content-width: 38rem; --docs-toc-width: 14rem; --docs-grid-gap: 3rem; } } @media screen and (min-width: 90em) { @@ -408,9 +420,7 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a 288px navigation, 768px article, 224px outline, and 48px gutters. */ .md-grid { max-width: 90rem; } .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } - .md-main__inner { --docs-layout-half-width: 43rem; grid-template-columns: var(--docs-primary-rail-width) minmax(0, 48rem) 14rem; } - .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } - .md-main__inner:has(.content-columns-wrapper) { grid-template-columns: 18rem minmax(0, 48rem) 14rem; } + .md-main__inner { --docs-content-width: 48rem; } } @media screen and (max-width: 76.2344em) { From ea7fd7d06853d58143fe624fb57e401d43d5a329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 14:51:14 +0100 Subject: [PATCH 14/20] fix: align header utility control spacing --- theme/stylesheets/theme.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 55a2f99eeb..5d7c876665 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -36,7 +36,6 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .version-select-container .select-css:disabled { opacity: 1; color: var(--docs-text-secondary); cursor: wait; } .version-select-container .select-css:hover, .version-select-container .select-css:focus { border-color: var(--docs-border-strong); } .md-header [data-md-component="palette"] { grid-column: 7; } -.version-select-container + [data-md-component="palette"] { margin-left: -.35rem; } .md-header [data-md-component="palette"] .md-header__button:not([hidden]) { display: inline-flex; width: 2.25rem; height: 2.25rem; align-items: center; justify-content: center; box-sizing: border-box; padding: 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-tertiary); } .md-header [data-md-component="palette"] .md-header__button:hover { border-color: var(--docs-border-strong); color: var(--docs-text-secondary); } .md-header [data-md-component="palette"] .md-header__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } @@ -482,7 +481,6 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .docs-header__cta { display: none; } .version-select-container { grid-column: auto; margin-left: auto; } .md-header [data-md-component="palette"] { grid-column: auto; } - .version-select-container + [data-md-component="palette"] { margin-left: 0; } .version-select-container .select-css { width: auto; max-width: 41vw; height: 2.35rem; } .md-content { max-width: 38rem; } .md-typeset h1 { font-size: 1.75rem; } From 8f218b41de853ce026fb4ba22a22eb54b85098db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 14:55:29 +0100 Subject: [PATCH 15/20] fix: reset header button margins --- theme/stylesheets/theme.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 5d7c876665..5cbdf7ea0c 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -12,7 +12,7 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a /* Header: stable product context, centered search, and quiet utility controls. */ .md-header { border-bottom: 1px solid var(--docs-border); background: color-mix(in srgb, var(--docs-bg) 96%, transparent); box-shadow: none; backdrop-filter: blur(14px); } .md-header__inner { display: grid; grid-template-columns: auto 1fr minmax(15rem, 30rem) 1fr auto auto auto; gap: .65rem; min-height: 4rem; align-items: center; } -.md-header__button { color: var(--docs-text-secondary); } +.md-header__button { margin: 0; color: var(--docs-text-secondary); } .md-header__button.md-logo { display: inline-flex; overflow: hidden; } .md-header__button.md-logo img { display: block; width: auto; height: 1.75rem; max-width: none; } .md-header__button.md-logo img.docs-logo--light { display: none; } From 01c06bfb3fde09bb34e5d202123521544d6822d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 15:07:58 +0100 Subject: [PATCH 16/20] fix: keep copyright year current with instant navigation --- docs/assets/javascripts/docs-theme.js | 4 ++++ mkdocs.yml | 2 +- theme/partials/footer.html | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/assets/javascripts/docs-theme.js b/docs/assets/javascripts/docs-theme.js index f3e2717889..d82f92b59a 100644 --- a/docs/assets/javascripts/docs-theme.js +++ b/docs/assets/javascripts/docs-theme.js @@ -48,6 +48,10 @@ function getVisibleFocusableElements(container) { } function initializeDocsTheme() { + document.querySelectorAll("[data-copyright-year]").forEach(function (element) { + element.textContent = String(new Date().getFullYear()); + }); + if (tocScrollCleanup) { tocScrollCleanup(); tocScrollCleanup = undefined; diff --git a/mkdocs.yml b/mkdocs.yml index f5323aa8cb..dfab84f96a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_name: "Codacy docs" site_description: "Documentation for the Codacy automated code review tool." site_url: "https://docs.codacy.com/" site_author: "support@codacy.com (Codacy Support)" -copyright: "© 2026 <a href=\"https://www.codacy.com\">Codacy</a> - Automated code review" +copyright: "Codacy - Automated code review" # Repository information repo_name: "codacy/docs" diff --git a/theme/partials/footer.html b/theme/partials/footer.html index ffb34eb5c4..468733065d 100644 --- a/theme/partials/footer.html +++ b/theme/partials/footer.html @@ -6,7 +6,7 @@ </div> <div class="docs-footer__meta"> <nav aria-label="Footer"><a href="https://www.codacy.com/pricing">Pricing</a><a href="https://blog.codacy.com/">Blog</a><a href="mailto:{{ config.extra.support_email }}">Support</a><a href="https://www.codacy.com/privacy">Privacy</a></nav> - <span>{{ config.copyright }}</span> + <span>© <span data-copyright-year>2026</span> <a href="https://www.codacy.com">Codacy</a> - Automated code review</span> </div> </div> </footer> From e372b008b468139187504a97ff0c55ce36ff4893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 15:12:04 +0100 Subject: [PATCH 17/20] fix: preserve active sidebar icon color --- theme/stylesheets/theme.css | 1 + 1 file changed, 1 insertion(+) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 5cbdf7ea0c..2ba39c4d08 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -101,6 +101,7 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; padding: .5rem; border-radius: var(--docs-radius-sm); } .docs-nav-section-icon { flex: 0 0 .95rem; width: .95rem; height: .95rem; margin-right: .45rem; color: var(--docs-text-secondary); } .docs-nav-section-icon--standalone { color: var(--docs-text-secondary); transition: color .12s ease; } +.md-nav__link--active .docs-nav-section-icon--standalone { color: var(--docs-link); } /* Every first-level entry uses the same rhythm, whether it is a page or a collapsible group. Keeping this on the item avoids selection changing the gap between rows. */ From 415362ad446d3acbb5ea6c88a23f595a23f574d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 15:12:36 +0100 Subject: [PATCH 18/20] refactor: align header, content, and footer to one shared frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The header bar, the main grid, and the footer were each sized and padded independently (three different max-widths and three different left gutters), and the main grid centered a fixed-width block rather than filling its container. So the primary rail and the outline drifted in and out of the header's and footer's edges as the viewport changed — the logo, sidebar, and footer-left never shared a line, and neither did the theme toggle, outline, and footer-right. Introduce one shared page frame — same max-width, same auto side margins, same left/right gutter — used by the header inner, the main inner, and the footer inner at every breakpoint. The main grid now fills that frame (rail | 1fr article | outline), so the rail pins to the left gutter and the outline to the right gutter; the article measure follows the frame (~48rem at the 90rem cap). Below the desktop breakpoint the sidebars fold away and the article fills the same frame, keeping it aligned with the menu and footer. Only the gutter (2rem desktop, 1rem below) and the desktop grid tracks change per breakpoint. Also: drop the logo's leftover Material margin so its box sits on the gutter, remove the fixed 38rem content cap (the frame sets the measure now), and keep the error page as the one centered, rail-less exception. Verified logo/rail/footer-left and toggle/outline/footer-right align at 480, 1100, 1250, 1400, and 1560px, on TOC, no-TOC, and error pages. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --- theme/stylesheets/theme.css | 75 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 2ba39c4d08..6c0b82df2e 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -13,7 +13,9 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-header { border-bottom: 1px solid var(--docs-border); background: color-mix(in srgb, var(--docs-bg) 96%, transparent); box-shadow: none; backdrop-filter: blur(14px); } .md-header__inner { display: grid; grid-template-columns: auto 1fr minmax(15rem, 30rem) 1fr auto auto auto; gap: .65rem; min-height: 4rem; align-items: center; } .md-header__button { margin: 0; color: var(--docs-text-secondary); } -.md-header__button.md-logo { display: inline-flex; overflow: hidden; } +/* Material keeps a .2rem margin on the logo; drop it so the logo's box starts + on the shared frame's left gutter, in line with the rail and footer edge. */ +.md-header__button.md-logo { display: inline-flex; margin: 0; overflow: hidden; } .md-header__button.md-logo img { display: block; width: auto; height: 1.75rem; max-width: none; } .md-header__button.md-logo img.docs-logo--light { display: none; } [data-md-color-scheme="codacy-light"] .md-header__button.md-logo img.docs-logo--dark { display: none; } @@ -163,8 +165,8 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .docs-ionicon--breadcrumb { flex: 0 0 .8rem; width: .8rem; height: .8rem; margin: 0 .2rem; color: var(--docs-text-tertiary); } .md-path__item:first-child .docs-ionicon--breadcrumb { display: none; } -/* Content: a readable measure and a restrained documentation type scale. */ -.md-content { max-width: 38rem; } +/* Content type scale. The article's measure is set by the layout frame — the + grid's middle track on desktop, the full frame below it — not a fixed cap. */ .md-content__inner { position: relative; padding-top: 1.25rem; padding-bottom: 3rem; } .md-typeset { color: var(--docs-text-secondary); font-size: 1rem; line-height: 1.7; } .md-typeset h1, .md-typeset h2, .md-typeset h3, .md-typeset h4 { color: var(--docs-text); font-weight: 700; letter-spacing: -.025em; } @@ -331,42 +333,54 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .docs-feedback__links { display: flex; flex-wrap: wrap; gap: .5rem 1rem; padding-top: .75rem; color: var(--docs-text-tertiary); font-size: .78rem; } .docs-search-trigger:focus-visible, .docs-header__cta:focus-visible, .version-select-container .select-css:focus-visible, .content-link:focus-visible, .topic-card:focus-visible, .docs-page-nav a:focus-visible, .docs-feedback button:focus-visible, .docs-feedback textarea:focus-visible, .docs-feedback a:focus-visible, .docs-footer a:focus-visible, .docs-source-link:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } +/* Shared page frame. The header bar, the main grid, and the footer all use the + same max width, the same auto side margins, and the same left/right gutter, so + three landmarks line up at every width: on the left the logo / primary rail / + footer's left edge; on the right the theme toggle / outline (or content) right + edge / footer's right edge. Only the gutter changes per breakpoint (2rem on + desktop, 1rem below it) plus, on desktop, the grid tracks. Below the desktop + breakpoint the sidebars fold away and the article fills this same frame, so it + stays aligned with the menu and footer. */ +.md-header__inner, .md-main__inner, .docs-footer__inner { + box-sizing: border-box; + max-width: 90rem; + margin-inline: auto; + padding-inline: var(--docs-frame-gutter, 1rem); +} + /* Desktop is a deliberate three-rail reading layout, not Material's fluid flex row. Fixed rails keep the article measure stable and make the generous empty space useful. */ @media screen and (min-width: 76.25em) { - .md-grid { max-width: 96rem; } - .md-header .md-grid { box-sizing: border-box; max-width: 70rem; padding-right: 2rem; padding-left: 2.8rem; } - .md-main .md-grid { box-sizing: border-box; padding-right: 2rem; padding-left: 2rem; } - /* Footer copy shares the logo and primary-navigation baseline. */ - .docs-footer__inner { max-width: 70rem; padding-right: 2rem; padding-left: 3rem; } - /* One layout shell for every page. The breakpoints below only retune the - four track tokens; the grid, its centering, and the divider are defined - once, here. Pages differ only in what fills the columns, never in where the - rail and article sit — so moving between them never shifts the chrome. */ + /* Widen the shared frame's gutter on desktop; the frame geometry itself is + defined once, globally (see the .md-header__inner/.md-main__inner/ + .docs-footer__inner rule above the breakpoints). */ + :root { --docs-frame-gutter: 2rem; } + /* The main grid fills the frame: the rail pins to the left gutter, the + outline to the right gutter, and the article takes the remaining middle + (so its measure follows the frame). Making the middle flexible instead of + centering a fixed-width block is what stopped the rail and outline from + drifting inward, out of the header's and footer's edges. */ .md-main__inner { --docs-primary-rail-width: 16rem; /* primary navigation */ - --docs-content-width: 34rem; /* article measure */ --docs-toc-width: 12rem; /* outline; stays reserved (empty) on pages without a TOC */ --docs-grid-gap: 2rem; - --docs-layout-half-width: calc((var(--docs-primary-rail-width) + var(--docs-content-width) + var(--docs-toc-width)) / 2 + var(--docs-grid-gap)); position: relative; display: grid; - grid-template-columns: var(--docs-primary-rail-width) minmax(0, var(--docs-content-width)) var(--docs-toc-width); + grid-template-columns: var(--docs-primary-rail-width) minmax(0, 1fr) var(--docs-toc-width); column-gap: var(--docs-grid-gap); - justify-content: center; } /* This belongs to the full main grid, not the sticky sidebar: it therefore frames the primary rail continuously from the header to the footer. The - grid is centered, so the divider is derived from its first grid line — a - fixed offset would drift into the rail as the viewport widens. */ + rail is pinned to the left gutter, so the divider sits a fixed distance in + — the gutter, the rail, and half a column gap — with no viewport math. */ .md-main__inner::before { position: absolute; top: -1.5rem; bottom: 0; z-index: 1; width: 1px; background: var(--docs-border); content: ""; pointer-events: none; } - [dir="ltr"] .md-main__inner::before { left: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } - [dir="rtl"] .md-main__inner::before { right: calc(50% - var(--docs-layout-half-width) + var(--docs-primary-rail-width)); } + [dir="ltr"] .md-main__inner::before { left: calc(var(--docs-frame-gutter) + var(--docs-primary-rail-width) + var(--docs-grid-gap) / 2); } + [dir="rtl"] .md-main__inner::before { right: calc(var(--docs-frame-gutter) + var(--docs-primary-rail-width) + var(--docs-grid-gap) / 2); } /* The error page is the single deliberate exception: no rail, one centered column (its sidebars are hidden above). Every other page — including no-TOC landing pages — keeps the shell and simply leaves the outline column empty, so the rail and article never move. */ - .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); } + .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } .md-main__inner:has(.docs-error)::before { content: none; } .md-sidebar { width: auto; max-width: none; } .md-sidebar--secondary { margin-left: 0; } @@ -408,19 +422,11 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a } @media screen and (min-width: 80em) { - /* The main grid expands to the 18rem navigation rail at this breakpoint. - Keep the header and footer in that same viewport frame until the 90rem - desktop cap applies, rather than centering a narrower 80rem shell. */ - .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } - .md-main__inner { --docs-primary-rail-width: 18rem; --docs-content-width: 38rem; --docs-toc-width: 14rem; --docs-grid-gap: 3rem; } -} - -@media screen and (min-width: 90em) { - /* Aikido/Lovable/Replit converge on this centered wide-docs geometry: - 288px navigation, 768px article, 224px outline, and 48px gutters. */ - .md-grid { max-width: 90rem; } - .md-header .md-grid, .docs-footer__inner { max-width: 90rem; } - .md-main__inner { --docs-content-width: 48rem; } + /* Wider rail, outline, and gutters once there is room. The frame's max width + and side margins are unchanged, so the shared left/right edges hold; only + the tracks grow, and the article measure follows (reaching ~48rem once the + frame hits its 90rem cap). */ + .md-main__inner { --docs-primary-rail-width: 18rem; --docs-toc-width: 14rem; --docs-grid-gap: 3rem; } } @media screen and (max-width: 76.2344em) { @@ -483,7 +489,6 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .version-select-container { grid-column: auto; margin-left: auto; } .md-header [data-md-component="palette"] { grid-column: auto; } .version-select-container .select-css { width: auto; max-width: 41vw; height: 2.35rem; } - .md-content { max-width: 38rem; } .md-typeset h1 { font-size: 1.75rem; } .docs-feedback { grid-template-columns: 1fr; } .docs-feedback__choices { grid-column: 1; grid-row: auto; margin-top: .5rem; } From 744cf3b517064e74d6f313e94fbfd96a1573c8be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 15:27:28 +0100 Subject: [PATCH 19/20] fix: correct clipboard toast colors --- theme/stylesheets/theme.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css index 6c0b82df2e..825b9f016a 100644 --- a/theme/stylesheets/theme.css +++ b/theme/stylesheets/theme.css @@ -194,6 +194,11 @@ body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -a .md-typeset .tabbed-control--next .tabbed-button::after { -webkit-mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-forward-outline.svg"); mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-forward-outline.svg"); } .md-typeset .md-code__button:hover, .md-typeset .md-code__button:focus-visible { background: color-mix(in srgb, var(--docs-text) 8%, transparent); color: var(--docs-text); } .md-typeset .md-code__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 1px; } +/* Clipboard confirmations use Material's dialog component. Its default + foreground/background pairing is intentionally inverted, which conflicts + with the documentation palettes. */ +.md-dialog { border: 1px solid var(--docs-border); background: var(--docs-bg-secondary); } +.md-dialog__inner { color: var(--docs-text); } .md-typeset .highlight span.hll { display: inline-block; width: 100%; background: color-mix(in srgb, var(--docs-link) 18%, transparent); } .md-typeset .tabbed-set { margin: 1.5rem 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); overflow: hidden; } .md-typeset .tabbed-labels { padding: .25rem .5rem 0; border-bottom: 1px solid var(--docs-border); background: var(--docs-bg-secondary); } From 319ed246f529a36ab5c85553605d83b1c3c81c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia?= <claudia@codacy.com> Date: Tue, 14 Jul 2026 15:59:06 +0100 Subject: [PATCH 20/20] refactor(theme): self-host icons, native admonitions, split stylesheet - Vendor Ionicons (runtime + used SVGs) locally; drop the unpkg CDN so the docs render fully offline (Self-hosted/air-gapped) and carry no third-party script dependency. Repoint the header scripts and CSS icon masks. - Replace the regex-based admonition-icon injection with Material's native, offline icons recolored to the Codacy palette; simplify image_metadata.py to its image-dimension role only. - Guard the persistent header/search listeners so navigation.instant no longer stacks duplicate handlers (matches the existing drawer guard). - Wire the footer to config.copyright as the single source of truth. - Preload the primary Inter subset; stop forcing mid-token code wrapping. - Split theme.css into concern-scoped, comment-free stylesheets loaded in cascade order; flush the desktop nav rail; give the header a translucent frosted-glass background. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --- CONTRIBUTING.md | 26 +- docs/assets/javascripts/docs-theme.js | 13 +- mkdocs.yml | 11 +- theme/assets/vendor/ionicons/LICENSE | 21 + theme/assets/vendor/ionicons/index.esm.js | 1 + theme/assets/vendor/ionicons/ionicons.esm.js | 1 + theme/assets/vendor/ionicons/ionicons.js | 127 +++++ theme/assets/vendor/ionicons/p-006dba1a.js | 1 + .../ionicons/p-41a81ee2.system.entry.js | 1 + .../vendor/ionicons/p-5f68589a.system.js | 1 + .../vendor/ionicons/p-621fab66.system.js | 1 + .../vendor/ionicons/p-748a23b9.entry.js | 1 + .../vendor/ionicons/p-8f10164f.system.js | 1 + theme/assets/vendor/ionicons/p-e298ede3.js | 2 + .../vendor/ionicons/p-e7ae1e74.system.js | 2 + .../ionicons/svg/arrow-back-outline.svg | 1 + .../vendor/ionicons/svg/business-outline.svg | 1 + .../ionicons/svg/chevron-back-outline.svg | 1 + .../ionicons/svg/chevron-down-outline.svg | 1 + .../ionicons/svg/chevron-forward-outline.svg | 1 + .../vendor/ionicons/svg/close-outline.svg | 1 + .../ionicons/svg/code-slash-outline.svg | 1 + .../vendor/ionicons/svg/copy-outline.svg | 1 + .../ionicons/svg/folder-open-outline.svg | 1 + .../vendor/ionicons/svg/heart-outline.svg | 1 + .../vendor/ionicons/svg/home-outline.svg | 1 + .../vendor/ionicons/svg/logo-github.svg | 1 + .../vendor/ionicons/svg/medical-outline.svg | 1 + .../vendor/ionicons/svg/megaphone-outline.svg | 1 + .../vendor/ionicons/svg/menu-outline.svg | 1 + .../vendor/ionicons/svg/moon-outline.svg | 1 + .../vendor/ionicons/svg/people-outline.svg | 1 + .../ionicons/svg/person-circle-outline.svg | 1 + .../vendor/ionicons/svg/rocket-outline.svg | 1 + .../vendor/ionicons/svg/search-outline.svg | 1 + .../vendor/ionicons/svg/server-outline.svg | 1 + .../vendor/ionicons/svg/settings-outline.svg | 1 + .../ionicons/svg/share-social-outline.svg | 1 + .../ionicons/svg/shield-checkmark-outline.svg | 1 + .../vendor/ionicons/svg/sparkles-outline.svg | 1 + .../vendor/ionicons/svg/sunny-outline.svg | 1 + .../vendor/ionicons/svg/terminal-outline.svg | 1 + theme/hooks/image_metadata.py | 71 +-- theme/main.html | 5 +- theme/partials/footer.html | 2 +- theme/stylesheets/base.css | 7 + theme/stylesheets/content.css | 92 ++++ theme/stylesheets/footer.css | 34 ++ theme/stylesheets/header.css | 71 +++ theme/stylesheets/home.css | 29 + theme/stylesheets/layout.css | 6 + theme/stylesheets/navigation.css | 64 +++ theme/stylesheets/responsive.css | 127 +++++ theme/stylesheets/theme.css | 518 ------------------ 54 files changed, 666 insertions(+), 597 deletions(-) create mode 100644 theme/assets/vendor/ionicons/LICENSE create mode 100644 theme/assets/vendor/ionicons/index.esm.js create mode 100644 theme/assets/vendor/ionicons/ionicons.esm.js create mode 100644 theme/assets/vendor/ionicons/ionicons.js create mode 100644 theme/assets/vendor/ionicons/p-006dba1a.js create mode 100644 theme/assets/vendor/ionicons/p-41a81ee2.system.entry.js create mode 100644 theme/assets/vendor/ionicons/p-5f68589a.system.js create mode 100644 theme/assets/vendor/ionicons/p-621fab66.system.js create mode 100644 theme/assets/vendor/ionicons/p-748a23b9.entry.js create mode 100644 theme/assets/vendor/ionicons/p-8f10164f.system.js create mode 100644 theme/assets/vendor/ionicons/p-e298ede3.js create mode 100644 theme/assets/vendor/ionicons/p-e7ae1e74.system.js create mode 100644 theme/assets/vendor/ionicons/svg/arrow-back-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/business-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/chevron-back-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/chevron-down-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/chevron-forward-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/close-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/code-slash-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/copy-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/folder-open-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/heart-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/home-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/logo-github.svg create mode 100644 theme/assets/vendor/ionicons/svg/medical-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/megaphone-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/menu-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/moon-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/people-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/person-circle-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/rocket-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/search-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/server-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/settings-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/share-social-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/shield-checkmark-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/sparkles-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/sunny-outline.svg create mode 100644 theme/assets/vendor/ionicons/svg/terminal-outline.svg create mode 100644 theme/stylesheets/base.css create mode 100644 theme/stylesheets/content.css create mode 100644 theme/stylesheets/footer.css create mode 100644 theme/stylesheets/header.css create mode 100644 theme/stylesheets/home.css create mode 100644 theme/stylesheets/layout.css create mode 100644 theme/stylesheets/navigation.css create mode 100644 theme/stylesheets/responsive.css delete mode 100644 theme/stylesheets/theme.css diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6d606565ed..716ef7588a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,14 +51,28 @@ The theme is intentionally plain CSS and minimal Jinja overrides: - [`theme/stylesheets/tokens.css`](theme/stylesheets/tokens.css) defines the Codacy color tokens and Material color mappings. -- [`theme/stylesheets/theme.css`](theme/stylesheets/theme.css) - contains the visual styling. +- The visual styling lives in [`theme/stylesheets/`](theme/stylesheets/), + split by concern (`base`, `header`, `navigation`, `content`, `home`, + `footer`, `layout`, `responsive`) and loaded in that order via `extra_css`. + The files are plain, comment-free CSS; keep a rule in the file that matches + its concern, and keep `extra_css` in cascade order (it layers over the + Material package, so order and specificity are what make an override win). - [`theme/main.html`](theme/main.html) and its [`partials/`](theme/partials/) retain only the overrides and integrations that Codacy needs. - [`mkdocs.yml`](mkdocs.yml) connects this layer through `theme.custom_dir` and loads the small supporting browser scripts and stylesheets. +Several partials under [`theme/partials/`](theme/partials/) (for example +`nav-item.html`, `header.html`, `search.html`, and `toc.html`) are derived from +the equivalent templates in the `mkdocs-material` version pinned in +[`requirements.txt`](requirements.txt) and then trimmed to Codacy's needs. They +are coupled to that version's markup, CSS class names, and JavaScript component +contracts, so **bumping `mkdocs-material` requires re-diffing these partials +against the new upstream templates** and re-testing search, the palette toggle, +and navigation. Pin the package to an exact version and treat an upgrade as a +deliberate task, not an incidental dependency bump. + There is no front-end build step. Edit the CSS, Jinja partials, or supporting JavaScript directly, then use the normal MkDocs preview: @@ -70,6 +84,14 @@ The theme self-hosts the Inter and Roboto Mono font files under `theme/assets/fonts/`; it doesn't contact a third-party font service. Keep the font license beside those assets when updating them. +Icons are provided by Ionicons, also vendored locally under +`theme/assets/vendor/ionicons/` (the runtime loader plus only the SVGs the theme +references) so the docs render fully offline and don't depend on a third-party +CDN — this matters for Self-hosted installations. When you add an +`<ion-icon name="…">` or a `sidebar_icons` entry, copy the matching +`svg/<name>.svg` from the Ionicons package into that folder; unreferenced icons +are intentionally not vendored. Keep the Ionicons license beside the assets. + The `theme/hooks/image_metadata.py` hook adds intrinsic dimensions and safe loading hints to local documentation images at build time. Authors normally use standard Markdown image syntax; explicit HTML image attributes are preserved diff --git a/docs/assets/javascripts/docs-theme.js b/docs/assets/javascripts/docs-theme.js index d82f92b59a..88d5b6e072 100644 --- a/docs/assets/javascripts/docs-theme.js +++ b/docs/assets/javascripts/docs-theme.js @@ -63,7 +63,14 @@ function initializeDocsTheme() { if (shortcut && !/Mac|iPhone|iPad/.test(navigator.platform)) { shortcut.textContent = "Ctrl K"; } + // The header search trigger persists across navigation.instant page loads, + // so bind each trigger once; otherwise every navigation stacks another + // handler on the same element. searchTriggers.forEach(function (searchTrigger) { + if (searchTrigger.dataset.docsSearchTriggerInitialized) { + return; + } + searchTrigger.dataset.docsSearchTriggerInitialized = "true"; searchTrigger.addEventListener("click", function (event) { event.preventDefault(); openSearch(searchTrigger); @@ -143,7 +150,8 @@ function initializeDocsTheme() { } var searchToggle = document.querySelector("#__search"); - if (searchToggle && trigger) { + if (searchToggle && trigger && !searchToggle.dataset.docsSearchToggleInitialized) { + searchToggle.dataset.docsSearchToggleInitialized = "true"; searchToggle.addEventListener("change", function () { searchTriggers.forEach(function (searchTrigger) { searchTrigger.setAttribute("aria-expanded", String(searchToggle.checked)); @@ -160,7 +168,8 @@ function initializeDocsTheme() { } var searchInput = document.querySelector(".md-search__input"); - if (searchInput) { + if (searchInput && !searchInput.dataset.docsSearchInputInitialized) { + searchInput.dataset.docsSearchInputInitialized = "true"; searchInput.addEventListener("input", function (event) { // Material listens for keyup. Mirroring input events also covers // paste, autofill, and browser automation without duplicating diff --git a/mkdocs.yml b/mkdocs.yml index dfab84f96a..b17149ce15 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_name: "Codacy docs" site_description: "Documentation for the Codacy automated code review tool." site_url: "https://docs.codacy.com/" site_author: "support@codacy.com (Codacy Support)" -copyright: "Codacy - Automated code review" +copyright: "© <span data-copyright-year>2026</span> <a href=\"https://www.codacy.com\">Codacy</a> - Automated code review" # Repository information repo_name: "codacy/docs" @@ -43,7 +43,14 @@ theme: extra_css: - "stylesheets/fonts.css" - "stylesheets/tokens.css" - - "stylesheets/theme.css" + - "stylesheets/base.css" + - "stylesheets/header.css" + - "stylesheets/navigation.css" + - "stylesheets/content.css" + - "stylesheets/home.css" + - "stylesheets/footer.css" + - "stylesheets/layout.css" + - "stylesheets/responsive.css" extra_javascript: - "assets/javascripts/version-select.js" - "assets/javascripts/docs-theme.js" diff --git a/theme/assets/vendor/ionicons/LICENSE b/theme/assets/vendor/ionicons/LICENSE new file mode 100644 index 0000000000..6be4c3e10d --- /dev/null +++ b/theme/assets/vendor/ionicons/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present Ionic (http://ionic.io/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/theme/assets/vendor/ionicons/index.esm.js b/theme/assets/vendor/ionicons/index.esm.js new file mode 100644 index 0000000000..895219c129 --- /dev/null +++ b/theme/assets/vendor/ionicons/index.esm.js @@ -0,0 +1 @@ +export{a as setAssetPath}from"./p-e298ede3.js";export{a as addIcons}from"./p-006dba1a.js"; \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/ionicons.esm.js b/theme/assets/vendor/ionicons/ionicons.esm.js new file mode 100644 index 0000000000..78180d31e5 --- /dev/null +++ b/theme/assets/vendor/ionicons/ionicons.esm.js @@ -0,0 +1 @@ +import{p as e,b as o}from"./p-e298ede3.js";export{s as setNonce}from"./p-e298ede3.js";(()=>{const o=import.meta.url,s={};return""!==o&&(s.resourcesUrl=new URL(".",o).href),e(s)})().then((e=>o([["p-748a23b9",[[1,"ion-icon",{mode:[1025],color:[1],ios:[1],md:[1],flipRtl:[4,"flip-rtl"],name:[513],src:[1],icon:[8],size:[1],lazy:[4],sanitize:[4],svgContent:[32],isVisible:[32]}]]]],e))); \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/ionicons.js b/theme/assets/vendor/ionicons/ionicons.js new file mode 100644 index 0000000000..3f157c731a --- /dev/null +++ b/theme/assets/vendor/ionicons/ionicons.js @@ -0,0 +1,127 @@ + +'use strict'; +(function () { + var currentScript = document.currentScript; + + // Safari 10 support type="module" but still download and executes the nomodule script + if (!currentScript || !currentScript.hasAttribute('nomodule') || !('onbeforeload' in currentScript)) { + + /** + * core-js 3.6.5 + * https://github.com/zloirock/core-js + * License: http://rock.mit-license.org + * © 2019 Denis Pushkarev (zloirock.ru) + */ +!function(t){"use strict";!function(t){var n={};function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)e.d(r,o,function(n){return t[n]}.bind(null,o));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=0)}([function(t,n,e){e(1),e(55),e(62),e(68),e(70),e(71),e(72),e(73),e(75),e(76),e(78),e(87),e(88),e(89),e(98),e(99),e(101),e(102),e(103),e(105),e(106),e(107),e(108),e(110),e(111),e(112),e(113),e(114),e(115),e(116),e(117),e(118),e(127),e(130),e(131),e(133),e(135),e(136),e(137),e(138),e(139),e(141),e(143),e(146),e(148),e(150),e(151),e(153),e(154),e(155),e(156),e(157),e(159),e(160),e(162),e(163),e(164),e(165),e(166),e(167),e(168),e(169),e(170),e(172),e(173),e(183),e(184),e(185),e(189),e(191),e(192),e(193),e(194),e(195),e(196),e(198),e(201),e(202),e(203),e(204),e(208),e(209),e(212),e(213),e(214),e(215),e(216),e(217),e(218),e(219),e(221),e(222),e(223),e(226),e(227),e(228),e(229),e(230),e(231),e(232),e(233),e(234),e(235),e(236),e(237),e(238),e(240),e(241),e(243),e(248),t.exports=e(246)},function(t,n,e){var r=e(2),o=e(6),i=e(45),a=e(14),u=e(46),c=e(39),f=e(47),s=e(48),l=e(52),p=e(49),h=e(53),v=p("isConcatSpreadable"),g=h>=51||!o((function(){var t=[];return t[v]=!1,t.concat()[0]!==t})),d=l("concat"),y=function(t){if(!a(t))return!1;var n=t[v];return void 0!==n?!!n:i(t)};r({target:"Array",proto:!0,forced:!g||!d},{concat:function(t){var n,e,r,o,i,a=u(this),l=s(a,0),p=0;for(n=-1,r=arguments.length;n<r;n++)if(i=-1===n?a:arguments[n],y(i)){if(p+(o=c(i.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(e=0;e<o;e++,p++)e in i&&f(l,p,i[e])}else{if(p>=9007199254740991)throw TypeError("Maximum allowed index exceeded");f(l,p++,i)}return l.length=p,l}})},function(t,n,e){var r=e(3),o=e(4).f,i=e(18),a=e(21),u=e(22),c=e(32),f=e(44);t.exports=function(t,n){var e,s,l,p,h,v=t.target,g=t.global,d=t.stat;if(e=g?r:d?r[v]||u(v,{}):(r[v]||{}).prototype)for(s in n){if(p=n[s],l=t.noTargetGet?(h=o(e,s))&&h.value:e[s],!f(g?s:v+(d?".":"#")+s,t.forced)&&void 0!==l){if(typeof p==typeof l)continue;c(p,l)}(t.sham||l&&l.sham)&&i(p,"sham",!0),a(e,s,p,t)}}},function(t,n){var e=function(t){return t&&t.Math==Math&&t};t.exports=e("object"==typeof globalThis&&globalThis)||e("object"==typeof window&&window)||e("object"==typeof self&&self)||e("object"==typeof global&&global)||Function("return this")()},function(t,n,e){var r=e(5),o=e(7),i=e(8),a=e(9),u=e(13),c=e(15),f=e(16),s=Object.getOwnPropertyDescriptor;n.f=r?s:function(t,n){if(t=a(t),n=u(n,!0),f)try{return s(t,n)}catch(t){}if(c(t,n))return i(!o.f.call(t,n),t[n])}},function(t,n,e){var r=e(6);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);n.f=i?function(t){var n=o(this,t);return!!n&&n.enumerable}:r},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n,e){var r=e(10),o=e(12);t.exports=function(t){return r(o(t))}},function(t,n,e){var r=e(6),o=e(11),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,e){var r=e(14);t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(5),o=e(6),i=e(17);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(3),o=e(14),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,n,e){var r=e(5),o=e(19),i=e(8);t.exports=r?function(t,n,e){return o.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(5),o=e(16),i=e(20),a=e(13),u=Object.defineProperty;n.f=r?u:function(t,n,e){if(i(t),n=a(n,!0),i(e),o)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(14);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,n,e){var r=e(3),o=e(18),i=e(15),a=e(22),u=e(23),c=e(25),f=c.get,s=c.enforce,l=String(String).split("String");(t.exports=function(t,n,e,u){var c=!!u&&!!u.unsafe,f=!!u&&!!u.enumerable,p=!!u&&!!u.noTargetGet;"function"==typeof e&&("string"!=typeof n||i(e,"name")||o(e,"name",n),s(e).source=l.join("string"==typeof n?n:"")),t!==r?(c?!p&&t[n]&&(f=!0):delete t[n],f?t[n]=e:o(t,n,e)):f?t[n]=e:a(n,e)})(Function.prototype,"toString",(function(){return"function"==typeof this&&f(this).source||u(this)}))},function(t,n,e){var r=e(3),o=e(18);t.exports=function(t,n){try{o(r,t,n)}catch(e){r[t]=n}return n}},function(t,n,e){var r=e(24),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(t){return o.call(t)}),t.exports=r.inspectSource},function(t,n,e){var r=e(3),o=e(22),i=r["__core-js_shared__"]||o("__core-js_shared__",{});t.exports=i},function(t,n,e){var r,o,i,a=e(26),u=e(3),c=e(14),f=e(18),s=e(15),l=e(27),p=e(31),h=u.WeakMap;if(a){var v=new h,g=v.get,d=v.has,y=v.set;r=function(t,n){return y.call(v,t,n),n},o=function(t){return g.call(v,t)||{}},i=function(t){return d.call(v,t)}}else{var x=l("state");p[x]=!0,r=function(t,n){return f(t,x,n),n},o=function(t){return s(t,x)?t[x]:{}},i=function(t){return s(t,x)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(n){var e;if(!c(n)||(e=o(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return e}}}},function(t,n,e){var r=e(3),o=e(23),i=r.WeakMap;t.exports="function"==typeof i&&/native code/.test(o(i))},function(t,n,e){var r=e(28),o=e(30),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,n,e){var r=e(29),o=e(24);(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},function(t,n){t.exports=!1},function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++e+r).toString(36)}},function(t,n){t.exports={}},function(t,n,e){var r=e(15),o=e(33),i=e(4),a=e(19);t.exports=function(t,n){for(var e=o(n),u=a.f,c=i.f,f=0;f<e.length;f++){var s=e[f];r(t,s)||u(t,s,c(n,s))}}},function(t,n,e){var r=e(34),o=e(36),i=e(43),a=e(20);t.exports=r("Reflect","ownKeys")||function(t){var n=o.f(a(t)),e=i.f;return e?n.concat(e(t)):n}},function(t,n,e){var r=e(35),o=e(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,n){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][n]||o[t]&&o[t][n]}},function(t,n,e){var r=e(3);t.exports=r},function(t,n,e){var r=e(37),o=e(42).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,n,e){var r=e(15),o=e(9),i=e(38).indexOf,a=e(31);t.exports=function(t,n){var e,u=o(t),c=0,f=[];for(e in u)!r(a,e)&&r(u,e)&&f.push(e);for(;n.length>c;)r(u,e=n[c++])&&(~i(f,e)||f.push(e));return f}},function(t,n,e){var r=e(9),o=e(39),i=e(41),a=function(t){return function(n,e,a){var u,c=r(n),f=o(c.length),s=i(a,f);if(t&&e!=e){for(;f>s;)if((u=c[s++])!=u)return!0}else for(;f>s;s++)if((t||s in c)&&c[s]===e)return t||s||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,n,e){var r=e(40),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(40),o=Math.max,i=Math.min;t.exports=function(t,n){var e=r(t);return e<0?o(e+n,0):i(e,n)}},function(t,n){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(6),o=/#|\.prototype\./,i=function(t,n){var e=u[a(t)];return e==f||e!=c&&("function"==typeof n?r(n):!!n)},a=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},u=i.data={},c=i.NATIVE="N",f=i.POLYFILL="P";t.exports=i},function(t,n,e){var r=e(11);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,n,e){var r=e(12);t.exports=function(t){return Object(r(t))}},function(t,n,e){var r=e(13),o=e(19),i=e(8);t.exports=function(t,n,e){var a=r(n);a in t?o.f(t,a,i(0,e)):t[a]=e}},function(t,n,e){var r=e(14),o=e(45),i=e(49)("species");t.exports=function(t,n){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)?r(e)&&null===(e=e[i])&&(e=void 0):e=void 0),new(void 0===e?Array:e)(0===n?0:n)}},function(t,n,e){var r=e(3),o=e(28),i=e(15),a=e(30),u=e(50),c=e(51),f=o("wks"),s=r.Symbol,l=c?s:s&&s.withoutSetter||a;t.exports=function(t){return i(f,t)||(u&&i(s,t)?f[t]=s[t]:f[t]=l("Symbol."+t)),f[t]}},function(t,n,e){var r=e(6);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,n,e){var r=e(50);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,n,e){var r=e(6),o=e(49),i=e(53),a=o("species");t.exports=function(t){return i>=51||!r((function(){var n=[];return(n.constructor={})[a]=function(){return{foo:1}},1!==n[t](Boolean).foo}))}},function(t,n,e){var r,o,i=e(3),a=e(54),u=i.process,c=u&&u.versions,f=c&&c.v8;f?o=(r=f.split("."))[0]+r[1]:a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=r[1]),t.exports=o&&+o},function(t,n,e){var r=e(34);t.exports=r("navigator","userAgent")||""},function(t,n,e){var r=e(2),o=e(56),i=e(57);r({target:"Array",proto:!0},{copyWithin:o}),i("copyWithin")},function(t,n,e){var r=e(46),o=e(41),i=e(39),a=Math.min;t.exports=[].copyWithin||function(t,n){var e=r(this),u=i(e.length),c=o(t,u),f=o(n,u),s=arguments.length>2?arguments[2]:void 0,l=a((void 0===s?u:o(s,u))-f,u-c),p=1;for(f<c&&c<f+l&&(p=-1,f+=l-1,c+=l-1);l-- >0;)f in e?e[c]=e[f]:delete e[c],c+=p,f+=p;return e}},function(t,n,e){var r=e(49),o=e(58),i=e(19),a=r("unscopables"),u=Array.prototype;null==u[a]&&i.f(u,a,{configurable:!0,value:o(null)}),t.exports=function(t){u[a][t]=!0}},function(t,n,e){var r,o=e(20),i=e(59),a=e(42),u=e(31),c=e(61),f=e(17),s=e(27),l=s("IE_PROTO"),p=function(){},h=function(t){return"<script>"+t+"<\/script>"},v=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(t){}var t,n;v=r?function(t){t.write(h("")),t.close();var n=t.parentWindow.Object;return t=null,n}(r):((n=f("iframe")).style.display="none",c.appendChild(n),n.src=String("javascript:"),(t=n.contentWindow.document).open(),t.write(h("document.F=Object")),t.close(),t.F);for(var e=a.length;e--;)delete v.prototype[a[e]];return v()};u[l]=!0,t.exports=Object.create||function(t,n){var e;return null!==t?(p.prototype=o(t),e=new p,p.prototype=null,e[l]=t):e=v(),void 0===n?e:i(e,n)}},function(t,n,e){var r=e(5),o=e(19),i=e(20),a=e(60);t.exports=r?Object.defineProperties:function(t,n){i(t);for(var e,r=a(n),u=r.length,c=0;u>c;)o.f(t,e=r[c++],n[e]);return t}},function(t,n,e){var r=e(37),o=e(42);t.exports=Object.keys||function(t){return r(t,o)}},function(t,n,e){var r=e(34);t.exports=r("document","documentElement")},function(t,n,e){var r=e(2),o=e(63).every,i=e(66),a=e(67),u=i("every"),c=a("every");r({target:"Array",proto:!0,forced:!u||!c},{every:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(64),o=e(10),i=e(46),a=e(39),u=e(48),c=[].push,f=function(t){var n=1==t,e=2==t,f=3==t,s=4==t,l=6==t,p=5==t||l;return function(h,v,g,d){for(var y,x,m=i(h),b=o(m),S=r(v,g,3),E=a(b.length),w=0,O=d||u,R=n?O(h,E):e?O(h,0):void 0;E>w;w++)if((p||w in b)&&(x=S(y=b[w],w,m),t))if(n)R[w]=x;else if(x)switch(t){case 3:return!0;case 5:return y;case 6:return w;case 2:c.call(R,y)}else if(s)return!1;return l?-1:f||s?s:R}};t.exports={forEach:f(0),map:f(1),filter:f(2),some:f(3),every:f(4),find:f(5),findIndex:f(6)}},function(t,n,e){var r=e(65);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 0:return function(){return t.call(n)};case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,n,e){var r=e(6);t.exports=function(t,n){var e=[][t];return!!e&&r((function(){e.call(null,n||function(){throw 1},1)}))}},function(t,n,e){var r=e(5),o=e(6),i=e(15),a=Object.defineProperty,u={},c=function(t){throw t};t.exports=function(t,n){if(i(u,t))return u[t];n||(n={});var e=[][t],f=!!i(n,"ACCESSORS")&&n.ACCESSORS,s=i(n,0)?n[0]:c,l=i(n,1)?n[1]:void 0;return u[t]=!!e&&!o((function(){if(f&&!r)return!0;var t={length:-1};f?a(t,1,{enumerable:!0,get:c}):t[1]=1,e.call(t,s,l)}))}},function(t,n,e){var r=e(2),o=e(69),i=e(57);r({target:"Array",proto:!0},{fill:o}),i("fill")},function(t,n,e){var r=e(46),o=e(41),i=e(39);t.exports=function(t){for(var n=r(this),e=i(n.length),a=arguments.length,u=o(a>1?arguments[1]:void 0,e),c=a>2?arguments[2]:void 0,f=void 0===c?e:o(c,e);f>u;)n[u++]=t;return n}},function(t,n,e){var r=e(2),o=e(63).filter,i=e(52),a=e(67),u=i("filter"),c=a("filter");r({target:"Array",proto:!0,forced:!u||!c},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(63).find,i=e(57),a=e(67),u=!0,c=a("find");"find"in[]&&Array(1).find((function(){u=!1})),r({target:"Array",proto:!0,forced:u||!c},{find:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("find")},function(t,n,e){var r=e(2),o=e(63).findIndex,i=e(57),a=e(67),u=!0,c=a("findIndex");"findIndex"in[]&&Array(1).findIndex((function(){u=!1})),r({target:"Array",proto:!0,forced:u||!c},{findIndex:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("findIndex")},function(t,n,e){var r=e(2),o=e(74),i=e(46),a=e(39),u=e(40),c=e(48);r({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,n=i(this),e=a(n.length),r=c(n,0);return r.length=o(r,n,n,e,0,void 0===t?1:u(t)),r}})},function(t,n,e){var r=e(45),o=e(39),i=e(64),a=function(t,n,e,u,c,f,s,l){for(var p,h=c,v=0,g=!!s&&i(s,l,3);v<u;){if(v in e){if(p=g?g(e[v],v,n):e[v],f>0&&r(p))h=a(t,n,p,o(p.length),h,f-1)-1;else{if(h>=9007199254740991)throw TypeError("Exceed the acceptable array length");t[h]=p}h++}v++}return h};t.exports=a},function(t,n,e){var r=e(2),o=e(74),i=e(46),a=e(39),u=e(65),c=e(48);r({target:"Array",proto:!0},{flatMap:function(t){var n,e=i(this),r=a(e.length);return u(t),(n=c(e,0)).length=o(n,e,e,r,0,1,t,arguments.length>1?arguments[1]:void 0),n}})},function(t,n,e){var r=e(2),o=e(77);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},function(t,n,e){var r=e(63).forEach,o=e(66),i=e(67),a=o("forEach"),u=i("forEach");t.exports=a&&u?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},function(t,n,e){var r=e(2),o=e(79);r({target:"Array",stat:!0,forced:!e(86)((function(t){Array.from(t)}))},{from:o})},function(t,n,e){var r=e(64),o=e(46),i=e(80),a=e(81),u=e(39),c=e(47),f=e(83);t.exports=function(t){var n,e,s,l,p,h,v=o(t),g="function"==typeof this?this:Array,d=arguments.length,y=d>1?arguments[1]:void 0,x=void 0!==y,m=f(v),b=0;if(x&&(y=r(y,d>2?arguments[2]:void 0,2)),null==m||g==Array&&a(m))for(e=new g(n=u(v.length));n>b;b++)h=x?y(v[b],b):v[b],c(e,b,h);else for(p=(l=m.call(v)).next,e=new g;!(s=p.call(l)).done;b++)h=x?i(l,y,[s.value,b],!0):s.value,c(e,b,h);return e.length=b,e}},function(t,n,e){var r=e(20);t.exports=function(t,n,e,o){try{return o?n(r(e)[0],e[1]):n(e)}catch(n){var i=t.return;throw void 0!==i&&r(i.call(t)),n}}},function(t,n,e){var r=e(49),o=e(82),i=r("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||a[i]===t)}},function(t,n){t.exports={}},function(t,n,e){var r=e(84),o=e(82),i=e(49)("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,n,e){var r=e(85),o=e(11),i=e(49)("toStringTag"),a="Arguments"==o(function(){return arguments}());t.exports=r?o:function(t){var n,e,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?e:a?o(n):"Object"==(r=o(n))&&"function"==typeof n.callee?"Arguments":r}},function(t,n,e){var r={};r[e(49)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,n,e){var r=e(49)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},return:function(){o=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,n){if(!n&&!o)return!1;var e=!1;try{var i={};i[r]=function(){return{next:function(){return{done:e=!0}}}},t(i)}catch(t){}return e}},function(t,n,e){var r=e(2),o=e(38).includes,i=e(57);r({target:"Array",proto:!0,forced:!e(67)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("includes")},function(t,n,e){var r=e(2),o=e(38).indexOf,i=e(66),a=e(67),u=[].indexOf,c=!!u&&1/[1].indexOf(1,-0)<0,f=i("indexOf"),s=a("indexOf",{ACCESSORS:!0,1:0});r({target:"Array",proto:!0,forced:c||!f||!s},{indexOf:function(t){return c?u.apply(this,arguments)||0:o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(9),o=e(57),i=e(82),a=e(25),u=e(90),c=a.set,f=a.getterFor("Array Iterator");t.exports=u(Array,"Array",(function(t,n){c(this,{type:"Array Iterator",target:r(t),index:0,kind:n})}),(function(){var t=f(this),n=t.target,e=t.kind,r=t.index++;return!n||r>=n.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==e?{value:r,done:!1}:"values"==e?{value:n[r],done:!1}:{value:[r,n[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,n,e){var r=e(2),o=e(91),i=e(93),a=e(96),u=e(95),c=e(18),f=e(21),s=e(49),l=e(29),p=e(82),h=e(92),v=h.IteratorPrototype,g=h.BUGGY_SAFARI_ITERATORS,d=s("iterator"),y=function(){return this};t.exports=function(t,n,e,s,h,x,m){o(e,n,s);var b,S,E,w=function(t){if(t===h&&I)return I;if(!g&&t in A)return A[t];switch(t){case"keys":case"values":case"entries":return function(){return new e(this,t)}}return function(){return new e(this)}},O=n+" Iterator",R=!1,A=t.prototype,j=A[d]||A["@@iterator"]||h&&A[h],I=!g&&j||w(h),k="Array"==n&&A.entries||j;if(k&&(b=i(k.call(new t)),v!==Object.prototype&&b.next&&(l||i(b)===v||(a?a(b,v):"function"!=typeof b[d]&&c(b,d,y)),u(b,O,!0,!0),l&&(p[O]=y))),"values"==h&&j&&"values"!==j.name&&(R=!0,I=function(){return j.call(this)}),l&&!m||A[d]===I||c(A,d,I),p[n]=I,h)if(S={values:w("values"),keys:x?I:w("keys"),entries:w("entries")},m)for(E in S)(g||R||!(E in A))&&f(A,E,S[E]);else r({target:n,proto:!0,forced:g||R},S);return S}},function(t,n,e){var r=e(92).IteratorPrototype,o=e(58),i=e(8),a=e(95),u=e(82),c=function(){return this};t.exports=function(t,n,e){var f=n+" Iterator";return t.prototype=o(r,{next:i(1,e)}),a(t,f,!1,!0),u[f]=c,t}},function(t,n,e){var r,o,i,a=e(93),u=e(18),c=e(15),f=e(49),s=e(29),l=f("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=a(a(i)))!==Object.prototype&&(r=o):p=!0),null==r&&(r={}),s||c(r,l)||u(r,l,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},function(t,n,e){var r=e(15),o=e(46),i=e(27),a=e(94),u=i("IE_PROTO"),c=Object.prototype;t.exports=a?Object.getPrototypeOf:function(t){return t=o(t),r(t,u)?t[u]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?c:null}},function(t,n,e){var r=e(6);t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},function(t,n,e){var r=e(19).f,o=e(15),i=e(49)("toStringTag");t.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},function(t,n,e){var r=e(20),o=e(97);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,n=!1,e={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(e,[]),n=e instanceof Array}catch(t){}return function(e,i){return r(e),o(i),n?t.call(e,i):e.__proto__=i,e}}():void 0)},function(t,n,e){var r=e(14);t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},function(t,n,e){var r=e(2),o=e(10),i=e(9),a=e(66),u=[].join,c=o!=Object,f=a("join",",");r({target:"Array",proto:!0,forced:c||!f},{join:function(t){return u.call(i(this),void 0===t?",":t)}})},function(t,n,e){var r=e(2),o=e(100);r({target:"Array",proto:!0,forced:o!==[].lastIndexOf},{lastIndexOf:o})},function(t,n,e){var r=e(9),o=e(40),i=e(39),a=e(66),u=e(67),c=Math.min,f=[].lastIndexOf,s=!!f&&1/[1].lastIndexOf(1,-0)<0,l=a("lastIndexOf"),p=u("indexOf",{ACCESSORS:!0,1:0}),h=s||!l||!p;t.exports=h?function(t){if(s)return f.apply(this,arguments)||0;var n=r(this),e=i(n.length),a=e-1;for(arguments.length>1&&(a=c(a,o(arguments[1]))),a<0&&(a=e+a);a>=0;a--)if(a in n&&n[a]===t)return a||0;return-1}:f},function(t,n,e){var r=e(2),o=e(63).map,i=e(52),a=e(67),u=i("map"),c=a("map");r({target:"Array",proto:!0,forced:!u||!c},{map:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(6),i=e(47);r({target:"Array",stat:!0,forced:o((function(){function t(){}return!(Array.of.call(t)instanceof t)}))},{of:function(){for(var t=0,n=arguments.length,e=new("function"==typeof this?this:Array)(n);n>t;)i(e,t,arguments[t++]);return e.length=n,e}})},function(t,n,e){var r=e(2),o=e(104).left,i=e(66),a=e(67),u=i("reduce"),c=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!u||!c},{reduce:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(65),o=e(46),i=e(10),a=e(39),u=function(t){return function(n,e,u,c){r(e);var f=o(n),s=i(f),l=a(f.length),p=t?l-1:0,h=t?-1:1;if(u<2)for(;;){if(p in s){c=s[p],p+=h;break}if(p+=h,t?p<0:l<=p)throw TypeError("Reduce of empty array with no initial value")}for(;t?p>=0:l>p;p+=h)p in s&&(c=e(c,s[p],p,f));return c}};t.exports={left:u(!1),right:u(!0)}},function(t,n,e){var r=e(2),o=e(104).right,i=e(66),a=e(67),u=i("reduceRight"),c=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!u||!c},{reduceRight:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(14),i=e(45),a=e(41),u=e(39),c=e(9),f=e(47),s=e(49),l=e(52),p=e(67),h=l("slice"),v=p("slice",{ACCESSORS:!0,0:0,1:2}),g=s("species"),d=[].slice,y=Math.max;r({target:"Array",proto:!0,forced:!h||!v},{slice:function(t,n){var e,r,s,l=c(this),p=u(l.length),h=a(t,p),v=a(void 0===n?p:n,p);if(i(l)&&("function"!=typeof(e=l.constructor)||e!==Array&&!i(e.prototype)?o(e)&&null===(e=e[g])&&(e=void 0):e=void 0,e===Array||void 0===e))return d.call(l,h,v);for(r=new(void 0===e?Array:e)(y(v-h,0)),s=0;h<v;h++,s++)h in l&&f(r,s,l[h]);return r.length=s,r}})},function(t,n,e){var r=e(2),o=e(63).some,i=e(66),a=e(67),u=i("some"),c=a("some");r({target:"Array",proto:!0,forced:!u||!c},{some:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){e(109)("Array")},function(t,n,e){var r=e(34),o=e(19),i=e(49),a=e(5),u=i("species");t.exports=function(t){var n=r(t),e=o.f;a&&n&&!n[u]&&e(n,u,{configurable:!0,get:function(){return this}})}},function(t,n,e){var r=e(2),o=e(41),i=e(40),a=e(39),u=e(46),c=e(48),f=e(47),s=e(52),l=e(67),p=s("splice"),h=l("splice",{ACCESSORS:!0,0:0,1:2}),v=Math.max,g=Math.min;r({target:"Array",proto:!0,forced:!p||!h},{splice:function(t,n){var e,r,s,l,p,h,d=u(this),y=a(d.length),x=o(t,y),m=arguments.length;if(0===m?e=r=0:1===m?(e=0,r=y-x):(e=m-2,r=g(v(i(n),0),y-x)),y+e-r>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(s=c(d,r),l=0;l<r;l++)(p=x+l)in d&&f(s,l,d[p]);if(s.length=r,e<r){for(l=x;l<y-r;l++)h=l+e,(p=l+r)in d?d[h]=d[p]:delete d[h];for(l=y;l>y-r+e;l--)delete d[l-1]}else if(e>r)for(l=y-r;l>x;l--)h=l+e-1,(p=l+r-1)in d?d[h]=d[p]:delete d[h];for(l=0;l<e;l++)d[l+x]=arguments[l+2];return d.length=y-r+e,s}})},function(t,n,e){e(57)("flat")},function(t,n,e){e(57)("flatMap")},function(t,n,e){var r=e(14),o=e(19),i=e(93),a=e(49)("hasInstance"),u=Function.prototype;a in u||o.f(u,a,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,e){var r=e(5),o=e(19).f,i=Function.prototype,a=i.toString,u=/^\s*function ([^ (]*)/;r&&!("name"in i)&&o(i,"name",{configurable:!0,get:function(){try{return a.call(this).match(u)[1]}catch(t){return""}}})},function(t,n,e){e(2)({global:!0},{globalThis:e(3)})},function(t,n,e){var r=e(2),o=e(34),i=e(6),a=o("JSON","stringify"),u=/[\uD800-\uDFFF]/g,c=/^[\uD800-\uDBFF]$/,f=/^[\uDC00-\uDFFF]$/,s=function(t,n,e){var r=e.charAt(n-1),o=e.charAt(n+1);return c.test(t)&&!f.test(o)||f.test(t)&&!c.test(r)?"\\u"+t.charCodeAt(0).toString(16):t},l=i((function(){return'"\\udf06\\ud834"'!==a("\udf06\ud834")||'"\\udead"'!==a("\udead")}));a&&r({target:"JSON",stat:!0,forced:l},{stringify:function(t,n,e){var r=a.apply(null,arguments);return"string"==typeof r?r.replace(u,s):r}})},function(t,n,e){var r=e(3);e(95)(r.JSON,"JSON",!0)},function(t,n,e){var r=e(119),o=e(125);t.exports=r("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),o)},function(t,n,e){var r=e(2),o=e(3),i=e(44),a=e(21),u=e(120),c=e(122),f=e(123),s=e(14),l=e(6),p=e(86),h=e(95),v=e(124);t.exports=function(t,n,e){var g=-1!==t.indexOf("Map"),d=-1!==t.indexOf("Weak"),y=g?"set":"add",x=o[t],m=x&&x.prototype,b=x,S={},E=function(t){var n=m[t];a(m,t,"add"==t?function(t){return n.call(this,0===t?0:t),this}:"delete"==t?function(t){return!(d&&!s(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return d&&!s(t)?void 0:n.call(this,0===t?0:t)}:"has"==t?function(t){return!(d&&!s(t))&&n.call(this,0===t?0:t)}:function(t,e){return n.call(this,0===t?0:t,e),this})};if(i(t,"function"!=typeof x||!(d||m.forEach&&!l((function(){(new x).entries().next()})))))b=e.getConstructor(n,t,g,y),u.REQUIRED=!0;else if(i(t,!0)){var w=new b,O=w[y](d?{}:-0,1)!=w,R=l((function(){w.has(1)})),A=p((function(t){new x(t)})),j=!d&&l((function(){for(var t=new x,n=5;n--;)t[y](n,n);return!t.has(-0)}));A||((b=n((function(n,e){f(n,b,t);var r=v(new x,n,b);return null!=e&&c(e,r[y],r,g),r}))).prototype=m,m.constructor=b),(R||j)&&(E("delete"),E("has"),g&&E("get")),(j||O)&&E(y),d&&m.clear&&delete m.clear}return S[t]=b,r({global:!0,forced:b!=x},S),h(b,t),d||e.setStrong(b,t,g),b}},function(t,n,e){var r=e(31),o=e(14),i=e(15),a=e(19).f,u=e(30),c=e(121),f=u("meta"),s=0,l=Object.isExtensible||function(){return!0},p=function(t){a(t,f,{value:{objectID:"O"+ ++s,weakData:{}}})},h=t.exports={REQUIRED:!1,fastKey:function(t,n){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,f)){if(!l(t))return"F";if(!n)return"E";p(t)}return t[f].objectID},getWeakData:function(t,n){if(!i(t,f)){if(!l(t))return!0;if(!n)return!1;p(t)}return t[f].weakData},onFreeze:function(t){return c&&h.REQUIRED&&l(t)&&!i(t,f)&&p(t),t}};r[f]=!0},function(t,n,e){var r=e(6);t.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(t,n,e){var r=e(20),o=e(81),i=e(39),a=e(64),u=e(83),c=e(80),f=function(t,n){this.stopped=t,this.result=n};(t.exports=function(t,n,e,s,l){var p,h,v,g,d,y,x,m=a(n,e,s?2:1);if(l)p=t;else{if("function"!=typeof(h=u(t)))throw TypeError("Target is not iterable");if(o(h)){for(v=0,g=i(t.length);g>v;v++)if((d=s?m(r(x=t[v])[0],x[1]):m(t[v]))&&d instanceof f)return d;return new f(!1)}p=h.call(t)}for(y=p.next;!(x=y.call(p)).done;)if("object"==typeof(d=c(p,m,x.value,s))&&d&&d instanceof f)return d;return new f(!1)}).stop=function(t){return new f(!0,t)}},function(t,n){t.exports=function(t,n,e){if(!(t instanceof n))throw TypeError("Incorrect "+(e?e+" ":"")+"invocation");return t}},function(t,n,e){var r=e(14),o=e(96);t.exports=function(t,n,e){var i,a;return o&&"function"==typeof(i=n.constructor)&&i!==e&&r(a=i.prototype)&&a!==e.prototype&&o(t,a),t}},function(t,n,e){var r=e(19).f,o=e(58),i=e(126),a=e(64),u=e(123),c=e(122),f=e(90),s=e(109),l=e(5),p=e(120).fastKey,h=e(25),v=h.set,g=h.getterFor;t.exports={getConstructor:function(t,n,e,f){var s=t((function(t,r){u(t,s,n),v(t,{type:n,index:o(null),first:void 0,last:void 0,size:0}),l||(t.size=0),null!=r&&c(r,t[f],t,e)})),h=g(n),d=function(t,n,e){var r,o,i=h(t),a=y(t,n);return a?a.value=e:(i.last=a={index:o=p(n,!0),key:n,value:e,previous:r=i.last,next:void 0,removed:!1},i.first||(i.first=a),r&&(r.next=a),l?i.size++:t.size++,"F"!==o&&(i.index[o]=a)),t},y=function(t,n){var e,r=h(t),o=p(n);if("F"!==o)return r.index[o];for(e=r.first;e;e=e.next)if(e.key==n)return e};return i(s.prototype,{clear:function(){for(var t=h(this),n=t.index,e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=void 0),delete n[e.index],e=e.next;t.first=t.last=void 0,l?t.size=0:this.size=0},delete:function(t){var n=h(this),e=y(this,t);if(e){var r=e.next,o=e.previous;delete n.index[e.index],e.removed=!0,o&&(o.next=r),r&&(r.previous=o),n.first==e&&(n.first=r),n.last==e&&(n.last=o),l?n.size--:this.size--}return!!e},forEach:function(t){for(var n,e=h(this),r=a(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.next:e.first;)for(r(n.value,n.key,this);n&&n.removed;)n=n.previous},has:function(t){return!!y(this,t)}}),i(s.prototype,e?{get:function(t){var n=y(this,t);return n&&n.value},set:function(t,n){return d(this,0===t?0:t,n)}}:{add:function(t){return d(this,t=0===t?0:t,t)}}),l&&r(s.prototype,"size",{get:function(){return h(this).size}}),s},setStrong:function(t,n,e){var r=n+" Iterator",o=g(n),i=g(r);f(t,n,(function(t,n){v(this,{type:r,target:t,state:o(t),kind:n,last:void 0})}),(function(){for(var t=i(this),n=t.kind,e=t.last;e&&e.removed;)e=e.previous;return t.target&&(t.last=e=e?e.next:t.state.first)?"keys"==n?{value:e.key,done:!1}:"values"==n?{value:e.value,done:!1}:{value:[e.key,e.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),e?"entries":"values",!e,!0),s(n)}}},function(t,n,e){var r=e(21);t.exports=function(t,n,e){for(var o in n)r(t,o,n[o],e);return t}},function(t,n,e){var r=e(5),o=e(3),i=e(44),a=e(21),u=e(15),c=e(11),f=e(124),s=e(13),l=e(6),p=e(58),h=e(36).f,v=e(4).f,g=e(19).f,d=e(128).trim,y=o.Number,x=y.prototype,m="Number"==c(p(x)),b=function(t){var n,e,r,o,i,a,u,c,f=s(t,!1);if("string"==typeof f&&f.length>2)if(43===(n=(f=d(f)).charCodeAt(0))||45===n){if(88===(e=f.charCodeAt(2))||120===e)return NaN}else if(48===n){switch(f.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+f}for(a=(i=f.slice(2)).length,u=0;u<a;u++)if((c=i.charCodeAt(u))<48||c>o)return NaN;return parseInt(i,r)}return+f};if(i("Number",!y(" 0o1")||!y("0b1")||y("+0x1"))){for(var S,E=function(t){var n=arguments.length<1?0:t,e=this;return e instanceof E&&(m?l((function(){x.valueOf.call(e)})):"Number"!=c(e))?f(new y(b(n)),e,E):b(n)},w=r?h(y):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),O=0;w.length>O;O++)u(y,S=w[O])&&!u(E,S)&&g(E,S,v(y,S));E.prototype=x,x.constructor=E,a(o,"Number",E)}},function(t,n,e){var r=e(12),o="["+e(129)+"]",i=RegExp("^"+o+o+"*"),a=RegExp(o+o+"*$"),u=function(t){return function(n){var e=String(r(n));return 1&t&&(e=e.replace(i,"")),2&t&&(e=e.replace(a,"")),e}};t.exports={start:u(1),end:u(2),trim:u(3)}},function(t,n){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},function(t,n,e){e(2)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(t,n,e){e(2)({target:"Number",stat:!0},{isFinite:e(132)})},function(t,n,e){var r=e(3).isFinite;t.exports=Number.isFinite||function(t){return"number"==typeof t&&r(t)}},function(t,n,e){e(2)({target:"Number",stat:!0},{isInteger:e(134)})},function(t,n,e){var r=e(14),o=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&o(t)===t}},function(t,n,e){e(2)({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},function(t,n,e){var r=e(2),o=e(134),i=Math.abs;r({target:"Number",stat:!0},{isSafeInteger:function(t){return o(t)&&i(t)<=9007199254740991}})},function(t,n,e){e(2)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,e){e(2)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,e){var r=e(2),o=e(140);r({target:"Number",stat:!0,forced:Number.parseFloat!=o},{parseFloat:o})},function(t,n,e){var r=e(3),o=e(128).trim,i=e(129),a=r.parseFloat,u=1/a(i+"-0")!=-1/0;t.exports=u?function(t){var n=o(String(t)),e=a(n);return 0===e&&"-"==n.charAt(0)?-0:e}:a},function(t,n,e){var r=e(2),o=e(142);r({target:"Number",stat:!0,forced:Number.parseInt!=o},{parseInt:o})},function(t,n,e){var r=e(3),o=e(128).trim,i=e(129),a=r.parseInt,u=/^[+-]?0[Xx]/,c=8!==a(i+"08")||22!==a(i+"0x16");t.exports=c?function(t,n){var e=o(String(t));return a(e,n>>>0||(u.test(e)?16:10))}:a},function(t,n,e){var r=e(2),o=e(40),i=e(144),a=e(145),u=e(6),c=1..toFixed,f=Math.floor,s=function(t,n,e){return 0===n?e:n%2==1?s(t,n-1,e*t):s(t*t,n/2,e)};r({target:"Number",proto:!0,forced:c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!u((function(){c.call({})}))},{toFixed:function(t){var n,e,r,u,c=i(this),l=o(t),p=[0,0,0,0,0,0],h="",v="0",g=function(t,n){for(var e=-1,r=n;++e<6;)r+=t*p[e],p[e]=r%1e7,r=f(r/1e7)},d=function(t){for(var n=6,e=0;--n>=0;)e+=p[n],p[n]=f(e/t),e=e%t*1e7},y=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==p[t]){var e=String(p[t]);n=""===n?e:n+a.call("0",7-e.length)+e}return n};if(l<0||l>20)throw RangeError("Incorrect fraction digits");if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(h="-",c=-c),c>1e-21)if(e=(n=function(t){for(var n=0,e=t;e>=4096;)n+=12,e/=4096;for(;e>=2;)n+=1,e/=2;return n}(c*s(2,69,1))-69)<0?c*s(2,-n,1):c/s(2,n,1),e*=4503599627370496,(n=52-n)>0){for(g(0,e),r=l;r>=7;)g(1e7,0),r-=7;for(g(s(10,r,1),0),r=n-1;r>=23;)d(1<<23),r-=23;d(1<<r),g(1,1),d(2),v=y()}else g(0,e),g(1<<-n,0),v=y()+a.call("0",l);return v=l>0?h+((u=v.length)<=l?"0."+a.call("0",l-u)+v:v.slice(0,u-l)+"."+v.slice(u-l)):h+v}})},function(t,n,e){var r=e(11);t.exports=function(t){if("number"!=typeof t&&"Number"!=r(t))throw TypeError("Incorrect invocation");return+t}},function(t,n,e){var r=e(40),o=e(12);t.exports="".repeat||function(t){var n=String(o(this)),e="",i=r(t);if(i<0||i==1/0)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(n+=n))1&i&&(e+=n);return e}},function(t,n,e){var r=e(2),o=e(147);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},function(t,n,e){var r=e(5),o=e(6),i=e(60),a=e(43),u=e(7),c=e(46),f=e(10),s=Object.assign,l=Object.defineProperty;t.exports=!s||o((function(){if(r&&1!==s({b:1},s(l({},"a",{enumerable:!0,get:function(){l(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},n={},e=Symbol();return t[e]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),7!=s({},t)[e]||"abcdefghijklmnopqrst"!=i(s({},n)).join("")}))?function(t,n){for(var e=c(t),o=arguments.length,s=1,l=a.f,p=u.f;o>s;)for(var h,v=f(arguments[s++]),g=l?i(v).concat(l(v)):i(v),d=g.length,y=0;d>y;)h=g[y++],r&&!p.call(v,h)||(e[h]=v[h]);return e}:s},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(65),c=e(19);o&&r({target:"Object",proto:!0,forced:i},{__defineGetter__:function(t,n){c.f(a(this),t,{get:u(n),enumerable:!0,configurable:!0})}})},function(t,n,e){var r=e(29),o=e(3),i=e(6);t.exports=r||!i((function(){var t=Math.random();__defineSetter__.call(null,t,(function(){})),delete o[t]}))},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(65),c=e(19);o&&r({target:"Object",proto:!0,forced:i},{__defineSetter__:function(t,n){c.f(a(this),t,{set:u(n),enumerable:!0,configurable:!0})}})},function(t,n,e){var r=e(2),o=e(152).entries;r({target:"Object",stat:!0},{entries:function(t){return o(t)}})},function(t,n,e){var r=e(5),o=e(60),i=e(9),a=e(7).f,u=function(t){return function(n){for(var e,u=i(n),c=o(u),f=c.length,s=0,l=[];f>s;)e=c[s++],r&&!a.call(u,e)||l.push(t?[e,u[e]]:u[e]);return l}};t.exports={entries:u(!0),values:u(!1)}},function(t,n,e){var r=e(2),o=e(121),i=e(6),a=e(14),u=e(120).onFreeze,c=Object.freeze;r({target:"Object",stat:!0,forced:i((function(){c(1)})),sham:!o},{freeze:function(t){return c&&a(t)?c(u(t)):t}})},function(t,n,e){var r=e(2),o=e(122),i=e(47);r({target:"Object",stat:!0},{fromEntries:function(t){var n={};return o(t,(function(t,e){i(n,t,e)}),void 0,!0),n}})},function(t,n,e){var r=e(2),o=e(6),i=e(9),a=e(4).f,u=e(5),c=o((function(){a(1)}));r({target:"Object",stat:!0,forced:!u||c,sham:!u},{getOwnPropertyDescriptor:function(t,n){return a(i(t),n)}})},function(t,n,e){var r=e(2),o=e(5),i=e(33),a=e(9),u=e(4),c=e(47);r({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(t){for(var n,e,r=a(t),o=u.f,f=i(r),s={},l=0;f.length>l;)void 0!==(e=o(r,n=f[l++]))&&c(s,n,e);return s}})},function(t,n,e){var r=e(2),o=e(6),i=e(158).f;r({target:"Object",stat:!0,forced:o((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:i})},function(t,n,e){var r=e(9),o=e(36).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return a&&"[object Window]"==i.call(t)?function(t){try{return o(t)}catch(t){return a.slice()}}(t):o(r(t))}},function(t,n,e){var r=e(2),o=e(6),i=e(46),a=e(93),u=e(94);r({target:"Object",stat:!0,forced:o((function(){a(1)})),sham:!u},{getPrototypeOf:function(t){return a(i(t))}})},function(t,n,e){e(2)({target:"Object",stat:!0},{is:e(161)})},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isExtensible;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isExtensible:function(t){return!!i(t)&&(!a||a(t))}})},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isFrozen;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isFrozen:function(t){return!i(t)||!!a&&a(t)}})},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isSealed;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isSealed:function(t){return!i(t)||!!a&&a(t)}})},function(t,n,e){var r=e(2),o=e(46),i=e(60);r({target:"Object",stat:!0,forced:e(6)((function(){i(1)}))},{keys:function(t){return i(o(t))}})},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(13),c=e(93),f=e(4).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupGetter__:function(t){var n,e=a(this),r=u(t,!0);do{if(n=f(e,r))return n.get}while(e=c(e))}})},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(13),c=e(93),f=e(4).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupSetter__:function(t){var n,e=a(this),r=u(t,!0);do{if(n=f(e,r))return n.set}while(e=c(e))}})},function(t,n,e){var r=e(2),o=e(14),i=e(120).onFreeze,a=e(121),u=e(6),c=Object.preventExtensions;r({target:"Object",stat:!0,forced:u((function(){c(1)})),sham:!a},{preventExtensions:function(t){return c&&o(t)?c(i(t)):t}})},function(t,n,e){var r=e(2),o=e(14),i=e(120).onFreeze,a=e(121),u=e(6),c=Object.seal;r({target:"Object",stat:!0,forced:u((function(){c(1)})),sham:!a},{seal:function(t){return c&&o(t)?c(i(t)):t}})},function(t,n,e){var r=e(85),o=e(21),i=e(171);r||o(Object.prototype,"toString",i,{unsafe:!0})},function(t,n,e){var r=e(85),o=e(84);t.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},function(t,n,e){var r=e(2),o=e(152).values;r({target:"Object",stat:!0},{values:function(t){return o(t)}})},function(t,n,e){var r,o,i,a,u=e(2),c=e(29),f=e(3),s=e(34),l=e(174),p=e(21),h=e(126),v=e(95),g=e(109),d=e(14),y=e(65),x=e(123),m=e(11),b=e(23),S=e(122),E=e(86),w=e(175),O=e(176).set,R=e(178),A=e(179),j=e(181),I=e(180),k=e(182),P=e(25),L=e(44),T=e(49),_=e(53),U=T("species"),N="Promise",C=P.get,F=P.set,M=P.getterFor(N),z=l,D=f.TypeError,q=f.document,B=f.process,W=s("fetch"),$=I.f,G=$,V="process"==m(B),X=!!(q&&q.createEvent&&f.dispatchEvent),Y=L(N,(function(){if(!(b(z)!==String(z))){if(66===_)return!0;if(!V&&"function"!=typeof PromiseRejectionEvent)return!0}if(c&&!z.prototype.finally)return!0;if(_>=51&&/native code/.test(z))return!1;var t=z.resolve(1),n=function(t){t((function(){}),(function(){}))};return(t.constructor={})[U]=n,!(t.then((function(){}))instanceof n)})),K=Y||!E((function(t){z.all(t).catch((function(){}))})),J=function(t){var n;return!(!d(t)||"function"!=typeof(n=t.then))&&n},H=function(t,n,e){if(!n.notified){n.notified=!0;var r=n.reactions;R((function(){for(var o=n.value,i=1==n.state,a=0;r.length>a;){var u,c,f,s=r[a++],l=i?s.ok:s.fail,p=s.resolve,h=s.reject,v=s.domain;try{l?(i||(2===n.rejection&&nt(t,n),n.rejection=1),!0===l?u=o:(v&&v.enter(),u=l(o),v&&(v.exit(),f=!0)),u===s.promise?h(D("Promise-chain cycle")):(c=J(u))?c.call(u,p,h):p(u)):h(o)}catch(t){v&&!f&&v.exit(),h(t)}}n.reactions=[],n.notified=!1,e&&!n.rejection&&Z(t,n)}))}},Q=function(t,n,e){var r,o;X?((r=q.createEvent("Event")).promise=n,r.reason=e,r.initEvent(t,!1,!0),f.dispatchEvent(r)):r={promise:n,reason:e},(o=f["on"+t])?o(r):"unhandledrejection"===t&&j("Unhandled promise rejection",e)},Z=function(t,n){O.call(f,(function(){var e,r=n.value;if(tt(n)&&(e=k((function(){V?B.emit("unhandledRejection",r,t):Q("unhandledrejection",t,r)})),n.rejection=V||tt(n)?2:1,e.error))throw e.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},nt=function(t,n){O.call(f,(function(){V?B.emit("rejectionHandled",t):Q("rejectionhandled",t,n.value)}))},et=function(t,n,e,r){return function(o){t(n,e,o,r)}},rt=function(t,n,e,r){n.done||(n.done=!0,r&&(n=r),n.value=e,n.state=2,H(t,n,!0))},ot=function(t,n,e,r){if(!n.done){n.done=!0,r&&(n=r);try{if(t===e)throw D("Promise can't be resolved itself");var o=J(e);o?R((function(){var r={done:!1};try{o.call(e,et(ot,t,r,n),et(rt,t,r,n))}catch(e){rt(t,r,e,n)}})):(n.value=e,n.state=1,H(t,n,!1))}catch(e){rt(t,{done:!1},e,n)}}};Y&&(z=function(t){x(this,z,N),y(t),r.call(this);var n=C(this);try{t(et(ot,this,n),et(rt,this,n))}catch(t){rt(this,n,t)}},(r=function(t){F(this,{type:N,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(z.prototype,{then:function(t,n){var e=M(this),r=$(w(this,z));return r.ok="function"!=typeof t||t,r.fail="function"==typeof n&&n,r.domain=V?B.domain:void 0,e.parent=!0,e.reactions.push(r),0!=e.state&&H(this,e,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r,n=C(t);this.promise=t,this.resolve=et(ot,t,n),this.reject=et(rt,t,n)},I.f=$=function(t){return t===z||t===i?new o(t):G(t)},c||"function"!=typeof l||(a=l.prototype.then,p(l.prototype,"then",(function(t,n){var e=this;return new z((function(t,n){a.call(e,t,n)})).then(t,n)}),{unsafe:!0}),"function"==typeof W&&u({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return A(z,W.apply(f,arguments))}}))),u({global:!0,wrap:!0,forced:Y},{Promise:z}),v(z,N,!1,!0),g(N),i=s(N),u({target:N,stat:!0,forced:Y},{reject:function(t){var n=$(this);return n.reject.call(void 0,t),n.promise}}),u({target:N,stat:!0,forced:c||Y},{resolve:function(t){return A(c&&this===i?z:this,t)}}),u({target:N,stat:!0,forced:K},{all:function(t){var n=this,e=$(n),r=e.resolve,o=e.reject,i=k((function(){var e=y(n.resolve),i=[],a=0,u=1;S(t,(function(t){var c=a++,f=!1;i.push(void 0),u++,e.call(n,t).then((function(t){f||(f=!0,i[c]=t,--u||r(i))}),o)})),--u||r(i)}));return i.error&&o(i.value),e.promise},race:function(t){var n=this,e=$(n),r=e.reject,o=k((function(){var o=y(n.resolve);S(t,(function(t){o.call(n,t).then(e.resolve,r)}))}));return o.error&&r(o.value),e.promise}})},function(t,n,e){var r=e(3);t.exports=r.Promise},function(t,n,e){var r=e(20),o=e(65),i=e(49)("species");t.exports=function(t,n){var e,a=r(t).constructor;return void 0===a||null==(e=r(a)[i])?n:o(e)}},function(t,n,e){var r,o,i,a=e(3),u=e(6),c=e(11),f=e(64),s=e(61),l=e(17),p=e(177),h=a.location,v=a.setImmediate,g=a.clearImmediate,d=a.process,y=a.MessageChannel,x=a.Dispatch,m=0,b={},S=function(t){if(b.hasOwnProperty(t)){var n=b[t];delete b[t],n()}},E=function(t){return function(){S(t)}},w=function(t){S(t.data)},O=function(t){a.postMessage(t+"",h.protocol+"//"+h.host)};v&&g||(v=function(t){for(var n=[],e=1;arguments.length>e;)n.push(arguments[e++]);return b[++m]=function(){("function"==typeof t?t:Function(t)).apply(void 0,n)},r(m),m},g=function(t){delete b[t]},"process"==c(d)?r=function(t){d.nextTick(E(t))}:x&&x.now?r=function(t){x.now(E(t))}:y&&!p?(i=(o=new y).port2,o.port1.onmessage=w,r=f(i.postMessage,i,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||u(O)||"file:"===h.protocol?r="onreadystatechange"in l("script")?function(t){s.appendChild(l("script")).onreadystatechange=function(){s.removeChild(this),S(t)}}:function(t){setTimeout(E(t),0)}:(r=O,a.addEventListener("message",w,!1))),t.exports={set:v,clear:g}},function(t,n,e){var r=e(54);t.exports=/(iphone|ipod|ipad).*applewebkit/i.test(r)},function(t,n,e){var r,o,i,a,u,c,f,s,l=e(3),p=e(4).f,h=e(11),v=e(176).set,g=e(177),d=l.MutationObserver||l.WebKitMutationObserver,y=l.process,x=l.Promise,m="process"==h(y),b=p(l,"queueMicrotask"),S=b&&b.value;S||(r=function(){var t,n;for(m&&(t=y.domain)&&t.exit();o;){n=o.fn,o=o.next;try{n()}catch(t){throw o?a():i=void 0,t}}i=void 0,t&&t.enter()},m?a=function(){y.nextTick(r)}:d&&!g?(u=!0,c=document.createTextNode(""),new d(r).observe(c,{characterData:!0}),a=function(){c.data=u=!u}):x&&x.resolve?(f=x.resolve(void 0),s=f.then,a=function(){s.call(f,r)}):a=function(){v.call(l,r)}),t.exports=S||function(t){var n={fn:t,next:void 0};i&&(i.next=n),o||(o=n,a()),i=n}},function(t,n,e){var r=e(20),o=e(14),i=e(180);t.exports=function(t,n){if(r(t),o(n)&&n.constructor===t)return n;var e=i.f(t);return(0,e.resolve)(n),e.promise}},function(t,n,e){var r=e(65),o=function(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||void 0!==e)throw TypeError("Bad Promise constructor");n=t,e=r})),this.resolve=r(n),this.reject=r(e)};t.exports.f=function(t){return new o(t)}},function(t,n,e){var r=e(3);t.exports=function(t,n){var e=r.console;e&&e.error&&(1===arguments.length?e.error(t):e.error(t,n))}},function(t,n){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,n,e){var r=e(2),o=e(65),i=e(180),a=e(182),u=e(122);r({target:"Promise",stat:!0},{allSettled:function(t){var n=this,e=i.f(n),r=e.resolve,c=e.reject,f=a((function(){var e=o(n.resolve),i=[],a=0,c=1;u(t,(function(t){var o=a++,u=!1;i.push(void 0),c++,e.call(n,t).then((function(t){u||(u=!0,i[o]={status:"fulfilled",value:t},--c||r(i))}),(function(t){u||(u=!0,i[o]={status:"rejected",reason:t},--c||r(i))}))})),--c||r(i)}));return f.error&&c(f.value),e.promise}})},function(t,n,e){var r=e(2),o=e(29),i=e(174),a=e(6),u=e(34),c=e(175),f=e(179),s=e(21);r({target:"Promise",proto:!0,real:!0,forced:!!i&&a((function(){i.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(t){var n=c(this,u("Promise")),e="function"==typeof t;return this.then(e?function(e){return f(n,t()).then((function(){return e}))}:t,e?function(e){return f(n,t()).then((function(){throw e}))}:t)}}),o||"function"!=typeof i||i.prototype.finally||s(i.prototype,"finally",u("Promise").prototype.finally)},function(t,n,e){var r=e(5),o=e(3),i=e(44),a=e(124),u=e(19).f,c=e(36).f,f=e(186),s=e(187),l=e(188),p=e(21),h=e(6),v=e(25).set,g=e(109),d=e(49)("match"),y=o.RegExp,x=y.prototype,m=/a/g,b=/a/g,S=new y(m)!==m,E=l.UNSUPPORTED_Y;if(r&&i("RegExp",!S||E||h((function(){return b[d]=!1,y(m)!=m||y(b)==b||"/a/i"!=y(m,"i")})))){for(var w=function(t,n){var e,r=this instanceof w,o=f(t),i=void 0===n;if(!r&&o&&t.constructor===w&&i)return t;S?o&&!i&&(t=t.source):t instanceof w&&(i&&(n=s.call(t)),t=t.source),E&&(e=!!n&&n.indexOf("y")>-1)&&(n=n.replace(/y/g,""));var u=a(S?new y(t,n):y(t,n),r?this:x,w);return E&&e&&v(u,{sticky:e}),u},O=function(t){t in w||u(w,t,{configurable:!0,get:function(){return y[t]},set:function(n){y[t]=n}})},R=c(y),A=0;R.length>A;)O(R[A++]);x.constructor=w,w.prototype=x,p(o,"RegExp",w)}g("RegExp")},function(t,n,e){var r=e(14),o=e(11),i=e(49)("match");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[i])?!!n:"RegExp"==o(t))}},function(t,n,e){var r=e(20);t.exports=function(){var t=r(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.dotAll&&(n+="s"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n,e){var r=e(6);function o(t,n){return RegExp(t,n)}n.UNSUPPORTED_Y=r((function(){var t=o("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),n.BROKEN_CARET=r((function(){var t=o("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},function(t,n,e){var r=e(2),o=e(190);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},function(t,n,e){var r,o,i=e(187),a=e(188),u=RegExp.prototype.exec,c=String.prototype.replace,f=u,s=(r=/a/,o=/b*/g,u.call(r,"a"),u.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),l=a.UNSUPPORTED_Y||a.BROKEN_CARET,p=void 0!==/()??/.exec("")[1];(s||p||l)&&(f=function(t){var n,e,r,o,a=this,f=l&&a.sticky,h=i.call(a),v=a.source,g=0,d=t;return f&&(-1===(h=h.replace("y","")).indexOf("g")&&(h+="g"),d=String(t).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==t[a.lastIndex-1])&&(v="(?: "+v+")",d=" "+d,g++),e=new RegExp("^(?:"+v+")",h)),p&&(e=new RegExp("^"+v+"$(?!\\s)",h)),s&&(n=a.lastIndex),r=u.call(f?e:a,d),f?r?(r.input=r.input.slice(g),r[0]=r[0].slice(g),r.index=a.lastIndex,a.lastIndex+=r[0].length):a.lastIndex=0:s&&r&&(a.lastIndex=a.global?r.index+r[0].length:n),p&&r&&r.length>1&&c.call(r[0],e,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(r[o]=void 0)})),r}),t.exports=f},function(t,n,e){var r=e(5),o=e(19),i=e(187),a=e(188).UNSUPPORTED_Y;r&&("g"!=/./g.flags||a)&&o.f(RegExp.prototype,"flags",{configurable:!0,get:i})},function(t,n,e){var r=e(5),o=e(188).UNSUPPORTED_Y,i=e(19).f,a=e(25).get,u=RegExp.prototype;r&&o&&i(RegExp.prototype,"sticky",{configurable:!0,get:function(){if(this!==u){if(this instanceof RegExp)return!!a(this).sticky;throw TypeError("Incompatible receiver, RegExp required")}}})},function(t,n,e){e(189);var r,o,i=e(2),a=e(14),u=(r=!1,(o=/[ac]/).exec=function(){return r=!0,/./.exec.apply(this,arguments)},!0===o.test("abc")&&r),c=/./.test;i({target:"RegExp",proto:!0,forced:!u},{test:function(t){if("function"!=typeof this.exec)return c.call(this,t);var n=this.exec(t);if(null!==n&&!a(n))throw new Error("RegExp exec method returned something other than an Object or null");return!!n}})},function(t,n,e){var r=e(21),o=e(20),i=e(6),a=e(187),u=RegExp.prototype,c=u.toString,f=i((function(){return"/a/b"!=c.call({source:"a",flags:"b"})})),s="toString"!=c.name;(f||s)&&r(RegExp.prototype,"toString",(function(){var t=o(this),n=String(t.source),e=t.flags;return"/"+n+"/"+String(void 0===e&&t instanceof RegExp&&!("flags"in u)?a.call(t):e)}),{unsafe:!0})},function(t,n,e){var r=e(119),o=e(125);t.exports=r("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),o)},function(t,n,e){var r=e(2),o=e(197).codeAt;r({target:"String",proto:!0},{codePointAt:function(t){return o(this,t)}})},function(t,n,e){var r=e(40),o=e(12),i=function(t){return function(n,e){var i,a,u=String(o(n)),c=r(e),f=u.length;return c<0||c>=f?t?"":void 0:(i=u.charCodeAt(c))<55296||i>56319||c+1===f||(a=u.charCodeAt(c+1))<56320||a>57343?t?u.charAt(c):i:t?u.slice(c,c+2):a-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},function(t,n,e){var r,o=e(2),i=e(4).f,a=e(39),u=e(199),c=e(12),f=e(200),s=e(29),l="".endsWith,p=Math.min,h=f("endsWith");o({target:"String",proto:!0,forced:!!(s||h||(r=i(String.prototype,"endsWith"),!r||r.writable))&&!h},{endsWith:function(t){var n=String(c(this));u(t);var e=arguments.length>1?arguments[1]:void 0,r=a(n.length),o=void 0===e?r:p(a(e),r),i=String(t);return l?l.call(n,i,o):n.slice(o-i.length,o)===i}})},function(t,n,e){var r=e(186);t.exports=function(t){if(r(t))throw TypeError("The method doesn't accept regular expressions");return t}},function(t,n,e){var r=e(49)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{return n[r]=!1,"/./"[t](n)}catch(t){}}return!1}},function(t,n,e){var r=e(2),o=e(41),i=String.fromCharCode,a=String.fromCodePoint;r({target:"String",stat:!0,forced:!!a&&1!=a.length},{fromCodePoint:function(t){for(var n,e=[],r=arguments.length,a=0;r>a;){if(n=+arguments[a++],o(n,1114111)!==n)throw RangeError(n+" is not a valid code point");e.push(n<65536?i(n):i(55296+((n-=65536)>>10),n%1024+56320))}return e.join("")}})},function(t,n,e){var r=e(2),o=e(199),i=e(12);r({target:"String",proto:!0,forced:!e(200)("includes")},{includes:function(t){return!!~String(i(this)).indexOf(o(t),arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(197).charAt,o=e(25),i=e(90),a=o.set,u=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,n=u(this),e=n.string,o=n.index;return o>=e.length?{value:void 0,done:!0}:(t=r(e,o),n.index+=t.length,{value:t,done:!1})}))},function(t,n,e){var r=e(205),o=e(20),i=e(39),a=e(12),u=e(206),c=e(207);r("match",1,(function(t,n,e){return[function(n){var e=a(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var a=o(t),f=String(this);if(!a.global)return c(a,f);var s=a.unicode;a.lastIndex=0;for(var l,p=[],h=0;null!==(l=c(a,f));){var v=String(l[0]);p[h]=v,""===v&&(a.lastIndex=u(f,i(a.lastIndex),s)),h++}return 0===h?null:p}]}))},function(t,n,e){e(189);var r=e(21),o=e(6),i=e(49),a=e(190),u=e(18),c=i("species"),f=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")})),s="$0"==="a".replace(/./,"$0"),l=i("replace"),p=!!/./[l]&&""===/./[l]("a","$0"),h=!o((function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e="ab".split(t);return 2!==e.length||"a"!==e[0]||"b"!==e[1]}));t.exports=function(t,n,e,l){var v=i(t),g=!o((function(){var n={};return n[v]=function(){return 7},7!=""[t](n)})),d=g&&!o((function(){var n=!1,e=/a/;return"split"===t&&((e={}).constructor={},e.constructor[c]=function(){return e},e.flags="",e[v]=/./[v]),e.exec=function(){return n=!0,null},e[v](""),!n}));if(!g||!d||"replace"===t&&(!f||!s||p)||"split"===t&&!h){var y=/./[v],x=e(v,""[t],(function(t,n,e,r,o){return n.exec===a?g&&!o?{done:!0,value:y.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}}),{REPLACE_KEEPS_$0:s,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:p}),m=x[0],b=x[1];r(String.prototype,t,m),r(RegExp.prototype,v,2==n?function(t,n){return b.call(t,this,n)}:function(t){return b.call(t,this)})}l&&u(RegExp.prototype[v],"sham",!0)}},function(t,n,e){var r=e(197).charAt;t.exports=function(t,n,e){return n+(e?r(t,n).length:1)}},function(t,n,e){var r=e(11),o=e(190);t.exports=function(t,n){var e=t.exec;if("function"==typeof e){var i=e.call(t,n);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return o.call(t,n)}},function(t,n,e){var r=e(2),o=e(91),i=e(12),a=e(39),u=e(65),c=e(20),f=e(11),s=e(186),l=e(187),p=e(18),h=e(6),v=e(49),g=e(175),d=e(206),y=e(25),x=e(29),m=v("matchAll"),b=y.set,S=y.getterFor("RegExp String Iterator"),E=RegExp.prototype,w=E.exec,O="".matchAll,R=!!O&&!h((function(){"a".matchAll(/./)})),A=o((function(t,n,e,r){b(this,{type:"RegExp String Iterator",regexp:t,string:n,global:e,unicode:r,done:!1})}),"RegExp String",(function(){var t=S(this);if(t.done)return{value:void 0,done:!0};var n=t.regexp,e=t.string,r=function(t,n){var e,r=t.exec;if("function"==typeof r){if("object"!=typeof(e=r.call(t,n)))throw TypeError("Incorrect exec result");return e}return w.call(t,n)}(n,e);return null===r?{value:void 0,done:t.done=!0}:t.global?(""==String(r[0])&&(n.lastIndex=d(e,a(n.lastIndex),t.unicode)),{value:r,done:!1}):(t.done=!0,{value:r,done:!1})})),j=function(t){var n,e,r,o,i,u,f=c(this),s=String(t);return n=g(f,RegExp),void 0===(e=f.flags)&&f instanceof RegExp&&!("flags"in E)&&(e=l.call(f)),r=void 0===e?"":String(e),o=new n(n===RegExp?f.source:f,r),i=!!~r.indexOf("g"),u=!!~r.indexOf("u"),o.lastIndex=a(f.lastIndex),new A(o,s,i,u)};r({target:"String",proto:!0,forced:R},{matchAll:function(t){var n,e,r,o=i(this);if(null!=t){if(s(t)&&!~String(i("flags"in E?t.flags:l.call(t))).indexOf("g"))throw TypeError("`.matchAll` does not allow non-global regexes");if(R)return O.apply(o,arguments);if(void 0===(e=t[m])&&x&&"RegExp"==f(t)&&(e=j),null!=e)return u(e).call(t,o)}else if(R)return O.apply(o,arguments);return n=String(o),r=new RegExp(t,"g"),x?j.call(r,n):r[m](n)}}),x||m in E||p(E,m,j)},function(t,n,e){var r=e(2),o=e(210).end;r({target:"String",proto:!0,forced:e(211)},{padEnd:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(39),o=e(145),i=e(12),a=Math.ceil,u=function(t){return function(n,e,u){var c,f,s=String(i(n)),l=s.length,p=void 0===u?" ":String(u),h=r(e);return h<=l||""==p?s:(c=h-l,(f=o.call(p,a(c/p.length))).length>c&&(f=f.slice(0,c)),t?s+f:f+s)}};t.exports={start:u(!1),end:u(!0)}},function(t,n,e){var r=e(54);t.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(r)},function(t,n,e){var r=e(2),o=e(210).start;r({target:"String",proto:!0,forced:e(211)},{padStart:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(9),i=e(39);r({target:"String",stat:!0},{raw:function(t){for(var n=o(t.raw),e=i(n.length),r=arguments.length,a=[],u=0;e>u;)a.push(String(n[u++])),u<r&&a.push(String(arguments[u]));return a.join("")}})},function(t,n,e){e(2)({target:"String",proto:!0},{repeat:e(145)})},function(t,n,e){var r=e(205),o=e(20),i=e(46),a=e(39),u=e(40),c=e(12),f=e(206),s=e(207),l=Math.max,p=Math.min,h=Math.floor,v=/\$([$&'`]|\d\d?|<[^>]*>)/g,g=/\$([$&'`]|\d\d?)/g;r("replace",2,(function(t,n,e,r){var d=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,y=r.REPLACE_KEEPS_$0,x=d?"$":"$0";return[function(e,r){var o=c(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,o,r):n.call(String(o),e,r)},function(t,r){if(!d&&y||"string"==typeof r&&-1===r.indexOf(x)){var i=e(n,t,this,r);if(i.done)return i.value}var c=o(t),h=String(this),v="function"==typeof r;v||(r=String(r));var g=c.global;if(g){var b=c.unicode;c.lastIndex=0}for(var S=[];;){var E=s(c,h);if(null===E)break;if(S.push(E),!g)break;""===String(E[0])&&(c.lastIndex=f(h,a(c.lastIndex),b))}for(var w,O="",R=0,A=0;A<S.length;A++){E=S[A];for(var j=String(E[0]),I=l(p(u(E.index),h.length),0),k=[],P=1;P<E.length;P++)k.push(void 0===(w=E[P])?w:String(w));var L=E.groups;if(v){var T=[j].concat(k,I,h);void 0!==L&&T.push(L);var _=String(r.apply(void 0,T))}else _=m(j,h,I,k,L,r);I>=R&&(O+=h.slice(R,I)+_,R=I+j.length)}return O+h.slice(R)}];function m(t,e,r,o,a,u){var c=r+t.length,f=o.length,s=g;return void 0!==a&&(a=i(a),s=v),n.call(u,s,(function(n,i){var u;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,r);case"'":return e.slice(c);case"<":u=a[i.slice(1,-1)];break;default:var s=+i;if(0===s)return n;if(s>f){var l=h(s/10);return 0===l?n:l<=f?void 0===o[l-1]?i.charAt(1):o[l-1]+i.charAt(1):n}u=o[s-1]}return void 0===u?"":u}))}}))},function(t,n,e){var r=e(205),o=e(20),i=e(12),a=e(161),u=e(207);r("search",1,(function(t,n,e){return[function(n){var e=i(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var i=o(t),c=String(this),f=i.lastIndex;a(f,0)||(i.lastIndex=0);var s=u(i,c);return a(i.lastIndex,f)||(i.lastIndex=f),null===s?-1:s.index}]}))},function(t,n,e){var r=e(205),o=e(186),i=e(20),a=e(12),u=e(175),c=e(206),f=e(39),s=e(207),l=e(190),p=e(6),h=[].push,v=Math.min,g=!p((function(){return!RegExp(4294967295,"y")}));r("split",2,(function(t,n,e){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,e){var r=String(a(this)),i=void 0===e?4294967295:e>>>0;if(0===i)return[];if(void 0===t)return[r];if(!o(t))return n.call(r,t,i);for(var u,c,f,s=[],p=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),v=0,g=new RegExp(t.source,p+"g");(u=l.call(g,r))&&!((c=g.lastIndex)>v&&(s.push(r.slice(v,u.index)),u.length>1&&u.index<r.length&&h.apply(s,u.slice(1)),f=u[0].length,v=c,s.length>=i));)g.lastIndex===u.index&&g.lastIndex++;return v===r.length?!f&&g.test("")||s.push(""):s.push(r.slice(v)),s.length>i?s.slice(0,i):s}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var o=a(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,o,e):r.call(String(o),n,e)},function(t,o){var a=e(r,t,this,o,r!==n);if(a.done)return a.value;var l=i(t),p=String(this),h=u(l,RegExp),d=l.unicode,y=(l.ignoreCase?"i":"")+(l.multiline?"m":"")+(l.unicode?"u":"")+(g?"y":"g"),x=new h(g?l:"^(?:"+l.source+")",y),m=void 0===o?4294967295:o>>>0;if(0===m)return[];if(0===p.length)return null===s(x,p)?[p]:[];for(var b=0,S=0,E=[];S<p.length;){x.lastIndex=g?S:0;var w,O=s(x,g?p:p.slice(S));if(null===O||(w=v(f(x.lastIndex+(g?0:S)),p.length))===b)S=c(p,S,d);else{if(E.push(p.slice(b,S)),E.length===m)return E;for(var R=1;R<=O.length-1;R++)if(E.push(O[R]),E.length===m)return E;S=b=w}}return E.push(p.slice(b)),E}]}),!g)},function(t,n,e){var r,o=e(2),i=e(4).f,a=e(39),u=e(199),c=e(12),f=e(200),s=e(29),l="".startsWith,p=Math.min,h=f("startsWith");o({target:"String",proto:!0,forced:!!(s||h||(r=i(String.prototype,"startsWith"),!r||r.writable))&&!h},{startsWith:function(t){var n=String(c(this));u(t);var e=a(p(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return l?l.call(n,r,e):n.slice(e,e+r.length)===r}})},function(t,n,e){var r=e(2),o=e(128).trim;r({target:"String",proto:!0,forced:e(220)("trim")},{trim:function(){return o(this)}})},function(t,n,e){var r=e(6),o=e(129);t.exports=function(t){return r((function(){return!!o[t]()||"​…᠎"!="​…᠎"[t]()||o[t].name!==t}))}},function(t,n,e){var r=e(2),o=e(128).end,i=e(220)("trimEnd"),a=i?function(){return o(this)}:"".trimEnd;r({target:"String",proto:!0,forced:i},{trimEnd:a,trimRight:a})},function(t,n,e){var r=e(2),o=e(128).start,i=e(220)("trimStart"),a=i?function(){return o(this)}:"".trimStart;r({target:"String",proto:!0,forced:i},{trimStart:a,trimLeft:a})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("anchor")},{anchor:function(t){return o(this,"a","name",t)}})},function(t,n,e){var r=e(12),o=/"/g;t.exports=function(t,n,e,i){var a=String(r(t)),u="<"+n;return""!==e&&(u+=" "+e+'="'+String(i).replace(o,""")+'"'),u+">"+a+"</"+n+">"}},function(t,n,e){var r=e(6);t.exports=function(t){return r((function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}))}},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("big")},{big:function(){return o(this,"big","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("blink")},{blink:function(){return o(this,"blink","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("bold")},{bold:function(){return o(this,"b","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fixed")},{fixed:function(){return o(this,"tt","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fontcolor")},{fontcolor:function(t){return o(this,"font","color",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fontsize")},{fontsize:function(t){return o(this,"font","size",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("italics")},{italics:function(){return o(this,"i","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("link")},{link:function(t){return o(this,"a","href",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("small")},{small:function(){return o(this,"small","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("strike")},{strike:function(){return o(this,"strike","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("sub")},{sub:function(){return o(this,"sub","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("sup")},{sup:function(){return o(this,"sup","","")}})},function(t,n,e){var r,o=e(3),i=e(126),a=e(120),u=e(119),c=e(239),f=e(14),s=e(25).enforce,l=e(26),p=!o.ActiveXObject&&"ActiveXObject"in o,h=Object.isExtensible,v=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},g=t.exports=u("WeakMap",v,c);if(l&&p){r=c.getConstructor(v,"WeakMap",!0),a.REQUIRED=!0;var d=g.prototype,y=d.delete,x=d.has,m=d.get,b=d.set;i(d,{delete:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),y.call(this,t)||n.frozen.delete(t)}return y.call(this,t)},has:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),x.call(this,t)||n.frozen.has(t)}return x.call(this,t)},get:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),x.call(this,t)?m.call(this,t):n.frozen.get(t)}return m.call(this,t)},set:function(t,n){if(f(t)&&!h(t)){var e=s(this);e.frozen||(e.frozen=new r),x.call(this,t)?b.call(this,t,n):e.frozen.set(t,n)}else b.call(this,t,n);return this}})}},function(t,n,e){var r=e(126),o=e(120).getWeakData,i=e(20),a=e(14),u=e(123),c=e(122),f=e(63),s=e(15),l=e(25),p=l.set,h=l.getterFor,v=f.find,g=f.findIndex,d=0,y=function(t){return t.frozen||(t.frozen=new x)},x=function(){this.entries=[]},m=function(t,n){return v(t.entries,(function(t){return t[0]===n}))};x.prototype={get:function(t){var n=m(this,t);if(n)return n[1]},has:function(t){return!!m(this,t)},set:function(t,n){var e=m(this,t);e?e[1]=n:this.entries.push([t,n])},delete:function(t){var n=g(this.entries,(function(n){return n[0]===t}));return~n&&this.entries.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,f){var l=t((function(t,r){u(t,l,n),p(t,{type:n,id:d++,frozen:void 0}),null!=r&&c(r,t[f],t,e)})),v=h(n),g=function(t,n,e){var r=v(t),a=o(i(n),!0);return!0===a?y(r).set(n,e):a[r.id]=e,t};return r(l.prototype,{delete:function(t){var n=v(this);if(!a(t))return!1;var e=o(t);return!0===e?y(n).delete(t):e&&s(e,n.id)&&delete e[n.id]},has:function(t){var n=v(this);if(!a(t))return!1;var e=o(t);return!0===e?y(n).has(t):e&&s(e,n.id)}}),r(l.prototype,e?{get:function(t){var n=v(this);if(a(t)){var e=o(t);return!0===e?y(n).get(t):e?e[n.id]:void 0}},set:function(t,n){return g(this,t,n)}}:{add:function(t){return g(this,t,!0)}}),l}}},function(t,n,e){e(119)("WeakSet",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e(239))},function(t,n,e){var r=e(3),o=e(242),i=e(77),a=e(18);for(var u in o){var c=r[u],f=c&&c.prototype;if(f&&f.forEach!==i)try{a(f,"forEach",i)}catch(t){f.forEach=i}}},function(t,n){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,n,e){e(203);var r,o=e(2),i=e(5),a=e(244),u=e(3),c=e(59),f=e(21),s=e(123),l=e(15),p=e(147),h=e(79),v=e(197).codeAt,g=e(245),d=e(95),y=e(246),x=e(25),m=u.URL,b=y.URLSearchParams,S=y.getState,E=x.set,w=x.getterFor("URL"),O=Math.floor,R=Math.pow,A=/[A-Za-z]/,j=/[\d+-.A-Za-z]/,I=/\d/,k=/^(0x|0X)/,P=/^[0-7]+$/,L=/^\d+$/,T=/^[\dA-Fa-f]+$/,_=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,C=/[\u0009\u000A\u000D]/g,F=function(t,n){var e,r,o;if("["==n.charAt(0)){if("]"!=n.charAt(n.length-1))return"Invalid host";if(!(e=z(n.slice(1,-1))))return"Invalid host";t.host=e}else if(X(t)){if(n=g(n),_.test(n))return"Invalid host";if(null===(e=M(n)))return"Invalid host";t.host=e}else{if(U.test(n))return"Invalid host";for(e="",r=h(n),o=0;o<r.length;o++)e+=G(r[o],q);t.host=e}},M=function(t){var n,e,r,o,i,a,u,c=t.split(".");if(c.length&&""==c[c.length-1]&&c.pop(),(n=c.length)>4)return t;for(e=[],r=0;r<n;r++){if(""==(o=c[r]))return t;if(i=10,o.length>1&&"0"==o.charAt(0)&&(i=k.test(o)?16:8,o=o.slice(8==i?1:2)),""===o)a=0;else{if(!(10==i?L:8==i?P:T).test(o))return t;a=parseInt(o,i)}e.push(a)}for(r=0;r<n;r++)if(a=e[r],r==n-1){if(a>=R(256,5-n))return null}else if(a>255)return null;for(u=e.pop(),r=0;r<e.length;r++)u+=e[r]*R(256,3-r);return u},z=function(t){var n,e,r,o,i,a,u,c=[0,0,0,0,0,0,0,0],f=0,s=null,l=0,p=function(){return t.charAt(l)};if(":"==p()){if(":"!=t.charAt(1))return;l+=2,s=++f}for(;p();){if(8==f)return;if(":"!=p()){for(n=e=0;e<4&&T.test(p());)n=16*n+parseInt(p(),16),l++,e++;if("."==p()){if(0==e)return;if(l-=e,f>6)return;for(r=0;p();){if(o=null,r>0){if(!("."==p()&&r<4))return;l++}if(!I.test(p()))return;for(;I.test(p());){if(i=parseInt(p(),10),null===o)o=i;else{if(0==o)return;o=10*o+i}if(o>255)return;l++}c[f]=256*c[f]+o,2!=++r&&4!=r||f++}if(4!=r)return;break}if(":"==p()){if(l++,!p())return}else if(p())return;c[f++]=n}else{if(null!==s)return;l++,s=++f}}if(null!==s)for(a=f-s,f=7;0!=f&&a>0;)u=c[f],c[f--]=c[s+a-1],c[s+--a]=u;else if(8!=f)return;return c},D=function(t){var n,e,r,o;if("number"==typeof t){for(n=[],e=0;e<4;e++)n.unshift(t%256),t=O(t/256);return n.join(".")}if("object"==typeof t){for(n="",r=function(t){for(var n=null,e=1,r=null,o=0,i=0;i<8;i++)0!==t[i]?(o>e&&(n=r,e=o),r=null,o=0):(null===r&&(r=i),++o);return o>e&&(n=r,e=o),n}(t),e=0;e<8;e++)o&&0===t[e]||(o&&(o=!1),r===e?(n+=e?":":"::",o=!0):(n+=t[e].toString(16),e<7&&(n+=":")));return"["+n+"]"}return t},q={},B=p({},q,{" ":1,'"':1,"<":1,">":1,"`":1}),W=p({},B,{"#":1,"?":1,"{":1,"}":1}),$=p({},W,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,n){var e=v(t,0);return e>32&&e<127&&!l(n,t)?t:encodeURIComponent(t)},V={ftp:21,file:null,http:80,https:443,ws:80,wss:443},X=function(t){return l(V,t.scheme)},Y=function(t){return""!=t.username||""!=t.password},K=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},J=function(t,n){var e;return 2==t.length&&A.test(t.charAt(0))&&(":"==(e=t.charAt(1))||!n&&"|"==e)},H=function(t){var n;return t.length>1&&J(t.slice(0,2))&&(2==t.length||"/"===(n=t.charAt(2))||"\\"===n||"?"===n||"#"===n)},Q=function(t){var n=t.path,e=n.length;!e||"file"==t.scheme&&1==e&&J(n[0],!0)||n.pop()},Z=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},nt={},et={},rt={},ot={},it={},at={},ut={},ct={},ft={},st={},lt={},pt={},ht={},vt={},gt={},dt={},yt={},xt={},mt={},bt={},St=function(t,n,e,o){var i,a,u,c,f,s=e||tt,p=0,v="",g=!1,d=!1,y=!1;for(e||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,n=n.replace(N,"")),n=n.replace(C,""),i=h(n);p<=i.length;){switch(a=i[p],s){case tt:if(!a||!A.test(a)){if(e)return"Invalid scheme";s=et;continue}v+=a.toLowerCase(),s=nt;break;case nt:if(a&&(j.test(a)||"+"==a||"-"==a||"."==a))v+=a.toLowerCase();else{if(":"!=a){if(e)return"Invalid scheme";v="",s=et,p=0;continue}if(e&&(X(t)!=l(V,v)||"file"==v&&(Y(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=v,e)return void(X(t)&&V[t.scheme]==t.port&&(t.port=null));v="","file"==t.scheme?s=ht:X(t)&&o&&o.scheme==t.scheme?s=rt:X(t)?s=ut:"/"==i[p+1]?(s=ot,p++):(t.cannotBeABaseURL=!0,t.path.push(""),s=xt)}break;case et:if(!o||o.cannotBeABaseURL&&"#"!=a)return"Invalid scheme";if(o.cannotBeABaseURL&&"#"==a){t.scheme=o.scheme,t.path=o.path.slice(),t.query=o.query,t.fragment="",t.cannotBeABaseURL=!0,s=bt;break}s="file"==o.scheme?ht:it;continue;case rt:if("/"!=a||"/"!=i[p+1]){s=it;continue}s=ct,p++;break;case ot:if("/"==a){s=ft;break}s=yt;continue;case it:if(t.scheme=o.scheme,a==r)t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query=o.query;else if("/"==a||"\\"==a&&X(t))s=at;else if("?"==a)t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query="",s=mt;else{if("#"!=a){t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.path.pop(),s=yt;continue}t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query=o.query,t.fragment="",s=bt}break;case at:if(!X(t)||"/"!=a&&"\\"!=a){if("/"!=a){t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,s=yt;continue}s=ft}else s=ct;break;case ut:if(s=ct,"/"!=a||"/"!=v.charAt(p+1))continue;p++;break;case ct:if("/"!=a&&"\\"!=a){s=ft;continue}break;case ft:if("@"==a){g&&(v="%40"+v),g=!0,u=h(v);for(var x=0;x<u.length;x++){var m=u[x];if(":"!=m||y){var b=G(m,$);y?t.password+=b:t.username+=b}else y=!0}v=""}else if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)){if(g&&""==v)return"Invalid authority";p-=h(v).length+1,v="",s=st}else v+=a;break;case st:case lt:if(e&&"file"==t.scheme){s=gt;continue}if(":"!=a||d){if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)){if(X(t)&&""==v)return"Invalid host";if(e&&""==v&&(Y(t)||null!==t.port))return;if(c=F(t,v))return c;if(v="",s=dt,e)return;continue}"["==a?d=!0:"]"==a&&(d=!1),v+=a}else{if(""==v)return"Invalid host";if(c=F(t,v))return c;if(v="",s=pt,e==lt)return}break;case pt:if(!I.test(a)){if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)||e){if(""!=v){var S=parseInt(v,10);if(S>65535)return"Invalid port";t.port=X(t)&&S===V[t.scheme]?null:S,v=""}if(e)return;s=dt;continue}return"Invalid port"}v+=a;break;case ht:if(t.scheme="file","/"==a||"\\"==a)s=vt;else{if(!o||"file"!=o.scheme){s=yt;continue}if(a==r)t.host=o.host,t.path=o.path.slice(),t.query=o.query;else if("?"==a)t.host=o.host,t.path=o.path.slice(),t.query="",s=mt;else{if("#"!=a){H(i.slice(p).join(""))||(t.host=o.host,t.path=o.path.slice(),Q(t)),s=yt;continue}t.host=o.host,t.path=o.path.slice(),t.query=o.query,t.fragment="",s=bt}}break;case vt:if("/"==a||"\\"==a){s=gt;break}o&&"file"==o.scheme&&!H(i.slice(p).join(""))&&(J(o.path[0],!0)?t.path.push(o.path[0]):t.host=o.host),s=yt;continue;case gt:if(a==r||"/"==a||"\\"==a||"?"==a||"#"==a){if(!e&&J(v))s=yt;else if(""==v){if(t.host="",e)return;s=dt}else{if(c=F(t,v))return c;if("localhost"==t.host&&(t.host=""),e)return;v="",s=dt}continue}v+=a;break;case dt:if(X(t)){if(s=yt,"/"!=a&&"\\"!=a)continue}else if(e||"?"!=a)if(e||"#"!=a){if(a!=r&&(s=yt,"/"!=a))continue}else t.fragment="",s=bt;else t.query="",s=mt;break;case yt:if(a==r||"/"==a||"\\"==a&&X(t)||!e&&("?"==a||"#"==a)){if(".."===(f=(f=v).toLowerCase())||"%2e."===f||".%2e"===f||"%2e%2e"===f?(Q(t),"/"==a||"\\"==a&&X(t)||t.path.push("")):Z(v)?"/"==a||"\\"==a&&X(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&J(v)&&(t.host&&(t.host=""),v=v.charAt(0)+":"),t.path.push(v)),v="","file"==t.scheme&&(a==r||"?"==a||"#"==a))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==a?(t.query="",s=mt):"#"==a&&(t.fragment="",s=bt)}else v+=G(a,W);break;case xt:"?"==a?(t.query="",s=mt):"#"==a?(t.fragment="",s=bt):a!=r&&(t.path[0]+=G(a,q));break;case mt:e||"#"!=a?a!=r&&("'"==a&&X(t)?t.query+="%27":t.query+="#"==a?"%23":G(a,q)):(t.fragment="",s=bt);break;case bt:a!=r&&(t.fragment+=G(a,B))}p++}},Et=function(t){var n,e,r=s(this,Et,"URL"),o=arguments.length>1?arguments[1]:void 0,a=String(t),u=E(r,{type:"URL"});if(void 0!==o)if(o instanceof Et)n=w(o);else if(e=St(n={},String(o)))throw TypeError(e);if(e=St(u,a,null,n))throw TypeError(e);var c=u.searchParams=new b,f=S(c);f.updateSearchParams(u.query),f.updateURL=function(){u.query=String(c)||null},i||(r.href=Ot.call(r),r.origin=Rt.call(r),r.protocol=At.call(r),r.username=jt.call(r),r.password=It.call(r),r.host=kt.call(r),r.hostname=Pt.call(r),r.port=Lt.call(r),r.pathname=Tt.call(r),r.search=_t.call(r),r.searchParams=Ut.call(r),r.hash=Nt.call(r))},wt=Et.prototype,Ot=function(){var t=w(this),n=t.scheme,e=t.username,r=t.password,o=t.host,i=t.port,a=t.path,u=t.query,c=t.fragment,f=n+":";return null!==o?(f+="//",Y(t)&&(f+=e+(r?":"+r:"")+"@"),f+=D(o),null!==i&&(f+=":"+i)):"file"==n&&(f+="//"),f+=t.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==u&&(f+="?"+u),null!==c&&(f+="#"+c),f},Rt=function(){var t=w(this),n=t.scheme,e=t.port;if("blob"==n)try{return new URL(n.path[0]).origin}catch(t){return"null"}return"file"!=n&&X(t)?n+"://"+D(t.host)+(null!==e?":"+e:""):"null"},At=function(){return w(this).scheme+":"},jt=function(){return w(this).username},It=function(){return w(this).password},kt=function(){var t=w(this),n=t.host,e=t.port;return null===n?"":null===e?D(n):D(n)+":"+e},Pt=function(){var t=w(this).host;return null===t?"":D(t)},Lt=function(){var t=w(this).port;return null===t?"":String(t)},Tt=function(){var t=w(this),n=t.path;return t.cannotBeABaseURL?n[0]:n.length?"/"+n.join("/"):""},_t=function(){var t=w(this).query;return t?"?"+t:""},Ut=function(){return w(this).searchParams},Nt=function(){var t=w(this).fragment;return t?"#"+t:""},Ct=function(t,n){return{get:t,set:n,configurable:!0,enumerable:!0}};if(i&&c(wt,{href:Ct(Ot,(function(t){var n=w(this),e=String(t),r=St(n,e);if(r)throw TypeError(r);S(n.searchParams).updateSearchParams(n.query)})),origin:Ct(Rt),protocol:Ct(At,(function(t){var n=w(this);St(n,String(t)+":",tt)})),username:Ct(jt,(function(t){var n=w(this),e=h(String(t));if(!K(n)){n.username="";for(var r=0;r<e.length;r++)n.username+=G(e[r],$)}})),password:Ct(It,(function(t){var n=w(this),e=h(String(t));if(!K(n)){n.password="";for(var r=0;r<e.length;r++)n.password+=G(e[r],$)}})),host:Ct(kt,(function(t){var n=w(this);n.cannotBeABaseURL||St(n,String(t),st)})),hostname:Ct(Pt,(function(t){var n=w(this);n.cannotBeABaseURL||St(n,String(t),lt)})),port:Ct(Lt,(function(t){var n=w(this);K(n)||(""==(t=String(t))?n.port=null:St(n,t,pt))})),pathname:Ct(Tt,(function(t){var n=w(this);n.cannotBeABaseURL||(n.path=[],St(n,t+"",dt))})),search:Ct(_t,(function(t){var n=w(this);""==(t=String(t))?n.query=null:("?"==t.charAt(0)&&(t=t.slice(1)),n.query="",St(n,t,mt)),S(n.searchParams).updateSearchParams(n.query)})),searchParams:Ct(Ut),hash:Ct(Nt,(function(t){var n=w(this);""!=(t=String(t))?("#"==t.charAt(0)&&(t=t.slice(1)),n.fragment="",St(n,t,bt)):n.fragment=null}))}),f(wt,"toJSON",(function(){return Ot.call(this)}),{enumerable:!0}),f(wt,"toString",(function(){return Ot.call(this)}),{enumerable:!0}),m){var Ft=m.createObjectURL,Mt=m.revokeObjectURL;Ft&&f(Et,"createObjectURL",(function(t){return Ft.apply(m,arguments)})),Mt&&f(Et,"revokeObjectURL",(function(t){return Mt.apply(m,arguments)}))}d(Et,"URL"),o({global:!0,forced:!a,sham:!i},{URL:Et})},function(t,n,e){var r=e(6),o=e(49),i=e(29),a=o("iterator");t.exports=!r((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),n=t.searchParams,e="";return t.pathname="c%20d",n.forEach((function(t,r){n.delete("b"),e+=r+t})),i&&!t.toJSON||!n.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==n.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!n[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==e||"x"!==new URL("http://x",void 0).host}))},function(t,n,e){var r=/[^\0-\u007E]/,o=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",a=Math.floor,u=String.fromCharCode,c=function(t){return t+22+75*(t<26)},f=function(t,n,e){var r=0;for(t=e?a(t/700):t>>1,t+=a(t/n);t>455;r+=36)t=a(t/35);return a(r+36*t/(t+38))},s=function(t){var n,e,r=[],o=(t=function(t){for(var n=[],e=0,r=t.length;e<r;){var o=t.charCodeAt(e++);if(o>=55296&&o<=56319&&e<r){var i=t.charCodeAt(e++);56320==(64512&i)?n.push(((1023&o)<<10)+(1023&i)+65536):(n.push(o),e--)}else n.push(o)}return n}(t)).length,s=128,l=0,p=72;for(n=0;n<t.length;n++)(e=t[n])<128&&r.push(u(e));var h=r.length,v=h;for(h&&r.push("-");v<o;){var g=2147483647;for(n=0;n<t.length;n++)(e=t[n])>=s&&e<g&&(g=e);var d=v+1;if(g-s>a((2147483647-l)/d))throw RangeError(i);for(l+=(g-s)*d,s=g,n=0;n<t.length;n++){if((e=t[n])<s&&++l>2147483647)throw RangeError(i);if(e==s){for(var y=l,x=36;;x+=36){var m=x<=p?1:x>=p+26?26:x-p;if(y<m)break;var b=y-m,S=36-m;r.push(u(c(m+b%S))),y=a(b/S)}r.push(u(c(y))),p=f(l,d,v==h),l=0,++v}}++l,++s}return r.join("")};t.exports=function(t){var n,e,i=[],a=t.toLowerCase().replace(o,".").split(".");for(n=0;n<a.length;n++)e=a[n],i.push(r.test(e)?"xn--"+s(e):e);return i.join(".")}},function(t,n,e){e(89);var r=e(2),o=e(34),i=e(244),a=e(21),u=e(126),c=e(95),f=e(91),s=e(25),l=e(123),p=e(15),h=e(64),v=e(84),g=e(20),d=e(14),y=e(58),x=e(8),m=e(247),b=e(83),S=e(49),E=o("fetch"),w=o("Headers"),O=S("iterator"),R=s.set,A=s.getterFor("URLSearchParams"),j=s.getterFor("URLSearchParamsIterator"),I=/\+/g,k=Array(4),P=function(t){return k[t-1]||(k[t-1]=RegExp("((?:%[\\da-f]{2}){"+t+"})","gi"))},L=function(t){try{return decodeURIComponent(t)}catch(n){return t}},T=function(t){var n=t.replace(I," "),e=4;try{return decodeURIComponent(n)}catch(t){for(;e;)n=n.replace(P(e--),L);return n}},_=/[!'()~]|%20/g,U={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},N=function(t){return U[t]},C=function(t){return encodeURIComponent(t).replace(_,N)},F=function(t,n){if(n)for(var e,r,o=n.split("&"),i=0;i<o.length;)(e=o[i++]).length&&(r=e.split("="),t.push({key:T(r.shift()),value:T(r.join("="))}))},M=function(t){this.entries.length=0,F(this.entries,t)},z=function(t,n){if(t<n)throw TypeError("Not enough arguments")},D=f((function(t,n){R(this,{type:"URLSearchParamsIterator",iterator:m(A(t).entries),kind:n})}),"Iterator",(function(){var t=j(this),n=t.kind,e=t.iterator.next(),r=e.value;return e.done||(e.value="keys"===n?r.key:"values"===n?r.value:[r.key,r.value]),e})),q=function(){l(this,q,"URLSearchParams");var t,n,e,r,o,i,a,u,c,f=arguments.length>0?arguments[0]:void 0,s=this,h=[];if(R(s,{type:"URLSearchParams",entries:h,updateURL:function(){},updateSearchParams:M}),void 0!==f)if(d(f))if("function"==typeof(t=b(f)))for(e=(n=t.call(f)).next;!(r=e.call(n)).done;){if((a=(i=(o=m(g(r.value))).next).call(o)).done||(u=i.call(o)).done||!i.call(o).done)throw TypeError("Expected sequence with length 2");h.push({key:a.value+"",value:u.value+""})}else for(c in f)p(f,c)&&h.push({key:c,value:f[c]+""});else F(h,"string"==typeof f?"?"===f.charAt(0)?f.slice(1):f:f+"")},B=q.prototype;u(B,{append:function(t,n){z(arguments.length,2);var e=A(this);e.entries.push({key:t+"",value:n+""}),e.updateURL()},delete:function(t){z(arguments.length,1);for(var n=A(this),e=n.entries,r=t+"",o=0;o<e.length;)e[o].key===r?e.splice(o,1):o++;n.updateURL()},get:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=0;r<n.length;r++)if(n[r].key===e)return n[r].value;return null},getAll:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=[],o=0;o<n.length;o++)n[o].key===e&&r.push(n[o].value);return r},has:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=0;r<n.length;)if(n[r++].key===e)return!0;return!1},set:function(t,n){z(arguments.length,1);for(var e,r=A(this),o=r.entries,i=!1,a=t+"",u=n+"",c=0;c<o.length;c++)(e=o[c]).key===a&&(i?o.splice(c--,1):(i=!0,e.value=u));i||o.push({key:a,value:u}),r.updateURL()},sort:function(){var t,n,e,r=A(this),o=r.entries,i=o.slice();for(o.length=0,e=0;e<i.length;e++){for(t=i[e],n=0;n<e;n++)if(o[n].key>t.key){o.splice(n,0,t);break}n===e&&o.push(t)}r.updateURL()},forEach:function(t){for(var n,e=A(this).entries,r=h(t,arguments.length>1?arguments[1]:void 0,3),o=0;o<e.length;)r((n=e[o++]).value,n.key,this)},keys:function(){return new D(this,"keys")},values:function(){return new D(this,"values")},entries:function(){return new D(this,"entries")}},{enumerable:!0}),a(B,O,B.entries),a(B,"toString",(function(){for(var t,n=A(this).entries,e=[],r=0;r<n.length;)t=n[r++],e.push(C(t.key)+"="+C(t.value));return e.join("&")}),{enumerable:!0}),c(q,"URLSearchParams"),r({global:!0,forced:!i},{URLSearchParams:q}),i||"function"!=typeof E||"function"!=typeof w||r({global:!0,enumerable:!0,forced:!0},{fetch:function(t){var n,e,r,o=[t];return arguments.length>1&&(n=arguments[1],d(n)&&(e=n.body,"URLSearchParams"===v(e)&&((r=n.headers?new w(n.headers):new w).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),n=y(n,{body:x(0,String(e)),headers:x(0,r)}))),o.push(n)),E.apply(this,o)}}),t.exports={URLSearchParams:q,getState:A}},function(t,n,e){var r=e(20),o=e(83);t.exports=function(t){var n=o(t);if("function"!=typeof n)throw TypeError(String(t)+" is not iterable");return r(n.call(t))}},function(t,n,e){e(2)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})}])}(); + +//!fetch 3.0.0, global "this" must be replaced with "window" +// IIFE version +!function(t){"use strict";var e="URLSearchParams"in self,r="Symbol"in self&&"iterator"in Symbol,o="FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(t){return!1}}(),n="FormData"in self,i="ArrayBuffer"in self;if(i)var s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],a=ArrayBuffer.isView||function(t){return t&&s.indexOf(Object.prototype.toString.call(t))>-1};function h(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function u(t){return"string"!=typeof t&&(t=String(t)),t}function f(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return r&&(e[Symbol.iterator]=function(){return e}),e}function d(t){this.map={},t instanceof d?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function c(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function p(t){return new Promise((function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}}))}function y(t){var e=new FileReader,r=p(e);return e.readAsArrayBuffer(t),r}function l(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:n&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():i&&o&&((r=t)&&DataView.prototype.isPrototypeOf(r))?(this._bodyArrayBuffer=l(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(t)||a(t))?this._bodyArrayBuffer=l(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=c(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?c(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(y)}),this.text=function(){var t,e,r,o=c(this);if(o)return o;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,r=p(e),e.readAsText(t),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),o=0;o<e.length;o++)r[o]=String.fromCharCode(e[o]);return r.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},n&&(this.formData=function(){return this.text().then(v)}),this.json=function(){return this.text().then(JSON.parse)},this}d.prototype.append=function(t,e){t=h(t),e=u(e);var r=this.map[t];this.map[t]=r?r+", "+e:e},d.prototype.delete=function(t){delete this.map[h(t)]},d.prototype.get=function(t){return t=h(t),this.has(t)?this.map[t]:null},d.prototype.has=function(t){return this.map.hasOwnProperty(h(t))},d.prototype.set=function(t,e){this.map[h(t)]=u(e)},d.prototype.forEach=function(t,e){for(var r in this.map)this.map.hasOwnProperty(r)&&t.call(e,this.map[r],r,this)},d.prototype.keys=function(){var t=[];return this.forEach((function(e,r){t.push(r)})),f(t)},d.prototype.values=function(){var t=[];return this.forEach((function(e){t.push(e)})),f(t)},d.prototype.entries=function(){var t=[];return this.forEach((function(e,r){t.push([r,e])})),f(t)},r&&(d.prototype[Symbol.iterator]=d.prototype.entries);var m=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function w(t,e){var r,o,n=(e=e||{}).body;if(t instanceof w){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new d(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,n||null==t._bodyInit||(n=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"same-origin",!e.headers&&this.headers||(this.headers=new d(e.headers)),this.method=(r=e.method||this.method||"GET",o=r.toUpperCase(),m.indexOf(o)>-1?o:r),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function v(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var r=t.split("="),o=r.shift().replace(/\+/g," "),n=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(o),decodeURIComponent(n))}})),e}function E(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new d(e.headers),this.url=e.url||"",this._initBody(t)}w.prototype.clone=function(){return new w(this,{body:this._bodyInit})},b.call(w.prototype),b.call(E.prototype),E.prototype.clone=function(){return new E(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new d(this.headers),url:this.url})},E.error=function(){var t=new E(null,{status:0,statusText:""});return t.type="error",t};var A=[301,302,303,307,308];E.redirect=function(t,e){if(-1===A.indexOf(e))throw new RangeError("Invalid status code");return new E(null,{status:e,headers:{location:t}})},t.DOMException=self.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function _(e,r){return new Promise((function(n,i){var s=new w(e,r);if(s.signal&&s.signal.aborted)return i(new t.DOMException("Aborted","AbortError"));var a=new XMLHttpRequest;function h(){a.abort()}a.onload=function(){var t,e,r={status:a.status,statusText:a.statusText,headers:(t=a.getAllResponseHeaders()||"",e=new d,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(t){var r=t.split(":"),o=r.shift().trim();if(o){var n=r.join(":").trim();e.append(o,n)}})),e)};r.url="responseURL"in a?a.responseURL:r.headers.get("X-Request-URL");var o="response"in a?a.response:a.responseText;n(new E(o,r))},a.onerror=function(){i(new TypeError("Network request failed"))},a.ontimeout=function(){i(new TypeError("Network request failed"))},a.onabort=function(){i(new t.DOMException("Aborted","AbortError"))},a.open(s.method,s.url,!0),"include"===s.credentials?a.withCredentials=!0:"omit"===s.credentials&&(a.withCredentials=!1),"responseType"in a&&o&&(a.responseType="blob"),s.headers.forEach((function(t,e){a.setRequestHeader(e,t)})),s.signal&&(s.signal.addEventListener("abort",h),a.onreadystatechange=function(){4===a.readyState&&s.signal.removeEventListener("abort",h)}),a.send(void 0===s._bodyInit?null:s._bodyInit)}))}_.polyfill=!0,self.fetch||(self.fetch=_,self.Headers=d,self.Request=w,self.Response=E),t.Headers=d,t.Request=w,t.Response=E,t.fetch=_}({}); + +(function(){ + /* + Copyright (c) 2016 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ + 'use strict';var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function g(a){var b=aa.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function l(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))} + function n(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null} + function p(a,b,d){d=void 0===d?new Set:d;for(var c=a;c;){if(c.nodeType===Node.ELEMENT_NODE){var e=c;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){c=e.import;if(c instanceof Node&&!d.has(c))for(d.add(c),c=c.firstChild;c;c=c.nextSibling)p(c,b,d);c=n(a,e);continue}else if("template"===f){c=n(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)p(e,b,d)}c=c.firstChild?c.firstChild:n(a,c)}}function r(a,b,d){a[b]=d};function u(){this.a=new Map;this.g=new Map;this.c=[];this.f=[];this.b=!1}function ba(a,b,d){a.a.set(b,d);a.g.set(d.constructorFunction,d)}function ca(a,b){a.b=!0;a.c.push(b)}function da(a,b){a.b=!0;a.f.push(b)}function v(a,b){a.b&&p(b,function(b){return w(a,b)})}function w(a,b){if(a.b&&!b.__CE_patched){b.__CE_patched=!0;for(var d=0;d<a.c.length;d++)a.c[d](b);for(d=0;d<a.f.length;d++)a.f[d](b)}} + function x(a,b){var d=[];p(b,function(b){return d.push(b)});for(b=0;b<d.length;b++){var c=d[b];1===c.__CE_state?a.connectedCallback(c):y(a,c)}}function z(a,b){var d=[];p(b,function(b){return d.push(b)});for(b=0;b<d.length;b++){var c=d[b];1===c.__CE_state&&a.disconnectedCallback(c)}} + function A(a,b,d){d=void 0===d?{}:d;var c=d.u||new Set,e=d.i||function(b){return y(a,b)},f=[];p(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var d=b.import;d instanceof Node&&(d.__CE_isImportDocument=!0,d.__CE_hasRegistry=!0);d&&"complete"===d.readyState?d.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var d=b.import;if(!d.__CE_documentLoadHandled){d.__CE_documentLoadHandled=!0;var f=new Set(c);f.delete(d);A(a,d,{u:f,i:e})}})}else f.push(b)},c);if(a.b)for(b= + 0;b<f.length;b++)w(a,f[b]);for(b=0;b<f.length;b++)e(f[b])} + function y(a,b){if(void 0===b.__CE_state){var d=b.ownerDocument;if(d.defaultView||d.__CE_isImportDocument&&d.__CE_hasRegistry)if(d=a.a.get(b.localName)){d.constructionStack.push(b);var c=d.constructorFunction;try{try{if(new c!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{d.constructionStack.pop()}}catch(t){throw b.__CE_state=2,t;}b.__CE_state=1;b.__CE_definition=d;if(d.attributeChangedCallback)for(d=d.observedAttributes,c=0;c<d.length;c++){var e= + d[c],f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}l(b)&&a.connectedCallback(b)}}}u.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};u.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)}; + u.prototype.attributeChangedCallback=function(a,b,d,c,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,d,c,e)};function B(a){var b=document;this.c=a;this.a=b;this.b=void 0;A(this.c,this.a);"loading"===this.a.readyState&&(this.b=new MutationObserver(this.f.bind(this)),this.b.observe(this.a,{childList:!0,subtree:!0}))}function C(a){a.b&&a.b.disconnect()}B.prototype.f=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||C(this);for(b=0;b<a.length;b++)for(var d=a[b].addedNodes,c=0;c<d.length;c++)A(this.c,d[c])};function ea(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}function D(a){if(a.a)throw Error("Already resolved.");a.a=void 0;a.b&&a.b(void 0)};function E(a){this.c=!1;this.a=a;this.j=new Map;this.f=function(b){return b()};this.b=!1;this.g=[];this.o=new B(a)} + E.prototype.l=function(a,b){var d=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!g(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.a.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.c)throw Error("A custom element is already being defined.");this.c=!0;try{var c=function(b){var a=e[b];if(void 0!==a&&!(a instanceof Function))throw Error("The '"+b+"' callback must be a function."); + return a},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=c("connectedCallback");var t=c("disconnectedCallback");var k=c("adoptedCallback");var h=c("attributeChangedCallback");var m=b.observedAttributes||[]}catch(q){return}finally{this.c=!1}b={localName:a,constructorFunction:b,connectedCallback:f,disconnectedCallback:t,adoptedCallback:k,attributeChangedCallback:h,observedAttributes:m,constructionStack:[]};ba(this.a, + a,b);this.g.push(b);this.b||(this.b=!0,this.f(function(){return fa(d)}))};E.prototype.i=function(a){A(this.a,a)}; + function fa(a){if(!1!==a.b){a.b=!1;for(var b=a.g,d=[],c=new Map,e=0;e<b.length;e++)c.set(b[e].localName,[]);A(a.a,document,{i:function(b){if(void 0===b.__CE_state){var e=b.localName,f=c.get(e);f?f.push(b):a.a.a.get(e)&&d.push(b)}}});for(e=0;e<d.length;e++)y(a.a,d[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=c.get(f.localName);for(var t=0;t<f.length;t++)y(a.a,f[t]);(e=a.j.get(e))&&D(e)}}}E.prototype.get=function(a){if(a=this.a.a.get(a))return a.constructorFunction}; + E.prototype.m=function(a){if(!g(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.j.get(a);if(b)return b.c;b=new ea;this.j.set(a,b);this.a.a.get(a)&&!this.g.some(function(b){return b.localName===a})&&D(b);return b.c};E.prototype.s=function(a){C(this.o);var b=this.f;this.f=function(d){return a(function(){return b(d)})}};window.CustomElementRegistry=E;E.prototype.define=E.prototype.l;E.prototype.upgrade=E.prototype.i;E.prototype.get=E.prototype.get; + E.prototype.whenDefined=E.prototype.m;E.prototype.polyfillWrapFlushCallback=E.prototype.s;var F=window.Document.prototype.createElement,G=window.Document.prototype.createElementNS,ha=window.Document.prototype.importNode,ia=window.Document.prototype.prepend,ja=window.Document.prototype.append,ka=window.DocumentFragment.prototype.prepend,la=window.DocumentFragment.prototype.append,H=window.Node.prototype.cloneNode,I=window.Node.prototype.appendChild,J=window.Node.prototype.insertBefore,K=window.Node.prototype.removeChild,L=window.Node.prototype.replaceChild,M=Object.getOwnPropertyDescriptor(window.Node.prototype, + "textContent"),N=window.Element.prototype.attachShadow,O=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),P=window.Element.prototype.getAttribute,Q=window.Element.prototype.setAttribute,R=window.Element.prototype.removeAttribute,S=window.Element.prototype.getAttributeNS,T=window.Element.prototype.setAttributeNS,U=window.Element.prototype.removeAttributeNS,ma=window.Element.prototype.insertAdjacentElement,na=window.Element.prototype.insertAdjacentHTML,oa=window.Element.prototype.prepend, + pa=window.Element.prototype.append,V=window.Element.prototype.before,qa=window.Element.prototype.after,ra=window.Element.prototype.replaceWith,sa=window.Element.prototype.remove,ta=window.HTMLElement,W=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),ua=window.HTMLElement.prototype.insertAdjacentElement,va=window.HTMLElement.prototype.insertAdjacentHTML;var wa=new function(){};function xa(){var a=X;window.HTMLElement=function(){function b(){var b=this.constructor,c=a.g.get(b);if(!c)throw Error("The custom element being constructed was not registered with `customElements`.");var e=c.constructionStack;if(0===e.length)return e=F.call(document,c.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=c,w(a,e),e;c=e.length-1;var f=e[c];if(f===wa)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times."); + e[c]=wa;Object.setPrototypeOf(f,b.prototype);w(a,f);return f}b.prototype=ta.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function Y(a,b,d){function c(b){return function(d){for(var e=[],c=0;c<arguments.length;++c)e[c]=arguments[c];c=[];for(var f=[],m=0;m<e.length;m++){var q=e[m];q instanceof Element&&l(q)&&f.push(q);if(q instanceof DocumentFragment)for(q=q.firstChild;q;q=q.nextSibling)c.push(q);else c.push(q)}b.apply(this,e);for(e=0;e<f.length;e++)z(a,f[e]);if(l(this))for(e=0;e<c.length;e++)f=c[e],f instanceof Element&&x(a,f)}}void 0!==d.h&&(b.prepend=c(d.h));void 0!==d.append&&(b.append=c(d.append))};function ya(){var a=X;r(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var d=a.a.get(b);if(d)return new d.constructorFunction}b=F.call(this,b);w(a,b);return b});r(Document.prototype,"importNode",function(b,d){b=ha.call(this,b,!!d);this.__CE_hasRegistry?A(a,b):v(a,b);return b});r(Document.prototype,"createElementNS",function(b,d){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var c=a.a.get(d);if(c)return new c.constructorFunction}b=G.call(this,b, + d);w(a,b);return b});Y(a,Document.prototype,{h:ia,append:ja})};function za(){function a(a,c){Object.defineProperty(a,"textContent",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(a){if(this.nodeType===Node.TEXT_NODE)c.set.call(this,a);else{var d=void 0;if(this.firstChild){var e=this.childNodes,k=e.length;if(0<k&&l(this)){d=Array(k);for(var h=0;h<k;h++)d[h]=e[h]}}c.set.call(this,a);if(d)for(a=0;a<d.length;a++)z(b,d[a])}}})}var b=X;r(Node.prototype,"insertBefore",function(a,c){if(a instanceof DocumentFragment){var e=Array.prototype.slice.apply(a.childNodes); + a=J.call(this,a,c);if(l(this))for(c=0;c<e.length;c++)x(b,e[c]);return a}e=l(a);c=J.call(this,a,c);e&&z(b,a);l(this)&&x(b,a);return c});r(Node.prototype,"appendChild",function(a){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=I.call(this,a);if(l(this))for(var e=0;e<c.length;e++)x(b,c[e]);return a}c=l(a);e=I.call(this,a);c&&z(b,a);l(this)&&x(b,a);return e});r(Node.prototype,"cloneNode",function(a){a=H.call(this,!!a);this.ownerDocument.__CE_hasRegistry?A(b,a):v(b, + a);return a});r(Node.prototype,"removeChild",function(a){var c=l(a),e=K.call(this,a);c&&z(b,a);return e});r(Node.prototype,"replaceChild",function(a,c){if(a instanceof DocumentFragment){var e=Array.prototype.slice.apply(a.childNodes);a=L.call(this,a,c);if(l(this))for(z(b,c),c=0;c<e.length;c++)x(b,e[c]);return a}e=l(a);var f=L.call(this,a,c),d=l(this);d&&z(b,c);e&&z(b,a);d&&x(b,a);return f});M&&M.get?a(Node.prototype,M):ca(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){for(var a=[], + b=0;b<this.childNodes.length;b++){var f=this.childNodes[b];f.nodeType!==Node.COMMENT_NODE&&a.push(f.textContent)}return a.join("")},set:function(a){for(;this.firstChild;)K.call(this,this.firstChild);null!=a&&""!==a&&I.call(this,document.createTextNode(a))}})})};function Aa(a){function b(b){return function(e){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=[];for(var k=[],h=0;h<c.length;h++){var m=c[h];m instanceof Element&&l(m)&&k.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)d.push(m);else d.push(m)}b.apply(this,c);for(c=0;c<k.length;c++)z(a,k[c]);if(l(this))for(c=0;c<d.length;c++)k=d[c],k instanceof Element&&x(a,k)}}var d=Element.prototype;void 0!==V&&(d.before=b(V));void 0!==V&&(d.after=b(qa));void 0!==ra&& + r(d,"replaceWith",function(b){for(var e=[],c=0;c<arguments.length;++c)e[c]=arguments[c];c=[];for(var d=[],k=0;k<e.length;k++){var h=e[k];h instanceof Element&&l(h)&&d.push(h);if(h instanceof DocumentFragment)for(h=h.firstChild;h;h=h.nextSibling)c.push(h);else c.push(h)}k=l(this);ra.apply(this,e);for(e=0;e<d.length;e++)z(a,d[e]);if(k)for(z(a,this),e=0;e<c.length;e++)d=c[e],d instanceof Element&&x(a,d)});void 0!==sa&&r(d,"remove",function(){var b=l(this);sa.call(this);b&&z(a,this)})};function Ba(){function a(a,b){Object.defineProperty(a,"innerHTML",{enumerable:b.enumerable,configurable:!0,get:b.get,set:function(a){var e=this,d=void 0;l(this)&&(d=[],p(this,function(a){a!==e&&d.push(a)}));b.set.call(this,a);if(d)for(var f=0;f<d.length;f++){var t=d[f];1===t.__CE_state&&c.disconnectedCallback(t)}this.ownerDocument.__CE_hasRegistry?A(c,this):v(c,this);return a}})}function b(a,b){r(a,"insertAdjacentElement",function(a,e){var d=l(e);a=b.call(this,a,e);d&&z(c,e);l(a)&&x(c,e);return a})} + function d(a,b){function e(a,b){for(var e=[];a!==b;a=a.nextSibling)e.push(a);for(b=0;b<e.length;b++)A(c,e[b])}r(a,"insertAdjacentHTML",function(a,c){a=a.toLowerCase();if("beforebegin"===a){var d=this.previousSibling;b.call(this,a,c);e(d||this.parentNode.firstChild,this)}else if("afterbegin"===a)d=this.firstChild,b.call(this,a,c),e(this.firstChild,d);else if("beforeend"===a)d=this.lastChild,b.call(this,a,c),e(d||this.firstChild,null);else if("afterend"===a)d=this.nextSibling,b.call(this,a,c),e(this.nextSibling, + d);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}var c=X;N&&r(Element.prototype,"attachShadow",function(a){a=N.call(this,a);var b=c;if(b.b&&!a.__CE_patched){a.__CE_patched=!0;for(var e=0;e<b.c.length;e++)b.c[e](a)}return this.__CE_shadowRoot=a});O&&O.get?a(Element.prototype,O):W&&W.get?a(HTMLElement.prototype,W):da(c,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){return H.call(this,!0).innerHTML}, + set:function(a){var b="template"===this.localName,c=b?this.content:this,e=G.call(document,this.namespaceURI,this.localName);for(e.innerHTML=a;0<c.childNodes.length;)K.call(c,c.childNodes[0]);for(a=b?e.content:e;0<a.childNodes.length;)I.call(c,a.childNodes[0])}})});r(Element.prototype,"setAttribute",function(a,b){if(1!==this.__CE_state)return Q.call(this,a,b);var e=P.call(this,a);Q.call(this,a,b);b=P.call(this,a);c.attributeChangedCallback(this,a,e,b,null)});r(Element.prototype,"setAttributeNS",function(a, + b,d){if(1!==this.__CE_state)return T.call(this,a,b,d);var e=S.call(this,a,b);T.call(this,a,b,d);d=S.call(this,a,b);c.attributeChangedCallback(this,b,e,d,a)});r(Element.prototype,"removeAttribute",function(a){if(1!==this.__CE_state)return R.call(this,a);var b=P.call(this,a);R.call(this,a);null!==b&&c.attributeChangedCallback(this,a,b,null,null)});r(Element.prototype,"removeAttributeNS",function(a,b){if(1!==this.__CE_state)return U.call(this,a,b);var d=S.call(this,a,b);U.call(this,a,b);var e=S.call(this, + a,b);d!==e&&c.attributeChangedCallback(this,b,d,e,a)});ua?b(HTMLElement.prototype,ua):ma?b(Element.prototype,ma):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");va?d(HTMLElement.prototype,va):na?d(Element.prototype,na):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Y(c,Element.prototype,{h:oa,append:pa});Aa(c)};var Z=window.customElements;if(!Z||Z.forcePolyfill||"function"!=typeof Z.define||"function"!=typeof Z.get){var X=new u;xa();ya();Y(X,DocumentFragment.prototype,{h:ka,append:la});za();Ba();document.__CE_hasRegistry=!0;var customElements=new E(X);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})}; +}).call(self); + +// Polyfill document.baseURI +"string"!==typeof document.baseURI&&Object.defineProperty(Document.prototype,"baseURI",{enumerable:!0,configurable:!0,get:function(){var a=document.querySelector("base");return a&&a.href?a.href:document.URL}}); + +// Polyfill CustomEvent +"function"!==typeof window.CustomEvent&&(window.CustomEvent=function(c,a){a=a||{bubbles:!1,cancelable:!1,detail:void 0};var b=document.createEvent("CustomEvent");b.initCustomEvent(c,a.bubbles,a.cancelable,a.detail);return b},window.CustomEvent.prototype=window.Event.prototype); + +// Event.composedPath +(function(b,c,d){b.composedPath||(b.composedPath=function(){if(this.path)return this.path;var a=this.target;for(this.path=[];null!==a.parentNode;)this.path.push(a),a=a.parentNode;this.path.push(c,d);return this.path})})(Event.prototype,document,window); + +/*! +Element.closest and Element.matches +https://github.com/jonathantneal/closest +Creative Commons Zero v1.0 Universal +*/ +(function(a){"function"!==typeof a.matches&&(a.matches=a.msMatchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||function(a){a=(this.document||this.ownerDocument).querySelectorAll(a);for(var b=0;a[b]&&a[b]!==this;)++b;return!!a[b]});"function"!==typeof a.closest&&(a.closest=function(a){for(var b=this;b&&1===b.nodeType;){if(b.matches(a))return b;b=b.parentNode}return null})})(window.Element.prototype); + +/*! +Element.getRootNode() +*/ +(function(c){function d(a){a=b(a);return a&&11===a.nodeType?d(a.host):a}function b(a){return a&&a.parentNode?b(a.parentNode):a}"function"!==typeof c.getRootNode&&(c.getRootNode=function(a){return a&&a.composed?d(this):b(this)})})(Element.prototype); + +/*! +Element.isConnected() +*/ +(function(a){"isConnected"in a||Object.defineProperty(a,"isConnected",{configurable:!0,enumerable:!0,get:function(){var a=this.getRootNode({composed:!0});return a&&9===a.nodeType}})})(Element.prototype); + +/*! +Element.remove() +*/ +(function(b){b.forEach(function(a){a.hasOwnProperty("remove")||Object.defineProperty(a,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){null!==this.parentNode&&this.parentNode.removeChild(this)}})})})([Element.prototype,CharacterData.prototype,DocumentType.prototype]); + +/*! +Element.classList +*/ +!function(e){'classList'in e||Object.defineProperty(e,"classList",{get:function(){var e=this,t=(e.getAttribute("class")||"").replace(/^\s+|\s$/g,"").split(/\s+/g);function n(){t.length>0?e.setAttribute("class",t.join(" ")):e.removeAttribute("class")}return""===t[0]&&t.splice(0,1),t.toggle=function(e,i){void 0!==i?i?t.add(e):t.remove(e):-1!==t.indexOf(e)?t.splice(t.indexOf(e),1):t.push(e),n()},t.add=function(){for(var e=[].slice.call(arguments),i=0,s=e.length;i<s;i++)-1===t.indexOf(e[i])&&t.push(e[i]);n()},t.remove=function(){for(var e=[].slice.call(arguments),i=0,s=e.length;i<s;i++)-1!==t.indexOf(e[i])&&t.splice(t.indexOf(e[i]),1);n()},t.item=function(e){return t[e]},t.contains=function(e){return-1!==t.indexOf(e)},t.replace=function(e,i){-1!==t.indexOf(e)&&t.splice(t.indexOf(e),1,i),n()},t.value=e.getAttribute("class")||"",t}})}(Element.prototype); + +/*! +DOMTokenList +*/ +(function(b){try{document.body.classList.add()}catch(e){var c=b.add,d=b.remove;b.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])};b.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])}}})(DOMTokenList.prototype); + +(function(){if("undefined"!==typeof window&&void 0!==window.Reflect&&void 0!==window.customElements){var a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)};HTMLElement.prototype=a.prototype;HTMLElement.prototype.constructor=HTMLElement;Object.setPrototypeOf(HTMLElement,a)}})(); +/** + * SystemJS 4.0.2 + * MANUAL PATCH: remove script.crossOrigin = "anonymous" + * MANUAL PATCH: add conditionally apply, n.System=n.System||new u + */ +!function(){var e="undefined"!=typeof self,n=e?self:global;var t;if("undefined"!=typeof document){var e=document.querySelector("base[href]");e&&(t=e.href)}if(!t&&"undefined"!=typeof location){var e=(t=location.href.split("#")[0].split("?")[0]).lastIndexOf("/");-1!==e&&(t=t.slice(0,e+1))}var r=/\\/g,o="undefined"!=typeof Symbol,i=o&&Symbol.toStringTag,c=o?Symbol():"@";function u(){this[c]={}}var s=u.prototype;var l;s.import=function(e,n){var t=this;return Promise.resolve(t.resolve(e,n)).then(function(e){var n=function e(n,t,r){var o=n[c][t];if(o)return o;var u=[],s=Object.create(null);i&&Object.defineProperty(s,i,{value:"Module"});var l=Promise.resolve().then(function(){return n.instantiate(t,r)}).then(function(e){if(!e)throw Error("Module "+t+" did not instantiate");var r=e[1](function(e,n){o.h=!0;var t=!1;if("object"!=typeof e)e in s&&s[e]===n||(s[e]=n,t=!0);else for(var n in e){var r=e[n];n in s&&s[n]===r||(s[n]=r,t=!0)}if(t)for(var e=0;e<u.length;e++)u[e](s);return n},2===e[1].length?{import:function(e){return n.import(e,t)},meta:n.createContext(t)}:void 0);return o.e=r.execute||function(){},[e[0],r.setters||[]]});var f=l.then(function(r){return Promise.all(r[0].map(function(o,i){var c=r[1][i];return Promise.resolve(n.resolve(o,t)).then(function(r){var o=e(n,r,t);return Promise.resolve(o.I).then(function(){return c&&(o.i.push(c),!o.h&&o.I||c(o.n)),o})})})).then(function(e){o.d=e})});return f.catch(function(e){o.e=null,o.er=e}),o=n[c][t]={id:t,i:u,n:s,I:l,L:f,h:!1,d:void 0,e:void 0,er:void 0,E:void 0,C:void 0}}(t,e);return n.C||function(e,n){return n.C=function e(n,t,r){if(!r[t.id])return r[t.id]=!0,Promise.resolve(t.L).then(function(){return Promise.all(t.d.map(function(t){return e(n,t,r)}))})}(e,n,{}).then(function(){return function e(n,t,r){if(r[t.id])return;if(r[t.id]=!0,!t.e){if(t.er)throw t.er;return t.E?t.E:void 0}var o;return t.d.forEach(function(t){{var i=e(n,t,r);i&&(o=o||[]).push(i)}}),o?Promise.all(o).then(i):i();function i(){try{var e=t.e.call(f);if(e)return e=e.then(function(){t.C=t.n,t.E=null}),t.E=t.E||e;t.C=t.n}catch(e){throw t.er=e,e}finally{t.L=t.I=void 0,t.e=null}}}(e,n,{})}).then(function(){return n.n})}(t,n)})},s.createContext=function(e){return{url:e}},s.register=function(e,n){l=[e,n]},s.getRegister=function(){var e=l;return l=void 0,e};var f=Object.freeze(Object.create(null));n.System=n.System||new u;var d=s.register;s.register=function(e,n){d.call(this,e,n)},s.instantiate=function(e,n){var t=this;return".json"===e.substr(-5)?fetch(e).then(function(e){return e.text()}).then(function(e){return[[],function(n){return{execute:function(){n("default",JSON.parse(e))}}}]}):new Promise(function(r,o){var i;function c(n){n.filename===e&&(i=n.error)}window.addEventListener("error",c);var u=document.createElement("script");u.charset="utf-8",u.async=!0,u.addEventListener("error",function(){window.removeEventListener("error",c),o(Error("Error loading "+e+(n?" from "+n:"")))}),u.addEventListener("load",function(){window.removeEventListener("error",c),document.head.removeChild(u),i?o(i):r(t.getRegister())}),u.src=e,document.head.appendChild(u)})},e&&"function"==typeof importScripts&&(s.instantiate=function(e){var n=this;return new Promise(function(t,r){try{importScripts(e)}catch(e){r(e)}t(n.getRegister())})}),s.resolve=function(e,n){var o=function(e,n){if(-1!==e.indexOf("\\")&&(e=e.replace(r,"/")),"/"===e[0]&&"/"===e[1])return n.slice(0,n.indexOf(":")+1)+e;if("."===e[0]&&("/"===e[1]||"."===e[1]&&("/"===e[2]||2===e.length&&(e+="/"))||1===e.length&&(e+="/"))||"/"===e[0]){var t=n.slice(0,n.indexOf(":")+1);var r;if(r="/"===n[t.length+1]?"file:"!==t?(r=n.slice(t.length+2)).slice(r.indexOf("/")+1):n.slice(8):n.slice(t.length+("/"===n[t.length])),"/"===e[0])return n.slice(0,n.length-r.length-1)+e;var o=r.slice(0,r.lastIndexOf("/")+1)+e,i=[];var c=-1;for(var e=0;e<o.length;e++)-1!==c?"/"===o[e]&&(i.push(o.slice(c,e+1)),c=-1):"."===o[e]?"."!==o[e+1]||"/"!==o[e+2]&&e+2!==o.length?"/"===o[e+1]||e+1===o.length?e+=1:c=e:(i.pop(),e+=2):c=e;return-1!==c&&i.push(o.slice(c)),n.slice(0,n.length-r.length)+i.join("")}}(e,n||t);if(!o){if(-1!==e.indexOf(":"))return Promise.resolve(e);throw Error('Cannot resolve "'+e+(n?'" from '+n:'"'))}return Promise.resolve(o)}}(); + + // Figure out currentScript (for IE11, since it does not support currentScript) + var regex = /\/ionicons(\.esm)?\.js($|\?|#)/; + var scriptElm = currentScript || Array.from(document.querySelectorAll('script')).find(function(s) { + return regex.test(s.src) || s.getAttribute('data-stencil-namespace') === "ionicons"; + }); + + var resourcesUrl = scriptElm ? scriptElm.getAttribute('data-resources-url') || scriptElm.src : ''; + var start = function() { + // if src is not present then origin is "null", and new URL() throws TypeError: Failed to construct 'URL': Invalid base URL + var url = new URL('./p-8f10164f.system.js', new URL(resourcesUrl, window.location.origin !== 'null' ? window.location.origin : undefined)); + System.import(url.href); + }; + + start(); + + // Note: using .call(window) here because the self-executing function needs + // to be scoped to the window object for the ES6Promise polyfill to work + } +}).call(window); diff --git a/theme/assets/vendor/ionicons/p-006dba1a.js b/theme/assets/vendor/ionicons/p-006dba1a.js new file mode 100644 index 0000000000..1f0b07b97f --- /dev/null +++ b/theme/assets/vendor/ionicons/p-006dba1a.js @@ -0,0 +1 @@ +import{g as n}from"./p-e298ede3.js";let t;const e=()=>{if("undefined"==typeof window)return new Map;if(!t){const n=window;n.Ionicons=n.Ionicons||{},t=n.Ionicons.map=n.Ionicons.map||new Map}return t},o=n=>{Object.keys(n).forEach((t=>{i(t,n[t]);const e=t.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g,"$1-$2").toLowerCase();t!==e&&i(e,n[t])}))},i=(n,t)=>{const o=e(),i=o.get(n);void 0===i?o.set(n,t):i!==t&&console.warn(`[Ionicons Warning]: Multiple icons were mapped to name "${n}". Ensure that multiple icons are not mapped to the same icon name.`)},r=n=>{let t=c(n.src);if(t)return t;if(t=a(n.name,n.icon,n.mode,n.ios,n.md),t)return s(t,n);if(n.icon){if(t=c(n.icon),t)return t;if(t=c(n.icon[n.mode]),t)return t}return null},s=(t,o)=>{const i=e().get(t);if(i)return i;try{return n(`svg/${t}.svg`)}catch(n){console.warn(`[Ionicons Warning]: Could not load icon with name "${t}". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to the icon component.`,o)}},a=(n,t,e,o,i)=>(e="ios"===(e&&l(e))?"ios":"md",o&&"ios"===e?n=l(o):i&&"md"===e?n=l(i):(n||!t||u(t)||(n=t),d(n)&&(n=l(n))),d(n)&&""!==n.trim()?""!==n.replace(/[a-z]|-|\d/gi,"")?null:n:null),c=n=>d(n)&&(n=n.trim(),u(n))?n:null,u=n=>n.length>0&&/(\/|\.)/.test(n),d=n=>"string"==typeof n,l=n=>n.toLowerCase(),m=(n,t=[])=>{const e={};return t.forEach((t=>{n.hasAttribute(t)&&(null!==n.getAttribute(t)&&(e[t]=n.getAttribute(t)),n.removeAttribute(t))})),e},p=n=>n&&""!==n.dir?"rtl"===n.dir.toLowerCase():"rtl"===(null===document||void 0===document?void 0:document.dir.toLowerCase());export{o as a,m as b,a as c,p as d,r as g,d as i} \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/p-41a81ee2.system.entry.js b/theme/assets/vendor/ionicons/p-41a81ee2.system.entry.js new file mode 100644 index 0000000000..02f0ddded1 --- /dev/null +++ b/theme/assets/vendor/ionicons/p-41a81ee2.system.entry.js @@ -0,0 +1 @@ +System.register(["./p-e7ae1e74.system.js","./p-621fab66.system.js"],(function(e){"use strict";var t,o,i,n,r,s,c,a,l;return{setters:[function(e){t=e.r;o=e.h;i=e.H;n=e.c},function(e){r=e.i;s=e.b;c=e.g;a=e.c;l=e.d}],execute:function(){var d=function(e){var t=document.createElement("div");t.innerHTML=e;for(var o=t.childNodes.length-1;o>=0;o--){if(t.childNodes[o].nodeName.toLowerCase()!=="svg"){t.removeChild(t.childNodes[o])}}var i=t.firstElementChild;if(i&&i.nodeName.toLowerCase()==="svg"){var n=i.getAttribute("class")||"";i.setAttribute("class",(n+" s-ion-icon").trim());if(f(i)){return t.innerHTML}}return""};var f=function(e){if(e.nodeType===1){if(e.nodeName.toLowerCase()==="script"){return false}for(var t=0;t<e.attributes.length;t++){var o=e.attributes[t].name;if(r(o)&&o.toLowerCase().indexOf("on")===0){return false}}for(var t=0;t<e.childNodes.length;t++){if(!f(e.childNodes[t])){return false}}}return true};var u=function(e){return e.startsWith("data:image/svg+xml")};var h=function(e){return e.indexOf(";utf8,")!==-1};var m=new Map;var v=new Map;var b;var p=function(e,t){var o=v.get(e);if(!o){if(typeof fetch!=="undefined"&&typeof document!=="undefined"){if(u(e)&&h(e)){if(!b){b=new DOMParser}var i=b.parseFromString(e,"text/html");var n=i.querySelector("svg");if(n){m.set(e,n.outerHTML)}return Promise.resolve()}else{o=fetch(e).then((function(o){if(o.ok){return o.text().then((function(o){if(o&&t!==false){o=d(o)}m.set(e,o||"")}))}m.set(e,"")}));v.set(e,o)}}else{m.set(e,"");return Promise.resolve()}}return o};var g=":host{display:inline-block;width:1em;height:1em;contain:strict;fill:currentColor;-webkit-box-sizing:content-box !important;box-sizing:content-box !important}:host .ionicon{stroke:currentColor}.ionicon-fill-none{fill:none}.ionicon-stroke-width{stroke-width:32px;stroke-width:var(--ionicon-stroke-width, 32px)}.icon-inner,.ionicon,svg{display:block;height:100%;width:100%}@supports (background: -webkit-named-image(i)){:host(.icon-rtl) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}}@supports not selector(:dir(rtl)) and selector(:host-context([dir='rtl'])){:host(.icon-rtl) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}}:host(.flip-rtl):host-context([dir='rtl']) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}@supports selector(:dir(rtl)){:host(.flip-rtl:dir(rtl)) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}:host(.flip-rtl:dir(ltr)) .icon-inner{-webkit-transform:scaleX(1);transform:scaleX(1)}}:host(.icon-small){font-size:1.125rem !important}:host(.icon-large){font-size:2rem !important}:host(.ion-color){color:var(--ion-color-base) !important}:host(.ion-color-primary){--ion-color-base:var(--ion-color-primary, #3880ff)}:host(.ion-color-secondary){--ion-color-base:var(--ion-color-secondary, #0cd1e8)}:host(.ion-color-tertiary){--ion-color-base:var(--ion-color-tertiary, #f4a942)}:host(.ion-color-success){--ion-color-base:var(--ion-color-success, #10dc60)}:host(.ion-color-warning){--ion-color-base:var(--ion-color-warning, #ffce00)}:host(.ion-color-danger){--ion-color-base:var(--ion-color-danger, #f14141)}:host(.ion-color-light){--ion-color-base:var(--ion-color-light, #f4f5f8)}:host(.ion-color-medium){--ion-color-base:var(--ion-color-medium, #989aa2)}:host(.ion-color-dark){--ion-color-base:var(--ion-color-dark, #222428)}";var w=e("ion_icon",function(){function e(e){t(this,e);this.iconName=null;this.inheritedAttributes={};this.didLoadIcon=false;this.svgContent=undefined;this.isVisible=false;this.mode=y();this.color=undefined;this.ios=undefined;this.md=undefined;this.flipRtl=undefined;this.name=undefined;this.src=undefined;this.icon=undefined;this.size=undefined;this.lazy=false;this.sanitize=true}e.prototype.componentWillLoad=function(){this.inheritedAttributes=s(this.el,["aria-label"])};e.prototype.connectedCallback=function(){var e=this;this.waitUntilVisible(this.el,"50px",(function(){e.isVisible=true;e.loadIcon()}))};e.prototype.componentDidLoad=function(){if(!this.didLoadIcon){this.loadIcon()}};e.prototype.disconnectedCallback=function(){if(this.io){this.io.disconnect();this.io=undefined}};e.prototype.waitUntilVisible=function(e,t,o){var i=this;if(this.lazy&&typeof window!=="undefined"&&window.IntersectionObserver){var n=this.io=new window.IntersectionObserver((function(e){if(e[0].isIntersecting){n.disconnect();i.io=undefined;o()}}),{rootMargin:t});n.observe(e)}else{o()}};e.prototype.loadIcon=function(){var e=this;if(this.isVisible){var t=c(this);if(t){if(m.has(t)){this.svgContent=m.get(t)}else{p(t,this.sanitize).then((function(){return e.svgContent=m.get(t)}))}this.didLoadIcon=true}}this.iconName=a(this.name,this.icon,this.mode,this.ios,this.md)};e.prototype.render=function(){var e,t;var n=this,r=n.flipRtl,s=n.iconName,c=n.inheritedAttributes,a=n.el;var d=this.mode||"md";var f=s?(s.includes("arrow")||s.includes("chevron"))&&r!==false:false;var u=r||f;return o(i,Object.assign({role:"img",class:Object.assign(Object.assign((e={},e[d]=true,e),k(this.color)),(t={},t["icon-".concat(this.size)]=!!this.size,t["flip-rtl"]=u,t["icon-rtl"]=u&&l(a),t))},c),this.svgContent?o("div",{class:"icon-inner",innerHTML:this.svgContent}):o("div",{class:"icon-inner"}))};Object.defineProperty(e,"assetsDirs",{get:function(){return["svg"]},enumerable:false,configurable:true});Object.defineProperty(e.prototype,"el",{get:function(){return n(this)},enumerable:false,configurable:true});Object.defineProperty(e,"watchers",{get:function(){return{name:["loadIcon"],src:["loadIcon"],icon:["loadIcon"],ios:["loadIcon"],md:["loadIcon"]}},enumerable:false,configurable:true});return e}());var y=function(){return typeof document!=="undefined"&&document.documentElement.getAttribute("mode")||"md"};var k=function(e){var t;return e?(t={"ion-color":true},t["ion-color-".concat(e)]=true,t):null};w.style=g}}})); \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/p-5f68589a.system.js b/theme/assets/vendor/ionicons/p-5f68589a.system.js new file mode 100644 index 0000000000..3c1ec001e5 --- /dev/null +++ b/theme/assets/vendor/ionicons/p-5f68589a.system.js @@ -0,0 +1 @@ +System.register(["./p-e7ae1e74.system.js","./p-621fab66.system.js"],(function(e){"use strict";return{setters:[function(t){e("setAssetPath",t.a)},function(t){e("addIcons",t.a)}],execute:function(){}}})); \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/p-621fab66.system.js b/theme/assets/vendor/ionicons/p-621fab66.system.js new file mode 100644 index 0000000000..f59e1eefae --- /dev/null +++ b/theme/assets/vendor/ionicons/p-621fab66.system.js @@ -0,0 +1 @@ +System.register(["./p-e7ae1e74.system.js"],(function(n){"use strict";var e;return{setters:[function(n){e=n.g}],execute:function(){var t;var r=function(){if(typeof window==="undefined"){return new Map}else{if(!t){var n=window;n.Ionicons=n.Ionicons||{};t=n.Ionicons.map=n.Ionicons.map||new Map}return t}};var i=n("a",(function(n){Object.keys(n).forEach((function(e){o(e,n[e]);var t=e.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g,"$1-$2").toLowerCase();if(e!==t){o(t,n[e])}}))}));var o=function(n,e){var t=r();var i=t.get(n);if(i===undefined){t.set(n,e)}else if(i!==e){console.warn('[Ionicons Warning]: Multiple icons were mapped to name "'.concat(n,'". Ensure that multiple icons are not mapped to the same icon name.'))}};var a=n("g",(function(n){var e=s(n.src);if(e){return e}e=c(n.name,n.icon,n.mode,n.ios,n.md);if(e){return u(e,n)}if(n.icon){e=s(n.icon);if(e){return e}e=s(n.icon[n.mode]);if(e){return e}}return null}));var u=function(n,t){var i=r().get(n);if(i){return i}try{return e("svg/".concat(n,".svg"))}catch(e){console.warn('[Ionicons Warning]: Could not load icon with name "'.concat(n,'". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to the icon component.'),t)}};var c=n("c",(function(n,e,t,r,i){t=(t&&l(t))==="ios"?"ios":"md";if(r&&t==="ios"){n=l(r)}else if(i&&t==="md"){n=l(i)}else{if(!n&&e&&!f(e)){n=e}if(d(n)){n=l(n)}}if(!d(n)||n.trim()===""){return null}var o=n.replace(/[a-z]|-|\d/gi,"");if(o!==""){return null}return n}));var s=function(n){if(d(n)){n=n.trim();if(f(n)){return n}}return null};var f=function(n){return n.length>0&&/(\/|\.)/.test(n)};var d=n("i",(function(n){return typeof n==="string"}));var l=function(n){return n.toLowerCase()};var v=n("b",(function(n,e){if(e===void 0){e=[]}var t={};e.forEach((function(e){if(n.hasAttribute(e)){var r=n.getAttribute(e);if(r!==null){t[e]=n.getAttribute(e)}n.removeAttribute(e)}}));return t}));var m=n("d",(function(n){if(n){if(n.dir!==""){return n.dir.toLowerCase()==="rtl"}}return(document===null||document===void 0?void 0:document.dir.toLowerCase())==="rtl"}))}}})); \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/p-748a23b9.entry.js b/theme/assets/vendor/ionicons/p-748a23b9.entry.js new file mode 100644 index 0000000000..497e69d543 --- /dev/null +++ b/theme/assets/vendor/ionicons/p-748a23b9.entry.js @@ -0,0 +1 @@ +import{r as o,h as i,H as t,c as n}from"./p-e298ede3.js";import{i as r,b as s,g as e,c,d as l}from"./p-006dba1a.js";const a=o=>{if(1===o.nodeType){if("script"===o.nodeName.toLowerCase())return!1;for(let i=0;i<o.attributes.length;i++){const t=o.attributes[i].name;if(r(t)&&0===t.toLowerCase().indexOf("on"))return!1}for(let i=0;i<o.childNodes.length;i++)if(!a(o.childNodes[i]))return!1}return!0},h=new Map,d=new Map;let f;const m=class{constructor(i){o(this,i),this.iconName=null,this.inheritedAttributes={},this.didLoadIcon=!1,this.svgContent=void 0,this.isVisible=!1,this.mode=p(),this.color=void 0,this.ios=void 0,this.md=void 0,this.flipRtl=void 0,this.name=void 0,this.src=void 0,this.icon=void 0,this.size=void 0,this.lazy=!1,this.sanitize=!0}componentWillLoad(){this.inheritedAttributes=s(this.el,["aria-label"])}connectedCallback(){this.waitUntilVisible(this.el,"50px",(()=>{this.isVisible=!0,this.loadIcon()}))}componentDidLoad(){this.didLoadIcon||this.loadIcon()}disconnectedCallback(){this.io&&(this.io.disconnect(),this.io=void 0)}waitUntilVisible(o,i,t){if(this.lazy&&"undefined"!=typeof window&&window.IntersectionObserver){const n=this.io=new window.IntersectionObserver((o=>{o[0].isIntersecting&&(n.disconnect(),this.io=void 0,t())}),{rootMargin:i});n.observe(o)}else t()}loadIcon(){if(this.isVisible){const o=e(this);o&&(h.has(o)?this.svgContent=h.get(o):((o,i)=>{let t=d.get(o);if(!t){if("undefined"==typeof fetch||"undefined"==typeof document)return h.set(o,""),Promise.resolve();if((o=>o.startsWith("data:image/svg+xml"))(o)&&(o=>-1!==o.indexOf(";utf8,"))(o)){f||(f=new DOMParser);const i=f.parseFromString(o,"text/html").querySelector("svg");return i&&h.set(o,i.outerHTML),Promise.resolve()}t=fetch(o).then((t=>{if(t.ok)return t.text().then((t=>{t&&!1!==i&&(t=(o=>{const i=document.createElement("div");i.innerHTML=o;for(let o=i.childNodes.length-1;o>=0;o--)"svg"!==i.childNodes[o].nodeName.toLowerCase()&&i.removeChild(i.childNodes[o]);const t=i.firstElementChild;if(t&&"svg"===t.nodeName.toLowerCase()){const o=t.getAttribute("class")||"";if(t.setAttribute("class",(o+" s-ion-icon").trim()),a(t))return i.innerHTML}return""})(t)),h.set(o,t||"")}));h.set(o,"")})),d.set(o,t)}return t})(o,this.sanitize).then((()=>this.svgContent=h.get(o))),this.didLoadIcon=!0)}this.iconName=c(this.name,this.icon,this.mode,this.ios,this.md)}render(){const{flipRtl:o,iconName:n,inheritedAttributes:r,el:s}=this,e=this.mode||"md",c=!!n&&(n.includes("arrow")||n.includes("chevron"))&&!1!==o,a=o||c;return i(t,Object.assign({role:"img",class:Object.assign(Object.assign({[e]:!0},u(this.color)),{[`icon-${this.size}`]:!!this.size,"flip-rtl":a,"icon-rtl":a&&l(s)})},r),i("div",this.svgContent?{class:"icon-inner",innerHTML:this.svgContent}:{class:"icon-inner"}))}static get assetsDirs(){return["svg"]}get el(){return n(this)}static get watchers(){return{name:["loadIcon"],src:["loadIcon"],icon:["loadIcon"],ios:["loadIcon"],md:["loadIcon"]}}},p=()=>"undefined"!=typeof document&&document.documentElement.getAttribute("mode")||"md",u=o=>o?{"ion-color":!0,[`ion-color-${o}`]:!0}:null;m.style=":host{display:inline-block;width:1em;height:1em;contain:strict;fill:currentColor;-webkit-box-sizing:content-box !important;box-sizing:content-box !important}:host .ionicon{stroke:currentColor}.ionicon-fill-none{fill:none}.ionicon-stroke-width{stroke-width:32px;stroke-width:var(--ionicon-stroke-width, 32px)}.icon-inner,.ionicon,svg{display:block;height:100%;width:100%}@supports (background: -webkit-named-image(i)){:host(.icon-rtl) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}}@supports not selector(:dir(rtl)) and selector(:host-context([dir='rtl'])){:host(.icon-rtl) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}}:host(.flip-rtl):host-context([dir='rtl']) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}@supports selector(:dir(rtl)){:host(.flip-rtl:dir(rtl)) .icon-inner{-webkit-transform:scaleX(-1);transform:scaleX(-1)}:host(.flip-rtl:dir(ltr)) .icon-inner{-webkit-transform:scaleX(1);transform:scaleX(1)}}:host(.icon-small){font-size:1.125rem !important}:host(.icon-large){font-size:2rem !important}:host(.ion-color){color:var(--ion-color-base) !important}:host(.ion-color-primary){--ion-color-base:var(--ion-color-primary, #3880ff)}:host(.ion-color-secondary){--ion-color-base:var(--ion-color-secondary, #0cd1e8)}:host(.ion-color-tertiary){--ion-color-base:var(--ion-color-tertiary, #f4a942)}:host(.ion-color-success){--ion-color-base:var(--ion-color-success, #10dc60)}:host(.ion-color-warning){--ion-color-base:var(--ion-color-warning, #ffce00)}:host(.ion-color-danger){--ion-color-base:var(--ion-color-danger, #f14141)}:host(.ion-color-light){--ion-color-base:var(--ion-color-light, #f4f5f8)}:host(.ion-color-medium){--ion-color-base:var(--ion-color-medium, #989aa2)}:host(.ion-color-dark){--ion-color-base:var(--ion-color-dark, #222428)}";export{m as ion_icon} \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/p-8f10164f.system.js b/theme/assets/vendor/ionicons/p-8f10164f.system.js new file mode 100644 index 0000000000..2e55d524e9 --- /dev/null +++ b/theme/assets/vendor/ionicons/p-8f10164f.system.js @@ -0,0 +1 @@ +System.register(["./p-e7ae1e74.system.js"],(function(e,t){"use strict";var n,r;return{setters:[function(t){n=t.p;r=t.b;e("setNonce",t.s)}],execute:function(){var e=function(){var e=t.meta.url;var r={};if(e!==""){r.resourcesUrl=new URL(".",e).href}return n(r)};e().then((function(e){return r([["p-41a81ee2.system",[[1,"ion-icon",{mode:[1025],color:[1],ios:[1],md:[1],flipRtl:[4,"flip-rtl"],name:[513],src:[1],icon:[8],size:[1],lazy:[4],sanitize:[4],svgContent:[32],isVisible:[32]}]]]],e)}))}}})); \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/p-e298ede3.js b/theme/assets/vendor/ionicons/p-e298ede3.js new file mode 100644 index 0000000000..727606f03a --- /dev/null +++ b/theme/assets/vendor/ionicons/p-e298ede3.js @@ -0,0 +1,2 @@ +let e,n,t=!1;const l=e=>{const n=new URL(e,Y.t);return n.origin!==Q.location.origin?n.href:n.pathname},o=e=>Y.t=e,s="http://www.w3.org/1999/xlink",i={},c=e=>"object"==(e=typeof e)||"function"===e;function r(e){var n,t,l;return null!==(l=null===(t=null===(n=e.head)||void 0===n?void 0:n.querySelector('meta[name="csp-nonce"]'))||void 0===t?void 0:t.getAttribute("content"))&&void 0!==l?l:void 0}const u=(e,n,...t)=>{let l=null,o=null,s=!1,i=!1;const r=[],u=n=>{for(let t=0;t<n.length;t++)l=n[t],Array.isArray(l)?u(l):null!=l&&"boolean"!=typeof l&&((s="function"!=typeof e&&!c(l))&&(l+=""),s&&i?r[r.length-1].l+=l:r.push(s?a(null,l):l),i=s)};if(u(t),n){n.key&&(o=n.key);{const e=n.className||n.class;e&&(n.class="object"!=typeof e?e:Object.keys(e).filter((n=>e[n])).join(" "))}}const f=a(e,null);return f.o=n,r.length>0&&(f.i=r),f.u=o,f},a=(e,n)=>({$:0,h:e,l:n,p:null,i:null,o:null,u:null}),f={},d=e=>V(e).m,y=new WeakMap,$=e=>"sc-"+e.v,h=(e,n,t,l,o,i)=>{if(t!==l){let r=B(e,n),u=n.toLowerCase();if("class"===n){const n=e.classList,o=m(t),s=m(l);n.remove(...o.filter((e=>e&&!s.includes(e)))),n.add(...s.filter((e=>e&&!o.includes(e))))}else if("style"===n){for(const n in t)l&&null!=l[n]||(n.includes("-")?e.style.removeProperty(n):e.style[n]="");for(const n in l)t&&l[n]===t[n]||(n.includes("-")?e.style.setProperty(n,l[n]):e.style[n]=l[n])}else if("key"===n);else if("ref"===n)l&&l(e);else if(r||"o"!==n[0]||"n"!==n[1]){const a=c(l);if((r||a&&null!==l)&&!o)try{if(e.tagName.includes("-"))e[n]=l;else{const o=null==l?"":l;"list"===n?r=!1:null!=t&&e[n]==o||(e[n]=o)}}catch(e){}let f=!1;u!==(u=u.replace(/^xlink\:?/,""))&&(n=u,f=!0),null==l||!1===l?!1===l&&""!==e.getAttribute(n)||(f?e.removeAttributeNS(s,n):e.removeAttribute(n)):(!r||4&i||o)&&!a&&(l=!0===l?"":l,f?e.setAttributeNS(s,n,l):e.setAttribute(n,l))}else n="-"===n[2]?n.slice(3):B(Q,u)?u.slice(2):u[2]+n.slice(3),t&&Y.rel(e,n,t,!1),l&&Y.ael(e,n,l,!1)}},p=/\s/,m=e=>e?e.split(p):[],b=(e,n,t,l)=>{const o=11===n.p.nodeType&&n.p.host?n.p.host:n.p,s=e&&e.o||i,c=n.o||i;for(l in s)l in c||h(o,l,s[l],void 0,t,n.$);for(l in c)h(o,l,s[l],c[l],t,n.$)},v=(n,t,l)=>{const o=t.i[l];let s,i,c=0;if(null!==o.l)s=o.p=X.createTextNode(o.l);else if(s=o.p=X.createElement(o.h),b(null,o,!1),null!=e&&s["s-si"]!==e&&s.classList.add(s["s-si"]=e),o.i)for(c=0;c<o.i.length;++c)i=v(n,o,c),i&&s.appendChild(i);return s},w=(e,t,l,o,s,i)=>{let c,r=e;for(r.shadowRoot&&r.tagName===n&&(r=r.shadowRoot);s<=i;++s)o[s]&&(c=v(null,l,s),c&&(o[s].p=c,r.insertBefore(c,t)))},k=(e,n,t)=>{for(let l=n;l<=t;++l){const n=e[l];if(n){const e=n.p;j(n),e&&e.remove()}}},g=(e,n)=>e.h===n.h&&e.u===n.u,S=(e,n)=>{const t=n.p=e.p,l=e.i,o=n.i,s=n.l;null===s?(b(e,n,!1),null!==l&&null!==o?((e,n,t,l)=>{let o,s,i=0,c=0,r=0,u=0,a=n.length-1,f=n[0],d=n[a],y=l.length-1,$=l[0],h=l[y];for(;i<=a&&c<=y;)if(null==f)f=n[++i];else if(null==d)d=n[--a];else if(null==$)$=l[++c];else if(null==h)h=l[--y];else if(g(f,$))S(f,$),f=n[++i],$=l[++c];else if(g(d,h))S(d,h),d=n[--a],h=l[--y];else if(g(f,h))S(f,h),e.insertBefore(f.p,d.p.nextSibling),f=n[++i],h=l[--y];else if(g(d,$))S(d,$),e.insertBefore(d.p,f.p),d=n[--a],$=l[++c];else{for(r=-1,u=i;u<=a;++u)if(n[u]&&null!==n[u].u&&n[u].u===$.u){r=u;break}r>=0?(s=n[r],s.h!==$.h?o=v(n&&n[c],t,r):(S(s,$),n[r]=void 0,o=s.p),$=l[++c]):(o=v(n&&n[c],t,c),$=l[++c]),o&&f.p.parentNode.insertBefore(o,f.p)}i>a?w(e,null==l[y+1]?null:l[y+1].p,t,l,c,y):c>y&&k(n,i,a)})(t,l,n,o):null!==o?(null!==e.l&&(t.textContent=""),w(t,null,n,o,0,o.length-1)):null!==l&&k(l,0,l.length-1)):e.l!==s&&(t.data=s)},j=e=>{e.o&&e.o.ref&&e.o.ref(null),e.i&&e.i.map(j)},C=(e,n)=>{n&&!e.k&&n["s-p"]&&n["s-p"].push(new Promise((n=>e.k=n)))},M=(e,n)=>{if(e.$|=16,!(4&e.$))return C(e,e.g),ce((()=>O(e,n)));e.$|=512},O=(e,n)=>{const t=e.S;let l;return n&&(l=T(t,"componentWillLoad")),x(l,(()=>P(e,t,n)))},x=(e,n)=>L(e)?e.then(n):n(),L=e=>e instanceof Promise||e&&e.then&&"function"==typeof e.then,P=async(e,n,t)=>{var l;const o=e.m,s=o["s-rc"];t&&(e=>{const n=e.j,t=e.m,l=n.$,o=((e,n)=>{var t;const l=$(n),o=K.get(l);if(e=11===e.nodeType?e:X,o)if("string"==typeof o){let n,s=y.get(e=e.head||e);if(s||y.set(e,s=new Set),!s.has(l)){{n=X.createElement("style"),n.innerHTML=o;const l=null!==(t=Y.C)&&void 0!==t?t:r(X);null!=l&&n.setAttribute("nonce",l),e.insertBefore(n,e.querySelector("link"))}s&&s.add(l)}}else e.adoptedStyleSheets.includes(o)||(e.adoptedStyleSheets=[...e.adoptedStyleSheets,o]);return l})(t.shadowRoot?t.shadowRoot:t.getRootNode(),n);10&l&&(t["s-sc"]=o,t.classList.add(o+"-h"))})(e);E(e,n,o,t),s&&(s.map((e=>e())),o["s-rc"]=void 0);{const n=null!==(l=o["s-p"])&&void 0!==l?l:[],t=()=>N(e);0===n.length?t():(Promise.all(n).then(t),e.$|=4,n.length=0)}},E=(t,l,o,s)=>{try{l=l.render(),t.$&=-17,t.$|=2,((t,l,o=!1)=>{const s=t.m,i=t.j,c=t.M||a(null,null),r=(e=>e&&e.h===f)(l)?l:u(null,null,l);if(n=s.tagName,i.O&&(r.o=r.o||{},i.O.map((([e,n])=>r.o[n]=s[e]))),o&&r.o)for(const e of Object.keys(r.o))s.hasAttribute(e)&&!["key","ref","style","class"].includes(e)&&(r.o[e]=s[e]);r.h=null,r.$|=4,t.M=r,r.p=c.p=s.shadowRoot||s,e=s["s-sc"],S(c,r)})(t,l,s)}catch(e){G(e,t.m)}return null},N=e=>{const n=e.m,t=e.S,l=e.g;64&e.$||(e.$|=64,U(n),T(t,"componentDidLoad"),e.L(n),l||R()),e.k&&(e.k(),e.k=void 0),512&e.$&&ie((()=>M(e,!1))),e.$&=-517},R=()=>{U(X.documentElement),ie((()=>(e=>{const n=Y.ce("appload",{detail:{namespace:"ionicons"}});return e.dispatchEvent(n),n})(Q)))},T=(e,n,t)=>{if(e&&e[n])try{return e[n](t)}catch(e){G(e)}},U=e=>e.classList.add("hydrated"),W=(e,n,t)=>{if(n.P){e.watchers&&(n.N=e.watchers);const l=Object.entries(n.P),o=e.prototype;if(l.map((([e,[l]])=>{(31&l||2&t&&32&l)&&Object.defineProperty(o,e,{get(){return((e,n)=>V(this).R.get(n))(0,e)},set(t){((e,n,t,l)=>{const o=V(e),s=o.m,i=o.R.get(n),r=o.$,u=o.S;if(t=((e,n)=>null==e||c(e)?e:4&n?"false"!==e&&(""===e||!!e):1&n?e+"":e)(t,l.P[n][0]),(!(8&r)||void 0===i)&&t!==i&&(!Number.isNaN(i)||!Number.isNaN(t))&&(o.R.set(n,t),u)){if(l.N&&128&r){const e=l.N[n];e&&e.map((e=>{try{u[e](t,i,n)}catch(e){G(e,s)}}))}2==(18&r)&&M(o,!1)}})(this,e,t,n)},configurable:!0,enumerable:!0})})),1&t){const t=new Map;o.attributeChangedCallback=function(e,n,l){Y.jmp((()=>{const n=t.get(e);if(this.hasOwnProperty(n))l=this[n],delete this[n];else if(o.hasOwnProperty(n)&&"number"==typeof this[n]&&this[n]==l)return;this[n]=(null!==l||"boolean"!=typeof this[n])&&l}))},e.observedAttributes=l.filter((([e,n])=>15&n[0])).map((([e,l])=>{const o=l[1]||e;return t.set(o,e),512&l[0]&&n.O.push([e,o]),o}))}}return e},A=e=>{T(e,"connectedCallback")},H=e=>{T(e,"disconnectedCallback")},q=(e,n={})=>{var t;const l=[],o=n.exclude||[],s=Q.customElements,i=X.head,c=i.querySelector("meta[charset]"),u=X.createElement("style"),a=[];let f,d=!0;Object.assign(Y,n),Y.t=new URL(n.resourcesUrl||"./",X.baseURI).href,e.map((e=>{e[1].map((n=>{const t={$:n[0],v:n[1],P:n[2],T:n[3]};t.P=n[2],t.O=[],t.N={};const i=t.v,c=class extends HTMLElement{constructor(e){super(e),z(e=this,t),1&t.$&&e.attachShadow({mode:"open"})}connectedCallback(){f&&(clearTimeout(f),f=null),d?a.push(this):Y.jmp((()=>(e=>{if(0==(1&Y.$)){const n=V(e),t=n.j,l=()=>{};if(1&n.$)(null==n?void 0:n.S)?A(n.S):(null==n?void 0:n.U)&&n.U.then((()=>A(n.S)));else{n.$|=1;{let t=e;for(;t=t.parentNode||t.host;)if(t["s-p"]){C(n,n.g=t);break}}t.P&&Object.entries(t.P).map((([n,[t]])=>{if(31&t&&e.hasOwnProperty(n)){const t=e[n];delete e[n],e[n]=t}})),(async(e,n,t,l,o)=>{if(0==(32&n.$)){n.$|=32;{if((o=J(t)).then){const e=()=>{};o=await o,e()}o.isProxied||(t.N=o.watchers,W(o,t,2),o.isProxied=!0);const e=()=>{};n.$|=8;try{new o(n)}catch(e){G(e)}n.$&=-9,n.$|=128,e(),A(n.S)}if(o.style){let e=o.style;const n=$(t);if(!K.has(n)){const l=()=>{};((e,n,t)=>{let l=K.get(e);ee&&t?(l=l||new CSSStyleSheet,"string"==typeof l?l=n:l.replaceSync(n)):l=n,K.set(e,l)})(n,e,!!(1&t.$)),l()}}}const s=n.g,i=()=>M(n,!0);s&&s["s-rc"]?s["s-rc"].push(i):i()})(0,n,t)}l()}})(this)))}disconnectedCallback(){Y.jmp((()=>(async()=>{if(0==(1&Y.$)){const e=V(this);(null==e?void 0:e.S)?H(e.S):(null==e?void 0:e.U)&&e.U.then((()=>H(e.S)))}})()))}componentOnReady(){return V(this).U}};t.W=e[0],o.includes(i)||s.get(i)||(l.push(i),s.define(i,W(c,t,1)))}))}));{u.innerHTML=l+"{visibility:hidden}.hydrated{visibility:inherit}",u.setAttribute("data-styles","");const e=null!==(t=Y.C)&&void 0!==t?t:r(X);null!=e&&u.setAttribute("nonce",e),i.insertBefore(u,c?c.nextSibling:i.firstChild)}d=!1,a.length?a.map((e=>e.connectedCallback())):Y.jmp((()=>f=setTimeout(R,30)))},D=e=>Y.C=e,F=new WeakMap,V=e=>F.get(e),_=(e,n)=>F.set(n.S=e,n),z=(e,n)=>{const t={$:0,m:e,j:n,R:new Map};return t.U=new Promise((e=>t.L=e)),e["s-p"]=[],e["s-rc"]=[],F.set(e,t)},B=(e,n)=>n in e,G=(e,n)=>(0,console.error)(e,n),I=new Map,J=e=>{const n=e.v.replace(/-/g,"_"),t=e.W,l=I.get(t);return l?l[n]:import(`./${t}.entry.js`).then((e=>(I.set(t,e),e[n])),G) +/*!__STENCIL_STATIC_IMPORT_SWITCH__*/},K=new Map,Q="undefined"!=typeof window?window:{},X=Q.document||{head:{}},Y={$:0,t:"",jmp:e=>e(),raf:e=>requestAnimationFrame(e),ael:(e,n,t,l)=>e.addEventListener(n,t,l),rel:(e,n,t,l)=>e.removeEventListener(n,t,l),ce:(e,n)=>new CustomEvent(e,n)},Z=e=>Promise.resolve(e),ee=(()=>{try{return new CSSStyleSheet,"function"==typeof(new CSSStyleSheet).replaceSync}catch(e){}return!1})(),ne=[],te=[],le=(e,n)=>l=>{e.push(l),t||(t=!0,n&&4&Y.$?ie(se):Y.raf(se))},oe=e=>{for(let n=0;n<e.length;n++)try{e[n](performance.now())}catch(e){G(e)}e.length=0},se=()=>{oe(ne),oe(te),(t=ne.length>0)&&Y.raf(se)},ie=e=>Z().then(e),ce=le(te,!0);export{f as H,o as a,q as b,d as c,l as g,u as h,Z as p,_ as r,D as s} \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/p-e7ae1e74.system.js b/theme/assets/vendor/ionicons/p-e7ae1e74.system.js new file mode 100644 index 0000000000..35837c99cb --- /dev/null +++ b/theme/assets/vendor/ionicons/p-e7ae1e74.system.js @@ -0,0 +1,2 @@ +var __extends=this&&this.__extends||function(){var e=function(t,n){e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n))e[n]=t[n]};return e(t,n)};return function(t,n){if(typeof n!=="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}();var __awaiter=this&&this.__awaiter||function(e,t,n,r){function a(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,i){function l(e){try{s(r.next(e))}catch(e){i(e)}}function o(e){try{s(r["throw"](e))}catch(e){i(e)}}function s(e){e.done?n(e.value):a(e.value).then(l,o)}s((r=r.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,a,i,l;return l={next:o(0),throw:o(1),return:o(2)},typeof Symbol==="function"&&(l[Symbol.iterator]=function(){return this}),l;function o(e){return function(t){return s([e,t])}}function s(o){if(r)throw new TypeError("Generator is already executing.");while(l&&(l=0,o[0]&&(n=0)),n)try{if(r=1,a&&(i=o[0]&2?a["return"]:o[0]?a["throw"]||((i=a["return"])&&i.call(a),0):a.next)&&!(i=i.call(a,o[1])).done)return i;if(a=0,i)o=[o[0]&2,i.value];switch(o[0]){case 0:case 1:i=o;break;case 4:n.label++;return{value:o[1],done:false};case 5:n.label++;a=o[1];o=[0];continue;case 7:o=n.ops.pop();n.trys.pop();continue;default:if(!(i=n.trys,i=i.length>0&&i[i.length-1])&&(o[0]===6||o[0]===2)){n=0;continue}if(o[0]===3&&(!i||o[1]>i[0]&&o[1]<i[3])){n.label=o[1];break}if(o[0]===6&&n.label<i[1]){n.label=i[1];i=o;break}if(i&&n.label<i[2]){n.label=i[2];n.ops.push(o);break}if(i[2])n.ops.pop();n.trys.pop();continue}o=t.call(e,n)}catch(e){o=[6,e];a=0}finally{r=i=0}if(o[0]&5)throw o[1];return{value:o[0]?o[1]:void 0,done:true}}};var __spreadArray=this&&this.__spreadArray||function(e,t,n){if(n||arguments.length===2)for(var r=0,a=t.length,i;r<a;r++){if(i||!(r in t)){if(!i)i=Array.prototype.slice.call(t,0,r);i[r]=t[r]}}return e.concat(i||Array.prototype.slice.call(t))};System.register([],(function(e,t){"use strict";return{execute:function(){var n=this;var r="ionicons";var a;var i;var l=false;var o=false;var s=e("g",(function(e){var t=new URL(e,be.$resourcesUrl$);return t.origin!==ye.location.origin?t.href:t.pathname}));var f=e("a",(function(e){return be.$resourcesUrl$=e}));var u=function(e,t){if(t===void 0){t=""}{return function(){return}}};var $=function(e,t){{return function(){return}}};var c="{visibility:hidden}.hydrated{visibility:inherit}";var v="http://www.w3.org/1999/xlink";var d={};var h=function(e){return e!=null};var p=function(e){e=typeof e;return e==="object"||e==="function"};function m(e){var t,n,r;return(r=(n=(t=e.head)===null||t===void 0?void 0:t.querySelector('meta[name="csp-nonce"]'))===null||n===void 0?void 0:n.getAttribute("content"))!==null&&r!==void 0?r:undefined}var y=e("h",(function(e,t){var n=[];for(var r=2;r<arguments.length;r++){n[r-2]=arguments[r]}var a=null;var i=null;var l=false;var o=false;var s=[];var f=function(t){for(var n=0;n<t.length;n++){a=t[n];if(Array.isArray(a)){f(a)}else if(a!=null&&typeof a!=="boolean"){if(l=typeof e!=="function"&&!p(a)){a=String(a)}if(l&&o){s[s.length-1].$text$+=a}else{s.push(l?g(null,a):a)}o=l}}};f(n);if(t){if(t.key){i=t.key}{var u=t.className||t.class;if(u){t.class=typeof u!=="object"?u:Object.keys(u).filter((function(e){return u[e]})).join(" ")}}}var $=g(e,null);$.$attrs$=t;if(s.length>0){$.$children$=s}{$.$key$=i}return $}));var g=function(e,t){var n={$flags$:0,$tag$:e,$text$:t,$elm$:null,$children$:null};{n.$attrs$=null}{n.$key$=null}return n};var b=e("H",{});var w=function(e){return e&&e.$tag$===b};var _=function(e,t){if(e!=null&&!p(e)){if(t&4){return e==="false"?false:e===""||!!e}if(t&1){return String(e)}return e}return e};var S=e("c",(function(e){return ue(e).$hostElement$}));var R=function(e,t,n){var r=be.ce(t,n);e.dispatchEvent(r);return r};var k=new WeakMap;var N=function(e,t,n){var r=me.get(e);if(_e&&n){r=r||new CSSStyleSheet;if(typeof r==="string"){r=t}else{r.replaceSync(t)}}else{r=t}me.set(e,r)};var x=function(e,t,n){var r;var a=A(t);var i=me.get(a);e=e.nodeType===11?e:ge;if(i){if(typeof i==="string"){e=e.head||e;var l=k.get(e);var o=void 0;if(!l){k.set(e,l=new Set)}if(!l.has(a)){{o=ge.createElement("style");o.innerHTML=i;var s=(r=be.$nonce$)!==null&&r!==void 0?r:m(ge);if(s!=null){o.setAttribute("nonce",s)}e.insertBefore(o,e.querySelector("link"))}if(l){l.add(a)}}}else if(!e.adoptedStyleSheets.includes(i)){e.adoptedStyleSheets=__spreadArray(__spreadArray([],e.adoptedStyleSheets,true),[i],false)}}return a};var P=function(e){var t=e.$cmpMeta$;var n=e.$hostElement$;var r=t.$flags$;var a=u("attachStyles",t.$tagName$);var i=x(n.shadowRoot?n.shadowRoot:n.getRootNode(),t);if(r&10){n["s-sc"]=i;n.classList.add(i+"-h")}a()};var A=function(e,t){return"sc-"+e.$tagName$};var C=function(e,t,n,r,a,i){if(n!==r){var l=ve(e,t);var o=t.toLowerCase();if(t==="class"){var s=e.classList;var f=j(n);var u=j(r);s.remove.apply(s,f.filter((function(e){return e&&!u.includes(e)})));s.add.apply(s,u.filter((function(e){return e&&!f.includes(e)})))}else if(t==="style"){{for(var $ in n){if(!r||r[$]==null){if($.includes("-")){e.style.removeProperty($)}else{e.style[$]=""}}}}for(var $ in r){if(!n||r[$]!==n[$]){if($.includes("-")){e.style.setProperty($,r[$])}else{e.style[$]=r[$]}}}}else if(t==="key");else if(t==="ref"){if(r){r(e)}}else if(!l&&t[0]==="o"&&t[1]==="n"){if(t[2]==="-"){t=t.slice(3)}else if(ve(ye,o)){t=o.slice(2)}else{t=o[2]+t.slice(3)}if(n){be.rel(e,t,n,false)}if(r){be.ael(e,t,r,false)}}else{var c=p(r);if((l||c&&r!==null)&&!a){try{if(!e.tagName.includes("-")){var d=r==null?"":r;if(t==="list"){l=false}else if(n==null||e[t]!=d){e[t]=d}}else{e[t]=r}}catch(e){}}var h=false;{if(o!==(o=o.replace(/^xlink\:?/,""))){t=o;h=true}}if(r==null||r===false){if(r!==false||e.getAttribute(t)===""){if(h){e.removeAttributeNS(v,t)}else{e.removeAttribute(t)}}}else if((!l||i&4||a)&&!c){r=r===true?"":r;if(h){e.setAttributeNS(v,t,r)}else{e.setAttribute(t,r)}}}}};var E=/\s/;var j=function(e){return!e?[]:e.split(E)};var M=function(e,t,n,r){var a=t.$elm$.nodeType===11&&t.$elm$.host?t.$elm$.host:t.$elm$;var i=e&&e.$attrs$||d;var l=t.$attrs$||d;{for(r in i){if(!(r in l)){C(a,r,i[r],undefined,n,t.$flags$)}}}for(r in l){C(a,r,i[r],l[r],n,t.$flags$)}};var I=function(e,t,n,r){var i=t.$children$[n];var o=0;var s;var f;if(i.$text$!==null){s=i.$elm$=ge.createTextNode(i.$text$)}else{s=i.$elm$=ge.createElement(i.$tag$);{M(null,i,l)}if(h(a)&&s["s-si"]!==a){s.classList.add(s["s-si"]=a)}if(i.$children$){for(o=0;o<i.$children$.length;++o){f=I(e,i,o);if(f){s.appendChild(f)}}}}return s};var O=function(e,t,n,r,a,l){var o=e;var s;if(o.shadowRoot&&o.tagName===i){o=o.shadowRoot}for(;a<=l;++a){if(r[a]){s=I(null,n,a);if(s){r[a].$elm$=s;o.insertBefore(s,t)}}}};var L=function(e,t,n){for(var r=t;r<=n;++r){var a=e[r];if(a){var i=a.$elm$;B(a);if(i){i.remove()}}}};var T=function(e,t,n,r){var a=0;var i=0;var l=0;var o=0;var s=t.length-1;var f=t[0];var u=t[s];var $=r.length-1;var c=r[0];var v=r[$];var d;var h;while(a<=s&&i<=$){if(f==null){f=t[++a]}else if(u==null){u=t[--s]}else if(c==null){c=r[++i]}else if(v==null){v=r[--$]}else if(z(f,c)){U(f,c);f=t[++a];c=r[++i]}else if(z(u,v)){U(u,v);u=t[--s];v=r[--$]}else if(z(f,v)){U(f,v);e.insertBefore(f.$elm$,u.$elm$.nextSibling);f=t[++a];v=r[--$]}else if(z(u,c)){U(u,c);e.insertBefore(u.$elm$,f.$elm$);u=t[--s];c=r[++i]}else{l=-1;{for(o=a;o<=s;++o){if(t[o]&&t[o].$key$!==null&&t[o].$key$===c.$key$){l=o;break}}}if(l>=0){h=t[l];if(h.$tag$!==c.$tag$){d=I(t&&t[i],n,l)}else{U(h,c);t[l]=undefined;d=h.$elm$}c=r[++i]}else{d=I(t&&t[i],n,i);c=r[++i]}if(d){{f.$elm$.parentNode.insertBefore(d,f.$elm$)}}}}if(a>s){O(e,r[$+1]==null?null:r[$+1].$elm$,n,r,i,$)}else if(i>$){L(t,a,s)}};var z=function(e,t){if(e.$tag$===t.$tag$){{return e.$key$===t.$key$}}return false};var U=function(e,t){var n=t.$elm$=e.$elm$;var r=e.$children$;var a=t.$children$;var i=t.$text$;if(i===null){{{M(e,t,l)}}if(r!==null&&a!==null){T(n,r,t,a)}else if(a!==null){if(e.$text$!==null){n.textContent=""}O(n,null,t,a,0,a.length-1)}else if(r!==null){L(r,0,r.length-1)}}else if(e.$text$!==i){n.data=i}};var B=function(e){{e.$attrs$&&e.$attrs$.ref&&e.$attrs$.ref(null);e.$children$&&e.$children$.map(B)}};var q=function(e,t,n){if(n===void 0){n=false}var r=e.$hostElement$;var l=e.$cmpMeta$;var o=e.$vnode$||g(null,null);var s=w(t)?t:y(null,null,t);i=r.tagName;if(l.$attrsToReflect$){s.$attrs$=s.$attrs$||{};l.$attrsToReflect$.map((function(e){var t=e[0],n=e[1];return s.$attrs$[n]=r[t]}))}if(n&&s.$attrs$){for(var f=0,u=Object.keys(s.$attrs$);f<u.length;f++){var $=u[f];if(r.hasAttribute($)&&!["key","ref","style","class"].includes($)){s.$attrs$[$]=r[$]}}}s.$tag$=null;s.$flags$|=4;e.$vnode$=s;s.$elm$=o.$elm$=r.shadowRoot||r;{a=r["s-sc"]}U(o,s)};var H=function(e,t){if(t&&!e.$onRenderResolve$&&t["s-p"]){t["s-p"].push(new Promise((function(t){return e.$onRenderResolve$=t})))}};var V=function(e,t){{e.$flags$|=16}if(e.$flags$&4){e.$flags$|=512;return}H(e,e.$ancestorComponent$);var n=function(){return W(e,t)};return Ae(n)};var W=function(e,t){var n=u("scheduleUpdate",e.$cmpMeta$.$tagName$);var r=e.$lazyInstance$;var a;if(t){{a=X(r,"componentWillLoad")}}n();return D(a,(function(){return G(e,r,t)}))};var D=function(e,t){return F(e)?e.then(t):t()};var F=function(e){return e instanceof Promise||e&&e.then&&typeof e.then==="function"};var G=function(e,t,r){return __awaiter(n,void 0,void 0,(function(){var n,a,i,l,o,s,f;return __generator(this,(function($){a=e.$hostElement$;i=u("update",e.$cmpMeta$.$tagName$);l=a["s-rc"];if(r){P(e)}o=u("render",e.$cmpMeta$.$tagName$);{J(e,t,a,r)}if(l){l.map((function(e){return e()}));a["s-rc"]=undefined}o();i();{s=(n=a["s-p"])!==null&&n!==void 0?n:[];f=function(){return K(e)};if(s.length===0){f()}else{Promise.all(s).then(f);e.$flags$|=4;s.length=0}}return[2]}))}))};var J=function(e,t,n,r){try{t=t.render();{e.$flags$&=~16}{e.$flags$|=2}{{{q(e,t,r)}}}}catch(t){de(t,e.$hostElement$)}return null};var K=function(e){var t=e.$cmpMeta$.$tagName$;var n=e.$hostElement$;var r=u("postUpdate",t);var a=e.$lazyInstance$;var i=e.$ancestorComponent$;if(!(e.$flags$&64)){e.$flags$|=64;{Y(n)}{X(a,"componentDidLoad")}r();{e.$onReadyResolve$(n);if(!i){Q()}}}else{r()}{if(e.$onRenderResolve$){e.$onRenderResolve$();e.$onRenderResolve$=undefined}if(e.$flags$&512){Pe((function(){return V(e,false)}))}e.$flags$&=~(4|512)}};var Q=function(e){{Y(ge.documentElement)}Pe((function(){return R(ye,"appload",{detail:{namespace:r}})}))};var X=function(e,t,n){if(e&&e[t]){try{return e[t](n)}catch(e){de(e)}}return undefined};var Y=function(e){return e.classList.add("hydrated")};var Z=function(e,t){return ue(e).$instanceValues$.get(t)};var ee=function(e,t,n,r){var a=ue(e);var i=a.$hostElement$;var l=a.$instanceValues$.get(t);var o=a.$flags$;var s=a.$lazyInstance$;n=_(n,r.$members$[t][0]);var f=Number.isNaN(l)&&Number.isNaN(n);var u=n!==l&&!f;if((!(o&8)||l===undefined)&&u){a.$instanceValues$.set(t,n);if(s){if(r.$watchers$&&o&128){var $=r.$watchers$[t];if($){$.map((function(e){try{s[e](n,l,t)}catch(e){de(e,i)}}))}}if((o&(2|16))===2){V(a,false)}}}};var te=function(e,t,n){if(t.$members$){if(e.watchers){t.$watchers$=e.watchers}var r=Object.entries(t.$members$);var a=e.prototype;r.map((function(e){var r=e[0],i=e[1][0];if(i&31||n&2&&i&32){Object.defineProperty(a,r,{get:function(){return Z(this,r)},set:function(e){ee(this,r,e,t)},configurable:true,enumerable:true})}}));if(n&1){var i=new Map;a.attributeChangedCallback=function(e,t,n){var r=this;be.jmp((function(){var t=i.get(e);if(r.hasOwnProperty(t)){n=r[t];delete r[t]}else if(a.hasOwnProperty(t)&&typeof r[t]==="number"&&r[t]==n){return}r[t]=n===null&&typeof r[t]==="boolean"?false:n}))};e.observedAttributes=r.filter((function(e){var t=e[0],n=e[1];return n[0]&15})).map((function(e){var n=e[0],r=e[1];var a=r[1]||n;i.set(a,n);if(r[0]&512){t.$attrsToReflect$.push([n,a])}return a}))}}return e};var ne=function(e,t,r,a,i){return __awaiter(n,void 0,void 0,(function(){var e,n,a,l,o,s,f;return __generator(this,(function(c){switch(c.label){case 0:if(!((t.$flags$&32)===0))return[3,3];t.$flags$|=32;i=pe(r);if(!i.then)return[3,2];e=$();return[4,i];case 1:i=c.sent();e();c.label=2;case 2:if(!i.isProxied){{r.$watchers$=i.watchers}te(i,r,2);i.isProxied=true}n=u("createInstance",r.$tagName$);{t.$flags$|=8}try{new i(t)}catch(e){de(e)}{t.$flags$&=~8}{t.$flags$|=128}n();re(t.$lazyInstance$);if(i.style){a=i.style;l=A(r);if(!me.has(l)){o=u("registerStyles",r.$tagName$);N(l,a,!!(r.$flags$&1));o()}}c.label=3;case 3:s=t.$ancestorComponent$;f=function(){return V(t,true)};if(s&&s["s-rc"]){s["s-rc"].push(f)}else{f()}return[2]}}))}))};var re=function(e){{X(e,"connectedCallback")}};var ae=function(e){if((be.$flags$&1)===0){var t=ue(e);var n=t.$cmpMeta$;var r=u("connectedCallback",n.$tagName$);if(!(t.$flags$&1)){t.$flags$|=1;{var a=e;while(a=a.parentNode||a.host){if(a["s-p"]){H(t,t.$ancestorComponent$=a);break}}}if(n.$members$){Object.entries(n.$members$).map((function(t){var n=t[0],r=t[1][0];if(r&31&&e.hasOwnProperty(n)){var a=e[n];delete e[n];e[n]=a}}))}{ne(e,t,n)}}else{if(t===null||t===void 0?void 0:t.$lazyInstance$){re(t.$lazyInstance$)}else if(t===null||t===void 0?void 0:t.$onReadyPromise$){t.$onReadyPromise$.then((function(){return re(t.$lazyInstance$)}))}}r()}};var ie=function(e){{X(e,"disconnectedCallback")}};var le=function(e){return __awaiter(n,void 0,void 0,(function(){var t;return __generator(this,(function(n){if((be.$flags$&1)===0){t=ue(e);if(t===null||t===void 0?void 0:t.$lazyInstance$){ie(t.$lazyInstance$)}else if(t===null||t===void 0?void 0:t.$onReadyPromise$){t.$onReadyPromise$.then((function(){return ie(t.$lazyInstance$)}))}}return[2]}))}))};var oe=e("b",(function(e,t){if(t===void 0){t={}}var n;var r=u();var a=[];var i=t.exclude||[];var l=ye.customElements;var o=ge.head;var s=o.querySelector("meta[charset]");var f=ge.createElement("style");var $=[];var v;var d=true;Object.assign(be,t);be.$resourcesUrl$=new URL(t.resourcesUrl||"./",ge.baseURI).href;e.map((function(e){e[1].map((function(t){var n={$flags$:t[0],$tagName$:t[1],$members$:t[2],$listeners$:t[3]};{n.$members$=t[2]}{n.$attrsToReflect$=[]}{n.$watchers$={}}var r=n.$tagName$;var o=function(e){__extends(t,e);function t(t){var r=e.call(this,t)||this;t=r;ce(t,n);if(n.$flags$&1){{{t.attachShadow({mode:"open"})}}}return r}t.prototype.connectedCallback=function(){var e=this;if(v){clearTimeout(v);v=null}if(d){$.push(this)}else{be.jmp((function(){return ae(e)}))}};t.prototype.disconnectedCallback=function(){var e=this;be.jmp((function(){return le(e)}))};t.prototype.componentOnReady=function(){return ue(this).$onReadyPromise$};return t}(HTMLElement);n.$lazyBundleId$=e[0];if(!i.includes(r)&&!l.get(r)){a.push(r);l.define(r,te(o,n,1))}}))}));{f.innerHTML=a+c;f.setAttribute("data-styles","");var h=(n=be.$nonce$)!==null&&n!==void 0?n:m(ge);if(h!=null){f.setAttribute("nonce",h)}o.insertBefore(f,s?s.nextSibling:o.firstChild)}d=false;if($.length){$.map((function(e){return e.connectedCallback()}))}else{{be.jmp((function(){return v=setTimeout(Q,30)}))}}r()}));var se=e("s",(function(e){return be.$nonce$=e}));var fe=new WeakMap;var ue=function(e){return fe.get(e)};var $e=e("r",(function(e,t){return fe.set(t.$lazyInstance$=e,t)}));var ce=function(e,t){var n={$flags$:0,$hostElement$:e,$cmpMeta$:t,$instanceValues$:new Map};{n.$onReadyPromise$=new Promise((function(e){return n.$onReadyResolve$=e}));e["s-p"]=[];e["s-rc"]=[]}return fe.set(e,n)};var ve=function(e,t){return t in e};var de=function(e,t){return(0,console.error)(e,t)};var he=new Map;var pe=function(e,n,r){var a=e.$tagName$.replace(/-/g,"_");var i=e.$lazyBundleId$;var l=he.get(i);if(l){return l[a]} +/*!__STENCIL_STATIC_IMPORT_SWITCH__*/return t.import("./".concat(i,".entry.js").concat("")).then((function(e){{he.set(i,e)}return e[a]}),de)};var me=new Map;var ye=typeof window!=="undefined"?window:{};var ge=ye.document||{head:{}};var be={$flags$:0,$resourcesUrl$:"",jmp:function(e){return e()},raf:function(e){return requestAnimationFrame(e)},ael:function(e,t,n,r){return e.addEventListener(t,n,r)},rel:function(e,t,n,r){return e.removeEventListener(t,n,r)},ce:function(e,t){return new CustomEvent(e,t)}};var we=e("p",(function(e){return Promise.resolve(e)}));var _e=function(){try{new CSSStyleSheet;return typeof(new CSSStyleSheet).replaceSync==="function"}catch(e){}return false}();var Se=[];var Re=[];var ke=function(e,t){return function(n){e.push(n);if(!o){o=true;if(t&&be.$flags$&4){Pe(xe)}else{be.raf(xe)}}}};var Ne=function(e){for(var t=0;t<e.length;t++){try{e[t](performance.now())}catch(e){de(e)}}e.length=0};var xe=function(){Ne(Se);{Ne(Re);if(o=Se.length>0){be.raf(xe)}}};var Pe=function(e){return we().then(e)};var Ae=ke(Re,true)}}})); \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/arrow-back-outline.svg b/theme/assets/vendor/ionicons/svg/arrow-back-outline.svg new file mode 100644 index 0000000000..7270229443 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/arrow-back-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M244 400L100 256l144-144M120 256h292"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/business-outline.svg b/theme/assets/vendor/ionicons/svg/business-outline.svg new file mode 100644 index 0000000000..303b9bbef1 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/business-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M176 416v64M80 32h192a32 32 0 0132 32v412a4 4 0 01-4 4H48h0V64a32 32 0 0132-32zM320 192h112a32 32 0 0132 32v256h0-160 0V208a16 16 0 0116-16z"/><path d="M98.08 431.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM98.08 351.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM98.08 271.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM98.08 191.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM98.08 111.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM178.08 351.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM178.08 271.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM178.08 191.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM178.08 111.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM258.08 431.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM258.08 351.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM258.08 271.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79z"/><ellipse cx="256" cy="176" rx="15.95" ry="16.03" transform="rotate(-45 255.99 175.996)"/><path d="M258.08 111.87a16 16 0 1113.79-13.79 16 16 0 01-13.79 13.79zM400 400a16 16 0 1016 16 16 16 0 00-16-16zM400 320a16 16 0 1016 16 16 16 0 00-16-16zM400 240a16 16 0 1016 16 16 16 0 00-16-16zM336 400a16 16 0 1016 16 16 16 0 00-16-16zM336 320a16 16 0 1016 16 16 16 0 00-16-16zM336 240a16 16 0 1016 16 16 16 0 00-16-16z"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/chevron-back-outline.svg b/theme/assets/vendor/ionicons/svg/chevron-back-outline.svg new file mode 100644 index 0000000000..e0e5a234f7 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/chevron-back-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M328 112L184 256l144 144"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/chevron-down-outline.svg b/theme/assets/vendor/ionicons/svg/chevron-down-outline.svg new file mode 100644 index 0000000000..068f036a5e --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/chevron-down-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M112 184l144 144 144-144"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/chevron-forward-outline.svg b/theme/assets/vendor/ionicons/svg/chevron-forward-outline.svg new file mode 100644 index 0000000000..ef4a8d1df5 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/chevron-forward-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48" d="M184 112l144 144-144 144"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/close-outline.svg b/theme/assets/vendor/ionicons/svg/close-outline.svg new file mode 100644 index 0000000000..d1ccc18537 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/close-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M368 368L144 144M368 144L144 368"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/code-slash-outline.svg b/theme/assets/vendor/ionicons/svg/code-slash-outline.svg new file mode 100644 index 0000000000..205e3a91b1 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/code-slash-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M160 368L32 256l128-112M352 368l128-112-128-112M304 96l-96 320"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/copy-outline.svg b/theme/assets/vendor/ionicons/svg/copy-outline.svg new file mode 100644 index 0000000000..92638a47dc --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/copy-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><rect x="128" y="128" width="336" height="336" rx="57" ry="57" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32"/><path d="M383.5 128l.5-24a56.16 56.16 0 00-56-56H112a64.19 64.19 0 00-64 64v216a56.16 56.16 0 0056 56h24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/folder-open-outline.svg b/theme/assets/vendor/ionicons/svg/folder-open-outline.svg new file mode 100644 index 0000000000..05a4374f5f --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/folder-open-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M64 192v-72a40 40 0 0140-40h75.89a40 40 0 0122.19 6.72l27.84 18.56a40 40 0 0022.19 6.72H408a40 40 0 0140 40v40" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path d="M479.9 226.55L463.68 392a40 40 0 01-39.93 40H88.25a40 40 0 01-39.93-40L32.1 226.55A32 32 0 0164 192h384.1a32 32 0 0131.8 34.55z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/heart-outline.svg b/theme/assets/vendor/ionicons/svg/heart-outline.svg new file mode 100644 index 0000000000..532fc23468 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/heart-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M352.92 80C288 80 256 144 256 144s-32-64-96.92-64c-52.76 0-94.54 44.14-95.08 96.81-1.1 109.33 86.73 187.08 183 252.42a16 16 0 0018 0c96.26-65.34 184.09-143.09 183-252.42-.54-52.67-42.32-96.81-95.08-96.81z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/home-outline.svg b/theme/assets/vendor/ionicons/svg/home-outline.svg new file mode 100644 index 0000000000..3ada1aabd1 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/home-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M80 212v236a16 16 0 0016 16h96V328a24 24 0 0124-24h80a24 24 0 0124 24v136h96a16 16 0 0016-16V212" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path d="M480 256L266.89 52c-5-5.28-16.69-5.34-21.78 0L32 256M400 179V64h-48v69" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/logo-github.svg b/theme/assets/vendor/ionicons/svg/logo-github.svg new file mode 100644 index 0000000000..769a9d3146 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/logo-github.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 32C132.3 32 32 134.9 32 261.7c0 101.5 64.2 187.5 153.2 217.9a17.56 17.56 0 003.8.4c8.3 0 11.5-6.1 11.5-11.4 0-5.5-.2-19.9-.3-39.1a102.4 102.4 0 01-22.6 2.7c-43.1 0-52.9-33.5-52.9-33.5-10.2-26.5-24.9-33.6-24.9-33.6-19.5-13.7-.1-14.1 1.4-14.1h.1c22.5 2 34.3 23.8 34.3 23.8 11.2 19.6 26.2 25.1 39.6 25.1a63 63 0 0025.6-6c2-14.8 7.8-24.9 14.2-30.7-49.7-5.8-102-25.5-102-113.5 0-25.1 8.7-45.6 23-61.6-2.3-5.8-10-29.2 2.2-60.8a18.64 18.64 0 015-.5c8.1 0 26.4 3.1 56.6 24.1a208.21 208.21 0 01112.2 0c30.2-21 48.5-24.1 56.6-24.1a18.64 18.64 0 015 .5c12.2 31.6 4.5 55 2.2 60.8 14.3 16.1 23 36.6 23 61.6 0 88.2-52.4 107.6-102.3 113.3 8 7.1 15.2 21.1 15.2 42.5 0 30.7-.3 55.5-.3 63 0 5.4 3.1 11.5 11.4 11.5a19.35 19.35 0 004-.4C415.9 449.2 480 363.1 480 261.7 480 134.9 379.7 32 256 32z"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/medical-outline.svg b/theme/assets/vendor/ionicons/svg/medical-outline.svg new file mode 100644 index 0000000000..7d43338aa4 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/medical-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M429.93 174.27l-16.47-28.59a15.49 15.49 0 00-21.15-5.7l-98.39 57a4 4 0 01-6-3.5L288 80a16 16 0 00-16-16h-32a16 16 0 00-16 16l.07 113.57a4 4 0 01-6 3.5l-98.39-57a15.49 15.49 0 00-21.15 5.7l-16.46 28.6a15.42 15.42 0 005.69 21.1l98.49 57.08a4 4 0 010 6.9l-98.49 57.08a15.54 15.54 0 00-5.69 21.1l16.47 28.59a15.49 15.49 0 0021.15 5.7l98.39-57a4 4 0 016 3.5L224 432a16 16 0 0016 16h32a16 16 0 0016-16l-.07-113.67a4 4 0 016-3.5l98.39 57a15.49 15.49 0 0021.15-5.7l16.47-28.59a15.42 15.42 0 00-5.69-21.1l-98.49-57.08a4 4 0 010-6.9l98.49-57.08a15.51 15.51 0 005.68-21.11z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/megaphone-outline.svg b/theme/assets/vendor/ionicons/svg/megaphone-outline.svg new file mode 100644 index 0000000000..420736a5f6 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/megaphone-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M407.94 52.22S321.3 160 240 160H80a16 16 0 00-16 16v96a16 16 0 0016 16h160c81.3 0 167.94 108.23 167.94 108.23 6.06 8 24.06 2.52 24.06-9.83V62c0-12.31-17-18.82-24.06-9.78zM64 256s-16-6-16-32 16-32 16-32M448 246s16-4.33 16-22-16-22-16-22M256 160v128M112 160v128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path d="M144 288v168a8 8 0 008 8h53a16 16 0 0015.29-20.73C211.91 416.39 192 386.08 192 336h16a16 16 0 0016-16v-16a16 16 0 00-16-16h-16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/menu-outline.svg b/theme/assets/vendor/ionicons/svg/menu-outline.svg new file mode 100644 index 0000000000..f5696b3abf --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/menu-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M80 160h352M80 256h352M80 352h352"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/moon-outline.svg b/theme/assets/vendor/ionicons/svg/moon-outline.svg new file mode 100644 index 0000000000..4faa83b60e --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/moon-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M160 136c0-30.62 4.51-61.61 16-88C99.57 81.27 48 159.32 48 248c0 119.29 96.71 216 216 216 88.68 0 166.73-51.57 200-128-26.39 11.49-57.38 16-88 16-119.29 0-216-96.71-216-216z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/people-outline.svg b/theme/assets/vendor/ionicons/svg/people-outline.svg new file mode 100644 index 0000000000..35936affc8 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/people-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M402 168c-2.93 40.67-33.1 72-66 72s-63.12-31.32-66-72c-3-42.31 26.37-72 66-72s69 30.46 66 72z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path d="M336 304c-65.17 0-127.84 32.37-143.54 95.41-2.08 8.34 3.15 16.59 11.72 16.59h263.65c8.57 0 13.77-8.25 11.72-16.59C463.85 335.36 401.18 304 336 304z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path d="M200 185.94c-2.34 32.48-26.72 58.06-53 58.06s-50.7-25.57-53-58.06C91.61 152.15 115.34 128 147 128s55.39 24.77 53 57.94z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path d="M206 306c-18.05-8.27-37.93-11.45-59-11.45-52 0-102.1 25.85-114.65 76.2-1.65 6.66 2.53 13.25 9.37 13.25H154" fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/person-circle-outline.svg b/theme/assets/vendor/ionicons/svg/person-circle-outline.svg new file mode 100644 index 0000000000..1f6732c47c --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/person-circle-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M258.9 48C141.92 46.42 46.42 141.92 48 258.9c1.56 112.19 92.91 203.54 205.1 205.1 117 1.6 212.48-93.9 210.88-210.88C462.44 140.91 371.09 49.56 258.9 48zm126.42 327.25a4 4 0 01-6.14-.32 124.27 124.27 0 00-32.35-29.59C321.37 329 289.11 320 256 320s-65.37 9-90.83 25.34a124.24 124.24 0 00-32.35 29.58 4 4 0 01-6.14.32A175.32 175.32 0 0180 259c-1.63-97.31 78.22-178.76 175.57-179S432 158.81 432 256a175.32 175.32 0 01-46.68 119.25z"/><path d="M256 144c-19.72 0-37.55 7.39-50.22 20.82s-19 32-17.57 51.93C191.11 256 221.52 288 256 288s64.83-32 67.79-71.24c1.48-19.74-4.8-38.14-17.68-51.82C293.39 151.44 275.59 144 256 144z"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/rocket-outline.svg b/theme/assets/vendor/ionicons/svg/rocket-outline.svg new file mode 100644 index 0000000000..da5acc6816 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/rocket-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M461.81 53.81a4.4 4.4 0 00-3.3-3.39c-54.38-13.3-180 34.09-248.13 102.17a294.9 294.9 0 00-33.09 39.08c-21-1.9-42-.3-59.88 7.5-50.49 22.2-65.18 80.18-69.28 105.07a9 9 0 009.8 10.4l81.07-8.9a180.29 180.29 0 001.1 18.3 18.15 18.15 0 005.3 11.09l31.39 31.39a18.15 18.15 0 0011.1 5.3 179.91 179.91 0 0018.19 1.1l-8.89 81a9 9 0 0010.39 9.79c24.9-4 83-18.69 105.07-69.17 7.8-17.9 9.4-38.79 7.6-59.69a293.91 293.91 0 0039.19-33.09c68.38-68 115.47-190.86 102.37-247.95zM298.66 213.67a42.7 42.7 0 1160.38 0 42.65 42.65 0 01-60.38 0z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path d="M109.64 352a45.06 45.06 0 00-26.35 12.84C65.67 382.52 64 448 64 448s65.52-1.67 83.15-19.31A44.73 44.73 0 00160 402.32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/search-outline.svg b/theme/assets/vendor/ionicons/svg/search-outline.svg new file mode 100644 index 0000000000..d3686bee60 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/search-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M221.09 64a157.09 157.09 0 10157.09 157.09A157.1 157.1 0 00221.09 64z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M338.29 338.29L448 448"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/server-outline.svg b/theme/assets/vendor/ionicons/svg/server-outline.svg new file mode 100644 index 0000000000..8761e8f5aa --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/server-outline.svg @@ -0,0 +1 @@ +<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><ellipse cx="256" cy="112" rx="176" ry="80" stroke="currentColor" stroke-width="32" stroke-linecap="round" stroke-linejoin="round"/><path d="M432 112v288c0 44.183-78.798 80-176 80S80 444.183 80 400V112" stroke="currentColor" stroke-width="32" stroke-linecap="round" stroke-linejoin="round"/><path d="M432 256c0 44.183-78.798 80-176 80S80 300.183 80 256" stroke="currentColor" stroke-width="32" stroke-linecap="round" stroke-linejoin="round"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/settings-outline.svg b/theme/assets/vendor/ionicons/svg/settings-outline.svg new file mode 100644 index 0000000000..6d272c44c0 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/settings-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M262.29 192.31a64 64 0 1057.4 57.4 64.13 64.13 0 00-57.4-57.4zM416.39 256a154.34 154.34 0 01-1.53 20.79l45.21 35.46a10.81 10.81 0 012.45 13.75l-42.77 74a10.81 10.81 0 01-13.14 4.59l-44.9-18.08a16.11 16.11 0 00-15.17 1.75A164.48 164.48 0 01325 400.8a15.94 15.94 0 00-8.82 12.14l-6.73 47.89a11.08 11.08 0 01-10.68 9.17h-85.54a11.11 11.11 0 01-10.69-8.87l-6.72-47.82a16.07 16.07 0 00-9-12.22 155.3 155.3 0 01-21.46-12.57 16 16 0 00-15.11-1.71l-44.89 18.07a10.81 10.81 0 01-13.14-4.58l-42.77-74a10.8 10.8 0 012.45-13.75l38.21-30a16.05 16.05 0 006-14.08c-.36-4.17-.58-8.33-.58-12.5s.21-8.27.58-12.35a16 16 0 00-6.07-13.94l-38.19-30A10.81 10.81 0 0149.48 186l42.77-74a10.81 10.81 0 0113.14-4.59l44.9 18.08a16.11 16.11 0 0015.17-1.75A164.48 164.48 0 01187 111.2a15.94 15.94 0 008.82-12.14l6.73-47.89A11.08 11.08 0 01213.23 42h85.54a11.11 11.11 0 0110.69 8.87l6.72 47.82a16.07 16.07 0 009 12.22 155.3 155.3 0 0121.46 12.57 16 16 0 0015.11 1.71l44.89-18.07a10.81 10.81 0 0113.14 4.58l42.77 74a10.8 10.8 0 01-2.45 13.75l-38.21 30a16.05 16.05 0 00-6.05 14.08c.33 4.14.55 8.3.55 12.47z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/share-social-outline.svg b/theme/assets/vendor/ionicons/svg/share-social-outline.svg new file mode 100644 index 0000000000..24f5f72fa7 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/share-social-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><circle cx="128" cy="256" r="48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><circle cx="384" cy="112" r="48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><circle cx="384" cy="400" r="48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M169.83 279.53l172.34 96.94M342.17 135.53l-172.34 96.94"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/shield-checkmark-outline.svg b/theme/assets/vendor/ionicons/svg/shield-checkmark-outline.svg new file mode 100644 index 0000000000..0ce6e1f519 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/shield-checkmark-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M336 176L225.2 304 176 255.8"/><path d="M463.1 112.37C373.68 96.33 336.71 84.45 256 48c-80.71 36.45-117.68 48.33-207.1 64.37C32.7 369.13 240.58 457.79 256 464c15.42-6.21 223.3-94.87 207.1-351.63z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/sparkles-outline.svg b/theme/assets/vendor/ionicons/svg/sparkles-outline.svg new file mode 100644 index 0000000000..f60cb23155 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/sparkles-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M259.92 262.91L216.4 149.77a9 9 0 00-16.8 0l-43.52 113.14a9 9 0 01-5.17 5.17L37.77 311.6a9 9 0 000 16.8l113.14 43.52a9 9 0 015.17 5.17l43.52 113.14a9 9 0 0016.8 0l43.52-113.14a9 9 0 015.17-5.17l113.14-43.52a9 9 0 000-16.8l-113.14-43.52a9 9 0 01-5.17-5.17zM108 68L88 16 68 68 16 88l52 20 20 52 20-52 52-20-52-20zM426.67 117.33L400 48l-26.67 69.33L304 144l69.33 26.67L400 240l26.67-69.33L496 144l-69.33-26.67z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/sunny-outline.svg b/theme/assets/vendor/ionicons/svg/sunny-outline.svg new file mode 100644 index 0000000000..9eb10ae0d2 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/sunny-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M256 48v48M256 416v48M403.08 108.92l-33.94 33.94M142.86 369.14l-33.94 33.94M464 256h-48M96 256H48M403.08 403.08l-33.94-33.94M142.86 142.86l-33.94-33.94"/><circle cx="256" cy="256" r="80" fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32"/></svg> \ No newline at end of file diff --git a/theme/assets/vendor/ionicons/svg/terminal-outline.svg b/theme/assets/vendor/ionicons/svg/terminal-outline.svg new file mode 100644 index 0000000000..5db1e73ab4 --- /dev/null +++ b/theme/assets/vendor/ionicons/svg/terminal-outline.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><rect x="32" y="48" width="448" height="416" rx="48" ry="48" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32"/><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M96 112l80 64-80 64M192 240h64"/></svg> \ No newline at end of file diff --git a/theme/hooks/image_metadata.py b/theme/hooks/image_metadata.py index be9f83849a..0c97de9a49 100644 --- a/theme/hooks/image_metadata.py +++ b/theme/hooks/image_metadata.py @@ -14,21 +14,7 @@ _IMAGE_TAG = re.compile(r"<img\b[^>]*>", re.IGNORECASE) _SOURCE = re.compile(r"\bsrc\s*=\s*([\"'])(.*?)\1", re.IGNORECASE | re.DOTALL) _DIMENSION = re.compile(r"^\s*([0-9]+(?:\.[0-9]+)?)\s*(?:px)?\s*$", re.IGNORECASE) -_CLASS = re.compile(r"\bclass\s*=\s*([\"'])(.*?)\1", re.IGNORECASE | re.DOTALL) _STYLE = re.compile(r"\bstyle\s*=\s*([\"'])(.*?)\1", re.IGNORECASE | re.DOTALL) -_ADMONITION_TITLE = re.compile( - r"(?P<container><(?P<tag>div|details)\b(?P<attributes>[^>]*)>)" - r"(?P<space>\s*)" - r"(?P<title><p\b(?=[^>]*\bclass\s*=\s*[\"'][^\"']*\badmonition-title\b)[^>]*>|<summary\b[^>]*>)", - re.IGNORECASE | re.DOTALL, -) -_UNTITLED_ADMONITION = re.compile( - r"(?P<container><(?P<tag>div|details)\b" - r"(?=[^>]*\bclass\s*=\s*[\"'][^\"']*\badmonition\b)(?P<attributes>[^>]*)>)" - r"(?P<space>\s*)" - r"(?P<first><(?!/)[^>]+>)", - re.IGNORECASE | re.DOTALL, -) _WIDE_SCREENSHOT_MINIMUM = 280 _files_identity = None @@ -154,61 +140,6 @@ def _add_attributes(tag: str, attributes: list[tuple[str, str]]) -> str: return f"{tag[:end]}{insertion}{tag[end:]}" -def _admonition_icon(attributes: str) -> str: - """Select a solid Ionicon that matches the generated admonition type.""" - - match = _CLASS.search(attributes) - classes = set(match.group(2).lower().split()) if match else set() - if classes & {"danger", "failure", "bug"}: - return "alert-circle" - if classes & {"warning", "caution", "attention"}: - return "warning" - if classes & {"success"}: - return "checkmark-circle" - if classes & {"tip", "hint"}: - return "bulb" - if classes & {"abstract", "summary"}: - return "document-text" - if classes & {"example"}: - return "flask" - if classes & {"quote"}: - return "chatbubble" - return "information-circle" - - -def _add_admonition_icons(html: str) -> str: - """Emit status icons at build time, avoiding client-side DOM mutation.""" - - def enhance(match: re.Match[str]) -> str: - icon = _admonition_icon(match.group("attributes")) - return ( - f'{match.group("container")}{match.group("space")}{match.group("title")}' - f'<ion-icon name="{icon}" aria-hidden="true" ' - 'class="docs-ionicon docs-ionicon--admonition"></ion-icon>' - ) - - def enhance_untitled(match: re.Match[str]) -> str: - first = match.group("first") - classes = _CLASS.search(first) - is_title = ( - first.lower().startswith("<summary") - or (classes is not None and "admonition-title" in classes.group(2).lower().split()) - ) - if is_title: - return match.group(0) - - icon = _admonition_icon(match.group("attributes")) - return ( - f'{match.group("container")}{match.group("space")}' - f'<ion-icon name="{icon}" aria-hidden="true" ' - 'class="docs-ionicon docs-ionicon--admonition"></ion-icon>' - f"{first}" - ) - - html = _UNTITLED_ADMONITION.sub(enhance_untitled, html) - return _ADMONITION_TITLE.sub(enhance, html) - - def on_page_content(html, page, config, files): """Reserve image space and defer non-leading screenshots in article HTML.""" @@ -246,4 +177,4 @@ def enhance(match: re.Match[str]) -> str: return _add_attributes(tag, attributes) - return _add_admonition_icons(_IMAGE_TAG.sub(enhance, html)) + return _IMAGE_TAG.sub(enhance, html) diff --git a/theme/main.html b/theme/main.html index 515ca7aff3..d9d9881f41 100644 --- a/theme/main.html +++ b/theme/main.html @@ -2,6 +2,7 @@ {% block fonts %} <style>:root{--md-text-font:"Inter";--md-code-font:"Roboto Mono"}</style> + <link rel="preload" href="{{ 'assets/fonts/inter-latin.woff2' | url }}" as="font" type="font/woff2" crossorigin> {% endblock %} {% block site_meta %} @@ -14,8 +15,8 @@ {% block libs %} {{ super() }} - <script type="module" src="https://unpkg.com/ionicons@7.4.0/dist/ionicons/ionicons.esm.js"></script> - <script nomodule src="https://unpkg.com/ionicons@7.4.0/dist/ionicons/ionicons.js"></script> + <script type="module" src="{{ 'assets/vendor/ionicons/ionicons.esm.js' | url }}"></script> + <script nomodule src="{{ 'assets/vendor/ionicons/ionicons.js' | url }}"></script> {% endblock %} {% block analytics %} diff --git a/theme/partials/footer.html b/theme/partials/footer.html index 468733065d..ffb34eb5c4 100644 --- a/theme/partials/footer.html +++ b/theme/partials/footer.html @@ -6,7 +6,7 @@ </div> <div class="docs-footer__meta"> <nav aria-label="Footer"><a href="https://www.codacy.com/pricing">Pricing</a><a href="https://blog.codacy.com/">Blog</a><a href="mailto:{{ config.extra.support_email }}">Support</a><a href="https://www.codacy.com/privacy">Privacy</a></nav> - <span>© <span data-copyright-year>2026</span> <a href="https://www.codacy.com">Codacy</a> - Automated code review</span> + <span>{{ config.copyright }}</span> </div> </div> </footer> diff --git a/theme/stylesheets/base.css b/theme/stylesheets/base.css new file mode 100644 index 0000000000..0395706d6f --- /dev/null +++ b/theme/stylesheets/base.css @@ -0,0 +1,7 @@ +html { font-size: 100%; } + +html { scroll-padding-top: 5rem; scroll-behavior: smooth; } +@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } + +body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } +.md-grid { max-width: 90rem; } diff --git a/theme/stylesheets/content.css b/theme/stylesheets/content.css new file mode 100644 index 0000000000..ed1d4c73af --- /dev/null +++ b/theme/stylesheets/content.css @@ -0,0 +1,92 @@ +.md-content__inner { position: relative; padding-top: 1.25rem; padding-bottom: 3rem; } +.md-typeset { color: var(--docs-text-secondary); font-size: 1rem; line-height: 1.7; } +.md-typeset h1, .md-typeset h2, .md-typeset h3, .md-typeset h4 { color: var(--docs-text); font-weight: 700; letter-spacing: -.025em; } +.md-typeset h1 { margin: 0 0 1.5rem; font-size: 1.875rem; line-height: 1.25; } +.md-typeset h2 { margin-top: 3rem; padding-top: .25rem; font-size: 1.5rem; line-height: 1.35; } +.md-typeset h3 { margin-top: 2rem; font-size: 1.2rem; } +.md-content__inner > h1 + p { color: var(--docs-text-secondary); font-size: 1.0625rem; line-height: 1.65; } +.md-typeset a { color: var(--docs-link); font-weight: 500; text-decoration-thickness: 1px; text-underline-offset: .14em; } +.md-typeset a:hover { color: var(--docs-link-hover); } +.md-typeset code { padding: .14em .32em; border-radius: var(--docs-radius); background: var(--docs-bg-subtle); color: var(--docs-text); } + +.md-typeset :not(pre) > code { border: 1px solid var(--docs-border); } +.md-typeset a code { color: inherit; } +.md-typeset pre { border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-code-bg); box-shadow: none; } +.md-typeset pre > code { color: var(--docs-code-text); background: transparent; } +.md-typeset pre > code, .md-typeset .highlighttable .code pre > code { overflow-x: auto; overflow-wrap: anywhere; white-space: pre-wrap; } +.md-typeset .highlighttable { overflow: hidden; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-code-bg); } +.md-typeset .highlighttable .linenos { background: color-mix(in srgb, var(--docs-code-bg) 82%, var(--docs-bg)); color: var(--docs-text-tertiary); } +.md-typeset .highlighttable pre { border: 0; border-radius: 0; } +.md-typeset .md-code__nav { top: .35rem; right: .35rem; gap: .2rem; padding: 0; } +.md-typeset .md-code__button { display: grid; width: 1.75rem; height: 1.75rem; padding: .35rem; place-items: center; border-radius: var(--docs-radius); color: var(--docs-text-tertiary); } +.md-typeset :is(.md-code__button, .md-clipboard)::after { display: block; width: 1rem; height: 1rem; margin: 0; background-color: currentColor; -webkit-mask-image: url("../assets/vendor/ionicons/svg/copy-outline.svg"); mask-image: url("../assets/vendor/ionicons/svg/copy-outline.svg"); -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: contain; mask-size: contain; } +.md-typeset .tabbed-control--prev .tabbed-button::after, .md-typeset .tabbed-control--next .tabbed-button::after { display: block; width: 1rem; height: 1rem; margin: 0; background-color: currentColor; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: contain; mask-size: contain; } +.md-typeset .tabbed-control--prev .tabbed-button::after { -webkit-mask-image: url("../assets/vendor/ionicons/svg/chevron-back-outline.svg"); mask-image: url("../assets/vendor/ionicons/svg/chevron-back-outline.svg"); } +.md-typeset .tabbed-control--next .tabbed-button::after { -webkit-mask-image: url("../assets/vendor/ionicons/svg/chevron-forward-outline.svg"); mask-image: url("../assets/vendor/ionicons/svg/chevron-forward-outline.svg"); } +.md-typeset .md-code__button:hover, .md-typeset .md-code__button:focus-visible { background: color-mix(in srgb, var(--docs-text) 8%, transparent); color: var(--docs-text); } +.md-typeset .md-code__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 1px; } + +.md-dialog { border: 1px solid var(--docs-border); background: var(--docs-bg-secondary); } +.md-dialog__inner { color: var(--docs-text); } +.md-typeset .highlight span.hll { display: inline-block; width: 100%; background: color-mix(in srgb, var(--docs-link) 18%, transparent); } +.md-typeset .tabbed-set { margin: 1.5rem 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); overflow: hidden; } +.md-typeset .tabbed-labels { padding: .25rem .5rem 0; border-bottom: 1px solid var(--docs-border); background: var(--docs-bg-secondary); } +.md-typeset .tabbed-labels > label { padding: .55rem .65rem; color: var(--docs-text-tertiary); font-size: .78rem; font-weight: 600; } +.md-typeset .tabbed-labels > label:hover { color: var(--docs-text); } +.md-typeset .tabbed-labels::before { background: var(--docs-link); } +.md-typeset .tabbed-content { box-shadow: none; } +.md-typeset .tabbed-content > .tabbed-block { margin: 0; } +.md-typeset .tabbed-content pre { margin: 0; border: 0; border-radius: 0; } +.md-typeset table:not([class]) { border: 1px solid var(--docs-border); border-radius: var(--docs-radius); box-shadow: none; } +.docs-table-scroll { width: 100%; overflow-x: auto; margin: 1.5rem 0; } +.docs-table-scroll > table { margin: 0; } +.md-typeset table:not([class]) th { color: var(--docs-text); background: var(--docs-bg-secondary); } +.md-typeset table:not([class]) tr:hover { background: var(--docs-bg-secondary); } + +.md-typeset table:not([class]):not([style]) { font-size: .8125rem; } +.md-typeset table:not([class]):not([style]) :is(th, td) { padding: .6rem .9rem; } +.md-typeset table:not([class]):not([style]) th { border-bottom: 1px solid var(--docs-border); } +.md-typeset .admonition, .md-typeset details { margin: 1.25rem 0; padding: .7rem .9rem; border: 1px solid color-mix(in srgb, var(--docs-link) 28%, var(--docs-border)); border-radius: var(--docs-radius); background: color-mix(in srgb, var(--docs-link) 4%, var(--docs-bg)); color: var(--docs-text-secondary); box-shadow: none; font-size: .875rem; line-height: 1.55; } +.md-typeset .admonition > :last-child, .md-typeset details > :last-child { margin-bottom: 0; } +.md-typeset .admonition > :first-child:not(.admonition-title), .md-typeset details > :first-child:not(summary) { margin-top: 0; } +.md-typeset .admonition > p, .md-typeset details > p { color: var(--docs-text-secondary); } +.md-typeset .admonition > .admonition-title + p, .md-typeset details > summary + p { margin: 0; } +.md-typeset .admonition > .admonition-title, .md-typeset details > summary { display: flex; gap: .6rem; align-items: flex-start; margin: 0 0 .3rem; padding: 0; background: transparent; color: var(--docs-text); font-size: .875rem; font-weight: 600; line-height: 1.45; list-style: none; } +.md-typeset .admonition > .admonition-title:only-child, .md-typeset details > summary:only-child { margin-bottom: 0; } +.md-typeset .admonition > .admonition-title::before, .md-typeset details > summary::before { content: ""; position: static; display: block; flex: 0 0 .9rem; width: .9rem; height: .9rem; margin-top: .18rem; background-color: var(--docs-link); -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: contain; mask-size: contain; } +.md-typeset .admonition.important > .admonition-title::before, .md-typeset details.important > summary::before { -webkit-mask-image: var(--md-admonition-icon--info); mask-image: var(--md-admonition-icon--info); } +.md-typeset .admonition.info > .admonition-title::before, .md-typeset details.info > summary::before { background-color: #00b8d4; } +.md-typeset .admonition.tip > .admonition-title::before, .md-typeset details.tip > summary::before, .md-typeset .admonition.success > .admonition-title::before, .md-typeset details.success > summary::before { background-color: var(--docs-success); } +.md-typeset .admonition.warning > .admonition-title::before, .md-typeset details.warning > summary::before { background-color: var(--docs-warning); } +.md-typeset .admonition.danger > .admonition-title::before, .md-typeset details.danger > summary::before { background-color: var(--docs-danger); } +.md-typeset .admonition.tip, .md-typeset details.tip, .md-typeset .admonition.success, .md-typeset details.success { border-color: color-mix(in srgb, var(--docs-success) 35%, var(--docs-border)); background: color-mix(in srgb, var(--docs-success) 6%, var(--docs-bg)); } +.md-typeset .admonition.warning, .md-typeset details.warning { border-color: color-mix(in srgb, var(--docs-warning) 38%, var(--docs-border)); background: color-mix(in srgb, var(--docs-warning) 6%, var(--docs-bg)); } +.md-typeset .admonition.danger, .md-typeset details.danger { border-color: color-mix(in srgb, var(--docs-danger) 35%, var(--docs-border)); background: color-mix(in srgb, var(--docs-danger) 6%, var(--docs-bg)); } +.md-content article.md-typeset blockquote { margin: 1.5rem 0; padding: .15rem 0 .15rem 1rem; border-left: 2px solid var(--docs-border-strong); color: var(--docs-text-secondary); } +.md-content article.md-typeset blockquote > :first-child { margin-top: 0; } +.md-content article.md-typeset blockquote > :last-child { margin-bottom: 0; } + +.docs-notice { margin: 0 0 1.5rem; padding: 1rem 1.1rem; border: 1px solid var(--docs-border-strong); border-radius: var(--docs-radius); background: var(--docs-bg-brand); color: var(--docs-text-secondary); } +.docs-notice strong { color: var(--docs-text); } +.docs-notice p { margin: .35rem 0 0; } +.docs-source-link { float: right; margin: .25rem 0 1rem 1rem; color: var(--docs-text-tertiary); font-size: .78rem; font-weight: 600; text-decoration: none; } +.docs-revision { display: flex; align-items: center; gap: .35rem; margin-top: 2.5rem; color: var(--docs-text-tertiary); font-size: .78rem; } +.docs-revision span { color: var(--docs-text-secondary); font-weight: 600; } +.docs-revision span::after { color: var(--docs-text-tertiary); content: "·"; margin-left: .35rem; } +.docs-revision .git-revision-date-localized-plugin::after { content: none; } + +.docs-error { max-width: 34rem; padding: 4rem 0 7rem; } +.docs-error__code { margin: 0 0 .55rem; color: var(--docs-link); font-size: .78rem; font-weight: 700; letter-spacing: .08em; } +.docs-error h1 { margin-bottom: 1rem; } +.docs-error > p:not(.docs-error__code) { max-width: 31rem; } +.docs-error__actions { display: flex; flex-wrap: wrap; gap: .75rem; margin-top: 1.5rem; } +.md-typeset .docs-error__actions a, .md-typeset .docs-error__actions label { display: inline-flex; min-height: 2.75rem; align-items: center; justify-content: center; padding: .65rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text); cursor: pointer; font-size: .85rem; font-weight: 600; text-decoration: none; } +.md-typeset .docs-error__actions .docs-error__primary { border-color: var(--docs-link); background: var(--docs-link); color: #fff; } +.md-typeset .docs-error__actions a:hover, .md-typeset .docs-error__actions label:hover { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); color: var(--docs-link); } +.md-typeset .docs-error__actions .docs-error__primary:hover { border-color: var(--docs-link-hover); background: var(--docs-link-hover); color: #fff; } +.docs-error__actions a:focus-visible, .docs-error__actions label:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } +.md-main__inner:has(.docs-error) .md-sidebar { display: none; } + +.md-typeset img.docs-image { display: block; max-width: 100%; height: auto; margin: 1.5rem 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); box-shadow: var(--docs-shadow-1); } +.md-typeset p.docs-image-block { margin: 1.75rem 0; } +.md-typeset p.docs-image-block img.docs-image { margin: 0; } diff --git a/theme/stylesheets/footer.css b/theme/stylesheets/footer.css new file mode 100644 index 0000000000..6c55d817dd --- /dev/null +++ b/theme/stylesheets/footer.css @@ -0,0 +1,34 @@ +.docs-page-nav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; margin-top: 3rem; padding-top: 1.5rem; border-top: 1px solid var(--docs-border); } +.docs-page-nav a { display: grid; gap: .25rem; min-height: 4.75rem; padding: .9rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); color: var(--docs-text); text-decoration: none; } +.docs-page-nav a:hover { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); text-decoration: none; } +.docs-page-nav span { color: var(--docs-text-tertiary); font-size: .72rem; } +.docs-page-nav strong { font-size: .86rem; font-weight: 600; } +.docs-page-nav__next { grid-column: 2; text-align: right; } +.docs-footer { border-top: 1px solid var(--docs-border); background: var(--docs-bg); } +.docs-footer__inner { display: flex; justify-content: space-between; gap: 2rem; max-width: 90rem; padding: 1.4rem 1rem; margin: auto; color: var(--docs-text-tertiary); font-size: .78rem; } +.docs-footer__brand { display: grid; gap: .4rem; max-width: 31rem; } +.docs-footer__brand strong { color: var(--docs-text); font-size: .86rem; font-weight: 600; } +.docs-footer__brand span { line-height: 1.5; } +.docs-footer__brand b { margin: 0 .35rem; color: var(--docs-border-strong); font-weight: 400; } +.docs-footer__meta { display: grid; align-content: space-between; justify-items: end; gap: .9rem; text-align: right; } +.docs-footer nav { display: flex; flex-wrap: wrap; gap: 1rem; } +.docs-footer a { color: var(--docs-text-secondary); text-decoration: none; } +.docs-footer a:hover { color: var(--docs-link); } + +.docs-feedback { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 1rem; row-gap: .25rem; margin-top: 3rem; padding: 1.5rem 0; border: 0; border-top: 1px solid var(--docs-border); border-bottom: 1px solid var(--docs-border); border-radius: 0; background: transparent; } +.docs-feedback h2 { grid-column: 1; margin: 0; padding: 0; font-size: 1rem; } +.docs-feedback p { grid-column: 1 / -1; margin: .25rem 0 0; } +.docs-feedback > p:first-of-type { grid-column: 1; color: var(--docs-text-tertiary); font-size: .82rem; } +.docs-feedback button { padding: .45rem .75rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); cursor: pointer; font: inherit; font-size: .8rem; } +.docs-feedback button:hover { border-color: var(--docs-border-strong); color: var(--docs-link); } +.docs-feedback button[aria-pressed="true"] { border-color: color-mix(in srgb, var(--docs-link) 55%, var(--docs-border)); background: color-mix(in srgb, var(--docs-link) 9%, var(--docs-bg)); color: var(--docs-link); font-weight: 600; } +.docs-feedback button:disabled { cursor: default; opacity: .65; } +.docs-feedback.is-submitted .docs-feedback__choices { opacity: .7; } +.docs-feedback__choices { display: flex; grid-column: 2; grid-row: 1 / span 2; align-self: center; gap: .5rem; } +.docs-feedback__form { grid-column: 1 / -1; margin-top: 1rem; } +.docs-feedback textarea { display: block; width: 100%; box-sizing: border-box; margin-top: .5rem; padding: .7rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text); font: inherit; } +.docs-feedback__count { color: var(--docs-text-tertiary); font-size: .72rem; } +.docs-feedback__thanks { color: var(--docs-success); font-weight: 600; } +.docs-feedback__thanks:focus { outline: none; } +.docs-feedback__links { display: flex; flex-wrap: wrap; gap: .5rem 1rem; padding-top: .75rem; color: var(--docs-text-tertiary); font-size: .78rem; } +.docs-search-trigger:focus-visible, .docs-header__cta:focus-visible, .version-select-container .select-css:focus-visible, .content-link:focus-visible, .topic-card:focus-visible, .docs-page-nav a:focus-visible, .docs-feedback button:focus-visible, .docs-feedback textarea:focus-visible, .docs-feedback a:focus-visible, .docs-footer a:focus-visible, .docs-source-link:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } diff --git a/theme/stylesheets/header.css b/theme/stylesheets/header.css new file mode 100644 index 0000000000..28d603ee3b --- /dev/null +++ b/theme/stylesheets/header.css @@ -0,0 +1,71 @@ +.md-header { border-bottom: 1px solid var(--docs-border); background: color-mix(in srgb, var(--docs-bg) 68%, transparent); box-shadow: none; -webkit-backdrop-filter: blur(16px) saturate(180%); backdrop-filter: blur(16px) saturate(180%); } +.md-header__inner { display: grid; grid-template-columns: auto 1fr minmax(15rem, 30rem) 1fr auto auto auto; gap: .65rem; min-height: 4rem; align-items: center; } +.md-header__button { margin: 0; color: var(--docs-text-secondary); } + +.md-header__button.md-logo { display: inline-flex; margin: 0; overflow: hidden; } +.md-header__button.md-logo img { display: block; width: auto; height: 1.75rem; max-width: none; } +.md-header__button.md-logo img.docs-logo--light { display: none; } +[data-md-color-scheme="codacy-light"] .md-header__button.md-logo img.docs-logo--dark { display: none; } +[data-md-color-scheme="codacy-light"] .md-header__button.md-logo img.docs-logo--light { display: block; } + +.md-nav__title .md-nav__button.md-logo img.docs-logo--light { display: none; } +[data-md-color-scheme="codacy-light"] .md-nav__title .md-nav__button.md-logo img.docs-logo--dark { display: none; } +[data-md-color-scheme="codacy-light"] .md-nav__title .md-nav__button.md-logo img.docs-logo--light { display: block; } +.md-header__button > ion-icon { display: block; width: 1.2rem; height: 1.2rem; } +.docs-search-trigger { display: flex; grid-column: 3; align-items: center; gap: .55rem; width: 100%; box-sizing: border-box; min-height: 2.25rem; padding: 0 .75rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-tertiary); cursor: pointer; font: inherit; font-size: .82rem; text-align: left; } +.docs-search-trigger:hover { border-color: var(--docs-border-strong); color: var(--docs-text-secondary); } +.docs-search-trigger > ion-icon { flex: 0 0 1.2rem; width: 1.2rem; height: 1.2rem; } +.docs-search-trigger kbd { margin-left: auto; padding: .1rem .32rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg-secondary); color: var(--docs-text-tertiary); font: inherit; font-size: .66rem; } +.docs-header__cta { grid-column: 6; display: inline-flex; min-height: 2.25rem; align-items: center; justify-content: center; padding: 0 .85rem; border: 1px solid var(--docs-link); border-radius: var(--docs-radius); background: var(--docs-link); color: #fff; font-size: .875rem; font-weight: 600; line-height: 1.25; text-decoration: none; white-space: nowrap; } +.docs-header__cta:hover { border-color: var(--docs-link-hover); background: var(--docs-link-hover); color: #fff; } +.version-select-container { position: relative; grid-column: 5; } +.version-select-container .select-css { width: 8.5rem; height: 2.25rem; padding: 0 2rem 0 .7rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); font: inherit; font-size: .78rem; font-weight: 500; appearance: none; -webkit-appearance: none; } +.docs-version-select__icon { position: absolute; top: 50%; right: .65rem; width: 1rem; height: 1rem; transform: translateY(-50%); color: var(--docs-text-secondary); pointer-events: none; } +.version-select-container .select-css:disabled { opacity: 1; color: var(--docs-text-secondary); cursor: wait; } +.version-select-container .select-css:hover, .version-select-container .select-css:focus { border-color: var(--docs-border-strong); } +.md-header [data-md-component="palette"] { grid-column: 7; } +.md-header [data-md-component="palette"] .md-header__button:not([hidden]) { display: inline-flex; width: 2.25rem; height: 2.25rem; align-items: center; justify-content: center; box-sizing: border-box; padding: 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-tertiary); } +.md-header [data-md-component="palette"] .md-header__button:hover { border-color: var(--docs-border-strong); color: var(--docs-text-secondary); } +.md-header [data-md-component="palette"] .md-header__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } +.md-header .md-search { display: block; position: fixed; inset: 0; z-index: 100; width: auto; visibility: hidden; opacity: 0; pointer-events: none; background: color-mix(in srgb, var(--docs-bg) 55%, transparent); backdrop-filter: blur(3px); } +.md-toggle[data-md-toggle="search"]:not(:checked) ~ .md-header .md-search__inner { width: 0; height: 0; margin: 0; overflow: hidden; } +.md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search { visibility: visible; opacity: 1; pointer-events: auto; } +.md-search__overlay { display: block; position: absolute; inset: 0; background: transparent; } +.md-search__inner { position: relative; z-index: 1; display: flex; float: none; flex-direction: column; width: min(40rem, calc(100vw - 3rem)); max-height: calc(100dvh - 6.5rem); height: auto; margin: clamp(3.25rem, 7.5vh, 5rem) auto 0; overflow: hidden; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); box-shadow: 0 24px 48px color-mix(in srgb, var(--docs-text) 12%, transparent), 0 0 0 1px color-mix(in srgb, var(--docs-bg) 72%, transparent) inset; } +[dir="ltr"] .md-search__inner, [dir="rtl"] .md-search__inner { float: none; } +.md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search__inner { width: min(40rem, calc(100vw - 3rem)); max-height: calc(100dvh - 6.5rem); height: auto; margin: clamp(3.25rem, 7.5vh, 5rem) auto 0; overflow: hidden; transform: none; } +.md-search .md-search__form { flex: 0 0 3.5rem; min-height: 3.5rem; border: 0; border-radius: 0; background: transparent; box-shadow: none; } +.md-search .md-search__input, .md-search .md-search__suggest { height: 3.5rem; padding-right: 3rem; padding-left: 2.8rem; background: transparent; font-size: .9375rem; line-height: 3.5rem; } +.md-search .md-search__input { color: var(--docs-text); } +.md-search .md-search__suggest { color: var(--docs-text-tertiary); } +.md-search .md-search__icon[for="__search"] { top: 50%; left: 1rem; width: 1rem; height: 1rem; transform: translateY(-50%); color: var(--docs-text-tertiary); } +.md-search .md-search__icon[for="__search"] ion-icon { width: 1rem; height: 1rem; } +.md-search .md-search__icon[for="__search"] ion-icon:first-child { display: block; } +.md-search .md-search__icon[for="__search"] ion-icon:last-child { display: none; } +.md-search .md-search__options { position: absolute; top: .7rem; right: .7rem; z-index: 3; } +.md-search .md-search__options .md-search__icon { display: grid; width: 2rem; height: 2rem; place-items: center; border-radius: var(--docs-radius); color: var(--docs-text-tertiary); } +.md-search .md-search__options .md-search__icon ion-icon { width: 1rem; height: 1rem; } +.md-search .md-search__options .md-search__icon:hover { background: var(--docs-bg-secondary); color: var(--docs-text); } +.md-search .md-search__output { position: relative; top: auto; right: auto; left: auto; order: 2; flex: 1 1 auto; width: 100%; max-height: none; overflow: hidden; border-top: 0; border-radius: 0; background: var(--docs-bg); box-shadow: none; } +.md-search .md-search__scrollwrap { width: 100%; height: auto; max-height: none !important; margin: 0; padding: 0 .35rem .35rem; overflow-y: auto; scrollbar-color: auto !important; scrollbar-gutter: auto; scrollbar-width: auto !important; } +.md-search .md-search__scrollwrap::-webkit-scrollbar, .md-search .md-search__scrollwrap::-webkit-scrollbar-thumb, .md-search .md-search__scrollwrap::-webkit-scrollbar-track { width: auto; background: initial !important; } +.docs-search-hint { display: flex; order: 3; gap: .9rem; align-items: center; min-height: 2.5rem; margin: 0; padding: .5rem 1rem; border-top: 1px solid var(--docs-border); color: var(--docs-text-tertiary); font-size: .7rem; } +.docs-search-hint span { display: inline-flex; gap: .25rem; align-items: center; white-space: nowrap; } +.docs-search-hint__close { margin-left: auto; } +.docs-search-hint kbd { min-width: 1rem; padding: .04rem .22rem; border: 0; border-radius: var(--docs-radius); background: var(--docs-bg-subtle); color: var(--docs-text-secondary); font: inherit; font-size: .63rem; font-weight: 600; line-height: 1.2; text-align: center; } +.md-search .md-search-result { border-color: var(--docs-border); background: var(--docs-bg); } +.md-search .md-search-result__meta { min-height: 0; padding: .35rem .75rem .45rem; background: var(--docs-bg); color: var(--docs-text-tertiary); font-size: .7rem; line-height: 1.35; } +.md-search .md-search-result__item { margin: 0 .15rem .2rem; overflow: hidden; border: 0; border-radius: var(--docs-radius); } +.md-search .md-search-result__link { display: block; color: inherit; border-radius: inherit; } +.md-search .md-search-result__article { min-height: 0; padding: .62rem .75rem; } +.md-search .md-search-result__article h1, .md-search .md-search-result__article h2 { margin: 0; color: var(--docs-text); font-size: .86rem; font-weight: 600; line-height: 1.4; } +.md-search .md-search-result__article > p { display: none; } +.md-search .md-search-result__article > h1 + p, .md-search .md-search-result__article > h2 + p { display: -webkit-box; margin: .3rem 0 0; overflow: hidden; color: var(--docs-text-tertiary); font-size: .72rem; line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } +.md-search .md-search-result__article > ul, .md-search .md-search-result__article > ol { display: none; } +.md-search .md-search-result__icon { display: none; } +.md-search .md-search-result mark { background: transparent; color: var(--docs-link); font-weight: 600; text-decoration: none; } +.md-search .md-search-result__link:hover, .md-search .md-search-result__link[data-md-state="active"] { background: color-mix(in srgb, var(--docs-link) 7%, var(--docs-bg)); } +.md-search .md-search-result__more summary { padding: .35rem .75rem .5rem; border-radius: var(--docs-radius-sm); color: var(--docs-link); cursor: pointer; font-size: .68rem; } +.md-search .md-search-result__more summary:hover { background: color-mix(in srgb, var(--docs-link) 7%, var(--docs-bg)); } +.md-search .md-search__form:focus-within { box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--docs-link) 55%, transparent); } +.md-search .md-search-result__link:focus-visible, .md-search .md-search__scrollwrap:focus-visible, .md-search .md-search__options button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: -2px; } diff --git a/theme/stylesheets/home.css b/theme/stylesheets/home.css new file mode 100644 index 0000000000..3ae55bfd4b --- /dev/null +++ b/theme/stylesheets/home.css @@ -0,0 +1,29 @@ +.docs-home-lead { max-width: 36rem; color: var(--docs-text-secondary); font-size: 1.05rem; } +.content-columns-wrapper { display: grid; grid-template-columns: 1fr; gap: 1.75rem; margin: 2rem 0 3rem; } +.content-link-column { display: grid; align-content: start; gap: .75rem; } +.content-link-column > h2 { margin: 0 0 .15rem; padding: 0; color: var(--docs-text); font-size: .78rem; font-weight: 700; letter-spacing: .04em; line-height: 1.4; text-transform: uppercase; } +.md-typeset .content-link, .md-typeset .topic-card { position: relative; display: block; min-height: 3.75rem; padding: 1rem 2.65rem 1rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); text-decoration: none; transition: border-color .15s ease, background .15s ease; } +.md-typeset .content-link::after, .md-typeset .topic-card::after { position: absolute; top: .95rem; right: 1rem; color: var(--docs-text-tertiary); content: "→"; font-size: .9rem; transition: color .15s ease, transform .15s ease; } +.content-link:hover, .topic-card:hover, .content-link:focus-visible, .topic-card:focus-visible { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); text-decoration: none; } +.content-link:hover::after, .topic-card:hover::after, .content-link:focus-visible::after, .topic-card:focus-visible::after { color: var(--docs-link); transform: translateX(.12rem); } +.md-typeset .content-link--primary { border-color: color-mix(in srgb, var(--docs-link) 32%, var(--docs-border)); background: color-mix(in srgb, var(--docs-link) 5%, var(--docs-bg)); } +.content-link h3, .topic-card h3 { margin: 0 0 .35rem; color: var(--docs-text); font-size: .92rem; font-weight: 600; letter-spacing: -.01em; line-height: 1.4; } +.content-link p, .topic-card p { margin: 0; color: var(--docs-text-secondary); font-size: .82rem; font-weight: 400; line-height: 1.55; } +.topic-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .75rem; margin-top: 1rem; } +.md-typeset .topic-card { padding-top: 1rem; } +.tc-icon { display: grid; width: 2.25rem; height: 2.25rem; place-items: center; margin-bottom: .9rem; border-radius: var(--docs-radius); background: var(--docs-bg-brand); } +.tc-icon img { width: 1.25rem; height: 1.25rem; margin: 0 !important; border: 0 !important; border-radius: 0 !important; box-shadow: none !important; } +.md-main__inner:has(.content-columns-wrapper) .md-sidebar--secondary { display: none; } +.md-main__inner:has(.content-columns-wrapper) .docs-page-nav { display: flex; justify-content: flex-end; margin-top: 2rem; padding-top: 1rem; } +.md-main__inner:has(.content-columns-wrapper) .docs-page-nav a { min-height: 0; padding: .5rem 0; border: 0; background: transparent; } +.md-main__inner:has(.content-columns-wrapper) .docs-page-nav__next { grid-column: auto; } + +.md-content article.md-typeset:has(#codacy-release-notes) .release-series { margin: 2rem 0 .45rem; padding: 0; color: var(--docs-text); font-size: .8rem; font-weight: 700; letter-spacing: .035em; line-height: 1.4; text-transform: uppercase; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul { margin: 0 0 1.75rem; padding: 0; border-top: 1px solid var(--docs-border); list-style: none; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li { position: relative; margin: 0; padding: .58rem .65rem .58rem 1.35rem; border-bottom: 1px solid var(--docs-border); color: var(--docs-text-tertiary); font-size: .875rem; line-height: 1.5; transition: background-color .12s ease; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li::before { position: absolute; top: 1.05rem; left: .55rem; width: .28rem; height: .28rem; border-radius: 50%; background: var(--docs-border-strong); content: ""; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li:hover { background: var(--docs-bg-secondary); } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul a { color: var(--docs-text-secondary); font-weight: 500; text-decoration: none; } +.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul a:hover { color: var(--docs-link); } +.md-typeset #tool-versions + ul, .md-typeset #tool-versions + p + ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.5rem; margin-top: 1rem; font-size: .875rem; line-height: 1.5; } +.md-typeset #tool-versions + ul > li, .md-typeset #tool-versions + p + ul > li { margin: .18rem 0; break-inside: avoid; } diff --git a/theme/stylesheets/layout.css b/theme/stylesheets/layout.css new file mode 100644 index 0000000000..e27e31989f --- /dev/null +++ b/theme/stylesheets/layout.css @@ -0,0 +1,6 @@ +.md-header__inner, .md-main__inner, .docs-footer__inner { + box-sizing: border-box; + max-width: 90rem; + margin-inline: auto; + padding-inline: var(--docs-frame-gutter, 1rem); +} diff --git a/theme/stylesheets/navigation.css b/theme/stylesheets/navigation.css new file mode 100644 index 0000000000..c89198ec73 --- /dev/null +++ b/theme/stylesheets/navigation.css @@ -0,0 +1,64 @@ +.md-sidebar { min-width: 0; border-color: transparent; } +.md-sidebar__inner { padding-top: 1.9rem; } +.md-sidebar--primary .md-sidebar__scrollwrap, .md-sidebar--primary .md-sidebar__inner, .md-sidebar--primary .md-nav { min-width: 0; max-width: 100%; } +.md-nav { width: 100%; min-width: 0; font-size: .875rem; line-height: 1.45; } +.md-nav--primary .md-nav__item { font-size: .875rem; line-height: 1.45; } +.md-nav--primary .md-nav__link { margin: .06rem 0; padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius-sm); color: var(--docs-text-secondary); font-weight: 400; transition: background-color .12s ease, color .12s ease; } +.md-nav__link:hover { color: var(--docs-text); background: color-mix(in srgb, var(--docs-text) 4%, transparent); } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { padding: .5rem; color: var(--docs-text); background: transparent; font-size: .75rem; font-weight: 700; letter-spacing: .025em; text-transform: uppercase; } + +.md-sidebar--primary .md-nav--primary > .md-nav__list { padding-inline: 1rem; } +.md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; padding: .5rem; border-radius: var(--docs-radius-sm); } +.docs-nav-section-icon { flex: 0 0 .95rem; width: .95rem; height: .95rem; margin-right: .45rem; color: var(--docs-text-secondary); } +.docs-nav-section-icon--standalone { color: var(--docs-text-secondary); transition: color .12s ease; } +.md-nav__link--active .docs-nav-section-icon--standalone { color: var(--docs-link); } + +.md-sidebar--primary .md-nav--primary > .md-nav__list > .md-nav__item { margin-block: .25rem; } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: 0; } +.md-sidebar--primary .md-nav__link:is(:hover, :focus-visible) { color: var(--docs-text); background: var(--docs-bg-secondary); } +.md-sidebar--primary .md-nav__item .md-nav__link--active { background: var(--docs-bg-brand); } +.md-sidebar--primary .md-nav__item .md-nav__link--active:is(:hover, :focus-visible) { color: var(--docs-link); background: var(--docs-bg-brand); } + +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active { color: var(--docs-link); background: var(--docs-bg-brand); font-weight: 600; } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link:is(:hover, :focus-visible) { color: var(--docs-text); background: var(--docs-bg-secondary); } +.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active:is(:hover, :focus-visible) { color: var(--docs-link); background: var(--docs-bg-brand); } +.md-nav__item .md-nav__link--active { padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius); background: transparent; box-shadow: none; color: var(--docs-link); font-weight: 600; } +.md-nav__item .md-nav__link--active:hover { background: color-mix(in srgb, var(--docs-link) 7%, transparent); } +.md-nav__icon { display: inline-grid; place-items: center; } + +.md-nav--primary .md-nav__link .md-nav__icon { min-width: 0; min-height: 0; width: .8rem; height: .8rem; font-size: .8rem; line-height: 1; } +.md-nav__icon::after { display: none; } +.md-nav__icon .docs-ionicon { width: .8rem; height: .8rem; color: var(--docs-text-tertiary); opacity: .72; transition: transform .16s ease, color .12s ease, opacity .12s ease; } +.md-nav__link:hover .md-nav__icon .docs-ionicon { color: var(--docs-text-secondary); opacity: 1; } +.md-nav__item--nested > .md-nav__toggle:checked ~ .md-nav__link .docs-ionicon--nav { transform: rotate(90deg); } +.md-source__icon .docs-ionicon { display: block; width: 1.2rem; height: 1.2rem; } + +.md-nav--primary .md-nav__toggle ~ .md-nav { margin: 0; padding: 0; border: 0; } +.md-nav--primary .md-nav__toggle ~ .md-nav > .md-nav__list { padding-left: 0; } + +.md-nav--primary .md-nav .md-nav__toggle ~ .md-nav > .md-nav__list { padding-left: .8rem; } +.md-sidebar__scrollwrap { overscroll-behavior: contain; scrollbar-color: auto !important; scrollbar-gutter: auto; scrollbar-width: auto !important; } +.md-sidebar__scrollwrap::-webkit-scrollbar, .md-sidebar__scrollwrap::-webkit-scrollbar-thumb, .md-sidebar__scrollwrap::-webkit-scrollbar-track { width: auto; height: auto; background: initial !important; } +.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { background: initial !important; } + +.md-sidebar--secondary .md-sidebar__inner { padding-top: 2.1rem; } +.md-sidebar--secondary .md-nav__title { padding: 0 0 .65rem; margin: 0; background: transparent; box-shadow: none; color: var(--docs-text); font-size: .875rem; font-weight: 600; letter-spacing: -.01em; } +.md-sidebar--secondary .md-nav__list { padding-left: .75rem; border-left: 1px solid var(--docs-border); } +.md-sidebar--secondary .md-nav__link { padding: .26rem 0; color: var(--docs-text-tertiary); font-size: .8125rem; } +.md-sidebar--secondary .md-nav__link:hover { background: transparent; color: var(--docs-text-secondary); } +.md-sidebar--secondary .md-nav__item .md-nav__link--active, .md-sidebar--secondary .md-nav__item .md-nav__link.docs-toc-active { position: relative; padding: .24rem 0; background: transparent; box-shadow: none; color: var(--docs-link); font-weight: 600; } +.md-sidebar--secondary .md-nav__item .md-nav__link--active::before, .md-sidebar--secondary .md-nav__item .md-nav__link.docs-toc-active::before { position: absolute; top: .26rem; bottom: .26rem; left: -0.81rem; width: 2px; border-radius: 2px; background: var(--docs-link); content: ""; } + +.docs-toc-scrollspy .md-sidebar--secondary .md-nav__item .md-nav__link--active:not(.docs-toc-active) { position: static; padding: .26rem 0; background: transparent; box-shadow: none; color: var(--docs-text-tertiary); font-weight: 400; } +.docs-toc-scrollspy .md-sidebar--secondary .md-nav__item .md-nav__link--active:not(.docs-toc-active)::before { content: none; } + +.md-path { margin: 0 0 .35rem; padding: 0; font-size: .8125rem; } +.md-path__list { display: flex; flex-wrap: wrap; gap: .1rem; align-items: center; } +.md-path__item { display: flex; flex: 0 0 auto; align-items: center; white-space: nowrap; } +.md-path__item, .md-path__link { color: var(--docs-text-tertiary); } +.md-path__link { text-decoration: none; } +.md-path__link:hover { color: var(--docs-link); } +.md-path__item:not(:last-child)::after { display: none; } +.md-path__item + .md-path__item::before { display: none; } +.docs-ionicon--breadcrumb { flex: 0 0 .8rem; width: .8rem; height: .8rem; margin: 0 .2rem; color: var(--docs-text-tertiary); } +.md-path__item:first-child .docs-ionicon--breadcrumb { display: none; } diff --git a/theme/stylesheets/responsive.css b/theme/stylesheets/responsive.css new file mode 100644 index 0000000000..a986223d47 --- /dev/null +++ b/theme/stylesheets/responsive.css @@ -0,0 +1,127 @@ +@media screen and (min-width: 76.25em) { + + :root { --docs-frame-gutter: 2rem; } + + .md-main__inner { + --docs-primary-rail-width: 16rem; + --docs-toc-width: 12rem; + --docs-grid-gap: 2rem; + position: relative; + display: grid; + grid-template-columns: var(--docs-primary-rail-width) minmax(0, 1fr) var(--docs-toc-width); + column-gap: var(--docs-grid-gap); + } + + .md-main__inner::before { position: absolute; top: -1.5rem; bottom: 0; z-index: 1; width: 1px; background: var(--docs-border); content: ""; pointer-events: none; } + [dir="ltr"] .md-main__inner::before { left: calc(var(--docs-frame-gutter) + var(--docs-primary-rail-width) + var(--docs-grid-gap) / 2); } + [dir="rtl"] .md-main__inner::before { right: calc(var(--docs-frame-gutter) + var(--docs-primary-rail-width) + var(--docs-grid-gap) / 2); } + + .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } + .md-main__inner:has(.docs-error)::before { content: none; } + .md-sidebar { width: auto; max-width: none; } + .md-sidebar--secondary { margin-left: 0; } + .md-content { min-width: 0; max-width: none; } + .md-header__button[data-drawer-trigger] { display: none; } + .md-nav--primary > .md-nav__title { display: none; } + + .md-path { margin-top: 1.25rem; margin-right: 1.2rem; margin-left: 1.2rem; } + .md-sidebar--primary { padding-top: .75rem; } + .md-sidebar--secondary { padding-top: .75rem; } + + [dir="ltr"] .md-sidebar--primary .md-sidebar__inner { padding-right: 0; } + [dir="rtl"] .md-sidebar--primary .md-sidebar__inner { padding-left: 0; } + + .md-sidebar--primary .md-sidebar__inner, + .md-sidebar--primary .md-nav--primary { width: 100%; max-width: none; box-sizing: border-box; } + [dir="ltr"] .md-sidebar--secondary .md-sidebar__inner { padding-right: 2rem; } + [dir="rtl"] .md-sidebar--secondary .md-sidebar__inner { padding-left: 2rem; } + + .md-sidebar--primary .md-sidebar__scrollwrap { margin-inline: 0; } + + .md-sidebar--primary .md-sidebar__scrollwrap { scrollbar-gutter: stable !important; } + + .md-sidebar--primary .md-nav--primary > .md-nav__list { padding-inline: 0; } + .md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; } + [dir="ltr"] .md-sidebar--primary .md-nav--primary .md-nav__link { margin-right: 0; } + [dir="rtl"] .md-sidebar--primary .md-nav--primary .md-nav__link { margin-left: 0; } + + .md-sidebar__inner, .md-sidebar--secondary .md-sidebar__inner { padding-top: 0; } +} + +@media screen and (min-width: 80em) { + + .md-main__inner { --docs-primary-rail-width: 18rem; --docs-toc-width: 14rem; --docs-grid-gap: 3rem; } +} + +@media screen and (max-width: 76.2344em) { + .md-sidebar--secondary:not([hidden]) { display: none; } + + .md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: .25rem; } + + .md-nav--primary .md-nav__title .md-nav__icon::after { display: none; } + + .md-path { padding-inline: 1rem; } + + .md-sidebar--primary { --docs-nav-rail-width: min(20rem, calc(100vw - 3.5rem)); width: var(--docs-nav-rail-width); max-width: none; flex-basis: var(--docs-nav-rail-width); border: 0; box-shadow: none; background: var(--docs-bg); } + + .md-sidebar--primary .md-nav--primary, + .md-sidebar--primary .md-nav--primary .md-nav { width: var(--docs-nav-rail-width); min-width: var(--docs-nav-rail-width); max-width: var(--docs-nav-rail-width); box-sizing: border-box; } + .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list { box-sizing: border-box; padding-inline: 1rem; } + + .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list > .md-nav__item { margin-block: .25rem; } + + .md-sidebar--primary .md-nav__item--nested > .md-nav__toggle:checked ~ .md-nav { z-index: 2; } + + .md-sidebar--primary .md-nav--primary[data-md-level="0"] > .md-nav__source { display: none; } + .md-sidebar--primary .md-nav--primary[data-md-level="0"] > .md-nav__list { padding-top: .75rem; } + .md-sidebar--primary .md-nav__title { border-bottom: 0; box-shadow: none; } + .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list { box-shadow: none; } + .md-sidebar--primary .md-sidebar__inner { padding-top: 0; } + [dir="ltr"] .md-sidebar--primary { left: 0; transform: translateX(calc(-1 * var(--docs-nav-rail-width))); } + [dir="rtl"] .md-sidebar--primary { right: 0; transform: translateX(var(--docs-nav-rail-width)); } + [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { transform: translateX(0); box-shadow: none; } + [dir="rtl"] [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { transform: translateX(0); } + [dir="ltr"] .md-sidebar--primary .md-sidebar__inner { padding-right: .75rem; } + [dir="rtl"] .md-sidebar--primary .md-sidebar__inner { padding-left: .75rem; } +} +@media screen and (min-width: 60em) and (max-width: 76.2344em) { + .md-header__inner { grid-template-columns: auto auto minmax(15rem, 30rem) minmax(0, 1fr) auto auto auto; } + .md-header__button[data-drawer-trigger] { order: -1; } + .md-main__inner { justify-content: center; } +} +@media screen and (min-width: 40.01em) and (max-width: 76.2344em) { + .topic-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .topic-row .topic-card:last-child { grid-column: 1 / -1; } +} +@media screen and (max-width: 59.9844em) { + .md-header__inner { grid-template-columns: auto auto auto minmax(0, 1fr) auto; min-height: 3.75rem; gap: .45rem; } + .md-header__button.md-logo img { height: 1.5rem; } + .md-header__button[data-drawer-trigger] { order: -1; } + .docs-search-trigger { grid-column: auto; width: auto; min-height: auto; justify-self: start; padding: .35rem; border: 0; background: transparent; } + .docs-search-trigger span, .docs-search-trigger kbd { display: none; } + .docs-header__cta { display: none; } + .version-select-container { grid-column: auto; margin-left: auto; } + .md-header [data-md-component="palette"] { grid-column: auto; } + .version-select-container .select-css { width: auto; max-width: 41vw; height: 2.35rem; } + .md-typeset h1 { font-size: 1.75rem; } + .docs-feedback { grid-template-columns: 1fr; } + .docs-feedback__choices { grid-column: 1; grid-row: auto; margin-top: .5rem; } + .docs-feedback button { min-height: 2.75rem; } + .docs-footer a, .docs-feedback__links a { display: inline-flex; min-height: 2.75rem; align-items: center; } + .docs-page-nav { grid-template-columns: 1fr; } + .docs-page-nav__next { grid-column: 1; text-align: left; } + .docs-footer__inner { flex-direction: column; } + .docs-footer__meta { justify-items: start; text-align: left; } +} +@media screen and (max-width: 40em) { + .content-columns-wrapper, .topic-row { grid-template-columns: 1fr; gap: .75rem; } + .topic-row .topic-card:last-child { grid-column: auto; } + .md-typeset #tool-versions + ul, .md-typeset #tool-versions + p + ul { grid-template-columns: 1fr; } +} +@media screen and (max-width: 27rem) { + .md-header__button.md-logo { width: 2rem; padding: .25rem; } + .md-header__button.md-logo img { height: 1.5rem; } + .md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search { background: color-mix(in srgb, var(--docs-bg) 42%, transparent); } + .md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search__inner { width: calc(100vw - 1rem); height: auto; max-height: calc(100dvh - 4.5rem - env(safe-area-inset-bottom)); margin-top: 4rem; border-radius: var(--docs-radius); } + .md-search .md-search__output, .md-search .md-search__scrollwrap { max-height: calc(100dvh - 7.5rem - env(safe-area-inset-bottom)) !important; } +} diff --git a/theme/stylesheets/theme.css b/theme/stylesheets/theme.css deleted file mode 100644 index 825b9f016a..0000000000 --- a/theme/stylesheets/theme.css +++ /dev/null @@ -1,518 +0,0 @@ -/* A deliberately small visual layer. Material remains responsible for behavior. */ - -html { font-size: 100%; } -/* Keep anchor, TOC, and search deep-link targets clear of the sticky header, - and glide to them the way Mintlify does (respecting reduced-motion). */ -html { scroll-padding-top: 5rem; scroll-behavior: smooth; } -@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } - -body { color: var(--docs-text); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } -.md-grid { max-width: 90rem; } - -/* Header: stable product context, centered search, and quiet utility controls. */ -.md-header { border-bottom: 1px solid var(--docs-border); background: color-mix(in srgb, var(--docs-bg) 96%, transparent); box-shadow: none; backdrop-filter: blur(14px); } -.md-header__inner { display: grid; grid-template-columns: auto 1fr minmax(15rem, 30rem) 1fr auto auto auto; gap: .65rem; min-height: 4rem; align-items: center; } -.md-header__button { margin: 0; color: var(--docs-text-secondary); } -/* Material keeps a .2rem margin on the logo; drop it so the logo's box starts - on the shared frame's left gutter, in line with the rail and footer edge. */ -.md-header__button.md-logo { display: inline-flex; margin: 0; overflow: hidden; } -.md-header__button.md-logo img { display: block; width: auto; height: 1.75rem; max-width: none; } -.md-header__button.md-logo img.docs-logo--light { display: none; } -[data-md-color-scheme="codacy-light"] .md-header__button.md-logo img.docs-logo--dark { display: none; } -[data-md-color-scheme="codacy-light"] .md-header__button.md-logo img.docs-logo--light { display: block; } -/* The mobile drawer has its own Material logo template, so it needs the same - light-scheme asset swap as the header. */ -.md-nav__title .md-nav__button.md-logo img.docs-logo--light { display: none; } -[data-md-color-scheme="codacy-light"] .md-nav__title .md-nav__button.md-logo img.docs-logo--dark { display: none; } -[data-md-color-scheme="codacy-light"] .md-nav__title .md-nav__button.md-logo img.docs-logo--light { display: block; } -.md-header__button > ion-icon { display: block; width: 1.2rem; height: 1.2rem; } -.docs-search-trigger { display: flex; grid-column: 3; align-items: center; gap: .55rem; width: 100%; box-sizing: border-box; min-height: 2.25rem; padding: 0 .75rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-tertiary); cursor: pointer; font: inherit; font-size: .82rem; text-align: left; } -.docs-search-trigger:hover { border-color: var(--docs-border-strong); color: var(--docs-text-secondary); } -.docs-search-trigger > ion-icon { flex: 0 0 1.2rem; width: 1.2rem; height: 1.2rem; } -.docs-search-trigger kbd { margin-left: auto; padding: .1rem .32rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg-secondary); color: var(--docs-text-tertiary); font: inherit; font-size: .66rem; } -.docs-header__cta { grid-column: 6; display: inline-flex; min-height: 2.25rem; align-items: center; justify-content: center; padding: 0 .85rem; border: 1px solid var(--docs-link); border-radius: var(--docs-radius); background: var(--docs-link); color: #fff; font-size: .875rem; font-weight: 600; line-height: 1.25; text-decoration: none; white-space: nowrap; } -.docs-header__cta:hover { border-color: var(--docs-link-hover); background: var(--docs-link-hover); color: #fff; } -.version-select-container { position: relative; grid-column: 5; } -.version-select-container .select-css { width: 8.5rem; height: 2.25rem; padding: 0 2rem 0 .7rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); font: inherit; font-size: .78rem; font-weight: 500; appearance: none; -webkit-appearance: none; } -.docs-version-select__icon { position: absolute; top: 50%; right: .65rem; width: 1rem; height: 1rem; transform: translateY(-50%); color: var(--docs-text-secondary); pointer-events: none; } -.version-select-container .select-css:disabled { opacity: 1; color: var(--docs-text-secondary); cursor: wait; } -.version-select-container .select-css:hover, .version-select-container .select-css:focus { border-color: var(--docs-border-strong); } -.md-header [data-md-component="palette"] { grid-column: 7; } -.md-header [data-md-component="palette"] .md-header__button:not([hidden]) { display: inline-flex; width: 2.25rem; height: 2.25rem; align-items: center; justify-content: center; box-sizing: border-box; padding: 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-tertiary); } -.md-header [data-md-component="palette"] .md-header__button:hover { border-color: var(--docs-border-strong); color: var(--docs-text-secondary); } -.md-header [data-md-component="palette"] .md-header__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } -.md-header .md-search { display: block; position: fixed; inset: 0; z-index: 100; width: auto; visibility: hidden; opacity: 0; pointer-events: none; background: color-mix(in srgb, var(--docs-bg) 55%, transparent); backdrop-filter: blur(3px); } -.md-toggle[data-md-toggle="search"]:not(:checked) ~ .md-header .md-search__inner { width: 0; height: 0; margin: 0; overflow: hidden; } -.md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search { visibility: visible; opacity: 1; pointer-events: auto; } -.md-search__overlay { display: block; position: absolute; inset: 0; background: transparent; } -.md-search__inner { position: relative; z-index: 1; display: flex; float: none; flex-direction: column; width: min(40rem, calc(100vw - 3rem)); max-height: calc(100dvh - 6.5rem); height: auto; margin: clamp(3.25rem, 7.5vh, 5rem) auto 0; overflow: hidden; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); box-shadow: 0 24px 48px color-mix(in srgb, var(--docs-text) 12%, transparent), 0 0 0 1px color-mix(in srgb, var(--docs-bg) 72%, transparent) inset; } -[dir="ltr"] .md-search__inner, [dir="rtl"] .md-search__inner { float: none; } -.md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search__inner { width: min(40rem, calc(100vw - 3rem)); max-height: calc(100dvh - 6.5rem); height: auto; margin: clamp(3.25rem, 7.5vh, 5rem) auto 0; overflow: hidden; transform: none; } -.md-search .md-search__form { flex: 0 0 3.5rem; min-height: 3.5rem; border: 0; border-radius: 0; background: transparent; box-shadow: none; } -.md-search .md-search__input, .md-search .md-search__suggest { height: 3.5rem; padding-right: 3rem; padding-left: 2.8rem; background: transparent; font-size: .9375rem; line-height: 3.5rem; } -.md-search .md-search__input { color: var(--docs-text); } -.md-search .md-search__suggest { color: var(--docs-text-tertiary); } -.md-search .md-search__icon[for="__search"] { top: 50%; left: 1rem; width: 1rem; height: 1rem; transform: translateY(-50%); color: var(--docs-text-tertiary); } -.md-search .md-search__icon[for="__search"] ion-icon { width: 1rem; height: 1rem; } -.md-search .md-search__icon[for="__search"] ion-icon:first-child { display: block; } -.md-search .md-search__icon[for="__search"] ion-icon:last-child { display: none; } -.md-search .md-search__options { position: absolute; top: .7rem; right: .7rem; z-index: 3; } -.md-search .md-search__options .md-search__icon { display: grid; width: 2rem; height: 2rem; place-items: center; border-radius: var(--docs-radius); color: var(--docs-text-tertiary); } -.md-search .md-search__options .md-search__icon ion-icon { width: 1rem; height: 1rem; } -.md-search .md-search__options .md-search__icon:hover { background: var(--docs-bg-secondary); color: var(--docs-text); } -.md-search .md-search__output { position: relative; top: auto; right: auto; left: auto; order: 2; flex: 1 1 auto; width: 100%; max-height: none; overflow: hidden; border-top: 0; border-radius: 0; background: var(--docs-bg); box-shadow: none; } -.md-search .md-search__scrollwrap { width: 100%; height: auto; max-height: none !important; margin: 0; padding: 0 .35rem .35rem; overflow-y: auto; scrollbar-color: auto !important; scrollbar-gutter: auto; scrollbar-width: auto !important; } -.md-search .md-search__scrollwrap::-webkit-scrollbar, .md-search .md-search__scrollwrap::-webkit-scrollbar-thumb, .md-search .md-search__scrollwrap::-webkit-scrollbar-track { width: auto; background: initial !important; } -.docs-search-hint { display: flex; order: 3; gap: .9rem; align-items: center; min-height: 2.5rem; margin: 0; padding: .5rem 1rem; border-top: 1px solid var(--docs-border); color: var(--docs-text-tertiary); font-size: .7rem; } -.docs-search-hint span { display: inline-flex; gap: .25rem; align-items: center; white-space: nowrap; } -.docs-search-hint__close { margin-left: auto; } -.docs-search-hint kbd { min-width: 1rem; padding: .04rem .22rem; border: 0; border-radius: var(--docs-radius); background: var(--docs-bg-subtle); color: var(--docs-text-secondary); font: inherit; font-size: .63rem; font-weight: 600; line-height: 1.2; text-align: center; } -.md-search .md-search-result { border-color: var(--docs-border); background: var(--docs-bg); } -.md-search .md-search-result__meta { min-height: 0; padding: .35rem .75rem .45rem; background: var(--docs-bg); color: var(--docs-text-tertiary); font-size: .7rem; line-height: 1.35; } -.md-search .md-search-result__item { margin: 0 .15rem .2rem; overflow: hidden; border: 0; border-radius: var(--docs-radius); } -.md-search .md-search-result__link { display: block; color: inherit; border-radius: inherit; } -.md-search .md-search-result__article { min-height: 0; padding: .62rem .75rem; } -.md-search .md-search-result__article h1, .md-search .md-search-result__article h2 { margin: 0; color: var(--docs-text); font-size: .86rem; font-weight: 600; line-height: 1.4; } -.md-search .md-search-result__article > p { display: none; } -.md-search .md-search-result__article > h1 + p, .md-search .md-search-result__article > h2 + p { display: -webkit-box; margin: .3rem 0 0; overflow: hidden; color: var(--docs-text-tertiary); font-size: .72rem; line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } -.md-search .md-search-result__article > ul, .md-search .md-search-result__article > ol { display: none; } -.md-search .md-search-result__icon { display: none; } -.md-search .md-search-result mark { background: transparent; color: var(--docs-link); font-weight: 600; text-decoration: none; } -.md-search .md-search-result__link:hover, .md-search .md-search-result__link[data-md-state="active"] { background: color-mix(in srgb, var(--docs-link) 7%, var(--docs-bg)); } -.md-search .md-search-result__more summary { padding: .35rem .75rem .5rem; border-radius: var(--docs-radius-sm); color: var(--docs-link); cursor: pointer; font-size: .68rem; } -.md-search .md-search-result__more summary:hover { background: color-mix(in srgb, var(--docs-link) 7%, var(--docs-bg)); } -.md-search .md-search__form:focus-within { box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--docs-link) 55%, transparent); } -.md-search .md-search-result__link:focus-visible, .md-search .md-search__scrollwrap:focus-visible, .md-search .md-search__options button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: -2px; } - -/* Navigation: quiet, compact, and without layout shifts for the active page. - The primary rail deliberately follows the Aikido-style documentation rhythm: - generous usable row width, small group labels, and feedback without card - borders. Material's disclosure behavior remains native. */ -.md-sidebar { min-width: 0; border-color: transparent; } -.md-sidebar__inner { padding-top: 1.9rem; } -.md-sidebar--primary .md-sidebar__scrollwrap, .md-sidebar--primary .md-sidebar__inner, .md-sidebar--primary .md-nav { min-width: 0; max-width: 100%; } -.md-nav { width: 100%; min-width: 0; font-size: .875rem; line-height: 1.45; } -.md-nav--primary .md-nav__item { font-size: .875rem; line-height: 1.45; } -.md-nav--primary .md-nav__link { margin: .06rem 0; padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius-sm); color: var(--docs-text-secondary); font-weight: 400; transition: background-color .12s ease, color .12s ease; } -.md-nav__link:hover { color: var(--docs-text); background: color-mix(in srgb, var(--docs-text) 4%, transparent); } -.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { padding: .5rem; color: var(--docs-text); background: transparent; font-size: .75rem; font-weight: 700; letter-spacing: .025em; text-transform: uppercase; } -/* Navigation rows share a 24px rail gutter and an 8px inner text inset. - This makes the background a deliberate hit target in both sidebars and - drawers, while preserving the existing nesting indentation. */ -.md-sidebar--primary .md-nav--primary > .md-nav__list { padding-inline: 1rem; } -.md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; padding: .5rem; border-radius: var(--docs-radius-sm); } -.docs-nav-section-icon { flex: 0 0 .95rem; width: .95rem; height: .95rem; margin-right: .45rem; color: var(--docs-text-secondary); } -.docs-nav-section-icon--standalone { color: var(--docs-text-secondary); transition: color .12s ease; } -.md-nav__link--active .docs-nav-section-icon--standalone { color: var(--docs-link); } -/* Every first-level entry uses the same rhythm, whether it is a page or a - collapsible group. Keeping this on the item avoids selection changing the - gap between rows. */ -.md-sidebar--primary .md-nav--primary > .md-nav__list > .md-nav__item { margin-block: .25rem; } -.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: 0; } -.md-sidebar--primary .md-nav__link:is(:hover, :focus-visible) { color: var(--docs-text); background: var(--docs-bg-secondary); } -.md-sidebar--primary .md-nav__item .md-nav__link--active { background: var(--docs-bg-brand); } -.md-sidebar--primary .md-nav__item .md-nav__link--active:is(:hover, :focus-visible) { color: var(--docs-link); background: var(--docs-bg-brand); } -/* Standalone top-level pages are links, not section labels. Preserve their - interaction states in both the desktop rail and the mobile drawer. */ -.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active { color: var(--docs-link); background: var(--docs-bg-brand); font-weight: 600; } -.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link:is(:hover, :focus-visible) { color: var(--docs-text); background: var(--docs-bg-secondary); } -.md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link--active:is(:hover, :focus-visible) { color: var(--docs-link); background: var(--docs-bg-brand); } -.md-nav__item .md-nav__link--active { padding: .34rem .5rem; border: 0; border-radius: var(--docs-radius); background: transparent; box-shadow: none; color: var(--docs-link); font-weight: 600; } -.md-nav__item .md-nav__link--active:hover { background: color-mix(in srgb, var(--docs-link) 7%, transparent); } -.md-nav__icon { display: inline-grid; place-items: center; } -/* Pin the disclosure icon to the glyph size. Without an explicit box the span - inherits Material's 1.2rem .md-icon sizing, so before ion-icon hydrates it is - taller than the 12px top-level line box and collapsible rows render ~2px - taller than standalone links until the icons load. A fixed box keeps every - row the same height regardless of hydration state. */ -.md-nav--primary .md-nav__link .md-nav__icon { min-width: 0; min-height: 0; width: .8rem; height: .8rem; font-size: .8rem; line-height: 1; } -.md-nav__icon::after { display: none; } -.md-nav__icon .docs-ionicon { width: .8rem; height: .8rem; color: var(--docs-text-tertiary); opacity: .72; transition: transform .16s ease, color .12s ease, opacity .12s ease; } -.md-nav__link:hover .md-nav__icon .docs-ionicon { color: var(--docs-text-secondary); opacity: 1; } -.md-nav__item--nested > .md-nav__toggle:checked ~ .md-nav__link .docs-ionicon--nav { transform: rotate(90deg); } -.md-source__icon .docs-ionicon { display: block; width: 1.2rem; height: 1.2rem; } -/* Level-1 section children align flush with top-level links (e.g. Documentation home). */ -.md-nav--primary .md-nav__toggle ~ .md-nav { margin: 0; padding: 0; border: 0; } -.md-nav--primary .md-nav__toggle ~ .md-nav > .md-nav__list { padding-left: 0; } -/* Deeper sub-items keep a subtle indent to signal hierarchy. */ -.md-nav--primary .md-nav .md-nav__toggle ~ .md-nav > .md-nav__list { padding-left: .8rem; } -.md-sidebar__scrollwrap { overscroll-behavior: contain; scrollbar-color: auto !important; scrollbar-gutter: auto; scrollbar-width: auto !important; } -.md-sidebar__scrollwrap::-webkit-scrollbar, .md-sidebar__scrollwrap::-webkit-scrollbar-thumb, .md-sidebar__scrollwrap::-webkit-scrollbar-track { width: auto; height: auto; background: initial !important; } -.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { background: initial !important; } - -/* Table of contents: a separate, simple reading aid. */ -.md-sidebar--secondary .md-sidebar__inner { padding-top: 2.1rem; } -.md-sidebar--secondary .md-nav__title { padding: 0 0 .65rem; margin: 0; background: transparent; box-shadow: none; color: var(--docs-text); font-size: .875rem; font-weight: 600; letter-spacing: -.01em; } -.md-sidebar--secondary .md-nav__list { padding-left: .75rem; border-left: 1px solid var(--docs-border); } -.md-sidebar--secondary .md-nav__link { padding: .26rem 0; color: var(--docs-text-tertiary); font-size: .8125rem; } -.md-sidebar--secondary .md-nav__link:hover { background: transparent; color: var(--docs-text-secondary); } -.md-sidebar--secondary .md-nav__item .md-nav__link--active, .md-sidebar--secondary .md-nav__item .md-nav__link.docs-toc-active { position: relative; padding: .24rem 0; background: transparent; box-shadow: none; color: var(--docs-link); font-weight: 600; } -.md-sidebar--secondary .md-nav__item .md-nav__link--active::before, .md-sidebar--secondary .md-nav__item .md-nav__link.docs-toc-active::before { position: absolute; top: .26rem; bottom: .26rem; left: -0.81rem; width: 2px; border-radius: 2px; background: var(--docs-link); content: ""; } -/* Material's scroll spy updates independently of the custom reading-position - state. Once the latter has started, only its selected link is highlighted. */ -.docs-toc-scrollspy .md-sidebar--secondary .md-nav__item .md-nav__link--active:not(.docs-toc-active) { position: static; padding: .26rem 0; background: transparent; box-shadow: none; color: var(--docs-text-tertiary); font-weight: 400; } -.docs-toc-scrollspy .md-sidebar--secondary .md-nav__item .md-nav__link--active:not(.docs-toc-active)::before { content: none; } - -/* Breadcrumb: a quiet, legible trail rather than Material's tiny default. */ -.md-path { margin: 0 0 .35rem; padding: 0; font-size: .8125rem; } -.md-path__list { display: flex; flex-wrap: wrap; gap: .1rem; align-items: center; } -.md-path__item { display: flex; flex: 0 0 auto; align-items: center; white-space: nowrap; } -.md-path__item, .md-path__link { color: var(--docs-text-tertiary); } -.md-path__link { text-decoration: none; } -.md-path__link:hover { color: var(--docs-link); } -.md-path__item:not(:last-child)::after { display: none; } -.md-path__item + .md-path__item::before { display: none; } -.docs-ionicon--breadcrumb { flex: 0 0 .8rem; width: .8rem; height: .8rem; margin: 0 .2rem; color: var(--docs-text-tertiary); } -.md-path__item:first-child .docs-ionicon--breadcrumb { display: none; } - -/* Content type scale. The article's measure is set by the layout frame — the - grid's middle track on desktop, the full frame below it — not a fixed cap. */ -.md-content__inner { position: relative; padding-top: 1.25rem; padding-bottom: 3rem; } -.md-typeset { color: var(--docs-text-secondary); font-size: 1rem; line-height: 1.7; } -.md-typeset h1, .md-typeset h2, .md-typeset h3, .md-typeset h4 { color: var(--docs-text); font-weight: 700; letter-spacing: -.025em; } -.md-typeset h1 { margin: 0 0 1.5rem; font-size: 1.875rem; line-height: 1.25; } -.md-typeset h2 { margin-top: 3rem; padding-top: .25rem; font-size: 1.5rem; line-height: 1.35; } -.md-typeset h3 { margin-top: 2rem; font-size: 1.2rem; } -.md-content__inner > h1 + p { color: var(--docs-text-secondary); font-size: 1.0625rem; line-height: 1.65; } -.md-typeset a { color: var(--docs-link); font-weight: 500; text-decoration-thickness: 1px; text-underline-offset: .14em; } -.md-typeset a:hover { color: var(--docs-link-hover); } -.md-typeset code { padding: .14em .32em; border-radius: var(--docs-radius); background: var(--docs-bg-subtle); color: var(--docs-text); } -/* Crisp, bordered inline-code chips; code inside links takes the link color. */ -.md-typeset :not(pre) > code { border: 1px solid var(--docs-border); } -.md-typeset a code { color: inherit; } -.md-typeset pre { border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-code-bg); box-shadow: none; } -.md-typeset pre > code { color: var(--docs-code-text); background: transparent; } -.md-typeset pre > code, .md-typeset .highlighttable .code pre > code { overflow-x: hidden; overflow-wrap: anywhere; white-space: pre-wrap; word-break: break-word; } -.md-typeset .highlighttable { overflow: hidden; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-code-bg); } -.md-typeset .highlighttable .linenos { background: color-mix(in srgb, var(--docs-code-bg) 82%, var(--docs-bg)); color: var(--docs-text-tertiary); } -.md-typeset .highlighttable pre { border: 0; border-radius: 0; } -.md-typeset .md-code__nav { top: .35rem; right: .35rem; gap: .2rem; padding: 0; } -.md-typeset .md-code__button { display: grid; width: 1.75rem; height: 1.75rem; padding: .35rem; place-items: center; border-radius: var(--docs-radius); color: var(--docs-text-tertiary); } -.md-typeset :is(.md-code__button, .md-clipboard)::after { display: block; width: 1rem; height: 1rem; margin: 0; background-color: currentColor; -webkit-mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/copy-outline.svg"); mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/copy-outline.svg"); -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: contain; mask-size: contain; } -.md-typeset .tabbed-control--prev .tabbed-button::after, .md-typeset .tabbed-control--next .tabbed-button::after { display: block; width: 1rem; height: 1rem; margin: 0; background-color: currentColor; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: contain; mask-size: contain; } -.md-typeset .tabbed-control--prev .tabbed-button::after { -webkit-mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-back-outline.svg"); mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-back-outline.svg"); } -.md-typeset .tabbed-control--next .tabbed-button::after { -webkit-mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-forward-outline.svg"); mask-image: url("https://unpkg.com/ionicons@7.4.0/dist/svg/chevron-forward-outline.svg"); } -.md-typeset .md-code__button:hover, .md-typeset .md-code__button:focus-visible { background: color-mix(in srgb, var(--docs-text) 8%, transparent); color: var(--docs-text); } -.md-typeset .md-code__button:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 1px; } -/* Clipboard confirmations use Material's dialog component. Its default - foreground/background pairing is intentionally inverted, which conflicts - with the documentation palettes. */ -.md-dialog { border: 1px solid var(--docs-border); background: var(--docs-bg-secondary); } -.md-dialog__inner { color: var(--docs-text); } -.md-typeset .highlight span.hll { display: inline-block; width: 100%; background: color-mix(in srgb, var(--docs-link) 18%, transparent); } -.md-typeset .tabbed-set { margin: 1.5rem 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); overflow: hidden; } -.md-typeset .tabbed-labels { padding: .25rem .5rem 0; border-bottom: 1px solid var(--docs-border); background: var(--docs-bg-secondary); } -.md-typeset .tabbed-labels > label { padding: .55rem .65rem; color: var(--docs-text-tertiary); font-size: .78rem; font-weight: 600; } -.md-typeset .tabbed-labels > label:hover { color: var(--docs-text); } -.md-typeset .tabbed-labels::before { background: var(--docs-link); } -.md-typeset .tabbed-content { box-shadow: none; } -.md-typeset .tabbed-content > .tabbed-block { margin: 0; } -.md-typeset .tabbed-content pre { margin: 0; border: 0; border-radius: 0; } -.md-typeset table:not([class]) { border: 1px solid var(--docs-border); border-radius: var(--docs-radius); box-shadow: none; } -.docs-table-scroll { width: 100%; overflow-x: auto; margin: 1.5rem 0; } -.docs-table-scroll > table { margin: 0; } -.md-typeset table:not([class]) th { color: var(--docs-text); background: var(--docs-bg-secondary); } -.md-typeset table:not([class]) tr:hover { background: var(--docs-bg-secondary); } -/* Normal prose tables read at a comfortable size with airier cells. Tables that - carry an inline `style` (e.g. the wide supported-languages matrix) opt out and - keep their deliberately compact sizing. */ -.md-typeset table:not([class]):not([style]) { font-size: .8125rem; } -.md-typeset table:not([class]):not([style]) :is(th, td) { padding: .6rem .9rem; } -.md-typeset table:not([class]):not([style]) th { border-bottom: 1px solid var(--docs-border); } -.md-typeset .admonition, .md-typeset details { margin: 1.25rem 0; padding: .7rem .9rem; border: 1px solid color-mix(in srgb, var(--docs-link) 28%, var(--docs-border)); border-radius: var(--docs-radius); background: color-mix(in srgb, var(--docs-link) 4%, var(--docs-bg)); color: var(--docs-text-secondary); box-shadow: none; font-size: .875rem; line-height: 1.55; } -.md-typeset .admonition > :last-child, .md-typeset details > :last-child { margin-bottom: 0; } -.md-typeset .admonition > :first-child:not(.admonition-title), .md-typeset details > :first-child:not(summary) { margin-top: 0; } -.md-typeset .admonition > p, .md-typeset details > p { color: var(--docs-text-secondary); } -.md-typeset .admonition > .admonition-title + p, .md-typeset details > summary + p { margin: 0; } -.md-typeset .admonition > .admonition-title, .md-typeset details > summary { display: flex; gap: .6rem; align-items: flex-start; margin: 0 0 .3rem; padding: 0; background: transparent; color: var(--docs-text); font-size: .875rem; font-weight: 600; line-height: 1.45; list-style: none; } -.md-typeset .admonition > .admonition-title:only-child, .md-typeset details > summary:only-child { margin-bottom: 0; } -.md-typeset .admonition > .admonition-title::before, .md-typeset details > summary::before { display: none; } -.docs-ionicon--admonition { flex: 0 0 .9rem; width: .9rem; height: .9rem; margin-top: .18rem; color: var(--docs-link); } -.md-typeset .admonition:has(> .docs-ionicon--admonition) { display: grid; grid-template-columns: .9rem minmax(0, 1fr); column-gap: .6rem; align-items: start; } -.md-typeset .admonition:has(> .docs-ionicon--admonition) > .docs-ionicon--admonition { grid-column: 1; grid-row: 1; } -.md-typeset .admonition:has(> .docs-ionicon--admonition) > :not(.docs-ionicon--admonition) { grid-column: 2; min-width: 0; } -.md-typeset .admonition.info .docs-ionicon--admonition, .md-typeset details.info .docs-ionicon--admonition { color: #00b8d4; } -.md-typeset .admonition.tip .docs-ionicon--admonition, .md-typeset details.tip .docs-ionicon--admonition, .md-typeset .admonition.success .docs-ionicon--admonition, .md-typeset details.success .docs-ionicon--admonition { color: var(--docs-success); } -.md-typeset .admonition.warning .docs-ionicon--admonition, .md-typeset details.warning .docs-ionicon--admonition { color: var(--docs-warning); } -.md-typeset .admonition.danger .docs-ionicon--admonition, .md-typeset details.danger .docs-ionicon--admonition { color: var(--docs-danger); } -.md-typeset .admonition.tip, .md-typeset details.tip, .md-typeset .admonition.success, .md-typeset details.success { border-color: color-mix(in srgb, var(--docs-success) 35%, var(--docs-border)); background: color-mix(in srgb, var(--docs-success) 6%, var(--docs-bg)); } -.md-typeset .admonition.warning, .md-typeset details.warning { border-color: color-mix(in srgb, var(--docs-warning) 38%, var(--docs-border)); background: color-mix(in srgb, var(--docs-warning) 6%, var(--docs-bg)); } -.md-typeset .admonition.danger, .md-typeset details.danger { border-color: color-mix(in srgb, var(--docs-danger) 35%, var(--docs-border)); background: color-mix(in srgb, var(--docs-danger) 6%, var(--docs-bg)); } -.md-content article.md-typeset blockquote { margin: 1.5rem 0; padding: .15rem 0 .15rem 1rem; border-left: 2px solid var(--docs-border-strong); color: var(--docs-text-secondary); } -.md-content article.md-typeset blockquote > :first-child { margin-top: 0; } -.md-content article.md-typeset blockquote > :last-child { margin-bottom: 0; } - -.docs-notice { margin: 0 0 1.5rem; padding: 1rem 1.1rem; border: 1px solid var(--docs-border-strong); border-radius: var(--docs-radius); background: var(--docs-bg-brand); color: var(--docs-text-secondary); } -.docs-notice strong { color: var(--docs-text); } -.docs-notice p { margin: .35rem 0 0; } -.docs-source-link { float: right; margin: .25rem 0 1rem 1rem; color: var(--docs-text-tertiary); font-size: .78rem; font-weight: 600; text-decoration: none; } -.docs-revision { display: flex; align-items: center; gap: .35rem; margin-top: 2.5rem; color: var(--docs-text-tertiary); font-size: .78rem; } -.docs-revision span { color: var(--docs-text-secondary); font-weight: 600; } -.docs-revision span::after { color: var(--docs-text-tertiary); content: "·"; margin-left: .35rem; } -.docs-revision .git-revision-date-localized-plugin::after { content: none; } - -/* Error page: useful recovery actions while preserving legacy redirects. */ -.docs-error { max-width: 34rem; padding: 4rem 0 7rem; } -.docs-error__code { margin: 0 0 .55rem; color: var(--docs-link); font-size: .78rem; font-weight: 700; letter-spacing: .08em; } -.docs-error h1 { margin-bottom: 1rem; } -.docs-error > p:not(.docs-error__code) { max-width: 31rem; } -.docs-error__actions { display: flex; flex-wrap: wrap; gap: .75rem; margin-top: 1.5rem; } -.md-typeset .docs-error__actions a, .md-typeset .docs-error__actions label { display: inline-flex; min-height: 2.75rem; align-items: center; justify-content: center; padding: .65rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text); cursor: pointer; font-size: .85rem; font-weight: 600; text-decoration: none; } -.md-typeset .docs-error__actions .docs-error__primary { border-color: var(--docs-link); background: var(--docs-link); color: #fff; } -.md-typeset .docs-error__actions a:hover, .md-typeset .docs-error__actions label:hover { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); color: var(--docs-link); } -.md-typeset .docs-error__actions .docs-error__primary:hover { border-color: var(--docs-link-hover); background: var(--docs-link-hover); color: #fff; } -.docs-error__actions a:focus-visible, .docs-error__actions label:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } -.md-main__inner:has(.docs-error) .md-sidebar { display: none; } - -/* Block screenshots are framed (border + rounded corners + soft shadow), - applied by docs-theme.js only to wide, standalone content images. */ -.md-typeset img.docs-image { display: block; max-width: 100%; height: auto; margin: 1.5rem 0; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); box-shadow: var(--docs-shadow-1); } -.md-typeset p.docs-image-block { margin: 1.75rem 0; } -.md-typeset p.docs-image-block img.docs-image { margin: 0; } - -/* Homepage: task-led landing content with one canonical documentation card. */ -.docs-home-lead { max-width: 36rem; color: var(--docs-text-secondary); font-size: 1.05rem; } -.content-columns-wrapper { display: grid; grid-template-columns: 1fr; gap: 1.75rem; margin: 2rem 0 3rem; } -.content-link-column { display: grid; align-content: start; gap: .75rem; } -.content-link-column > h2 { margin: 0 0 .15rem; padding: 0; color: var(--docs-text); font-size: .78rem; font-weight: 700; letter-spacing: .04em; line-height: 1.4; text-transform: uppercase; } -.md-typeset .content-link, .md-typeset .topic-card { position: relative; display: block; min-height: 3.75rem; padding: 1rem 2.65rem 1rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); text-decoration: none; transition: border-color .15s ease, background .15s ease; } -.md-typeset .content-link::after, .md-typeset .topic-card::after { position: absolute; top: .95rem; right: 1rem; color: var(--docs-text-tertiary); content: "→"; font-size: .9rem; transition: color .15s ease, transform .15s ease; } -.content-link:hover, .topic-card:hover, .content-link:focus-visible, .topic-card:focus-visible { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); text-decoration: none; } -.content-link:hover::after, .topic-card:hover::after, .content-link:focus-visible::after, .topic-card:focus-visible::after { color: var(--docs-link); transform: translateX(.12rem); } -.md-typeset .content-link--primary { border-color: color-mix(in srgb, var(--docs-link) 32%, var(--docs-border)); background: color-mix(in srgb, var(--docs-link) 5%, var(--docs-bg)); } -.content-link h3, .topic-card h3 { margin: 0 0 .35rem; color: var(--docs-text); font-size: .92rem; font-weight: 600; letter-spacing: -.01em; line-height: 1.4; } -.content-link p, .topic-card p { margin: 0; color: var(--docs-text-secondary); font-size: .82rem; font-weight: 400; line-height: 1.55; } -.topic-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .75rem; margin-top: 1rem; } -.md-typeset .topic-card { padding-top: 1rem; } -.tc-icon { display: grid; width: 2.25rem; height: 2.25rem; place-items: center; margin-bottom: .9rem; border-radius: var(--docs-radius); background: var(--docs-bg-brand); } -.tc-icon img { width: 1.25rem; height: 1.25rem; margin: 0 !important; border: 0 !important; border-radius: 0 !important; box-shadow: none !important; } -.md-main__inner:has(.content-columns-wrapper) .md-sidebar--secondary { display: none; } -.md-main__inner:has(.content-columns-wrapper) .docs-page-nav { display: flex; justify-content: flex-end; margin-top: 2rem; padding-top: 1rem; } -.md-main__inner:has(.content-columns-wrapper) .docs-page-nav a { min-height: 0; padding: .5rem 0; border: 0; background: transparent; } -.md-main__inner:has(.content-columns-wrapper) .docs-page-nav__next { grid-column: auto; } - -/* Release log: compact, scannable chronology without turning 132 entries into cards. */ -.md-content article.md-typeset:has(#codacy-release-notes) .release-series { margin: 2rem 0 .45rem; padding: 0; color: var(--docs-text); font-size: .8rem; font-weight: 700; letter-spacing: .035em; line-height: 1.4; text-transform: uppercase; } -.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul { margin: 0 0 1.75rem; padding: 0; border-top: 1px solid var(--docs-border); list-style: none; } -.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li { position: relative; margin: 0; padding: .58rem .65rem .58rem 1.35rem; border-bottom: 1px solid var(--docs-border); color: var(--docs-text-tertiary); font-size: .875rem; line-height: 1.5; transition: background-color .12s ease; } -.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li::before { position: absolute; top: 1.05rem; left: .55rem; width: .28rem; height: .28rem; border-radius: 50%; background: var(--docs-border-strong); content: ""; } -.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul > li:hover { background: var(--docs-bg-secondary); } -.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul a { color: var(--docs-text-secondary); font-weight: 500; text-decoration: none; } -.md-content article.md-typeset:has(#codacy-release-notes) .release-series + ul a:hover { color: var(--docs-link); } -.md-typeset #tool-versions + ul, .md-typeset #tool-versions + p + ul { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.5rem; margin-top: 1rem; font-size: .875rem; line-height: 1.5; } -.md-typeset #tool-versions + ul > li, .md-typeset #tool-versions + p + ul > li { margin: .18rem 0; break-inside: avoid; } - -/* Page navigation belongs with the article. The site footer remains global. */ -.docs-page-nav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; margin-top: 3rem; padding-top: 1.5rem; border-top: 1px solid var(--docs-border); } -.docs-page-nav a { display: grid; gap: .25rem; min-height: 4.75rem; padding: .9rem 1rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); color: var(--docs-text); text-decoration: none; } -.docs-page-nav a:hover { border-color: var(--docs-border-strong); background: var(--docs-bg-secondary); text-decoration: none; } -.docs-page-nav span { color: var(--docs-text-tertiary); font-size: .72rem; } -.docs-page-nav strong { font-size: .86rem; font-weight: 600; } -.docs-page-nav__next { grid-column: 2; text-align: right; } -.docs-footer { border-top: 1px solid var(--docs-border); background: var(--docs-bg); } -.docs-footer__inner { display: flex; justify-content: space-between; gap: 2rem; max-width: 90rem; padding: 1.4rem 1rem; margin: auto; color: var(--docs-text-tertiary); font-size: .78rem; } -.docs-footer__brand { display: grid; gap: .4rem; max-width: 31rem; } -.docs-footer__brand strong { color: var(--docs-text); font-size: .86rem; font-weight: 600; } -.docs-footer__brand span { line-height: 1.5; } -.docs-footer__brand b { margin: 0 .35rem; color: var(--docs-border-strong); font-weight: 400; } -.docs-footer__meta { display: grid; align-content: space-between; justify-items: end; gap: .9rem; text-align: right; } -.docs-footer nav { display: flex; flex-wrap: wrap; gap: 1rem; } -.docs-footer a { color: var(--docs-text-secondary); text-decoration: none; } -.docs-footer a:hover { color: var(--docs-link); } - -.docs-feedback { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 1rem; row-gap: .25rem; margin-top: 3rem; padding: 1.5rem 0; border: 0; border-top: 1px solid var(--docs-border); border-bottom: 1px solid var(--docs-border); border-radius: 0; background: transparent; } -.docs-feedback h2 { grid-column: 1; margin: 0; padding: 0; font-size: 1rem; } -.docs-feedback p { grid-column: 1 / -1; margin: .25rem 0 0; } -.docs-feedback > p:first-of-type { grid-column: 1; color: var(--docs-text-tertiary); font-size: .82rem; } -.docs-feedback button { padding: .45rem .75rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text-secondary); cursor: pointer; font: inherit; font-size: .8rem; } -.docs-feedback button:hover { border-color: var(--docs-border-strong); color: var(--docs-link); } -.docs-feedback button[aria-pressed="true"] { border-color: color-mix(in srgb, var(--docs-link) 55%, var(--docs-border)); background: color-mix(in srgb, var(--docs-link) 9%, var(--docs-bg)); color: var(--docs-link); font-weight: 600; } -.docs-feedback button:disabled { cursor: default; opacity: .65; } -.docs-feedback.is-submitted .docs-feedback__choices { opacity: .7; } -.docs-feedback__choices { display: flex; grid-column: 2; grid-row: 1 / span 2; align-self: center; gap: .5rem; } -.docs-feedback__form { grid-column: 1 / -1; margin-top: 1rem; } -.docs-feedback textarea { display: block; width: 100%; box-sizing: border-box; margin-top: .5rem; padding: .7rem; border: 1px solid var(--docs-border); border-radius: var(--docs-radius); background: var(--docs-bg); color: var(--docs-text); font: inherit; } -.docs-feedback__count { color: var(--docs-text-tertiary); font-size: .72rem; } -.docs-feedback__thanks { color: var(--docs-success); font-weight: 600; } -.docs-feedback__thanks:focus { outline: none; } -.docs-feedback__links { display: flex; flex-wrap: wrap; gap: .5rem 1rem; padding-top: .75rem; color: var(--docs-text-tertiary); font-size: .78rem; } -.docs-search-trigger:focus-visible, .docs-header__cta:focus-visible, .version-select-container .select-css:focus-visible, .content-link:focus-visible, .topic-card:focus-visible, .docs-page-nav a:focus-visible, .docs-feedback button:focus-visible, .docs-feedback textarea:focus-visible, .docs-feedback a:focus-visible, .docs-footer a:focus-visible, .docs-source-link:focus-visible { outline: 2px solid var(--docs-link); outline-offset: 3px; } - -/* Shared page frame. The header bar, the main grid, and the footer all use the - same max width, the same auto side margins, and the same left/right gutter, so - three landmarks line up at every width: on the left the logo / primary rail / - footer's left edge; on the right the theme toggle / outline (or content) right - edge / footer's right edge. Only the gutter changes per breakpoint (2rem on - desktop, 1rem below it) plus, on desktop, the grid tracks. Below the desktop - breakpoint the sidebars fold away and the article fills this same frame, so it - stays aligned with the menu and footer. */ -.md-header__inner, .md-main__inner, .docs-footer__inner { - box-sizing: border-box; - max-width: 90rem; - margin-inline: auto; - padding-inline: var(--docs-frame-gutter, 1rem); -} - -/* Desktop is a deliberate three-rail reading layout, not Material's fluid flex row. - Fixed rails keep the article measure stable and make the generous empty space useful. */ -@media screen and (min-width: 76.25em) { - /* Widen the shared frame's gutter on desktop; the frame geometry itself is - defined once, globally (see the .md-header__inner/.md-main__inner/ - .docs-footer__inner rule above the breakpoints). */ - :root { --docs-frame-gutter: 2rem; } - /* The main grid fills the frame: the rail pins to the left gutter, the - outline to the right gutter, and the article takes the remaining middle - (so its measure follows the frame). Making the middle flexible instead of - centering a fixed-width block is what stopped the rail and outline from - drifting inward, out of the header's and footer's edges. */ - .md-main__inner { - --docs-primary-rail-width: 16rem; /* primary navigation */ - --docs-toc-width: 12rem; /* outline; stays reserved (empty) on pages without a TOC */ - --docs-grid-gap: 2rem; - position: relative; - display: grid; - grid-template-columns: var(--docs-primary-rail-width) minmax(0, 1fr) var(--docs-toc-width); - column-gap: var(--docs-grid-gap); - } - /* This belongs to the full main grid, not the sticky sidebar: it therefore - frames the primary rail continuously from the header to the footer. The - rail is pinned to the left gutter, so the divider sits a fixed distance in - — the gutter, the rail, and half a column gap — with no viewport math. */ - .md-main__inner::before { position: absolute; top: -1.5rem; bottom: 0; z-index: 1; width: 1px; background: var(--docs-border); content: ""; pointer-events: none; } - [dir="ltr"] .md-main__inner::before { left: calc(var(--docs-frame-gutter) + var(--docs-primary-rail-width) + var(--docs-grid-gap) / 2); } - [dir="rtl"] .md-main__inner::before { right: calc(var(--docs-frame-gutter) + var(--docs-primary-rail-width) + var(--docs-grid-gap) / 2); } - /* The error page is the single deliberate exception: no rail, one centered - column (its sidebars are hidden above). Every other page — including no-TOC - landing pages — keeps the shell and simply leaves the outline column empty, - so the rail and article never move. */ - .md-main__inner:has(.docs-error) { grid-template-columns: minmax(0, 38rem); justify-content: center; } - .md-main__inner:has(.docs-error)::before { content: none; } - .md-sidebar { width: auto; max-width: none; } - .md-sidebar--secondary { margin-left: 0; } - .md-content { min-width: 0; max-width: none; } - .md-header__button[data-drawer-trigger] { display: none; } - .md-nav--primary > .md-nav__title { display: none; } - - /* Breadcrumb and article share a text edge. The primary navigation begins - slightly earlier, while the outline aligns with the page heading — the - stagger used by the strongest Mintlify/GitBook references. */ - .md-path { margin-top: 1.25rem; margin-right: 1.2rem; margin-left: 1.2rem; } - .md-sidebar--primary { padding-top: .75rem; } - .md-sidebar--secondary { padding-top: .75rem; } - - /* The navigation list owns its 24px hover gutter, keeping row widths - symmetrical without reserving extra space in the sidebar shell. */ - [dir="ltr"] .md-sidebar--primary .md-sidebar__inner { padding-right: 0; } - [dir="rtl"] .md-sidebar--primary .md-sidebar__inner { padding-left: 0; } - /* Material narrows this inner viewport when a section is expanded. Keep it - pinned to the desktop rail so grouped content retains the root-row width. */ - .md-sidebar--primary .md-sidebar__inner, - .md-sidebar--primary .md-nav--primary { width: 100%; max-width: none; box-sizing: border-box; } - [dir="ltr"] .md-sidebar--secondary .md-sidebar__inner { padding-right: 2rem; } - [dir="rtl"] .md-sidebar--secondary .md-sidebar__inner { padding-left: 2rem; } - - .md-sidebar--primary .md-sidebar__scrollwrap { margin-inline: 0; } - /* A long expanded group introduces the browser scrollbar. Reserve that - gutter from the root state as well, so the navigation content never - narrows when the sidebar starts scrolling. */ - .md-sidebar--primary .md-sidebar__scrollwrap { scrollbar-gutter: stable !important; } - /* Material reserves extra space on one side of desktop navigation rows. - The rail already owns a 16px list gutter, so remove that offset to keep - active, grouped, and standalone rows aligned to the same right edge. */ - .md-sidebar--primary .md-nav--primary .md-nav__link { margin-inline: 0; } - [dir="ltr"] .md-sidebar--primary .md-nav--primary .md-nav__link { margin-right: 0; } - [dir="rtl"] .md-sidebar--primary .md-nav--primary .md-nav__link { margin-left: 0; } - /* The TOC begins on the breadcrumb's post-header baseline. */ - .md-sidebar__inner, .md-sidebar--secondary .md-sidebar__inner { padding-top: 0; } -} - -@media screen and (min-width: 80em) { - /* Wider rail, outline, and gutters once there is room. The frame's max width - and side margins are unchanged, so the shared left/right edges hold; only - the tracks grow, and the article measure follows (reaching ~48rem once the - frame hits its 90rem cap). */ - .md-main__inner { --docs-primary-rail-width: 18rem; --docs-toc-width: 14rem; --docs-grid-gap: 3rem; } -} - -@media screen and (max-width: 76.2344em) { - .md-sidebar--secondary:not([hidden]) { display: none; } - /* Match the bottom rhythm of each root entry while the primary sidebar is - presented as the mobile drawer. */ - .md-nav--primary > .md-nav__list > .md-nav__item > .md-nav__link { margin-top: .25rem; } - /* Material adds a second arrow to the mobile group heading via this - pseudo-element; the inline icon is the only back control we need. */ - .md-nav--primary .md-nav__title .md-nav__icon::after { display: none; } - /* Keep the breadcrumb aligned with the article gutter after the desktop - three-rail layout collapses. */ - .md-path { padding-inline: 1rem; } - /* One computed rail width is shared by both transform states. This also - keeps expanded navigation labels from changing the drawer's footprint. */ - .md-sidebar--primary { --docs-nav-rail-width: min(20rem, calc(100vw - 3.5rem)); width: var(--docs-nav-rail-width); max-width: none; flex-basis: var(--docs-nav-rail-width); border: 0; box-shadow: none; background: var(--docs-bg); } - /* Material presents expanded sections as panels. Give those panels the - same horizontal gutter as the root list so the navigation rail doesn't - appear to widen when moving between levels. */ - .md-sidebar--primary .md-nav--primary, - .md-sidebar--primary .md-nav--primary .md-nav { width: var(--docs-nav-rail-width); min-width: var(--docs-nav-rail-width); max-width: var(--docs-nav-rail-width); box-sizing: border-box; } - .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list { box-sizing: border-box; padding-inline: 1rem; } - /* Group panels use Material's own list. Match the small vertical breathing - room of the root list, so each entry sits evenly between its separators. */ - .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list > .md-nav__item { margin-block: .25rem; } - /* A drilled-in panel must sit above its root-list siblings. Otherwise their - section icons bleed through the group heading and look like extra arrows. */ - .md-sidebar--primary .md-nav__item--nested > .md-nav__toggle:checked ~ .md-nav { z-index: 2; } - /* The root heading is omitted by the custom navigation partial: its logo - duplicates the header and its back control overlaps a drilled-in group. - Keep the repository source hidden in the drawer for the same reason. */ - .md-sidebar--primary .md-nav--primary[data-md-level="0"] > .md-nav__source { display: none; } - .md-sidebar--primary .md-nav--primary[data-md-level="0"] > .md-nav__list { padding-top: .75rem; } - .md-sidebar--primary .md-nav__title { border-bottom: 0; box-shadow: none; } - .md-sidebar--primary .md-nav--primary .md-nav > .md-nav__list { box-shadow: none; } - .md-sidebar--primary .md-sidebar__inner { padding-top: 0; } - [dir="ltr"] .md-sidebar--primary { left: 0; transform: translateX(calc(-1 * var(--docs-nav-rail-width))); } - [dir="rtl"] .md-sidebar--primary { right: 0; transform: translateX(var(--docs-nav-rail-width)); } - [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { transform: translateX(0); box-shadow: none; } - [dir="rtl"] [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { transform: translateX(0); } - [dir="ltr"] .md-sidebar--primary .md-sidebar__inner { padding-right: .75rem; } - [dir="rtl"] .md-sidebar--primary .md-sidebar__inner { padding-left: .75rem; } -} -@media screen and (min-width: 60em) and (max-width: 76.2344em) { - .md-header__inner { grid-template-columns: auto auto minmax(15rem, 30rem) minmax(0, 1fr) auto auto auto; } - .md-header__button[data-drawer-trigger] { order: -1; } - .md-main__inner { justify-content: center; } -} -@media screen and (min-width: 40.01em) and (max-width: 76.2344em) { - .topic-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .topic-row .topic-card:last-child { grid-column: 1 / -1; } -} -@media screen and (max-width: 59.9844em) { - .md-header__inner { grid-template-columns: auto auto auto minmax(0, 1fr) auto; min-height: 3.75rem; gap: .45rem; } - .md-header__button.md-logo img { height: 1.5rem; } - .md-header__button[data-drawer-trigger] { order: -1; } - .docs-search-trigger { grid-column: auto; width: auto; min-height: auto; justify-self: start; padding: .35rem; border: 0; background: transparent; } - .docs-search-trigger span, .docs-search-trigger kbd { display: none; } - .docs-header__cta { display: none; } - .version-select-container { grid-column: auto; margin-left: auto; } - .md-header [data-md-component="palette"] { grid-column: auto; } - .version-select-container .select-css { width: auto; max-width: 41vw; height: 2.35rem; } - .md-typeset h1 { font-size: 1.75rem; } - .docs-feedback { grid-template-columns: 1fr; } - .docs-feedback__choices { grid-column: 1; grid-row: auto; margin-top: .5rem; } - .docs-feedback button { min-height: 2.75rem; } - .docs-footer a, .docs-feedback__links a { display: inline-flex; min-height: 2.75rem; align-items: center; } - .docs-page-nav { grid-template-columns: 1fr; } - .docs-page-nav__next { grid-column: 1; text-align: left; } - .docs-footer__inner { flex-direction: column; } - .docs-footer__meta { justify-items: start; text-align: left; } -} -@media screen and (max-width: 40em) { - .content-columns-wrapper, .topic-row { grid-template-columns: 1fr; gap: .75rem; } - .topic-row .topic-card:last-child { grid-column: auto; } - .md-typeset #tool-versions + ul, .md-typeset #tool-versions + p + ul { grid-template-columns: 1fr; } -} -@media screen and (max-width: 27rem) { - .md-header__button.md-logo { width: 2rem; padding: .25rem; } - .md-header__button.md-logo img { height: 1.5rem; } - .md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search { background: color-mix(in srgb, var(--docs-bg) 42%, transparent); } - .md-toggle[data-md-toggle="search"]:checked ~ .md-header .md-search__inner { width: calc(100vw - 1rem); height: auto; max-height: calc(100dvh - 4.5rem - env(safe-area-inset-bottom)); margin-top: 4rem; border-radius: var(--docs-radius); } - .md-search .md-search__output, .md-search .md-search__scrollwrap { max-height: calc(100dvh - 7.5rem - env(safe-area-inset-bottom)) !important; } -}
Language File extensionsStatic analysisSuggested fixesStatic analysisSuggested fixes Secret detection Dependency vulnerability scanningMalicious packages detection 11DuplicationComplexityMalicious packages detection 11DuplicationComplexity License scanning