From ae639db117f066558e77d61f2e5215d95a4af358 Mon Sep 17 00:00:00 2001 From: newgrnetci Date: Wed, 6 Dec 2023 15:29:15 +0000 Subject: [PATCH] Deploy website - based on f2c40ee6cfc8fcc352aed4e33d642779108e38e2 --- 404.html | 8 ++++---- .../{193cf812.66e8894b.js => 193cf812.24327288.js} | 2 +- .../{1de2b0b2.94e8af37.js => 1de2b0b2.8292f1a3.js} | 2 +- .../{294a922a.5c4e9ded.js => 294a922a.1f6ad40a.js} | 2 +- .../{467b5c36.d944dcef.js => 467b5c36.9265d5ce.js} | 2 +- assets/js/4f4de028.0f119400.js | 1 + assets/js/4f4de028.28871bd6.js | 1 - .../{55f7549f.8be43562.js => 55f7549f.1d214e70.js} | 2 +- .../{58e2c8d2.05913925.js => 58e2c8d2.5f50400e.js} | 2 +- .../{2e4f6044.68d97f7d.js => 7193c74c.4e2ac402.js} | 2 +- assets/js/935f2afb.4ab739bd.js | 1 + assets/js/935f2afb.848052d0.js | 1 - .../{b311e722.bd1a6597.js => b5e81e6f.45c094a4.js} | 2 +- .../{b8ba37ed.40c31b81.js => b8ba37ed.7b7984ed.js} | 2 +- .../{bc796c94.696f49f8.js => bc796c94.c411d645.js} | 2 +- .../{59227a29.015c5e57.js => c7697309.ca7bf5b7.js} | 2 +- assets/js/ccd61d8c.061f7992.js | 1 - assets/js/ccd61d8c.35ae371e.js | 1 + .../{d7abbfd8.5914d25a.js => d7abbfd8.47412356.js} | 2 +- assets/js/main.32a4ebc6.js | 2 -- assets/js/main.e5861a7c.js | 2 ++ ...6.js.LICENSE.txt => main.e5861a7c.js.LICENSE.txt} | 0 assets/js/runtime~main.9b8307cf.js | 1 - assets/js/runtime~main.ccbfa78e.js | 1 + docs/UseCases/ProvidersPortal/index.html | 12 ++++++------ docs/category/communication/index.html | 10 +++++----- docs/category/guides/index.html | 8 ++++---- docs/category/information-feeds/index.html | 8 ++++---- docs/category/monitoring/index.html | 8 ++++---- docs/category/policies/index.html | 8 ++++---- docs/category/profiles/index.html | 8 ++++---- docs/category/reports/index.html | 8 ++++---- docs/category/training/index.html | 8 ++++---- docs/category/use-cases/index.html | 10 +++++----- docs/communication/index.html | 8 ++++---- docs/guides/AMS-consume-publish-events/index.html | 8 ++++---- docs/guides/EOSC-getARData/index.html | 8 ++++---- docs/guides/EOSC-getStatusData/index.html | 8 ++++---- docs/guides/case1/index.html | 8 ++++---- docs/guides/case2/index.html | 8 ++++---- docs/guides/case3/index.html | 8 ++++---- docs/guides/case4/index.html | 8 ++++---- docs/guides/case5/index.html | 8 ++++---- docs/guides/intro/index.html | 8 ++++---- docs/information_feeds/downtimes/index.html | 8 ++++---- docs/information_feeds/topology/index.html | 8 ++++---- docs/information_feeds/weights/index.html | 8 ++++---- docs/intro/index.html | 8 ++++---- docs/monitoring/SP_guide/index.html | 8 ++++---- docs/monitoring/guidelines/index.html | 8 ++++---- docs/policies/CookiePolicy/index.html | 8 ++++---- docs/policies/Privacy/index.html | 8 ++++---- docs/policies/Terms/index.html | 8 ++++---- docs/policies/tom/index.html | 8 ++++---- docs/profiles/aggregation-profile/index.html | 8 ++++---- docs/profiles/metrics-profile/index.html | 8 ++++---- docs/profiles/metrics-tags/index.html | 8 ++++---- docs/profiles/operations-profile/index.html | 8 ++++---- docs/profiles/thresholds-profile/index.html | 8 ++++---- docs/reports/ar/index.html | 8 ++++---- docs/reports/flapping-trends/index.html | 8 ++++---- .../status-critical-warning-unknown/index.html | 8 ++++---- docs/reports/status_timelines/index.html | 8 ++++---- docs/reports/timelines_&_ar/index.html | 8 ++++---- docs/training/index.html | 8 ++++---- index.html | 8 ++++---- markdown-page/index.html | 8 ++++---- search-index.json | 2 +- search/index.html | 8 ++++---- 69 files changed, 203 insertions(+), 203 deletions(-) rename assets/js/{193cf812.66e8894b.js => 193cf812.24327288.js} (99%) rename assets/js/{1de2b0b2.94e8af37.js => 1de2b0b2.8292f1a3.js} (98%) rename assets/js/{294a922a.5c4e9ded.js => 294a922a.1f6ad40a.js} (71%) rename assets/js/{467b5c36.d944dcef.js => 467b5c36.9265d5ce.js} (96%) create mode 100644 assets/js/4f4de028.0f119400.js delete mode 100644 assets/js/4f4de028.28871bd6.js rename assets/js/{55f7549f.8be43562.js => 55f7549f.1d214e70.js} (98%) rename assets/js/{58e2c8d2.05913925.js => 58e2c8d2.5f50400e.js} (54%) rename assets/js/{2e4f6044.68d97f7d.js => 7193c74c.4e2ac402.js} (63%) create mode 100644 assets/js/935f2afb.4ab739bd.js delete mode 100644 assets/js/935f2afb.848052d0.js rename assets/js/{b311e722.bd1a6597.js => b5e81e6f.45c094a4.js} (64%) rename assets/js/{b8ba37ed.40c31b81.js => b8ba37ed.7b7984ed.js} (96%) rename assets/js/{bc796c94.696f49f8.js => bc796c94.c411d645.js} (98%) rename assets/js/{59227a29.015c5e57.js => c7697309.ca7bf5b7.js} (64%) delete mode 100644 assets/js/ccd61d8c.061f7992.js create mode 100644 assets/js/ccd61d8c.35ae371e.js rename assets/js/{d7abbfd8.5914d25a.js => d7abbfd8.47412356.js} (99%) delete mode 100644 assets/js/main.32a4ebc6.js create mode 100644 assets/js/main.e5861a7c.js rename assets/js/{main.32a4ebc6.js.LICENSE.txt => main.e5861a7c.js.LICENSE.txt} (100%) delete mode 100644 assets/js/runtime~main.9b8307cf.js create mode 100644 assets/js/runtime~main.ccbfa78e.js diff --git a/404.html b/404.html index 8b0edd22..8f413faf 100644 --- a/404.html +++ b/404.html @@ -5,13 +5,13 @@ Page Not Found | Argo Monitoring - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/assets/js/193cf812.66e8894b.js b/assets/js/193cf812.24327288.js similarity index 99% rename from assets/js/193cf812.66e8894b.js rename to assets/js/193cf812.24327288.js index 095b6f33..02f4849c 100644 --- a/assets/js/193cf812.66e8894b.js +++ b/assets/js/193cf812.24327288.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3355],{3905:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>h});var r=i(7294);function o(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function a(e){for(var t=1;t=0||(o[i]=e[i]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(o[i]=e[i])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):a(a({},t),e)),i},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var i=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(i),h=o,m=d["".concat(l,".").concat(h)]||d[h]||p[h]||n;return i?r.createElement(m,a(a({ref:t},u),{},{components:i})):r.createElement(m,a({ref:t},u))}));function h(e,t){var i=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=i.length,a=new Array(n);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,a[1]=s;for(var c=2;c{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var r=i(7462),o=(i(7294),i(3905));const n={sidebar_position:1,title:"Introduction"},a=void 0,s={unversionedId:"guides/intro",id:"guides/intro",title:"Introduction",description:"Monitoring is the key service needed to gain insights into an infrastructure. It needs to be continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. The challenge of this type of monitoring is how to quickly identify and correlate problems before they affect end-users and ultimately the productivity of the organisation. Management teams can monitor the availability and reliability of the services from a high level view down to individual system metrics and monitor the conformance of multiple SLAs. The key functional requirements are:",source:"@site/docs/guides/intro.md",sourceDirName:"guides",slug:"/guides/intro",permalink:"/argo-monitoring/docs/guides/intro",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Introduction"},sidebar:"tutorialSidebar",previous:{title:"Guides",permalink:"/argo-monitoring/docs/category/guides"},next:{title:"Use Case 1: Monitor an Onboarded Service (central one)",permalink:"/argo-monitoring/docs/guides/case1"}},l={},c=[{value:"High-level Service Reference Architecture",id:"high-level-service-reference-architecture",level:2},{value:"Definitions",id:"definitions",level:2}],u={toc:c};function p(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Monitoring is the key service needed to gain insights into an infrastructure. It needs to be continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. The challenge of this type of monitoring is how to quickly identify and correlate problems before they affect end-users and ultimately the productivity of the organisation. Management teams can monitor the availability and reliability of the services from a high level view down to individual system metrics and monitor the conformance of multiple SLAs. The key functional requirements are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Monitoring of services"),(0,o.kt)("li",{parentName:"ul"},"Reporting availability and reliability,"),(0,o.kt)("li",{parentName:"ul"},"Visualisation of the services status, "),(0,o.kt)("li",{parentName:"ul"},"Provide dashboard interfaces,"),(0,o.kt)("li",{parentName:"ul"},"Sending real-time alerts. ")),(0,o.kt)("p",null,"The dashboard design should enable easy access and visualisation of data for end-users. APIs should also be supported so as to allow third parties to gather monitoring data from the system through them."),(0,o.kt)("p",null,"The key requirements of a monitoring system are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Support for multiple entry points (different types of systems can work together)"),(0,o.kt)("li",{parentName:"ul"},"Interoperable "),(0,o.kt)("li",{parentName:"ul"},"High availability of the different components of the system"),(0,o.kt)("li",{parentName:"ul"},"Loosely coupled: support API's in the full stack so that components are independent in their development cycles"),(0,o.kt)("li",{parentName:"ul"},"Support for Multiple Tenants, Configurations, Metrics and profiles to add flexibility and ease of customisation. ")),(0,o.kt)("p",null,"For EOSC there are two monitoring services already in place: EOSC CORE and the EOSC Exchange Monitoring Service. These two services are responsible to monitor the Core services (EOSC Core Monitoring) and the services onboarded to the Marketplace (EOSC-Exchange Monitoring)."),(0,o.kt)("h2",{id:"high-level-service-reference-architecture"},"High-level Service Reference Architecture"),(0,o.kt)("p",null,"The service collects status (metrics) results from one or more monitoring engine(es) and delivers daily and/or monthly availability (A) and reliability (R) results of distributed services. Both status results and A/R metrics are presented through a Web UI, with the ability for a user to drill-down from the availability of a site to individual test results that contributed to the computed figure."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Architecture",src:i(4359).Z,width:"952",height:"765"})),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Figure 1","."," High level architecture of a Monitoring service")," "),(0,o.kt)("p",null,"The main components of a monitoring service are depicted in the high-level architecture diagram and described below. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Monitoring Engine(s):")," This service component executes the service checks against the infrastructure and delivers the metric data (probe check results) to the Messaging Service. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Sources of Truth:")," The Monitoring system should support a number of connector plugins that are able to fetch topology, Metrics and Factors from various sources such as the CMDB and the Providers Portal. It also offers a Metric and Profile Management Component which is used in order to define checks (probes) and associate them to service types. Each grouping of checks and service types forms a profile. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Messaging:")," The monitoring system depends on a Pub/Sub Messaging Service to be in place, in order to facilitate the communication between its components."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Computations & Analytics:")," This component of the system should include computational job definitions for ingesting data, calculating status and availability/reliability and a management service to automatically configure, deploy and execute those jobs on a distributed processing engine for stateful computations. At the same time this component analyzes the monitoring results and sends notifications based on a set of rules, to inform the users (operators, NGIs) about the status of their services. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"WEB API:")," Rest-like HTTP API service that provides access to status and availability/reliability results. It supports token based authentication and authorization with established roles. Results are provided in JSON Format. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"WEB UI:"),' The Web UI is the component used to store, consolidate and "feed" data into the web application. The global information from the primary and heterogeneous data sources is retrieved by means of the different plugins. The collected information is structured and organized within configuration files in the service and, finally, made available to the web application without the need for any further computations. This modular architecture is conceived in order to make it easy to add new data sources and to use cached information if a primary source is unavailable. The resulting data is exposed through a ',(0,o.kt)("a",{parentName:"p",href:"http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"},"RESTful")," web service interface."),(0,o.kt)("h2",{id:"definitions"},"Definitions"),(0,o.kt)("p",null,"In this section we explain the basic concepts of EOSC Monitoring."),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},"Tenant")," is an isolated instance of the ARGO Monitor service that relies on common components and provides the user with its own environment. "),(0,o.kt)("p",null,"ARGO provides default ",(0,o.kt)("strong",{parentName:"p"},"UI and POEM URLs")," in following form:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"UI: ",(0,o.kt)("inlineCode",{parentName:"li"},"https://.ui.argo.grnet.gr")),(0,o.kt)("li",{parentName:"ul"},"POEM: ",(0,o.kt)("inlineCode",{parentName:"li"},"https://.ui.argo.grnet.gr"))),(0,o.kt)("p",null,"In case custom ones are to be used, the customer is responsible for providing valid certificates and DNS aliases."),(0,o.kt)("p",null,"ARGO Monitoring service requires following ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"/argo-monitoring/docs/information_feeds/topology"},"topology"))," information in order to monitor services:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"the services and service endpoints they are running,"),(0,o.kt)("li",{parentName:"ul"},"the way they are organised (e.g. groups of sites, groups of services),"),(0,o.kt)("li",{parentName:"ul"},"the service actors (owners, admins, contact points).")),(0,o.kt)("p",null,"Topology can be further extended with attributes needed for individual probes (e.g. service port or URL, path to be used in case of storage services, e.g.)."),(0,o.kt)("p",null,"Supported topology sources are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"EOSC Resource Registry (Providers Portal): ")),(0,o.kt)("p",null,"Need to be extended to hold the following information for Monitoring."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Service unique Id")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"the service endpoints,")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"the way they are organised (service, service components),")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"the service actors (owners, admins, contact points).")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"EGI Configuration Database (GOCDB) ")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"EUDAT DPMT")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"JSON feed in the predefined format."))),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},"Metric")," is a chunk of code that checks specific functionality of a given service. For example a metric such as Portal-WebCheck runs on a site and checks if the HTTP connection responds correctly or not. "),(0,o.kt)("p",null,"A Probe is a piece of code that implements single or multiple tests. The probe must comply with ",(0,o.kt)("a",{parentName:"p",href:"/argo-monitoring/docs/monitoring/guidelines"},"the guidelines for monitoring probes"),". "),(0,o.kt)("p",null,"ARGO provides a registry of probes and metrics. New probes and metrics can be added to the registry with the support of the ARGO monitoring team."),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"/argo-monitoring/docs/profiles/metrics-profile"},"Metric Profile"))," is used to associate a Service with the corresponding metrics."),(0,o.kt)("p",null,"An ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"/argo-monitoring/docs/profiles/aggregation-profile"},"Aggregation Profile"))," defines how to aggregate service statuses into higher hierarchical grouping (i.e. a service","_","group) status results. They are actually used to define logical rules on how to aggregate individual service status computations into groups."),(0,o.kt)("p",null,"The results of the metrics are computed, into EOSC Monitoring Service calculations, in order to conclude into the operational state of the service, during a specific period. In order to conclude about the operational state of the service, all or part of the metrics that check the service's functionality should be taken into account. In Metrics Profiles are included, for each service, these metrics whose results are considered to the computations of the service's state. For example, a service WebSite runs on host1.example.com. The WebSite service should operate properly, be accessible and some actions should be available such as downloading or uploading material (documents, images etc). Three metrics can apply on the service to check it's functionalities:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Portal-WebCheck is a metric to check if the http responds"),(0,o.kt)("li",{parentName:"ul"},"http.download is a metric to check if download functionality operates well"),(0,o.kt)("li",{parentName:"ul"},"http.upload is a metric to check if upload functionality operates well")),(0,o.kt)("p",null,"The service is assumed to operate properly if it is accessible and can support downloading material. Uploading material does not affect the state of the service (whether it is working properly or not). So in the Metrics Profile, the metrics Portal-WebCheck and http.download will be defined in order to be taken into account for concluding the status of the service."),(0,o.kt)("p",null,"Adopted Standards"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"REST (",(0,o.kt)("a",{parentName:"li",href:"https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"},"https://www.ics.uci.edu/~fielding/pubs/"),")"),(0,o.kt)("li",{parentName:"ul"},"SAML2 (",(0,o.kt)("a",{parentName:"li",href:"https://wiki.oasis-open.org/security/FrontPage"},"https://wiki.oasis-open.org/security/FrontPage"),")"),(0,o.kt)("li",{parentName:"ul"},"X509 (",(0,o.kt)("a",{parentName:"li",href:"https://www.rfc-editor.org/info/rfc5280"},"https://www.rfc-editor.org/info/rfc5280"),")"),(0,o.kt)("li",{parentName:"ul"},"Apache Avro (",(0,o.kt)("a",{parentName:"li",href:"http://avro.apache.org/"},"http://avro.apache.org/"),")")),(0,o.kt)("p",null,"Adopted Protocols"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"HTTPS (",(0,o.kt)("a",{parentName:"li",href:"https://tools.ietf.org/html/rfc2818"},"https://tools.ietf.org/html/rfc2818"),")"),(0,o.kt)("li",{parentName:"ul"},"Nagios Plugin API (",(0,o.kt)("a",{parentName:"li",href:"https://nagios-plugins.org/doc/guidelines.html"},"https://nagios-plugins.org/doc/guidelines.html"),")"),(0,o.kt)("li",{parentName:"ul"},"ARGO API over REST API (",(0,o.kt)("a",{parentName:"li",href:"http://argoeu.github.io/guides/api/"},"http://argoeu.github.io/guides/api/"),")")))}p.isMDXComponent=!0},4359:(e,t,i)=>{i.d(t,{Z:()=>r});const r=i.p+"assets/images/architecture-a66d2793f3e6fc0cd5b39bfc25c0dfdb.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3355],{3905:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>h});var r=i(7294);function o(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function a(e){for(var t=1;t=0||(o[i]=e[i]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(o[i]=e[i])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):a(a({},t),e)),i},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var i=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(i),h=o,m=d["".concat(l,".").concat(h)]||d[h]||p[h]||n;return i?r.createElement(m,a(a({ref:t},u),{},{components:i})):r.createElement(m,a({ref:t},u))}));function h(e,t){var i=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=i.length,a=new Array(n);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,a[1]=s;for(var c=2;c{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var r=i(7462),o=(i(7294),i(3905));const n={sidebar_position:1,title:"Introduction"},a=void 0,s={unversionedId:"guides/intro",id:"guides/intro",title:"Introduction",description:"Monitoring is the key service needed to gain insights into an infrastructure. It needs to be continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. The challenge of this type of monitoring is how to quickly identify and correlate problems before they affect end-users and ultimately the productivity of the organisation. Management teams can monitor the availability and reliability of the services from a high level view down to individual system metrics and monitor the conformance of multiple SLAs. The key functional requirements are:",source:"@site/docs/guides/intro.md",sourceDirName:"guides",slug:"/guides/intro",permalink:"/argo-monitoring/docs/guides/intro",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Introduction"},sidebar:"tutorialSidebar",previous:{title:"Guides",permalink:"/argo-monitoring/docs/category/guides"},next:{title:"Use Case 1: Monitor an Onboarded Service (central one)",permalink:"/argo-monitoring/docs/guides/case1"}},l={},c=[{value:"High-level Service Reference Architecture",id:"high-level-service-reference-architecture",level:2},{value:"Definitions",id:"definitions",level:2}],u={toc:c};function p(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Monitoring is the key service needed to gain insights into an infrastructure. It needs to be continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. The challenge of this type of monitoring is how to quickly identify and correlate problems before they affect end-users and ultimately the productivity of the organisation. Management teams can monitor the availability and reliability of the services from a high level view down to individual system metrics and monitor the conformance of multiple SLAs. The key functional requirements are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Monitoring of services"),(0,o.kt)("li",{parentName:"ul"},"Reporting availability and reliability,"),(0,o.kt)("li",{parentName:"ul"},"Visualisation of the services status, "),(0,o.kt)("li",{parentName:"ul"},"Provide dashboard interfaces,"),(0,o.kt)("li",{parentName:"ul"},"Sending real-time alerts. ")),(0,o.kt)("p",null,"The dashboard design should enable easy access and visualisation of data for end-users. APIs should also be supported so as to allow third parties to gather monitoring data from the system through them."),(0,o.kt)("p",null,"The key requirements of a monitoring system are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Support for multiple entry points (different types of systems can work together)"),(0,o.kt)("li",{parentName:"ul"},"Interoperable "),(0,o.kt)("li",{parentName:"ul"},"High availability of the different components of the system"),(0,o.kt)("li",{parentName:"ul"},"Loosely coupled: support API's in the full stack so that components are independent in their development cycles"),(0,o.kt)("li",{parentName:"ul"},"Support for Multiple Tenants, Configurations, Metrics and profiles to add flexibility and ease of customisation. ")),(0,o.kt)("p",null,"For EOSC there are two monitoring services already in place: EOSC CORE and the EOSC Exchange Monitoring Service. These two services are responsible to monitor the Core services (EOSC Core Monitoring) and the services onboarded to the Marketplace (EOSC-Exchange Monitoring)."),(0,o.kt)("h2",{id:"high-level-service-reference-architecture"},"High-level Service Reference Architecture"),(0,o.kt)("p",null,"The service collects status (metrics) results from one or more monitoring engine(es) and delivers daily and/or monthly availability (A) and reliability (R) results of distributed services. Both status results and A/R metrics are presented through a Web UI, with the ability for a user to drill-down from the availability of a site to individual test results that contributed to the computed figure."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Architecture",src:i(7087).Z,width:"952",height:"765"})),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Figure 1","."," High level architecture of a Monitoring service")," "),(0,o.kt)("p",null,"The main components of a monitoring service are depicted in the high-level architecture diagram and described below. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Monitoring Engine(s):")," This service component executes the service checks against the infrastructure and delivers the metric data (probe check results) to the Messaging Service. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Sources of Truth:")," The Monitoring system should support a number of connector plugins that are able to fetch topology, Metrics and Factors from various sources such as the CMDB and the Providers Portal. It also offers a Metric and Profile Management Component which is used in order to define checks (probes) and associate them to service types. Each grouping of checks and service types forms a profile. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Messaging:")," The monitoring system depends on a Pub/Sub Messaging Service to be in place, in order to facilitate the communication between its components."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Computations & Analytics:")," This component of the system should include computational job definitions for ingesting data, calculating status and availability/reliability and a management service to automatically configure, deploy and execute those jobs on a distributed processing engine for stateful computations. At the same time this component analyzes the monitoring results and sends notifications based on a set of rules, to inform the users (operators, NGIs) about the status of their services. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"WEB API:")," Rest-like HTTP API service that provides access to status and availability/reliability results. It supports token based authentication and authorization with established roles. Results are provided in JSON Format. "),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"WEB UI:"),' The Web UI is the component used to store, consolidate and "feed" data into the web application. The global information from the primary and heterogeneous data sources is retrieved by means of the different plugins. The collected information is structured and organized within configuration files in the service and, finally, made available to the web application without the need for any further computations. This modular architecture is conceived in order to make it easy to add new data sources and to use cached information if a primary source is unavailable. The resulting data is exposed through a ',(0,o.kt)("a",{parentName:"p",href:"http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"},"RESTful")," web service interface."),(0,o.kt)("h2",{id:"definitions"},"Definitions"),(0,o.kt)("p",null,"In this section we explain the basic concepts of EOSC Monitoring."),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},"Tenant")," is an isolated instance of the ARGO Monitor service that relies on common components and provides the user with its own environment. "),(0,o.kt)("p",null,"ARGO provides default ",(0,o.kt)("strong",{parentName:"p"},"UI and POEM URLs")," in following form:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"UI: ",(0,o.kt)("inlineCode",{parentName:"li"},"https://.ui.argo.grnet.gr")),(0,o.kt)("li",{parentName:"ul"},"POEM: ",(0,o.kt)("inlineCode",{parentName:"li"},"https://.ui.argo.grnet.gr"))),(0,o.kt)("p",null,"In case custom ones are to be used, the customer is responsible for providing valid certificates and DNS aliases."),(0,o.kt)("p",null,"ARGO Monitoring service requires following ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"/argo-monitoring/docs/information_feeds/topology"},"topology"))," information in order to monitor services:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"the services and service endpoints they are running,"),(0,o.kt)("li",{parentName:"ul"},"the way they are organised (e.g. groups of sites, groups of services),"),(0,o.kt)("li",{parentName:"ul"},"the service actors (owners, admins, contact points).")),(0,o.kt)("p",null,"Topology can be further extended with attributes needed for individual probes (e.g. service port or URL, path to be used in case of storage services, e.g.)."),(0,o.kt)("p",null,"Supported topology sources are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"EOSC Resource Registry (Providers Portal): ")),(0,o.kt)("p",null,"Need to be extended to hold the following information for Monitoring."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Service unique Id")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"the service endpoints,")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"the way they are organised (service, service components),")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"the service actors (owners, admins, contact points).")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"EGI Configuration Database (GOCDB) ")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"EUDAT DPMT")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"JSON feed in the predefined format."))),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},"Metric")," is a chunk of code that checks specific functionality of a given service. For example a metric such as Portal-WebCheck runs on a site and checks if the HTTP connection responds correctly or not. "),(0,o.kt)("p",null,"A Probe is a piece of code that implements single or multiple tests. The probe must comply with ",(0,o.kt)("a",{parentName:"p",href:"/argo-monitoring/docs/monitoring/guidelines"},"the guidelines for monitoring probes"),". "),(0,o.kt)("p",null,"ARGO provides a registry of probes and metrics. New probes and metrics can be added to the registry with the support of the ARGO monitoring team."),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"/argo-monitoring/docs/profiles/metrics-profile"},"Metric Profile"))," is used to associate a Service with the corresponding metrics."),(0,o.kt)("p",null,"An ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"/argo-monitoring/docs/profiles/aggregation-profile"},"Aggregation Profile"))," defines how to aggregate service statuses into higher hierarchical grouping (i.e. a service","_","group) status results. They are actually used to define logical rules on how to aggregate individual service status computations into groups."),(0,o.kt)("p",null,"The results of the metrics are computed, into EOSC Monitoring Service calculations, in order to conclude into the operational state of the service, during a specific period. In order to conclude about the operational state of the service, all or part of the metrics that check the service's functionality should be taken into account. In Metrics Profiles are included, for each service, these metrics whose results are considered to the computations of the service's state. For example, a service WebSite runs on host1.example.com. The WebSite service should operate properly, be accessible and some actions should be available such as downloading or uploading material (documents, images etc). Three metrics can apply on the service to check it's functionalities:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Portal-WebCheck is a metric to check if the http responds"),(0,o.kt)("li",{parentName:"ul"},"http.download is a metric to check if download functionality operates well"),(0,o.kt)("li",{parentName:"ul"},"http.upload is a metric to check if upload functionality operates well")),(0,o.kt)("p",null,"The service is assumed to operate properly if it is accessible and can support downloading material. Uploading material does not affect the state of the service (whether it is working properly or not). So in the Metrics Profile, the metrics Portal-WebCheck and http.download will be defined in order to be taken into account for concluding the status of the service."),(0,o.kt)("p",null,"Adopted Standards"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"REST (",(0,o.kt)("a",{parentName:"li",href:"https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"},"https://www.ics.uci.edu/~fielding/pubs/"),")"),(0,o.kt)("li",{parentName:"ul"},"SAML2 (",(0,o.kt)("a",{parentName:"li",href:"https://wiki.oasis-open.org/security/FrontPage"},"https://wiki.oasis-open.org/security/FrontPage"),")"),(0,o.kt)("li",{parentName:"ul"},"X509 (",(0,o.kt)("a",{parentName:"li",href:"https://www.rfc-editor.org/info/rfc5280"},"https://www.rfc-editor.org/info/rfc5280"),")"),(0,o.kt)("li",{parentName:"ul"},"Apache Avro (",(0,o.kt)("a",{parentName:"li",href:"http://avro.apache.org/"},"http://avro.apache.org/"),")")),(0,o.kt)("p",null,"Adopted Protocols"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"HTTPS (",(0,o.kt)("a",{parentName:"li",href:"https://tools.ietf.org/html/rfc2818"},"https://tools.ietf.org/html/rfc2818"),")"),(0,o.kt)("li",{parentName:"ul"},"Nagios Plugin API (",(0,o.kt)("a",{parentName:"li",href:"https://nagios-plugins.org/doc/guidelines.html"},"https://nagios-plugins.org/doc/guidelines.html"),")"),(0,o.kt)("li",{parentName:"ul"},"ARGO API over REST API (",(0,o.kt)("a",{parentName:"li",href:"http://argoeu.github.io/guides/api/"},"http://argoeu.github.io/guides/api/"),")")))}p.isMDXComponent=!0},7087:(e,t,i)=>{i.d(t,{Z:()=>r});const r=i.p+"assets/images/architecture-a66d2793f3e6fc0cd5b39bfc25c0dfdb.png"}}]); \ No newline at end of file diff --git a/assets/js/1de2b0b2.94e8af37.js b/assets/js/1de2b0b2.8292f1a3.js similarity index 98% rename from assets/js/1de2b0b2.94e8af37.js rename to assets/js/1de2b0b2.8292f1a3.js index 3f3ad89e..8b59e410 100644 --- a/assets/js/1de2b0b2.94e8af37.js +++ b/assets/js/1de2b0b2.8292f1a3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1413],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var i=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=i.createContext({}),c=function(e){var t=i.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),g=c(r),m=o,d=g["".concat(l,".").concat(m)]||g[m]||u[m]||n;return r?i.createElement(d,a(a({ref:t},p),{},{components:r})):i.createElement(d,a({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,a=new Array(n);a[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var i=r(7462),o=(r(7294),r(3905));const n={sidebar_position:1,title:"Monitoring guide for Service Providers"},a=void 0,s={unversionedId:"monitoring/SP_guide",id:"monitoring/SP_guide",title:"Monitoring guide for Service Providers",description:"Overview",source:"@site/docs/monitoring/SP_guide.md",sourceDirName:"monitoring",slug:"/monitoring/SP_guide",permalink:"/argo-monitoring/docs/monitoring/SP_guide",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Monitoring guide for Service Providers"},sidebar:"tutorialSidebar",previous:{title:"Monitoring",permalink:"/argo-monitoring/docs/category/monitoring"},next:{title:"Guidelines for monitoring probes",permalink:"/argo-monitoring/docs/monitoring/guidelines"}},l={},c=[{value:"Overview",id:"overview",level:2},{value:"Topology",id:"topology",level:2},{value:"Topology information",id:"topology-information",level:3},{value:"Metrics & probes",id:"metrics--probes",level:2},{value:"Service probe",id:"service-probe",level:3},{value:"Setting up service monitoring",id:"setting-up-service-monitoring",level:2}],p={toc:c};function u(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,i.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"overview"},"Overview"),(0,o.kt)("p",null,"The ARGO Monitoring service provides a flexible and scalable framework for monitoring status, availability and reliability of a wide range of services provided by infrastructures with medium to high complexity. ARGO generates reports using customer defined profiles (e.g. for SLA management, operations, etc.). During the report generation, ARGO takes into account custom factors such as the importance of a specific service endpoint and scheduled or unscheduled downtimes."),(0,o.kt)("h2",{id:"topology"},"Topology"),(0,o.kt)("p",null,"Topology database is actually a central registry for e-Infrastructure topology. "),(0,o.kt)("h3",{id:"topology-information"},"Topology information"),(0,o.kt)("p",null,"Monitoring service relies on topology database to provide the following information:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"monitored service(s)"),","),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"service types")," they are running (e.g. wiki),"),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"service endpoints")," of the service (e.g. endpoint),"),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"way they are organized")," (e.g. in groups of sites, in groups of services),"),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"service actors")," (owners, admins, contact points).")),(0,o.kt)("h2",{id:"metrics--probes"},"Metrics & probes"),(0,o.kt)("p",null,"A metric is a procedure that checks specific functionality of a given service, i.e. a single measurement. For example:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://poem.argo.grnet.gr/ui/public_metrictemplates/generic.http.connect"},"generic.http.connect"),": checks the http if it responds;"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://poem.argo.grnet.gr/ui/public_metrictemplates/generic.certificate.validity"},"generic.certificate.validity"),": checks the validity of a certificate.")),(0,o.kt)("h3",{id:"service-probe"},"Service probe"),(0,o.kt)("p",null,"Probe is piece of code which implements single or multiple tests. All the probes intended to be used for monitoring must comply with the ",(0,o.kt)("a",{parentName:"p",href:"/argo-monitoring/docs/monitoring/guidelines"},"guidelines for monitoring probes"),"."),(0,o.kt)("p",null,"The owners of the service are the ones that ",(0,o.kt)("strong",{parentName:"p"},"know exactly how the service is working"),". The service development team with the support of the monitoring team is responsible to implement the probe that checks and at the same time mimics the actual end user behaviour without requiring special privileges or special configurations."),(0,o.kt)("p",null,"Before you start implementing your probe, please check in the ",(0,o.kt)("a",{parentName:"p",href:"https://poem.argo.grnet.gr/ui/public_probes"},"POEM library")," if appropriate probe is already used for monitoring services."),(0,o.kt)("h2",{id:"setting-up-service-monitoring"},"Setting up service monitoring"),(0,o.kt)("p",null,(0,o.kt)("img",{src:r(5098).Z,width:"1565",height:"1832"})))}u.isMDXComponent=!0},5098:(e,t,r)=>{r.d(t,{Z:()=>i});const i=r.p+"assets/images/flowchart-cd8414acd3acdd48a1b98299bb09675e.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1413],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var i=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=i.createContext({}),c=function(e){var t=i.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),g=c(r),m=o,d=g["".concat(l,".").concat(m)]||g[m]||u[m]||n;return r?i.createElement(d,a(a({ref:t},p),{},{components:r})):i.createElement(d,a({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,a=new Array(n);a[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var i=r(7462),o=(r(7294),r(3905));const n={sidebar_position:1,title:"Monitoring guide for Service Providers"},a=void 0,s={unversionedId:"monitoring/SP_guide",id:"monitoring/SP_guide",title:"Monitoring guide for Service Providers",description:"Overview",source:"@site/docs/monitoring/SP_guide.md",sourceDirName:"monitoring",slug:"/monitoring/SP_guide",permalink:"/argo-monitoring/docs/monitoring/SP_guide",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Monitoring guide for Service Providers"},sidebar:"tutorialSidebar",previous:{title:"Monitoring",permalink:"/argo-monitoring/docs/category/monitoring"},next:{title:"Guidelines for monitoring probes",permalink:"/argo-monitoring/docs/monitoring/guidelines"}},l={},c=[{value:"Overview",id:"overview",level:2},{value:"Topology",id:"topology",level:2},{value:"Topology information",id:"topology-information",level:3},{value:"Metrics & probes",id:"metrics--probes",level:2},{value:"Service probe",id:"service-probe",level:3},{value:"Setting up service monitoring",id:"setting-up-service-monitoring",level:2}],p={toc:c};function u(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,i.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"overview"},"Overview"),(0,o.kt)("p",null,"The ARGO Monitoring service provides a flexible and scalable framework for monitoring status, availability and reliability of a wide range of services provided by infrastructures with medium to high complexity. ARGO generates reports using customer defined profiles (e.g. for SLA management, operations, etc.). During the report generation, ARGO takes into account custom factors such as the importance of a specific service endpoint and scheduled or unscheduled downtimes."),(0,o.kt)("h2",{id:"topology"},"Topology"),(0,o.kt)("p",null,"Topology database is actually a central registry for e-Infrastructure topology. "),(0,o.kt)("h3",{id:"topology-information"},"Topology information"),(0,o.kt)("p",null,"Monitoring service relies on topology database to provide the following information:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"monitored service(s)"),","),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"service types")," they are running (e.g. wiki),"),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"service endpoints")," of the service (e.g. endpoint),"),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"way they are organized")," (e.g. in groups of sites, in groups of services),"),(0,o.kt)("li",{parentName:"ul"},"the ",(0,o.kt)("strong",{parentName:"li"},"service actors")," (owners, admins, contact points).")),(0,o.kt)("h2",{id:"metrics--probes"},"Metrics & probes"),(0,o.kt)("p",null,"A metric is a procedure that checks specific functionality of a given service, i.e. a single measurement. For example:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://poem.argo.grnet.gr/ui/public_metrictemplates/generic.http.connect"},"generic.http.connect"),": checks the http if it responds;"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://poem.argo.grnet.gr/ui/public_metrictemplates/generic.certificate.validity"},"generic.certificate.validity"),": checks the validity of a certificate.")),(0,o.kt)("h3",{id:"service-probe"},"Service probe"),(0,o.kt)("p",null,"Probe is piece of code which implements single or multiple tests. All the probes intended to be used for monitoring must comply with the ",(0,o.kt)("a",{parentName:"p",href:"/argo-monitoring/docs/monitoring/guidelines"},"guidelines for monitoring probes"),"."),(0,o.kt)("p",null,"The owners of the service are the ones that ",(0,o.kt)("strong",{parentName:"p"},"know exactly how the service is working"),". The service development team with the support of the monitoring team is responsible to implement the probe that checks and at the same time mimics the actual end user behaviour without requiring special privileges or special configurations."),(0,o.kt)("p",null,"Before you start implementing your probe, please check in the ",(0,o.kt)("a",{parentName:"p",href:"https://poem.argo.grnet.gr/ui/public_probes"},"POEM library")," if appropriate probe is already used for monitoring services."),(0,o.kt)("h2",{id:"setting-up-service-monitoring"},"Setting up service monitoring"),(0,o.kt)("p",null,(0,o.kt)("img",{src:r(1109).Z,width:"1565",height:"1832"})))}u.isMDXComponent=!0},1109:(e,t,r)=>{r.d(t,{Z:()=>i});const i=r.p+"assets/images/flowchart-cd8414acd3acdd48a1b98299bb09675e.png"}}]); \ No newline at end of file diff --git a/assets/js/294a922a.5c4e9ded.js b/assets/js/294a922a.1f6ad40a.js similarity index 71% rename from assets/js/294a922a.5c4e9ded.js rename to assets/js/294a922a.1f6ad40a.js index 31b5be3d..997673f2 100644 --- a/assets/js/294a922a.5c4e9ded.js +++ b/assets/js/294a922a.1f6ad40a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8123],{573:e=>{e.exports=JSON.parse('{"title":"Use Cases","slug":"/category/use-cases","permalink":"/argo-monitoring/docs/category/use-cases","navigation":{"previous":{"title":"Training Material","permalink":"/argo-monitoring/docs/training/"},"next":{"title":"Providers Portal Use Case","permalink":"/argo-monitoring/docs/UseCases/ProvidersPortal"}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8123],{573:e=>{e.exports=JSON.parse('{"title":"Use Cases","slug":"/category/use-cases","permalink":"/argo-monitoring/docs/category/use-cases","navigation":{"previous":{"title":"Training Material","permalink":"/argo-monitoring/docs/training/"},"next":{"title":"Monitoring Data in the Providers Portal","permalink":"/argo-monitoring/docs/UseCases/ProvidersPortal"}}}')}}]); \ No newline at end of file diff --git a/assets/js/467b5c36.d944dcef.js b/assets/js/467b5c36.9265d5ce.js similarity index 96% rename from assets/js/467b5c36.d944dcef.js rename to assets/js/467b5c36.9265d5ce.js index 623bcca9..0c96f99b 100644 --- a/assets/js/467b5c36.d944dcef.js +++ b/assets/js/467b5c36.9265d5ce.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3435],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var i=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=i.createContext({}),p=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return i.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},u=i.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=r,d=u["".concat(l,".").concat(h)]||u[h]||m[h]||o;return n?i.createElement(d,a(a({ref:t},c),{},{components:n})):i.createElement(d,a({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:r,a[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var i=n(7462),r=(n(7294),n(3905));const o={sidebar_position:2,title:"Status Timelines"},a=void 0,s={unversionedId:"reports/status_timelines",id:"reports/status_timelines",title:"Status Timelines",description:"Status Timelines",source:"@site/docs/reports/status_timelines.md",sourceDirName:"reports",slug:"/reports/status_timelines",permalink:"/argo-monitoring/docs/reports/status_timelines",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Status Timelines"},sidebar:"tutorialSidebar",previous:{title:"Status Timelines & A/R Results",permalink:"/argo-monitoring/docs/reports/timelines_&_ar"},next:{title:"A/R results",permalink:"/argo-monitoring/docs/reports/ar"}},l={},p=[{value:"Status Timelines",id:"status-timelines",level:2},{value:"Metric Level - Monitoring a single check",id:"metric-level----monitoring-a-single-check",level:3},{value:"Example:",id:"example",level:4},{value:"Endpoint Level - Monitoring a single host",id:"endpoint-level----monitoring-a-single-host",level:3},{value:"Example:",id:"example-1",level:4},{value:"Service Level -Monitoring an entire service",id:"service-level---monitoring-an-entire-service",level:3},{value:"Example :",id:"example-",level:4},{value:"Monitoring an entire group",id:"monitoring-an-entire-group",level:3},{value:"Example :",id:"example--1",level:4}],c={toc:p};function m(e){let{components:t,...o}=e;return(0,r.kt)("wrapper",(0,i.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"status-timelines"},"Status Timelines"),(0,r.kt)("p",null,"Status Timeline is a report of the status of the monitored item/group of items, during the monitoring time. Knowing the timeline, provides information about the condition of the monitored item , helps to spot the most problematic metrics and decide about them. It is of major significance especially knowing when the monitored item is in a CRITICAL status, or it is in OK status "),(0,r.kt)("p",null,"The calculations of the ARGO Monitoring service apply to all levels of the topology, grouping the monitored items based on the topology\u2019s characteristics. Only items that are contained in the topology are included in the calculations, as they are defined by Topology Group, Topology Endpoint."),(0,r.kt)("h3",{id:"metric-level----monitoring-a-single-check"},"Metric Level - Monitoring a single check"),(0,r.kt)("p",null,"The first step of calculations of the ARGO Monitoring service is concluding results in the level of the metric checks. "),(0,r.kt)("h4",{id:"example"},"Example:"),(0,r.kt)("p",null,"The metric check applies on a monitoring item with the following topology\u2019s characteristics:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},' "metric": "http.check",\n "hostname": "host1.example.com",\n "service_type": "Web-Site",\n "group": "group1"\n')),(0,r.kt)("p",null,"The Metric Data records for this item could give information about the status as : "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"timestamp"),(0,r.kt)("th",{parentName:"tr",align:null},"status"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T00:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T03:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T06:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T09:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T12:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T15:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T18:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T21:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")))),(0,r.kt)("p",null,"The timeline result would be as shown in picture: ",(0,r.kt)("img",{src:n(5422).Z,width:"1109",height:"632"})," "),(0,r.kt)("h3",{id:"endpoint-level----monitoring-a-single-host"},"Endpoint Level - Monitoring a single host"),(0,r.kt)("p",null,"The next level of the calculations is the endpoint level, producing results for a single host. A host includes multiple metric checks, so the Metric Data are grouped by the host. But not all metric checks of the host need to be included into the calculations.\nThe ARGO Monitoring Service retrieves a Metric Profile report that defines the significant metric check. The Metric Data are filtered based on the given information and computations apply only to the metric checks defined in the Metric Profile reports. The Argo Monitoring service will combine the timelines of the metric checks and will combine the time interval and statuses into a new timeline. In order to combine the different statuses of a time interval and conclude into one status the ARGO Monitoring service retrieves an Operation Profile that defines all the possible status combinations. As Operation Profile includes a defined operation with a truth table of possible status combinations, the ARGO Monitoring service retrieves the operation that corresponds to the endpoint level from the Aggregation Profile"),(0,r.kt)("h4",{id:"example-1"},"Example:"),(0,r.kt)("p",null,"Here are three metric checks for the same host: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'"metric": "http.check", \n"hostname":"host1.example.com,\n"service_type": "Web-Site",\n"group": "group1" `\n')),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'"metric": "http.download",\n"hostname":"host1.example.com",\n"service_type":"Web-Site",\n"group": "group1"\n')),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'"metric": "http.upload",\n"hostname": "host1.example.com",\n"service_type": "Web-Site",\n"group": "group1"\n')),(0,r.kt)("p",null,"But from the metric profile report only ",(0,r.kt)("strong",{parentName:"p"},"http.download")," and ",(0,r.kt)("strong",{parentName:"p"},"http.upload")," are defined.\nAs a result the ARGO Monitoring service will filter the Metric Data and will ignore the ones of the ",(0,r.kt)("strong",{parentName:"p"},"http.check")," metric check. The timelines of ",(0,r.kt)("strong",{parentName:"p"},"http.download")," and ",(0,r.kt)("strong",{parentName:"p"},"http.upload")," will combine with each other and produce the timeline of the endpoint ",(0,r.kt)("strong",{parentName:"p"},"host1.example.com"),", as shown in picture: ",(0,r.kt)("img",{src:n(3283).Z,width:"1040",height:"572"})," "),(0,r.kt)("h3",{id:"service-level---monitoring-an-entire-service"},"Service Level -Monitoring an entire service"),(0,r.kt)("p",null,"The next level of the calculations is the service level, producing results for a single service. A service runs under multiple hosts, so the Metric Data are grouped by the service. The Argo Monitoring service will combine the timelines of the hosts that run the service into a new timeline."),(0,r.kt)("p",null,"Not all services are included into the calculations. ARGO Monitoring service filters the data to retrieve explicitly these services, as they are defined in Aggregation Profiles."),(0,r.kt)("p",null,"In order to combine the different statuses of a time interval and conclude into one status, the ARGO Monitoring service retrieves from the Aggregation Profile the operation for each service and knowing this, retrieves the status combination of this operation from the Operation Profile."),(0,r.kt)("h4",{id:"example-"},"Example :"),(0,r.kt)("p",null,"The monitored service ",(0,r.kt)("strong",{parentName:"p"},"Web-Site")," operates under 3 hosts :\n",(0,r.kt)("strong",{parentName:"p"},"host1.example.com"),", ",(0,r.kt)("strong",{parentName:"p"},"host2.example.com"),", ",(0,r.kt)("strong",{parentName:"p"},"host3.example.com"),". In order to decide that the service operates successfully it should run successfully to all hosts. ARGO Monitoring Service groups the timelines by the service ",(0,r.kt)("strong",{parentName:"p"},"Web-Site")," and would create status timelines for the service by combining the individual host status timelines. "),(0,r.kt)("p",null,"The way that the individual hosts\u2019 status timelines are combined to produce the final result for the service is described in the Aggregation Profile. The Aggregation Profile defines the ",(0,r.kt)("strong",{parentName:"p"},"AND")," or ",(0,r.kt)("strong",{parentName:"p"},"OR")," way to aggregate the individual hosts\u2019 status timelines in order to compute the final timelines. The function ",(0,r.kt)("strong",{parentName:"p"},"AND"),", ",(0,r.kt)("strong",{parentName:"p"},"OR")," and the way they are used for the computations are defined in the Operations Profile. "),(0,r.kt)("p",null,"The timeline result would be as shown in picture: ",(0,r.kt)("img",{src:n(2521).Z,width:"1032",height:"558"})," "),(0,r.kt)("h3",{id:"monitoring-an-entire-group"},"Monitoring an entire group"),(0,r.kt)("p",null,"A group might contain a number of service offerings, such as a ",(0,r.kt)("strong",{parentName:"p"},"Web-Site"),", a ",(0,r.kt)("strong",{parentName:"p"},"mysql-db"),", a ",(0,r.kt)("strong",{parentName:"p"},"NextCloud")," etc. The services\u2019 timelines can be combined and concluded into a status timeline for the group. A group may represent a whole project or a group of services that work together to offer an operational solution to the users. This kind of grouping could also represent data infrastructures with geographical designation, such as a specific data center etc.\nThe way that these services are combined to produce the final result for the group is described in the Aggregation Profile. "),(0,r.kt)("h4",{id:"example--1"},"Example :"),(0,r.kt)("p",null,"In the previous example we described how the ARGO Monitoring Service is monitoring the service ",(0,r.kt)("strong",{parentName:"p"},"Web-Site")," . Let\u2019s assume we have the ",(0,r.kt)("strong",{parentName:"p"},"mysql-db")," service for storing data, and the ",(0,r.kt)("strong",{parentName:"p"},"NextCloud")," service for storing files. "),(0,r.kt)("p",null,"A project is using these 3 services for its users. In order for the service offering to be operational, all of these 3 services should run without problems. In order to monitor them we put them in a group named by the project they belong to. ARGO Monitoring Service would create status timelines for the project by combining the individual service status timelines."),(0,r.kt)("p",null,"The way that the individual service status timelines are combined to produce the final result for the group is described in the Aggregation Profile. The Aggregation Profile defines the AND or OR way to aggregate the individual service status timelines in order to compute the final timelines. The function AND, OR and the way they are used for the computations are defined in the Operations Profile. "),(0,r.kt)("p",null,"The timeline result would be as shown in picture: ",(0,r.kt)("img",{src:n(8006).Z,width:"1045",height:"563"})))}m.isMDXComponent=!0},3283:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/endptimelines-0e9534b1d7ca9f4eb72cd5331cb48cdb.png"},8006:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/grouptimelines-8101bd7c7a545050d9d78c15f7833d2f.png"},5422:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/metrictimelines-cb2441dc2f225d7e647b7f4eda292f55.png"},2521:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/servicetimelines-6590e9cd54679659718489e9cc4a90a3.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3435],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var i=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=i.createContext({}),p=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return i.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},u=i.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=r,d=u["".concat(l,".").concat(h)]||u[h]||m[h]||o;return n?i.createElement(d,a(a({ref:t},c),{},{components:n})):i.createElement(d,a({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:r,a[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var i=n(7462),r=(n(7294),n(3905));const o={sidebar_position:2,title:"Status Timelines"},a=void 0,s={unversionedId:"reports/status_timelines",id:"reports/status_timelines",title:"Status Timelines",description:"Status Timelines",source:"@site/docs/reports/status_timelines.md",sourceDirName:"reports",slug:"/reports/status_timelines",permalink:"/argo-monitoring/docs/reports/status_timelines",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Status Timelines"},sidebar:"tutorialSidebar",previous:{title:"Status Timelines & A/R Results",permalink:"/argo-monitoring/docs/reports/timelines_&_ar"},next:{title:"A/R results",permalink:"/argo-monitoring/docs/reports/ar"}},l={},p=[{value:"Status Timelines",id:"status-timelines",level:2},{value:"Metric Level - Monitoring a single check",id:"metric-level----monitoring-a-single-check",level:3},{value:"Example:",id:"example",level:4},{value:"Endpoint Level - Monitoring a single host",id:"endpoint-level----monitoring-a-single-host",level:3},{value:"Example:",id:"example-1",level:4},{value:"Service Level -Monitoring an entire service",id:"service-level---monitoring-an-entire-service",level:3},{value:"Example :",id:"example-",level:4},{value:"Monitoring an entire group",id:"monitoring-an-entire-group",level:3},{value:"Example :",id:"example--1",level:4}],c={toc:p};function m(e){let{components:t,...o}=e;return(0,r.kt)("wrapper",(0,i.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"status-timelines"},"Status Timelines"),(0,r.kt)("p",null,"Status Timeline is a report of the status of the monitored item/group of items, during the monitoring time. Knowing the timeline, provides information about the condition of the monitored item , helps to spot the most problematic metrics and decide about them. It is of major significance especially knowing when the monitored item is in a CRITICAL status, or it is in OK status "),(0,r.kt)("p",null,"The calculations of the ARGO Monitoring service apply to all levels of the topology, grouping the monitored items based on the topology\u2019s characteristics. Only items that are contained in the topology are included in the calculations, as they are defined by Topology Group, Topology Endpoint."),(0,r.kt)("h3",{id:"metric-level----monitoring-a-single-check"},"Metric Level - Monitoring a single check"),(0,r.kt)("p",null,"The first step of calculations of the ARGO Monitoring service is concluding results in the level of the metric checks. "),(0,r.kt)("h4",{id:"example"},"Example:"),(0,r.kt)("p",null,"The metric check applies on a monitoring item with the following topology\u2019s characteristics:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},' "metric": "http.check",\n "hostname": "host1.example.com",\n "service_type": "Web-Site",\n "group": "group1"\n')),(0,r.kt)("p",null,"The Metric Data records for this item could give information about the status as : "),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"timestamp"),(0,r.kt)("th",{parentName:"tr",align:null},"status"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T00:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T03:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T06:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T09:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T12:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T15:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T18:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2021-05-02T21:00:00Z"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")))),(0,r.kt)("p",null,"The timeline result would be as shown in picture: ",(0,r.kt)("img",{src:n(2021).Z,width:"1109",height:"632"})," "),(0,r.kt)("h3",{id:"endpoint-level----monitoring-a-single-host"},"Endpoint Level - Monitoring a single host"),(0,r.kt)("p",null,"The next level of the calculations is the endpoint level, producing results for a single host. A host includes multiple metric checks, so the Metric Data are grouped by the host. But not all metric checks of the host need to be included into the calculations.\nThe ARGO Monitoring Service retrieves a Metric Profile report that defines the significant metric check. The Metric Data are filtered based on the given information and computations apply only to the metric checks defined in the Metric Profile reports. The Argo Monitoring service will combine the timelines of the metric checks and will combine the time interval and statuses into a new timeline. In order to combine the different statuses of a time interval and conclude into one status the ARGO Monitoring service retrieves an Operation Profile that defines all the possible status combinations. As Operation Profile includes a defined operation with a truth table of possible status combinations, the ARGO Monitoring service retrieves the operation that corresponds to the endpoint level from the Aggregation Profile"),(0,r.kt)("h4",{id:"example-1"},"Example:"),(0,r.kt)("p",null,"Here are three metric checks for the same host: "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'"metric": "http.check", \n"hostname":"host1.example.com,\n"service_type": "Web-Site",\n"group": "group1" `\n')),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'"metric": "http.download",\n"hostname":"host1.example.com",\n"service_type":"Web-Site",\n"group": "group1"\n')),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'"metric": "http.upload",\n"hostname": "host1.example.com",\n"service_type": "Web-Site",\n"group": "group1"\n')),(0,r.kt)("p",null,"But from the metric profile report only ",(0,r.kt)("strong",{parentName:"p"},"http.download")," and ",(0,r.kt)("strong",{parentName:"p"},"http.upload")," are defined.\nAs a result the ARGO Monitoring service will filter the Metric Data and will ignore the ones of the ",(0,r.kt)("strong",{parentName:"p"},"http.check")," metric check. The timelines of ",(0,r.kt)("strong",{parentName:"p"},"http.download")," and ",(0,r.kt)("strong",{parentName:"p"},"http.upload")," will combine with each other and produce the timeline of the endpoint ",(0,r.kt)("strong",{parentName:"p"},"host1.example.com"),", as shown in picture: ",(0,r.kt)("img",{src:n(3857).Z,width:"1040",height:"572"})," "),(0,r.kt)("h3",{id:"service-level---monitoring-an-entire-service"},"Service Level -Monitoring an entire service"),(0,r.kt)("p",null,"The next level of the calculations is the service level, producing results for a single service. A service runs under multiple hosts, so the Metric Data are grouped by the service. The Argo Monitoring service will combine the timelines of the hosts that run the service into a new timeline."),(0,r.kt)("p",null,"Not all services are included into the calculations. ARGO Monitoring service filters the data to retrieve explicitly these services, as they are defined in Aggregation Profiles."),(0,r.kt)("p",null,"In order to combine the different statuses of a time interval and conclude into one status, the ARGO Monitoring service retrieves from the Aggregation Profile the operation for each service and knowing this, retrieves the status combination of this operation from the Operation Profile."),(0,r.kt)("h4",{id:"example-"},"Example :"),(0,r.kt)("p",null,"The monitored service ",(0,r.kt)("strong",{parentName:"p"},"Web-Site")," operates under 3 hosts :\n",(0,r.kt)("strong",{parentName:"p"},"host1.example.com"),", ",(0,r.kt)("strong",{parentName:"p"},"host2.example.com"),", ",(0,r.kt)("strong",{parentName:"p"},"host3.example.com"),". In order to decide that the service operates successfully it should run successfully to all hosts. ARGO Monitoring Service groups the timelines by the service ",(0,r.kt)("strong",{parentName:"p"},"Web-Site")," and would create status timelines for the service by combining the individual host status timelines. "),(0,r.kt)("p",null,"The way that the individual hosts\u2019 status timelines are combined to produce the final result for the service is described in the Aggregation Profile. The Aggregation Profile defines the ",(0,r.kt)("strong",{parentName:"p"},"AND")," or ",(0,r.kt)("strong",{parentName:"p"},"OR")," way to aggregate the individual hosts\u2019 status timelines in order to compute the final timelines. The function ",(0,r.kt)("strong",{parentName:"p"},"AND"),", ",(0,r.kt)("strong",{parentName:"p"},"OR")," and the way they are used for the computations are defined in the Operations Profile. "),(0,r.kt)("p",null,"The timeline result would be as shown in picture: ",(0,r.kt)("img",{src:n(8031).Z,width:"1032",height:"558"})," "),(0,r.kt)("h3",{id:"monitoring-an-entire-group"},"Monitoring an entire group"),(0,r.kt)("p",null,"A group might contain a number of service offerings, such as a ",(0,r.kt)("strong",{parentName:"p"},"Web-Site"),", a ",(0,r.kt)("strong",{parentName:"p"},"mysql-db"),", a ",(0,r.kt)("strong",{parentName:"p"},"NextCloud")," etc. The services\u2019 timelines can be combined and concluded into a status timeline for the group. A group may represent a whole project or a group of services that work together to offer an operational solution to the users. This kind of grouping could also represent data infrastructures with geographical designation, such as a specific data center etc.\nThe way that these services are combined to produce the final result for the group is described in the Aggregation Profile. "),(0,r.kt)("h4",{id:"example--1"},"Example :"),(0,r.kt)("p",null,"In the previous example we described how the ARGO Monitoring Service is monitoring the service ",(0,r.kt)("strong",{parentName:"p"},"Web-Site")," . Let\u2019s assume we have the ",(0,r.kt)("strong",{parentName:"p"},"mysql-db")," service for storing data, and the ",(0,r.kt)("strong",{parentName:"p"},"NextCloud")," service for storing files. "),(0,r.kt)("p",null,"A project is using these 3 services for its users. In order for the service offering to be operational, all of these 3 services should run without problems. In order to monitor them we put them in a group named by the project they belong to. ARGO Monitoring Service would create status timelines for the project by combining the individual service status timelines."),(0,r.kt)("p",null,"The way that the individual service status timelines are combined to produce the final result for the group is described in the Aggregation Profile. The Aggregation Profile defines the AND or OR way to aggregate the individual service status timelines in order to compute the final timelines. The function AND, OR and the way they are used for the computations are defined in the Operations Profile. "),(0,r.kt)("p",null,"The timeline result would be as shown in picture: ",(0,r.kt)("img",{src:n(2842).Z,width:"1045",height:"563"})))}m.isMDXComponent=!0},3857:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/endptimelines-0e9534b1d7ca9f4eb72cd5331cb48cdb.png"},2842:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/grouptimelines-8101bd7c7a545050d9d78c15f7833d2f.png"},2021:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/metrictimelines-cb2441dc2f225d7e647b7f4eda292f55.png"},8031:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/servicetimelines-6590e9cd54679659718489e9cc4a90a3.png"}}]); \ No newline at end of file diff --git a/assets/js/4f4de028.0f119400.js b/assets/js/4f4de028.0f119400.js new file mode 100644 index 00000000..729a30a3 --- /dev/null +++ b/assets/js/4f4de028.0f119400.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7615],{3703:i=>{i.exports=JSON.parse('{"title":"Communication","slug":"/category/communication","permalink":"/argo-monitoring/docs/category/communication","navigation":{"previous":{"title":"Monitoring Data in the Providers Portal","permalink":"/argo-monitoring/docs/UseCases/ProvidersPortal"},"next":{"title":"Communication Channels","permalink":"/argo-monitoring/docs/communication/"}}}')}}]); \ No newline at end of file diff --git a/assets/js/4f4de028.28871bd6.js b/assets/js/4f4de028.28871bd6.js deleted file mode 100644 index 9a521e3d..00000000 --- a/assets/js/4f4de028.28871bd6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7615],{3703:o=>{o.exports=JSON.parse('{"title":"Communication","slug":"/category/communication","permalink":"/argo-monitoring/docs/category/communication","navigation":{"previous":{"title":"Providers Portal Use Case","permalink":"/argo-monitoring/docs/UseCases/ProvidersPortal"},"next":{"title":"Communication Channels","permalink":"/argo-monitoring/docs/communication/"}}}')}}]); \ No newline at end of file diff --git a/assets/js/55f7549f.8be43562.js b/assets/js/55f7549f.1d214e70.js similarity index 98% rename from assets/js/55f7549f.8be43562.js rename to assets/js/55f7549f.1d214e70.js index 1113f798..50f41973 100644 --- a/assets/js/55f7549f.8be43562.js +++ b/assets/js/55f7549f.1d214e70.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2385],{3905:(t,n,e)=>{e.d(n,{Zo:()=>s,kt:()=>u});var a=e(7294);function r(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function l(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),e.push.apply(e,a)}return e}function i(t){for(var n=1;n=0||(r[e]=t[e]);return r}(t,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,e)&&(r[e]=t[e])}return r}var o=a.createContext({}),p=function(t){var n=a.useContext(o),e=n;return t&&(e="function"==typeof t?t(n):i(i({},n),t)),e},s=function(t){var n=p(t.components);return a.createElement(o.Provider,{value:n},t.children)},m={inlineCode:"code",wrapper:function(t){var n=t.children;return a.createElement(a.Fragment,{},n)}},I=a.forwardRef((function(t,n){var e=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,s=N(t,["components","mdxType","originalType","parentName"]),I=p(e),u=r,d=I["".concat(o,".").concat(u)]||I[u]||m[u]||l;return e?a.createElement(d,i(i({ref:n},s),{},{components:e})):a.createElement(d,i({ref:n},s))}));function u(t,n){var e=arguments,r=n&&n.mdxType;if("string"==typeof t||r){var l=e.length,i=new Array(l);i[0]=I;var N={};for(var o in n)hasOwnProperty.call(n,o)&&(N[o]=n[o]);N.originalType=t,N.mdxType="string"==typeof t?t:r,i[1]=N;for(var p=2;p{e.r(n),e.d(n,{assets:()=>o,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>N,toc:()=>p});var a=e(7462),r=(e(7294),e(3905));const l={sidebar_position:1,title:"Operations Profile"},i=void 0,N={unversionedId:"profiles/operations-profile",id:"profiles/operations-profile",title:"Operations Profile",description:"Combining timelines",source:"@site/docs/profiles/operations-profile.md",sourceDirName:"profiles",slug:"/profiles/operations-profile",permalink:"/argo-monitoring/docs/profiles/operations-profile",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Operations Profile"},sidebar:"tutorialSidebar",previous:{title:"Profiles",permalink:"/argo-monitoring/docs/category/profiles"},next:{title:"Aggregation Profile",permalink:"/argo-monitoring/docs/profiles/aggregation-profile"}},o={},p=[{value:"Combining timelines",id:"combining-timelines",level:2},{value:"The use of operation profiles",id:"the-use-of-operation-profiles",level:2},{value:"Default operation profile",id:"default-operation-profile",level:2},{value:"Technical part",id:"technical-part",level:2}],s={toc:p};function m(t){let{components:n,...l}=t;return(0,r.kt)("wrapper",(0,a.Z)({},s,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"combining-timelines"},"Combining timelines"),(0,r.kt)("p",null,"In many cases we need to provide results for top level items that are being monitored. For example if a database service is offered that relies on 2 different hosts, then we need to present a timeline with the status of the service offering itself during the day. To do that we need to combine appropriately the status timelines observed for the hosts. There many ways to combine them but the usual cases are the following:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Service is deployed in a high availability fashion among hosts, so we need one of them to be ok for the general service offering to be working. In this case we say that the timelines are combined in an \u201cOR\u201d fashion. E.g. if host1 = OK, host2= CRITICAL the database service will be OK (see figure 1)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Service is deployed in a distributed fashion among hosts, so all of them are needed to be in a working state so as the service to be considered in working state. In this case we say that the timelines are combined in an \u201cAND\u201d fashion. E.g. if host1 = OK, host2 = CRITICAL the service offered will be CRITICAL (see figure 2)"))),(0,r.kt)("p",null,"Figure 1: Service deployed in a high availability fashion\n",(0,r.kt)("img",{src:e(1649).Z,width:"1160",height:"660"})),(0,r.kt)("p",null,"Figure 2: Service deployed in a distributed fashion\n",(0,r.kt)("img",{src:e(9159).Z,width:"1160",height:"660"})),(0,r.kt)("h2",{id:"the-use-of-operation-profiles"},"The use of operation profiles"),(0,r.kt)("p",null,"Operations profiles are used in ARGO platform to declare ways in which the status timelines can be combined. Each operation profile is actually a configuration file in json format that consists of the following parts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u0391 section to declare and enumerate all available statuses produced by monitoring checks. ARGO is agnostic on the names and number of statuses that can be produced by monitoring checks and they can be declared here. The default profile includes the usual array of statuses used in most monitoring systems (such as nagios) and that includes the following: OK, WARNING, CRITICAL, UNKNOWN, MISSING and DOWNTIME"),(0,r.kt)("li",{parentName:"ul"},"A section to define some default states. For example here we can define that OK state means a working state etc. "),(0,r.kt)("li",{parentName:"ul"},"A section to declare all the available ways (operations) that these statuses can be combined to produce a top result. Here we have a list of operation names mapped to truth tables that contain all the available combinations of statuses and the produced results (see table 1, table 2)")),(0,r.kt)("p",null,"Table 1 - the operations profile for AND operations is given in the following tabular:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"AND")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"OK")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"WARNING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"UNKNOWN")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"MISSING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"CRITICAL")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"DOWNTIME")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"OK")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"WARNING")),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"UNKNOWN")),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"MISSING")),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"CRITICAL")),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"DOWNTIME")),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")))),(0,r.kt)("p",null,"As can be seen the most prominent status in the case of the \u201cAND\u201d operation is the CRITICAL, while the least prominent is the \u201cOK\u201d status. "),(0,r.kt)("p",null,"Table 2 - the operations profile for \u201cOR\u201d operations is given in the following tabular:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"OR")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"OK")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"WARNING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"UNKNOWN")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"MISSING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"CRITICAL")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"DOWNTIME")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"OK")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"WARNING")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"UNKNOWN")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"MISSING")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"CRITICAL")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"DOWNTIME")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")))),(0,r.kt)("p",null,"In the case of \u201cOR\u201d the most prominent status result is the \u201cOK\u201d. "),(0,r.kt)("h2",{id:"default-operation-profile"},"Default operation profile"),(0,r.kt)("p",null,"ARGO provides a default operation profile capable for being used in most monitoring requirements that includes 6 monitoring states: OK, WARNING, CRITICAL, UNKNOWN, MISSING, DOWNTIME and two available operations on combining them: OR and AND "),(0,r.kt)("p",null,"Below is the default operation profile used in JSON Format:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "id": "profile_uuid",\n "date": "2015-01-01",\n "name": "profile_name",\n "available_states": [\n "OK",\n "WARNING",\n "UNKNOWN",\n "MISSING",\n "CRITICAL",\n "DOWNTIME"\n ],\n "defaults": {\n "down": "DOWNTIME",\n "missing": "MISSING",\n "unknown": "UNKNOWN"\n },\n "operations": [\n {\n "name": "AND",\n "truth_table": [\n {\n "a": "OK",\n "b": "OK",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "WARNING",\n "x": "WARNING"\n },\n {\n "a": "OK",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "OK",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "OK",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "OK",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "WARNING",\n "b": "WARNING",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "WARNING",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "WARNING",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "WARNING",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "UNKNOWN",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "UNKNOWN",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "UNKNOWN",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "UNKNOWN",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "MISSING",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "MISSING",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "MISSING",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "CRITICAL",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "CRITICAL",\n "b": "DOWNTIME",\n "x": "CRITICAL"\n },\n {\n "a": "DOWNTIME",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n }\n ]\n },\n {\n "name": "OR",\n "truth_table": [\n {\n "a": "OK",\n "b": "OK",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "WARNING",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "UNKNOWN",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "MISSING",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "CRITICAL",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "DOWNTIME",\n "x": "OK"\n },\n {\n "a": "WARNING",\n "b": "WARNING",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "UNKNOWN",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "MISSING",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "CRITICAL",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "DOWNTIME",\n "x": "WARNING"\n },\n {\n "a": "UNKNOWN",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "UNKNOWN",\n "b": "MISSING",\n "x": "UNKNOWN"\n },\n {\n "a": "UNKNOWN",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "UNKNOWN",\n "b": "DOWNTIME",\n "x": "UNKNOWN"\n },\n {\n "a": "MISSING",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "MISSING",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "MISSING",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "CRITICAL",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "CRITICAL",\n "b": "DOWNTIME",\n "x": "CRITICAL"\n },\n {\n "a": "DOWNTIME",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n }\n ]\n }\n ]\n }\n')),(0,r.kt)("h2",{id:"technical-part"},"Technical part"),(0,r.kt)("p",null,"The connection of the Operations profiles with the other components of ARGO"),(0,r.kt)("p",null,"They are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"defined in POEM"),(0,r.kt)("li",{parentName:"ul"},"stored in ARGO Web API"),(0,r.kt)("li",{parentName:"ul"},"Used for the computations in the Analytics Engine")))}m.isMDXComponent=!0},1649:(t,n,e)=>{e.d(n,{Z:()=>a});const a=e.p+"assets/images/service_example_ha-95ed727837b153df20a36e5e000efd0e.jpg"},9159:(t,n,e)=>{e.d(n,{Z:()=>a});const a=e.p+"assets/images/service_example_hb-854090cf0063671e78f4493db801adfa.jpg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2385],{3905:(t,n,e)=>{e.d(n,{Zo:()=>s,kt:()=>u});var a=e(7294);function r(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function l(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),e.push.apply(e,a)}return e}function i(t){for(var n=1;n=0||(r[e]=t[e]);return r}(t,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,e)&&(r[e]=t[e])}return r}var o=a.createContext({}),p=function(t){var n=a.useContext(o),e=n;return t&&(e="function"==typeof t?t(n):i(i({},n),t)),e},s=function(t){var n=p(t.components);return a.createElement(o.Provider,{value:n},t.children)},m={inlineCode:"code",wrapper:function(t){var n=t.children;return a.createElement(a.Fragment,{},n)}},I=a.forwardRef((function(t,n){var e=t.components,r=t.mdxType,l=t.originalType,o=t.parentName,s=N(t,["components","mdxType","originalType","parentName"]),I=p(e),u=r,d=I["".concat(o,".").concat(u)]||I[u]||m[u]||l;return e?a.createElement(d,i(i({ref:n},s),{},{components:e})):a.createElement(d,i({ref:n},s))}));function u(t,n){var e=arguments,r=n&&n.mdxType;if("string"==typeof t||r){var l=e.length,i=new Array(l);i[0]=I;var N={};for(var o in n)hasOwnProperty.call(n,o)&&(N[o]=n[o]);N.originalType=t,N.mdxType="string"==typeof t?t:r,i[1]=N;for(var p=2;p{e.r(n),e.d(n,{assets:()=>o,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>N,toc:()=>p});var a=e(7462),r=(e(7294),e(3905));const l={sidebar_position:1,title:"Operations Profile"},i=void 0,N={unversionedId:"profiles/operations-profile",id:"profiles/operations-profile",title:"Operations Profile",description:"Combining timelines",source:"@site/docs/profiles/operations-profile.md",sourceDirName:"profiles",slug:"/profiles/operations-profile",permalink:"/argo-monitoring/docs/profiles/operations-profile",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Operations Profile"},sidebar:"tutorialSidebar",previous:{title:"Profiles",permalink:"/argo-monitoring/docs/category/profiles"},next:{title:"Aggregation Profile",permalink:"/argo-monitoring/docs/profiles/aggregation-profile"}},o={},p=[{value:"Combining timelines",id:"combining-timelines",level:2},{value:"The use of operation profiles",id:"the-use-of-operation-profiles",level:2},{value:"Default operation profile",id:"default-operation-profile",level:2},{value:"Technical part",id:"technical-part",level:2}],s={toc:p};function m(t){let{components:n,...l}=t;return(0,r.kt)("wrapper",(0,a.Z)({},s,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"combining-timelines"},"Combining timelines"),(0,r.kt)("p",null,"In many cases we need to provide results for top level items that are being monitored. For example if a database service is offered that relies on 2 different hosts, then we need to present a timeline with the status of the service offering itself during the day. To do that we need to combine appropriately the status timelines observed for the hosts. There many ways to combine them but the usual cases are the following:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Service is deployed in a high availability fashion among hosts, so we need one of them to be ok for the general service offering to be working. In this case we say that the timelines are combined in an \u201cOR\u201d fashion. E.g. if host1 = OK, host2= CRITICAL the database service will be OK (see figure 1)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Service is deployed in a distributed fashion among hosts, so all of them are needed to be in a working state so as the service to be considered in working state. In this case we say that the timelines are combined in an \u201cAND\u201d fashion. E.g. if host1 = OK, host2 = CRITICAL the service offered will be CRITICAL (see figure 2)"))),(0,r.kt)("p",null,"Figure 1: Service deployed in a high availability fashion\n",(0,r.kt)("img",{src:e(5495).Z,width:"1160",height:"660"})),(0,r.kt)("p",null,"Figure 2: Service deployed in a distributed fashion\n",(0,r.kt)("img",{src:e(7651).Z,width:"1160",height:"660"})),(0,r.kt)("h2",{id:"the-use-of-operation-profiles"},"The use of operation profiles"),(0,r.kt)("p",null,"Operations profiles are used in ARGO platform to declare ways in which the status timelines can be combined. Each operation profile is actually a configuration file in json format that consists of the following parts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u0391 section to declare and enumerate all available statuses produced by monitoring checks. ARGO is agnostic on the names and number of statuses that can be produced by monitoring checks and they can be declared here. The default profile includes the usual array of statuses used in most monitoring systems (such as nagios) and that includes the following: OK, WARNING, CRITICAL, UNKNOWN, MISSING and DOWNTIME"),(0,r.kt)("li",{parentName:"ul"},"A section to define some default states. For example here we can define that OK state means a working state etc. "),(0,r.kt)("li",{parentName:"ul"},"A section to declare all the available ways (operations) that these statuses can be combined to produce a top result. Here we have a list of operation names mapped to truth tables that contain all the available combinations of statuses and the produced results (see table 1, table 2)")),(0,r.kt)("p",null,"Table 1 - the operations profile for AND operations is given in the following tabular:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"AND")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"OK")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"WARNING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"UNKNOWN")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"MISSING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"CRITICAL")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"DOWNTIME")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"OK")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"WARNING")),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"UNKNOWN")),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"MISSING")),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"CRITICAL")),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"DOWNTIME")),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")))),(0,r.kt)("p",null,"As can be seen the most prominent status in the case of the \u201cAND\u201d operation is the CRITICAL, while the least prominent is the \u201cOK\u201d status. "),(0,r.kt)("p",null,"Table 2 - the operations profile for \u201cOR\u201d operations is given in the following tabular:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"OR")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"OK")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"WARNING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"UNKNOWN")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"MISSING")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"CRITICAL")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"DOWNTIME")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"OK")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"OK")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"WARNING")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"UNKNOWN")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"MISSING")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"MISSING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"CRITICAL")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"DOWNTIME")),(0,r.kt)("td",{parentName:"tr",align:null},"OK"),(0,r.kt)("td",{parentName:"tr",align:null},"WARNING"),(0,r.kt)("td",{parentName:"tr",align:null},"UNKNOWN"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME"),(0,r.kt)("td",{parentName:"tr",align:null},"CRITICAL"),(0,r.kt)("td",{parentName:"tr",align:null},"DOWNTIME")))),(0,r.kt)("p",null,"In the case of \u201cOR\u201d the most prominent status result is the \u201cOK\u201d. "),(0,r.kt)("h2",{id:"default-operation-profile"},"Default operation profile"),(0,r.kt)("p",null,"ARGO provides a default operation profile capable for being used in most monitoring requirements that includes 6 monitoring states: OK, WARNING, CRITICAL, UNKNOWN, MISSING, DOWNTIME and two available operations on combining them: OR and AND "),(0,r.kt)("p",null,"Below is the default operation profile used in JSON Format:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "id": "profile_uuid",\n "date": "2015-01-01",\n "name": "profile_name",\n "available_states": [\n "OK",\n "WARNING",\n "UNKNOWN",\n "MISSING",\n "CRITICAL",\n "DOWNTIME"\n ],\n "defaults": {\n "down": "DOWNTIME",\n "missing": "MISSING",\n "unknown": "UNKNOWN"\n },\n "operations": [\n {\n "name": "AND",\n "truth_table": [\n {\n "a": "OK",\n "b": "OK",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "WARNING",\n "x": "WARNING"\n },\n {\n "a": "OK",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "OK",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "OK",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "OK",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "WARNING",\n "b": "WARNING",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "WARNING",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "WARNING",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "WARNING",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "UNKNOWN",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "UNKNOWN",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "UNKNOWN",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "UNKNOWN",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "MISSING",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "MISSING",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "MISSING",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "CRITICAL",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "CRITICAL",\n "b": "DOWNTIME",\n "x": "CRITICAL"\n },\n {\n "a": "DOWNTIME",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n }\n ]\n },\n {\n "name": "OR",\n "truth_table": [\n {\n "a": "OK",\n "b": "OK",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "WARNING",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "UNKNOWN",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "MISSING",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "CRITICAL",\n "x": "OK"\n },\n {\n "a": "OK",\n "b": "DOWNTIME",\n "x": "OK"\n },\n {\n "a": "WARNING",\n "b": "WARNING",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "UNKNOWN",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "MISSING",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "CRITICAL",\n "x": "WARNING"\n },\n {\n "a": "WARNING",\n "b": "DOWNTIME",\n "x": "WARNING"\n },\n {\n "a": "UNKNOWN",\n "b": "UNKNOWN",\n "x": "UNKNOWN"\n },\n {\n "a": "UNKNOWN",\n "b": "MISSING",\n "x": "UNKNOWN"\n },\n {\n "a": "UNKNOWN",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "UNKNOWN",\n "b": "DOWNTIME",\n "x": "UNKNOWN"\n },\n {\n "a": "MISSING",\n "b": "MISSING",\n "x": "MISSING"\n },\n {\n "a": "MISSING",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "MISSING",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n },\n {\n "a": "CRITICAL",\n "b": "CRITICAL",\n "x": "CRITICAL"\n },\n {\n "a": "CRITICAL",\n "b": "DOWNTIME",\n "x": "CRITICAL"\n },\n {\n "a": "DOWNTIME",\n "b": "DOWNTIME",\n "x": "DOWNTIME"\n }\n ]\n }\n ]\n }\n')),(0,r.kt)("h2",{id:"technical-part"},"Technical part"),(0,r.kt)("p",null,"The connection of the Operations profiles with the other components of ARGO"),(0,r.kt)("p",null,"They are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"defined in POEM"),(0,r.kt)("li",{parentName:"ul"},"stored in ARGO Web API"),(0,r.kt)("li",{parentName:"ul"},"Used for the computations in the Analytics Engine")))}m.isMDXComponent=!0},5495:(t,n,e)=>{e.d(n,{Z:()=>a});const a=e.p+"assets/images/service_example_ha-95ed727837b153df20a36e5e000efd0e.jpg"},7651:(t,n,e)=>{e.d(n,{Z:()=>a});const a=e.p+"assets/images/service_example_hb-854090cf0063671e78f4493db801adfa.jpg"}}]); \ No newline at end of file diff --git a/assets/js/58e2c8d2.05913925.js b/assets/js/58e2c8d2.5f50400e.js similarity index 54% rename from assets/js/58e2c8d2.05913925.js rename to assets/js/58e2c8d2.5f50400e.js index 4c222417..b7db620f 100644 --- a/assets/js/58e2c8d2.05913925.js +++ b/assets/js/58e2c8d2.5f50400e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8002],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>N});var r=a(7294);function i(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function n(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function l(t){for(var e=1;e=0||(i[a]=t[a]);return i}(t,e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(i[a]=t[a])}return i}var p=r.createContext({}),s=function(t){var e=r.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},d=function(t){var e=s(t.components);return r.createElement(p.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var a=t.components,i=t.mdxType,n=t.originalType,p=t.parentName,d=o(t,["components","mdxType","originalType","parentName"]),m=s(a),N=i,k=m["".concat(p,".").concat(N)]||m[N]||u[N]||n;return a?r.createElement(k,l(l({ref:e},d),{},{components:a})):r.createElement(k,l({ref:e},d))}));function N(t,e){var a=arguments,i=e&&e.mdxType;if("string"==typeof t||i){var n=a.length,l=new Array(n);l[0]=m;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o.mdxType="string"==typeof t?t:i,l[1]=o;for(var s=2;s{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>n,metadata:()=>o,toc:()=>s});var r=a(7462),i=(a(7294),a(3905));const n={sidebar_position:3,title:"A/R results"},l=void 0,o={unversionedId:"reports/ar",id:"reports/ar",title:"A/R results",description:"Availability Reliability",source:"@site/docs/reports/ar.md",sourceDirName:"reports",slug:"/reports/ar",permalink:"/argo-monitoring/docs/reports/ar",draft:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3,title:"A/R results"},sidebar:"tutorialSidebar",previous:{title:"Status Timelines",permalink:"/argo-monitoring/docs/reports/status_timelines"},next:{title:"Status Trends - Flapping",permalink:"/argo-monitoring/docs/reports/flapping-trends"}},p={},s=[{value:"Availability Reliability",id:"availability-reliability",level:2},{value:"Availability",id:"availability",level:3},{value:"Reliability",id:"reliability",level:3},{value:"Example",id:"example",level:3}],d={toc:s};function u(t){let{components:e,...n}=t;return(0,i.kt)("wrapper",(0,r.Z)({},d,n,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"availability-reliability"},"Availability Reliability"),(0,i.kt)("p",null,"ARGO Monitoring service, by generating status timelines for each level of the topology, can produce useful conclusions about the monitoring item. One very useful conclusion is to decide if the item is available for usage and if it is considered as reliable.",(0,i.kt)("br",{parentName:"p"}),"\n","To succeed this, availability/reliability rates need to be calculated on the timelines. "),(0,i.kt)("h3",{id:"availability"},"Availability"),(0,i.kt)("p",null,"Availability: Service Availability is the fraction of time a service was in the UP Period during the known interval in a given period."),(0,i.kt)("p",null,"Availability rate is useful to know, as it provides information of the time the monitored item is available for use. Availability is calculated as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Availability = UP period / KNOWN period \n")),(0,i.kt)("p",null,"where "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"KNOWN = Total period / UNKNOWN period \n")),(0,i.kt)("p",null,"and"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period : The duration the status of the monitored item is OK or WARNING"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: The duration the status of the monitored item is UNKNOWN"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : The duration of the monitoring (usually a day)")),(0,i.kt)("h3",{id:"reliability"},"Reliability"),(0,i.kt)("p",null,"Reliability : Service Reliability is the ratio of the time interval a service was UP over the time interval it was supposed (scheduled) to be UP in the given period."),(0,i.kt)("p",null,"Reliability rate is also useful to know, as it provides information about the quality of monitored item during the monitoring time, whereas it is reliable of usage or not. "),(0,i.kt)("p",null,"Reliability is calculated as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Reliability = UP period / (KNOWN period \u2013 Scheduled Downtime) \n")),(0,i.kt)("p",null,"where "),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period : The duration the status of the monitored item is OK or WARNING"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: The duration the status of the monitored item is UNKNOWN"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Scheduled")," Downtime period: The duration the status of the monitored item is defined to be DOWNTIME"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : The duration of the monitoring (usually a day)")),(0,i.kt)("h3",{id:"example"},"Example"),(0,i.kt)("p",null,"Let\u2019s assume we have a timeline for 15-09-2021 with the following status/timestamp"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(898).Z,width:"778",height:"166"})," "),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"timestamp"),(0,i.kt)("th",{parentName:"tr",align:null},"status"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T00:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"OK")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T03:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T12:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"UNKNOWN")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T18:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T22:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"OK")))),(0,i.kt)("p",null,"Based on these timestamps each status lasts as: "),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"OK Status:")," From 00:00 to 03:00 and from 22:00 till the end of the day"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"CRITICAL Status:")," From 03:00 to 12:00"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN Status:")," From 12:00 to 18:00")),(0,i.kt)("p",null,"The Service owner has informed the monitoring service for a scheduled downtime from 18:00 to 22:00 "),(0,i.kt)("p",null,"Calculating the duration for each status in seconds is: "),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Status"),(0,i.kt)("th",{parentName:"tr",align:null},"Duration"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Total seconds of a day")),(0,i.kt)("td",{parentName:"tr",align:null},"86400 seconds /24h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"OK")),(0,i.kt)("td",{parentName:"tr",align:null},"18000 seconds /5h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"CRITICAL")),(0,i.kt)("td",{parentName:"tr",align:null},"32400 seconds /9h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"UNKNOWN")),(0,i.kt)("td",{parentName:"tr",align:null},"21600 seconds /6h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"DOWNTIME")),(0,i.kt)("td",{parentName:"tr",align:null},"14400 seconds /4h")))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Availability = UP period / KNOWN period = UP period / (Total period \u2013 UNKNOWN period)\n")),(0,i.kt)("p",null,"where:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period =OK period + WARNING period=18000 seconds "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: UNKNOWN period + MISSING period=21600 seconds "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : 86400 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Availability")," = 18000/(86400-21600)=0.2777, and converting to the scale of 100 the availability is 27.777")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Reliability = UP period / (KNOWN period \u2013 Scheduled Downtime) = UP period / (Total period \u2013 UNKNOWN period \u2013 ScheduledDowntime)\n")),(0,i.kt)("p",null,"where:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period =OK period +WARNING period. This in numbers means 18000 seconds "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: UNKNOWN period+MISSING period. This in numbers means 21600 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"ScheduledDowntime")," period: 14400 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : 86400 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Reliability")," =18000/(86400-21600-14400)=0.3571, and converting to the scale of 100 the reliability is 35.771")),(0,i.kt)("p",null,"ARGO Monitoring Service also calculates results of up period, downtime period, unknown period as:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," = UP period / Total period. This in numbers mean 18000/86400 =0.20833 "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN"),"=UNKNOWN period +MISSING period / Total period. | this in numbers mean 21600/86400=0.25 "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"DOWNTIME"),"= DOWNTIME period / Total period. This in numbers mean 14400/86400=0.16667")))}u.isMDXComponent=!0},898:(t,e,a)=>{a.d(e,{Z:()=>r});const r=a.p+"assets/images/ARtimeline-b9a7fa2902768a2ad2c93f17a59af5e1.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8002],{3905:(t,e,a)=>{a.d(e,{Zo:()=>d,kt:()=>N});var r=a(7294);function i(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function n(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,r)}return a}function l(t){for(var e=1;e=0||(i[a]=t[a]);return i}(t,e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(i[a]=t[a])}return i}var p=r.createContext({}),s=function(t){var e=r.useContext(p),a=e;return t&&(a="function"==typeof t?t(e):l(l({},e),t)),a},d=function(t){var e=s(t.components);return r.createElement(p.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},m=r.forwardRef((function(t,e){var a=t.components,i=t.mdxType,n=t.originalType,p=t.parentName,d=o(t,["components","mdxType","originalType","parentName"]),m=s(a),N=i,k=m["".concat(p,".").concat(N)]||m[N]||u[N]||n;return a?r.createElement(k,l(l({ref:e},d),{},{components:a})):r.createElement(k,l({ref:e},d))}));function N(t,e){var a=arguments,i=e&&e.mdxType;if("string"==typeof t||i){var n=a.length,l=new Array(n);l[0]=m;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o.mdxType="string"==typeof t?t:i,l[1]=o;for(var s=2;s{a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>n,metadata:()=>o,toc:()=>s});var r=a(7462),i=(a(7294),a(3905));const n={sidebar_position:3,title:"A/R results"},l=void 0,o={unversionedId:"reports/ar",id:"reports/ar",title:"A/R results",description:"Availability Reliability",source:"@site/docs/reports/ar.md",sourceDirName:"reports",slug:"/reports/ar",permalink:"/argo-monitoring/docs/reports/ar",draft:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3,title:"A/R results"},sidebar:"tutorialSidebar",previous:{title:"Status Timelines",permalink:"/argo-monitoring/docs/reports/status_timelines"},next:{title:"Status Trends - Flapping",permalink:"/argo-monitoring/docs/reports/flapping-trends"}},p={},s=[{value:"Availability Reliability",id:"availability-reliability",level:2},{value:"Availability",id:"availability",level:3},{value:"Reliability",id:"reliability",level:3},{value:"Example",id:"example",level:3}],d={toc:s};function u(t){let{components:e,...n}=t;return(0,i.kt)("wrapper",(0,r.Z)({},d,n,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"availability-reliability"},"Availability Reliability"),(0,i.kt)("p",null,"ARGO Monitoring service, by generating status timelines for each level of the topology, can produce useful conclusions about the monitoring item. One very useful conclusion is to decide if the item is available for usage and if it is considered as reliable.",(0,i.kt)("br",{parentName:"p"}),"\n","To succeed this, availability/reliability rates need to be calculated on the timelines. "),(0,i.kt)("h3",{id:"availability"},"Availability"),(0,i.kt)("p",null,"Availability: Service Availability is the fraction of time a service was in the UP Period during the known interval in a given period."),(0,i.kt)("p",null,"Availability rate is useful to know, as it provides information of the time the monitored item is available for use. Availability is calculated as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Availability = UP period / KNOWN period \n")),(0,i.kt)("p",null,"where "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"KNOWN = Total period / UNKNOWN period \n")),(0,i.kt)("p",null,"and"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period : The duration the status of the monitored item is OK or WARNING"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: The duration the status of the monitored item is UNKNOWN"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : The duration of the monitoring (usually a day)")),(0,i.kt)("h3",{id:"reliability"},"Reliability"),(0,i.kt)("p",null,"Reliability : Service Reliability is the ratio of the time interval a service was UP over the time interval it was supposed (scheduled) to be UP in the given period."),(0,i.kt)("p",null,"Reliability rate is also useful to know, as it provides information about the quality of monitored item during the monitoring time, whereas it is reliable of usage or not. "),(0,i.kt)("p",null,"Reliability is calculated as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Reliability = UP period / (KNOWN period \u2013 Scheduled Downtime) \n")),(0,i.kt)("p",null,"where "),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period : The duration the status of the monitored item is OK or WARNING"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: The duration the status of the monitored item is UNKNOWN"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Scheduled")," Downtime period: The duration the status of the monitored item is defined to be DOWNTIME"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : The duration of the monitoring (usually a day)")),(0,i.kt)("h3",{id:"example"},"Example"),(0,i.kt)("p",null,"Let\u2019s assume we have a timeline for 15-09-2021 with the following status/timestamp"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(3801).Z,width:"778",height:"166"})," "),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"timestamp"),(0,i.kt)("th",{parentName:"tr",align:null},"status"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T00:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"OK")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T03:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"CRITICAL")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T12:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"UNKNOWN")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T18:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"DOWNTIME")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"2021-09-15T22:00:00Z"),(0,i.kt)("td",{parentName:"tr",align:null},"OK")))),(0,i.kt)("p",null,"Based on these timestamps each status lasts as: "),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"OK Status:")," From 00:00 to 03:00 and from 22:00 till the end of the day"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"CRITICAL Status:")," From 03:00 to 12:00"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN Status:")," From 12:00 to 18:00")),(0,i.kt)("p",null,"The Service owner has informed the monitoring service for a scheduled downtime from 18:00 to 22:00 "),(0,i.kt)("p",null,"Calculating the duration for each status in seconds is: "),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Status"),(0,i.kt)("th",{parentName:"tr",align:null},"Duration"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Total seconds of a day")),(0,i.kt)("td",{parentName:"tr",align:null},"86400 seconds /24h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"OK")),(0,i.kt)("td",{parentName:"tr",align:null},"18000 seconds /5h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"CRITICAL")),(0,i.kt)("td",{parentName:"tr",align:null},"32400 seconds /9h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"UNKNOWN")),(0,i.kt)("td",{parentName:"tr",align:null},"21600 seconds /6h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"DOWNTIME")),(0,i.kt)("td",{parentName:"tr",align:null},"14400 seconds /4h")))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Availability = UP period / KNOWN period = UP period / (Total period \u2013 UNKNOWN period)\n")),(0,i.kt)("p",null,"where:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period =OK period + WARNING period=18000 seconds "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: UNKNOWN period + MISSING period=21600 seconds "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : 86400 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Availability")," = 18000/(86400-21600)=0.2777, and converting to the scale of 100 the availability is 27.777")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Reliability = UP period / (KNOWN period \u2013 Scheduled Downtime) = UP period / (Total period \u2013 UNKNOWN period \u2013 ScheduledDowntime)\n")),(0,i.kt)("p",null,"where:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," period =OK period +WARNING period. This in numbers means 18000 seconds "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN")," period: UNKNOWN period+MISSING period. This in numbers means 21600 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"ScheduledDowntime")," period: 14400 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Total")," period : 86400 seconds"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Reliability")," =18000/(86400-21600-14400)=0.3571, and converting to the scale of 100 the reliability is 35.771")),(0,i.kt)("p",null,"ARGO Monitoring Service also calculates results of up period, downtime period, unknown period as:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UP")," = UP period / Total period. This in numbers mean 18000/86400 =0.20833 "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"UNKNOWN"),"=UNKNOWN period +MISSING period / Total period. | this in numbers mean 21600/86400=0.25 "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"DOWNTIME"),"= DOWNTIME period / Total period. This in numbers mean 14400/86400=0.16667")))}u.isMDXComponent=!0},3801:(t,e,a)=>{a.d(e,{Z:()=>r});const r=a.p+"assets/images/ARtimeline-b9a7fa2902768a2ad2c93f17a59af5e1.png"}}]); \ No newline at end of file diff --git a/assets/js/2e4f6044.68d97f7d.js b/assets/js/7193c74c.4e2ac402.js similarity index 63% rename from assets/js/2e4f6044.68d97f7d.js rename to assets/js/7193c74c.4e2ac402.js index bf440c23..0a46c028 100644 --- a/assets/js/2e4f6044.68d97f7d.js +++ b/assets/js/7193c74c.4e2ac402.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4870],{3769:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2581],{3769:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.4ab739bd.js b/assets/js/935f2afb.4ab739bd.js new file mode 100644 index 00000000..4f12e0cc --- /dev/null +++ b/assets/js/935f2afb.4ab739bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{4612:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/argo-monitoring/docs/guides/intro","docId":"guides/intro"},{"type":"link","label":"Use Case 1: Monitor an Onboarded Service (central one)","href":"/argo-monitoring/docs/guides/case1","docId":"guides/case1"},{"type":"link","label":"Use Case 2: Monitor an Infrastructure (community)","href":"/argo-monitoring/docs/guides/case2","docId":"guides/case2"},{"type":"link","label":"Use Case 3: Integrate External Monitoring service","href":"/argo-monitoring/docs/guides/case3","docId":"guides/case3"},{"type":"link","label":"Use Case 4: Combine Results of existing ARGO Tenants.","href":"/argo-monitoring/docs/guides/case4","docId":"guides/case4"},{"type":"link","label":"Use Case 5: Third-party services exploiting EOSC Monitoring data","href":"/argo-monitoring/docs/guides/case5","docId":"guides/case5"},{"type":"link","label":"Get Monitoring A/R Data based on the Resource-ID","href":"/argo-monitoring/docs/guides/EOSC-getARData","docId":"guides/EOSC-getARData"},{"type":"link","label":"Get Monitoring Status Data based on the Resource-ID","href":"/argo-monitoring/docs/guides/EOSC-getStatusData","docId":"guides/EOSC-getStatusData"},{"type":"link","label":"Process events/alerts directly from the source(AMS)","href":"/argo-monitoring/docs/guides/AMS-consume-publish-events","docId":"guides/AMS-consume-publish-events"}],"href":"/argo-monitoring/docs/category/guides"},{"type":"link","label":"Introduction","href":"/argo-monitoring/docs/intro","docId":"intro"},{"type":"category","label":"Information Feeds","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Topology","href":"/argo-monitoring/docs/information_feeds/topology","docId":"information_feeds/topology"},{"type":"link","label":"Downtimes","href":"/argo-monitoring/docs/information_feeds/downtimes","docId":"information_feeds/downtimes"},{"type":"link","label":"Weights","href":"/argo-monitoring/docs/information_feeds/weights","docId":"information_feeds/weights"}],"href":"/argo-monitoring/docs/category/information-feeds"},{"type":"category","label":"Monitoring","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Monitoring guide for Service Providers","href":"/argo-monitoring/docs/monitoring/SP_guide","docId":"monitoring/SP_guide"},{"type":"link","label":"Guidelines for monitoring probes","href":"/argo-monitoring/docs/monitoring/guidelines","docId":"monitoring/guidelines"}],"href":"/argo-monitoring/docs/category/monitoring"},{"type":"category","label":"Profiles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Operations Profile","href":"/argo-monitoring/docs/profiles/operations-profile","docId":"profiles/operations-profile"},{"type":"link","label":"Aggregation Profile","href":"/argo-monitoring/docs/profiles/aggregation-profile","docId":"profiles/aggregation-profile"},{"type":"link","label":"Threshold Profile","href":"/argo-monitoring/docs/profiles/thresholds-profile","docId":"profiles/thresholds-profile"},{"type":"link","label":"Metrics Profile","href":"/argo-monitoring/docs/profiles/metrics-profile","docId":"profiles/metrics-profile"},{"type":"link","label":"Metrics Tags","href":"/argo-monitoring/docs/profiles/metrics-tags","docId":"profiles/metrics-tags"}],"href":"/argo-monitoring/docs/category/profiles"},{"type":"category","label":"Reports","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Status Timelines & A/R Results","href":"/argo-monitoring/docs/reports/timelines_&_ar","docId":"reports/timelines_&_ar"},{"type":"link","label":"Status Timelines","href":"/argo-monitoring/docs/reports/status_timelines","docId":"reports/status_timelines"},{"type":"link","label":"A/R results","href":"/argo-monitoring/docs/reports/ar","docId":"reports/ar"},{"type":"link","label":"Status Trends - Flapping","href":"/argo-monitoring/docs/reports/flapping-trends","docId":"reports/flapping-trends"},{"type":"link","label":"Status Trends - Critical, Warning,Unknown","href":"/argo-monitoring/docs/reports/status-critical-warning-unknown","docId":"reports/status-critical-warning-unknown"}],"href":"/argo-monitoring/docs/category/reports"},{"type":"category","label":"Policies","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Terms of Use","href":"/argo-monitoring/docs/policies/Terms","docId":"policies/Terms"},{"type":"link","label":"Cookie Policy","href":"/argo-monitoring/docs/policies/CookiePolicy","docId":"policies/CookiePolicy"},{"type":"link","label":"Privacy Policy","href":"/argo-monitoring/docs/policies/Privacy","docId":"policies/Privacy"},{"type":"link","label":"Technical and organisational measures (TOM)","href":"/argo-monitoring/docs/policies/tom","docId":"policies/tom"}],"href":"/argo-monitoring/docs/category/policies"},{"type":"category","label":"Training","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Training Material","href":"/argo-monitoring/docs/training/","docId":"training/training"}],"href":"/argo-monitoring/docs/category/training"},{"type":"category","label":"Use Cases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Monitoring Data in the Providers Portal","href":"/argo-monitoring/docs/UseCases/ProvidersPortal","docId":"UseCases/ProvidersPortal"}],"href":"/argo-monitoring/docs/category/use-cases"},{"type":"category","label":"Communication","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Communication Channels","href":"/argo-monitoring/docs/communication/","docId":"communication/communication_channels"}],"href":"/argo-monitoring/docs/category/communication"}]},"docs":{"communication/communication_channels":{"id":"communication/communication_channels","title":"Communication Channels","description":"There are two ways you can initiate communication with the team behind the","sidebar":"tutorialSidebar"},"guides/AMS-consume-publish-events":{"id":"guides/AMS-consume-publish-events","title":"Process events/alerts directly from the source(AMS)","description":"All the events that compromise the produced alerts of the monitored","sidebar":"tutorialSidebar"},"guides/case1":{"id":"guides/case1","title":"Use Case 1: Monitor an Onboarded Service (central one)","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case2":{"id":"guides/case2","title":"Use Case 2: Monitor an Infrastructure (community)","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case3":{"id":"guides/case3","title":"Use Case 3: Integrate External Monitoring service","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case4":{"id":"guides/case4","title":"Use Case 4: Combine Results of existing ARGO Tenants.","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case5":{"id":"guides/case5","title":"Use Case 5: Third-party services exploiting EOSC Monitoring data","description":"Introduction","sidebar":"tutorialSidebar"},"guides/EOSC-getARData":{"id":"guides/EOSC-getARData","title":"Get Monitoring A/R Data based on the Resource-ID","description":"Introduction","sidebar":"tutorialSidebar"},"guides/EOSC-getStatusData":{"id":"guides/EOSC-getStatusData","title":"Get Monitoring Status Data based on the Resource-ID","description":"Introduction","sidebar":"tutorialSidebar"},"guides/intro":{"id":"guides/intro","title":"Introduction","description":"Monitoring is the key service needed to gain insights into an infrastructure. It needs to be continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. The challenge of this type of monitoring is how to quickly identify and correlate problems before they affect end-users and ultimately the productivity of the organisation. Management teams can monitor the availability and reliability of the services from a high level view down to individual system metrics and monitor the conformance of multiple SLAs. The key functional requirements are:","sidebar":"tutorialSidebar"},"information_feeds/downtimes":{"id":"information_feeds/downtimes","title":"Downtimes","description":"The term downtime is used to refer to periods when a service is unavailable. Downtime can be caused by failure in hardware (physical equipment), (logic controlling equipment), interconnecting equipment (such as cables, facilities, routers,...), transmission (wireless, microwave, satellite), and/or capacity (system limits).","sidebar":"tutorialSidebar"},"information_feeds/topology":{"id":"information_feeds/topology","title":"Topology","description":"One of the main sources of truth used in the Monitoring Service is the topology. It helps to discover and map relationships between services / resources. Via the topology the owner may have in-depth visibility into the infrastructure, by enabling the Monitoring Service to categorize, classify, and finally monitor the services in it.","sidebar":"tutorialSidebar"},"information_feeds/weights":{"id":"information_feeds/weights","title":"Weights","description":"In ARGO you may combine top level A/R results (such as results referring to you data center, institution as a whole) into a higher level of abstraction such as organisations, projects, federation.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Introduction","description":"Welcome to ARGO Monitoring","sidebar":"tutorialSidebar"},"monitoring/guidelines":{"id":"monitoring/guidelines","title":"Guidelines for monitoring probes","description":"Overview","sidebar":"tutorialSidebar"},"monitoring/SP_guide":{"id":"monitoring/SP_guide","title":"Monitoring guide for Service Providers","description":"Overview","sidebar":"tutorialSidebar"},"policies/CookiePolicy":{"id":"policies/CookiePolicy","title":"Cookie Policy","description":"1. Purpose of this cookie policy","sidebar":"tutorialSidebar"},"policies/Privacy":{"id":"policies/Privacy","title":"Privacy Policy","description":"Controller details","sidebar":"tutorialSidebar"},"policies/Terms":{"id":"policies/Terms","title":"Terms of Use","description":"By registering as a user you declare that you have read, understood and will abide by the following conditions of use:","sidebar":"tutorialSidebar"},"policies/tom":{"id":"policies/tom","title":"Technical and organisational measures (TOM)","description":"This document describes the technical and organisational measures established by National Infrastructures for Research and Technology S.A. (GRNET S.A.) to meet legal and contractual requirements when processing personal data, conducting a higher level of security and protection.","sidebar":"tutorialSidebar"},"profiles/aggregation-profile":{"id":"profiles/aggregation-profile","title":"Aggregation Profile","description":"Description","sidebar":"tutorialSidebar"},"profiles/metrics-profile":{"id":"profiles/metrics-profile","title":"Metrics Profile","description":"Description","sidebar":"tutorialSidebar"},"profiles/metrics-tags":{"id":"profiles/metrics-tags","title":"Metrics Tags","description":"Description","sidebar":"tutorialSidebar"},"profiles/operations-profile":{"id":"profiles/operations-profile","title":"Operations Profile","description":"Combining timelines","sidebar":"tutorialSidebar"},"profiles/thresholds-profile":{"id":"profiles/thresholds-profile","title":"Threshold Profile","description":"Description","sidebar":"tutorialSidebar"},"reports/ar":{"id":"reports/ar","title":"A/R results","description":"Availability Reliability","sidebar":"tutorialSidebar"},"reports/flapping-trends":{"id":"reports/flapping-trends","title":"Status Trends - Flapping","description":"Description","sidebar":"tutorialSidebar"},"reports/status_timelines":{"id":"reports/status_timelines","title":"Status Timelines","description":"Status Timelines","sidebar":"tutorialSidebar"},"reports/status-critical-warning-unknown":{"id":"reports/status-critical-warning-unknown","title":"Status Trends - Critical, Warning,Unknown","description":"Description","sidebar":"tutorialSidebar"},"reports/timelines_&_ar":{"id":"reports/timelines_&_ar","title":"Status Timelines & A/R Results","description":"Description","sidebar":"tutorialSidebar"},"training/training":{"id":"training/training","title":"Training Material","description":"Training Material","sidebar":"tutorialSidebar"},"UseCases/ProvidersPortal":{"id":"UseCases/ProvidersPortal","title":"Monitoring Data in the Providers Portal","description":"The EOSC Providers Portal (https://providers.eosc-portal.eu/) is a single platform for providers to onboard their organization into EOSC portal, register and manage their resources and gain rich insights about their offerings in the catalogue. It also offers the Provider dashboard, where representatives from provider organizations have a detailed view on their offerings in the EOSC portal as well as various usage statistics on their resources.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.848052d0.js b/assets/js/935f2afb.848052d0.js deleted file mode 100644 index 2f4c46d4..00000000 --- a/assets/js/935f2afb.848052d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/argo-monitoring/docs/guides/intro","docId":"guides/intro"},{"type":"link","label":"Use Case 1: Monitor an Onboarded Service (central one)","href":"/argo-monitoring/docs/guides/case1","docId":"guides/case1"},{"type":"link","label":"Use Case 2: Monitor an Infrastructure (community)","href":"/argo-monitoring/docs/guides/case2","docId":"guides/case2"},{"type":"link","label":"Use Case 3: Integrate External Monitoring service","href":"/argo-monitoring/docs/guides/case3","docId":"guides/case3"},{"type":"link","label":"Use Case 4: Combine Results of existing ARGO Tenants.","href":"/argo-monitoring/docs/guides/case4","docId":"guides/case4"},{"type":"link","label":"Use Case 5: Third-party services exploiting EOSC Monitoring data","href":"/argo-monitoring/docs/guides/case5","docId":"guides/case5"},{"type":"link","label":"Get Monitoring A/R Data based on the Resource-ID","href":"/argo-monitoring/docs/guides/EOSC-getARData","docId":"guides/EOSC-getARData"},{"type":"link","label":"Get Monitoring Status Data based on the Resource-ID","href":"/argo-monitoring/docs/guides/EOSC-getStatusData","docId":"guides/EOSC-getStatusData"},{"type":"link","label":"Process events/alerts directly from the source(AMS)","href":"/argo-monitoring/docs/guides/AMS-consume-publish-events","docId":"guides/AMS-consume-publish-events"}],"href":"/argo-monitoring/docs/category/guides"},{"type":"link","label":"Introduction","href":"/argo-monitoring/docs/intro","docId":"intro"},{"type":"category","label":"Information Feeds","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Topology","href":"/argo-monitoring/docs/information_feeds/topology","docId":"information_feeds/topology"},{"type":"link","label":"Downtimes","href":"/argo-monitoring/docs/information_feeds/downtimes","docId":"information_feeds/downtimes"},{"type":"link","label":"Weights","href":"/argo-monitoring/docs/information_feeds/weights","docId":"information_feeds/weights"}],"href":"/argo-monitoring/docs/category/information-feeds"},{"type":"category","label":"Monitoring","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Monitoring guide for Service Providers","href":"/argo-monitoring/docs/monitoring/SP_guide","docId":"monitoring/SP_guide"},{"type":"link","label":"Guidelines for monitoring probes","href":"/argo-monitoring/docs/monitoring/guidelines","docId":"monitoring/guidelines"}],"href":"/argo-monitoring/docs/category/monitoring"},{"type":"category","label":"Profiles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Operations Profile","href":"/argo-monitoring/docs/profiles/operations-profile","docId":"profiles/operations-profile"},{"type":"link","label":"Aggregation Profile","href":"/argo-monitoring/docs/profiles/aggregation-profile","docId":"profiles/aggregation-profile"},{"type":"link","label":"Threshold Profile","href":"/argo-monitoring/docs/profiles/thresholds-profile","docId":"profiles/thresholds-profile"},{"type":"link","label":"Metrics Profile","href":"/argo-monitoring/docs/profiles/metrics-profile","docId":"profiles/metrics-profile"},{"type":"link","label":"Metrics Tags","href":"/argo-monitoring/docs/profiles/metrics-tags","docId":"profiles/metrics-tags"}],"href":"/argo-monitoring/docs/category/profiles"},{"type":"category","label":"Reports","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Status Timelines & A/R Results","href":"/argo-monitoring/docs/reports/timelines_&_ar","docId":"reports/timelines_&_ar"},{"type":"link","label":"Status Timelines","href":"/argo-monitoring/docs/reports/status_timelines","docId":"reports/status_timelines"},{"type":"link","label":"A/R results","href":"/argo-monitoring/docs/reports/ar","docId":"reports/ar"},{"type":"link","label":"Status Trends - Flapping","href":"/argo-monitoring/docs/reports/flapping-trends","docId":"reports/flapping-trends"},{"type":"link","label":"Status Trends - Critical, Warning,Unknown","href":"/argo-monitoring/docs/reports/status-critical-warning-unknown","docId":"reports/status-critical-warning-unknown"}],"href":"/argo-monitoring/docs/category/reports"},{"type":"category","label":"Policies","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Terms of Use","href":"/argo-monitoring/docs/policies/Terms","docId":"policies/Terms"},{"type":"link","label":"Cookie Policy","href":"/argo-monitoring/docs/policies/CookiePolicy","docId":"policies/CookiePolicy"},{"type":"link","label":"Privacy Policy","href":"/argo-monitoring/docs/policies/Privacy","docId":"policies/Privacy"},{"type":"link","label":"Technical and organisational measures (TOM)","href":"/argo-monitoring/docs/policies/tom","docId":"policies/tom"}],"href":"/argo-monitoring/docs/category/policies"},{"type":"category","label":"Training","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Training Material","href":"/argo-monitoring/docs/training/","docId":"training/training"}],"href":"/argo-monitoring/docs/category/training"},{"type":"category","label":"Use Cases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Providers Portal Use Case","href":"/argo-monitoring/docs/UseCases/ProvidersPortal","docId":"UseCases/ProvidersPortal"}],"href":"/argo-monitoring/docs/category/use-cases"},{"type":"category","label":"Communication","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Communication Channels","href":"/argo-monitoring/docs/communication/","docId":"communication/communication_channels"}],"href":"/argo-monitoring/docs/category/communication"}]},"docs":{"communication/communication_channels":{"id":"communication/communication_channels","title":"Communication Channels","description":"There are two ways you can initiate communication with the team behind the","sidebar":"tutorialSidebar"},"guides/AMS-consume-publish-events":{"id":"guides/AMS-consume-publish-events","title":"Process events/alerts directly from the source(AMS)","description":"All the events that compromise the produced alerts of the monitored","sidebar":"tutorialSidebar"},"guides/case1":{"id":"guides/case1","title":"Use Case 1: Monitor an Onboarded Service (central one)","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case2":{"id":"guides/case2","title":"Use Case 2: Monitor an Infrastructure (community)","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case3":{"id":"guides/case3","title":"Use Case 3: Integrate External Monitoring service","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case4":{"id":"guides/case4","title":"Use Case 4: Combine Results of existing ARGO Tenants.","description":"Introduction","sidebar":"tutorialSidebar"},"guides/case5":{"id":"guides/case5","title":"Use Case 5: Third-party services exploiting EOSC Monitoring data","description":"Introduction","sidebar":"tutorialSidebar"},"guides/EOSC-getARData":{"id":"guides/EOSC-getARData","title":"Get Monitoring A/R Data based on the Resource-ID","description":"Introduction","sidebar":"tutorialSidebar"},"guides/EOSC-getStatusData":{"id":"guides/EOSC-getStatusData","title":"Get Monitoring Status Data based on the Resource-ID","description":"Introduction","sidebar":"tutorialSidebar"},"guides/intro":{"id":"guides/intro","title":"Introduction","description":"Monitoring is the key service needed to gain insights into an infrastructure. It needs to be continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. The challenge of this type of monitoring is how to quickly identify and correlate problems before they affect end-users and ultimately the productivity of the organisation. Management teams can monitor the availability and reliability of the services from a high level view down to individual system metrics and monitor the conformance of multiple SLAs. The key functional requirements are:","sidebar":"tutorialSidebar"},"information_feeds/downtimes":{"id":"information_feeds/downtimes","title":"Downtimes","description":"The term downtime is used to refer to periods when a service is unavailable. Downtime can be caused by failure in hardware (physical equipment), (logic controlling equipment), interconnecting equipment (such as cables, facilities, routers,...), transmission (wireless, microwave, satellite), and/or capacity (system limits).","sidebar":"tutorialSidebar"},"information_feeds/topology":{"id":"information_feeds/topology","title":"Topology","description":"One of the main sources of truth used in the Monitoring Service is the topology. It helps to discover and map relationships between services / resources. Via the topology the owner may have in-depth visibility into the infrastructure, by enabling the Monitoring Service to categorize, classify, and finally monitor the services in it.","sidebar":"tutorialSidebar"},"information_feeds/weights":{"id":"information_feeds/weights","title":"Weights","description":"In ARGO you may combine top level A/R results (such as results referring to you data center, institution as a whole) into a higher level of abstraction such as organisations, projects, federation.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Introduction","description":"Welcome to ARGO Monitoring","sidebar":"tutorialSidebar"},"monitoring/guidelines":{"id":"monitoring/guidelines","title":"Guidelines for monitoring probes","description":"Overview","sidebar":"tutorialSidebar"},"monitoring/SP_guide":{"id":"monitoring/SP_guide","title":"Monitoring guide for Service Providers","description":"Overview","sidebar":"tutorialSidebar"},"policies/CookiePolicy":{"id":"policies/CookiePolicy","title":"Cookie Policy","description":"1. Purpose of this cookie policy","sidebar":"tutorialSidebar"},"policies/Privacy":{"id":"policies/Privacy","title":"Privacy Policy","description":"Controller details","sidebar":"tutorialSidebar"},"policies/Terms":{"id":"policies/Terms","title":"Terms of Use","description":"By registering as a user you declare that you have read, understood and will abide by the following conditions of use:","sidebar":"tutorialSidebar"},"policies/tom":{"id":"policies/tom","title":"Technical and organisational measures (TOM)","description":"This document describes the technical and organisational measures established by National Infrastructures for Research and Technology S.A. (GRNET S.A.) to meet legal and contractual requirements when processing personal data, conducting a higher level of security and protection.","sidebar":"tutorialSidebar"},"profiles/aggregation-profile":{"id":"profiles/aggregation-profile","title":"Aggregation Profile","description":"Description","sidebar":"tutorialSidebar"},"profiles/metrics-profile":{"id":"profiles/metrics-profile","title":"Metrics Profile","description":"Description","sidebar":"tutorialSidebar"},"profiles/metrics-tags":{"id":"profiles/metrics-tags","title":"Metrics Tags","description":"Description","sidebar":"tutorialSidebar"},"profiles/operations-profile":{"id":"profiles/operations-profile","title":"Operations Profile","description":"Combining timelines","sidebar":"tutorialSidebar"},"profiles/thresholds-profile":{"id":"profiles/thresholds-profile","title":"Threshold Profile","description":"Description","sidebar":"tutorialSidebar"},"reports/ar":{"id":"reports/ar","title":"A/R results","description":"Availability Reliability","sidebar":"tutorialSidebar"},"reports/flapping-trends":{"id":"reports/flapping-trends","title":"Status Trends - Flapping","description":"Description","sidebar":"tutorialSidebar"},"reports/status_timelines":{"id":"reports/status_timelines","title":"Status Timelines","description":"Status Timelines","sidebar":"tutorialSidebar"},"reports/status-critical-warning-unknown":{"id":"reports/status-critical-warning-unknown","title":"Status Trends - Critical, Warning,Unknown","description":"Description","sidebar":"tutorialSidebar"},"reports/timelines_&_ar":{"id":"reports/timelines_&_ar","title":"Status Timelines & A/R Results","description":"Description","sidebar":"tutorialSidebar"},"training/training":{"id":"training/training","title":"Training Material","description":"Training Material","sidebar":"tutorialSidebar"},"UseCases/ProvidersPortal":{"id":"UseCases/ProvidersPortal","title":"Providers Portal Use Case","description":"The EOSC Providers Portal (https://providers.eosc-portal.eu/) is a single platform for providers to onboard their organization into EOSC portal, register and manage their resources and gain rich insights about their offerings in the catalogue. It also offers the Provider dashboard, where representatives from provider organizations have a detailed view on their offerings in the EOSC portal as well as various usage statistics on their resources.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b311e722.bd1a6597.js b/assets/js/b5e81e6f.45c094a4.js similarity index 64% rename from assets/js/b311e722.bd1a6597.js rename to assets/js/b5e81e6f.45c094a4.js index 57a6b5a1..bd768ade 100644 --- a/assets/js/b311e722.bd1a6597.js +++ b/assets/js/b5e81e6f.45c094a4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3358],{5745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9997],{5745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/b8ba37ed.40c31b81.js b/assets/js/b8ba37ed.7b7984ed.js similarity index 96% rename from assets/js/b8ba37ed.40c31b81.js rename to assets/js/b8ba37ed.7b7984ed.js index 49250ed2..3bb81f6a 100644 --- a/assets/js/b8ba37ed.40c31b81.js +++ b/assets/js/b8ba37ed.7b7984ed.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5583],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),f=i,m=d["".concat(l,".").concat(f)]||d[f]||u[f]||o;return n?r.createElement(m,a(a({ref:t},c),{},{components:n})):r.createElement(m,a({ref:t},c))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,a[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=n(7462),i=(n(7294),n(3905));const o={sidebar_position:4,title:"Status Trends - Flapping"},a=void 0,s={unversionedId:"reports/flapping-trends",id:"reports/flapping-trends",title:"Status Trends - Flapping",description:"Description",source:"@site/docs/reports/flapping-trends.md",sourceDirName:"reports",slug:"/reports/flapping-trends",permalink:"/argo-monitoring/docs/reports/flapping-trends",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,title:"Status Trends - Flapping"},sidebar:"tutorialSidebar",previous:{title:"A/R results",permalink:"/argo-monitoring/docs/reports/ar"},next:{title:"Status Trends - Critical, Warning,Unknown",permalink:"/argo-monitoring/docs/reports/status-critical-warning-unknown"}},l={},p=[{value:"Description",id:"description",level:2},{value:"Examples",id:"examples",level:2},{value:"Example 1: Flapping due to network issue",id:"example-1-flapping-due-to-network-issue",level:3},{value:"Result",id:"result",level:4},{value:"Example 2: Flapping due to internal problem of the service",id:"example-2-flapping-due-to-internal-problem-of-the-service",level:3},{value:"Result",id:"result-1",level:4}],c={toc:p};function u(e){let{components:t,...o}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Flapping occurs when a service or host changes state too frequently, resulting in a storm of problems and recovery notifications. Flapping can be indicative of configuration problems (i.e. wrong configuration between the monitored item and the monitoring host), troublesome services, or real network problems. This causes a lot of alarms and notifications. "),(0,i.kt)("p",null,"ARGO Monitoring service analyzes the status timelines in different levels, detects the flapping patterns and creates a report with the list of the most problematic monitored items. It actually analyzes the stream of collected status data (monitoring results) in a big data friendly platform (analytics engine) and traces flapping patterns almost immediately. It uncovers hidden patterns, correlations and other insights and informs the user."),(0,i.kt)("h2",{id:"examples"},"Examples"),(0,i.kt)("p",null,"Flapping can occur due to network problems between monitoring host and monitored item for example:\n",(0,i.kt)("img",{src:n(4904).Z,width:"1700",height:"971"})),(0,i.kt)("h3",{id:"example-1-flapping-due-to-network-issue"},"Example 1: Flapping due to network issue"),(0,i.kt)("p",null,"ARGO Monitoring service monitors HTTP activity in host1.example.com using the check_http check. Due to network issues between the ARGO Monitoring service and host1.example.com a pattern arises that some http checks are successful (OK) and some are critical (CRITICAL) (in successive order) as shown in picture:"),(0,i.kt)("h4",{id:"result"},"Result"),(0,i.kt)("p",null,"Based on this behaviour, during the data computations, the service is flagged as a flapping service, and it is included in the list of flapping services presented in the ARGO Monitoring UI. "),(0,i.kt)("h3",{id:"example-2-flapping-due-to-internal-problem-of-the-service"},"Example 2: Flapping due to internal problem of the service"),(0,i.kt)("p",null,"ARGO Monitoring service monitors the file upload functionality in host2.example.com (object storage) using the file upload check. Due to an internal error of the service, the check uploads a file successfully (OK), then issues a deletion request on it but the deletion takes too long. In a second attempt to re-upload the file the check receives a warning (WARNING) until the deletion of the original is completed. This results in a repeating pattern of status being OK then WARNING, then again OK etc as shown in the following picture:\n",(0,i.kt)("img",{src:n(5726).Z,width:"1700",height:"992"})),(0,i.kt)("h4",{id:"result-1"},"Result"),(0,i.kt)("p",null,"Based on this behaviour, during the data computations, the service is flagged as a flapping service, and it is included in the list of flapping services presented in the ARGO Monitoring UI."))}u.isMDXComponent=!0},4904:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/status-trends-flapping-img1-785dbb798f0519caf516915bf4059ae8.png"},5726:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/status-trends-flapping-img2-d8aa17773903cc5cd4b0b8b0bbea0282.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5583],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),f=i,m=d["".concat(l,".").concat(f)]||d[f]||u[f]||o;return n?r.createElement(m,a(a({ref:t},c),{},{components:n})):r.createElement(m,a({ref:t},c))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,a[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=n(7462),i=(n(7294),n(3905));const o={sidebar_position:4,title:"Status Trends - Flapping"},a=void 0,s={unversionedId:"reports/flapping-trends",id:"reports/flapping-trends",title:"Status Trends - Flapping",description:"Description",source:"@site/docs/reports/flapping-trends.md",sourceDirName:"reports",slug:"/reports/flapping-trends",permalink:"/argo-monitoring/docs/reports/flapping-trends",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,title:"Status Trends - Flapping"},sidebar:"tutorialSidebar",previous:{title:"A/R results",permalink:"/argo-monitoring/docs/reports/ar"},next:{title:"Status Trends - Critical, Warning,Unknown",permalink:"/argo-monitoring/docs/reports/status-critical-warning-unknown"}},l={},p=[{value:"Description",id:"description",level:2},{value:"Examples",id:"examples",level:2},{value:"Example 1: Flapping due to network issue",id:"example-1-flapping-due-to-network-issue",level:3},{value:"Result",id:"result",level:4},{value:"Example 2: Flapping due to internal problem of the service",id:"example-2-flapping-due-to-internal-problem-of-the-service",level:3},{value:"Result",id:"result-1",level:4}],c={toc:p};function u(e){let{components:t,...o}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Flapping occurs when a service or host changes state too frequently, resulting in a storm of problems and recovery notifications. Flapping can be indicative of configuration problems (i.e. wrong configuration between the monitored item and the monitoring host), troublesome services, or real network problems. This causes a lot of alarms and notifications. "),(0,i.kt)("p",null,"ARGO Monitoring service analyzes the status timelines in different levels, detects the flapping patterns and creates a report with the list of the most problematic monitored items. It actually analyzes the stream of collected status data (monitoring results) in a big data friendly platform (analytics engine) and traces flapping patterns almost immediately. It uncovers hidden patterns, correlations and other insights and informs the user."),(0,i.kt)("h2",{id:"examples"},"Examples"),(0,i.kt)("p",null,"Flapping can occur due to network problems between monitoring host and monitored item for example:\n",(0,i.kt)("img",{src:n(8920).Z,width:"1700",height:"971"})),(0,i.kt)("h3",{id:"example-1-flapping-due-to-network-issue"},"Example 1: Flapping due to network issue"),(0,i.kt)("p",null,"ARGO Monitoring service monitors HTTP activity in host1.example.com using the check_http check. Due to network issues between the ARGO Monitoring service and host1.example.com a pattern arises that some http checks are successful (OK) and some are critical (CRITICAL) (in successive order) as shown in picture:"),(0,i.kt)("h4",{id:"result"},"Result"),(0,i.kt)("p",null,"Based on this behaviour, during the data computations, the service is flagged as a flapping service, and it is included in the list of flapping services presented in the ARGO Monitoring UI. "),(0,i.kt)("h3",{id:"example-2-flapping-due-to-internal-problem-of-the-service"},"Example 2: Flapping due to internal problem of the service"),(0,i.kt)("p",null,"ARGO Monitoring service monitors the file upload functionality in host2.example.com (object storage) using the file upload check. Due to an internal error of the service, the check uploads a file successfully (OK), then issues a deletion request on it but the deletion takes too long. In a second attempt to re-upload the file the check receives a warning (WARNING) until the deletion of the original is completed. This results in a repeating pattern of status being OK then WARNING, then again OK etc as shown in the following picture:\n",(0,i.kt)("img",{src:n(4301).Z,width:"1700",height:"992"})),(0,i.kt)("h4",{id:"result-1"},"Result"),(0,i.kt)("p",null,"Based on this behaviour, during the data computations, the service is flagged as a flapping service, and it is included in the list of flapping services presented in the ARGO Monitoring UI."))}u.isMDXComponent=!0},8920:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/status-trends-flapping-img1-785dbb798f0519caf516915bf4059ae8.png"},4301:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/status-trends-flapping-img2-d8aa17773903cc5cd4b0b8b0bbea0282.png"}}]); \ No newline at end of file diff --git a/assets/js/bc796c94.696f49f8.js b/assets/js/bc796c94.c411d645.js similarity index 98% rename from assets/js/bc796c94.696f49f8.js rename to assets/js/bc796c94.c411d645.js index f5cde57c..b5e2b0f9 100644 --- a/assets/js/bc796c94.696f49f8.js +++ b/assets/js/bc796c94.c411d645.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[980],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,h=m["".concat(l,".").concat(d)]||m[d]||p[d]||i;return n?r.createElement(h,s(s({ref:t},u),{},{components:n})):r.createElement(h,s({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,s=new Array(i);s[0]=m;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o.mdxType="string"==typeof e?e:a,s[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const i={sidebar_position:4,title:"Status Trends - Critical, Warning,Unknown"},s=void 0,o={unversionedId:"reports/status-critical-warning-unknown",id:"reports/status-critical-warning-unknown",title:"Status Trends - Critical, Warning,Unknown",description:"Description",source:"@site/docs/reports/status-critical-warning-unknown.md",sourceDirName:"reports",slug:"/reports/status-critical-warning-unknown",permalink:"/argo-monitoring/docs/reports/status-critical-warning-unknown",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,title:"Status Trends - Critical, Warning,Unknown"},sidebar:"tutorialSidebar",previous:{title:"Status Trends - Flapping",permalink:"/argo-monitoring/docs/reports/flapping-trends"},next:{title:"Policies",permalink:"/argo-monitoring/docs/category/policies"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Examples",id:"examples",level:2},{value:"Example 1: Counting CRITICAL,WARNING,UNKNOWN status daily appearance and duration",id:"example-1-counting-criticalwarningunknown-status-daily-appearance-and-duration",level:3},{value:"Result",id:"result",level:4}],u={toc:c};function p(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"The ARGO Monitoring Service is checking the services at regular intervals. It actually runs explicit tests (checks) in order to assess the status of the service. The result of the checks decides on the state of the service. Based on that each service may have a state :"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"OK"),": the check succeeds"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"CRITICAL"),": the check does not succeed"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"WARNING"),": the check succeeds but performs unusually"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"MISSING"),": the check\u2019s state is not recorded"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"UNKNOWN"),": the check could not apply on the monitoring item and as a result the check\u2019s state is unknown")),(0,a.kt)("p",null,"As configuration problems, troublesome services, or other service internal problems occur, the checks on the monitoring items can result in a problematic state (critical, warning or unknown state), for a time period."),(0,a.kt)("p",null,"ARGO Monitoring service analyzes the status timelines in different levels, detects the CRITICAL, WARNING, UNKNOWN states and calculates the duration (in minutes) as well as the number of appearances of each state in the daily timelines. ARGO Monitoring service creates a report, for each of the problematic states, with the list of the monitored items which remain in the state for the longest time period."),(0,a.kt)("p",null,"It actually analyzes the stream of collected status data (monitoring results) using its analytics engine (a big data friendly platform) and traces the problematic states almost in real time, calculating their presence and duration. It uncovers hidden patterns, correlations and other insights and informs the user."),(0,a.kt)("h2",{id:"examples"},"Examples"),(0,a.kt)("p",null,"State changes can occur due to network problems between monitoring host and monitored item for example:"),(0,a.kt)("h3",{id:"example-1-counting-criticalwarningunknown-status-daily-appearance-and-duration"},"Example 1: Counting CRITICAL,WARNING,UNKNOWN status daily appearance and duration"),(0,a.kt)("p",null,"We have a monitoring service that monitors HTTP activity in host2.example.com using the check_http probe. Due to network issues between monitoring box and host2.example.com we have a pattern that some HTTP checks are successful (",(0,a.kt)("strong",{parentName:"p"},"OK"),") some are critical (",(0,a.kt)("strong",{parentName:"p"},"CRITICAL"),"), some are warning (",(0,a.kt)("strong",{parentName:"p"},"WARNING"),") and some are unknown (",(0,a.kt)("strong",{parentName:"p"},"UNKNOWN"),") as shown in picture:\n",(0,a.kt)("img",{src:n(5757).Z,width:"1700",height:"1001"})),(0,a.kt)("h4",{id:"result"},"Result"),(0,a.kt)("p",null,"ARGO Monitoring Service applies calculations on the recorded status timeline and counts the appearance and duration of CRITICAL, WARNING, UNKNOWN state. "),(0,a.kt)("p",null,"The duration of the status is calculated by aggregating the interval duration of each status appearance in the timeline."),(0,a.kt)("p",null,"In the above example, as the timeline is divided in 20 equal slots, each slot has a duration of 36 minutes."),(0,a.kt)("p",null,"The ARGO Monitoring Service detects that :"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"WARNING appears 2 times, with duration 72 minutes (2 X 36 minutes)"),(0,a.kt)("li",{parentName:"ul"},"CRITICAL appears 5 times, with duration 180 minutes (5 X 36 minutes)"),(0,a.kt)("li",{parentName:"ul"},"UNKNOWN appears 1 time,, with duration 36 minutes (1 X 36 minutes)")))}p.isMDXComponent=!0},5757:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/status-trends-flapping-img3-29a4599a2e23edda05ad7b75102c0905.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[980],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=c(n),d=a,h=m["".concat(l,".").concat(d)]||m[d]||p[d]||i;return n?r.createElement(h,s(s({ref:t},u),{},{components:n})):r.createElement(h,s({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,s=new Array(i);s[0]=m;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o.mdxType="string"==typeof e?e:a,s[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const i={sidebar_position:4,title:"Status Trends - Critical, Warning,Unknown"},s=void 0,o={unversionedId:"reports/status-critical-warning-unknown",id:"reports/status-critical-warning-unknown",title:"Status Trends - Critical, Warning,Unknown",description:"Description",source:"@site/docs/reports/status-critical-warning-unknown.md",sourceDirName:"reports",slug:"/reports/status-critical-warning-unknown",permalink:"/argo-monitoring/docs/reports/status-critical-warning-unknown",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,title:"Status Trends - Critical, Warning,Unknown"},sidebar:"tutorialSidebar",previous:{title:"Status Trends - Flapping",permalink:"/argo-monitoring/docs/reports/flapping-trends"},next:{title:"Policies",permalink:"/argo-monitoring/docs/category/policies"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Examples",id:"examples",level:2},{value:"Example 1: Counting CRITICAL,WARNING,UNKNOWN status daily appearance and duration",id:"example-1-counting-criticalwarningunknown-status-daily-appearance-and-duration",level:3},{value:"Result",id:"result",level:4}],u={toc:c};function p(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"The ARGO Monitoring Service is checking the services at regular intervals. It actually runs explicit tests (checks) in order to assess the status of the service. The result of the checks decides on the state of the service. Based on that each service may have a state :"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"OK"),": the check succeeds"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"CRITICAL"),": the check does not succeed"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"WARNING"),": the check succeeds but performs unusually"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"MISSING"),": the check\u2019s state is not recorded"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"UNKNOWN"),": the check could not apply on the monitoring item and as a result the check\u2019s state is unknown")),(0,a.kt)("p",null,"As configuration problems, troublesome services, or other service internal problems occur, the checks on the monitoring items can result in a problematic state (critical, warning or unknown state), for a time period."),(0,a.kt)("p",null,"ARGO Monitoring service analyzes the status timelines in different levels, detects the CRITICAL, WARNING, UNKNOWN states and calculates the duration (in minutes) as well as the number of appearances of each state in the daily timelines. ARGO Monitoring service creates a report, for each of the problematic states, with the list of the monitored items which remain in the state for the longest time period."),(0,a.kt)("p",null,"It actually analyzes the stream of collected status data (monitoring results) using its analytics engine (a big data friendly platform) and traces the problematic states almost in real time, calculating their presence and duration. It uncovers hidden patterns, correlations and other insights and informs the user."),(0,a.kt)("h2",{id:"examples"},"Examples"),(0,a.kt)("p",null,"State changes can occur due to network problems between monitoring host and monitored item for example:"),(0,a.kt)("h3",{id:"example-1-counting-criticalwarningunknown-status-daily-appearance-and-duration"},"Example 1: Counting CRITICAL,WARNING,UNKNOWN status daily appearance and duration"),(0,a.kt)("p",null,"We have a monitoring service that monitors HTTP activity in host2.example.com using the check_http probe. Due to network issues between monitoring box and host2.example.com we have a pattern that some HTTP checks are successful (",(0,a.kt)("strong",{parentName:"p"},"OK"),") some are critical (",(0,a.kt)("strong",{parentName:"p"},"CRITICAL"),"), some are warning (",(0,a.kt)("strong",{parentName:"p"},"WARNING"),") and some are unknown (",(0,a.kt)("strong",{parentName:"p"},"UNKNOWN"),") as shown in picture:\n",(0,a.kt)("img",{src:n(9550).Z,width:"1700",height:"1001"})),(0,a.kt)("h4",{id:"result"},"Result"),(0,a.kt)("p",null,"ARGO Monitoring Service applies calculations on the recorded status timeline and counts the appearance and duration of CRITICAL, WARNING, UNKNOWN state. "),(0,a.kt)("p",null,"The duration of the status is calculated by aggregating the interval duration of each status appearance in the timeline."),(0,a.kt)("p",null,"In the above example, as the timeline is divided in 20 equal slots, each slot has a duration of 36 minutes."),(0,a.kt)("p",null,"The ARGO Monitoring Service detects that :"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"WARNING appears 2 times, with duration 72 minutes (2 X 36 minutes)"),(0,a.kt)("li",{parentName:"ul"},"CRITICAL appears 5 times, with duration 180 minutes (5 X 36 minutes)"),(0,a.kt)("li",{parentName:"ul"},"UNKNOWN appears 1 time,, with duration 36 minutes (1 X 36 minutes)")))}p.isMDXComponent=!0},9550:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/status-trends-flapping-img3-29a4599a2e23edda05ad7b75102c0905.png"}}]); \ No newline at end of file diff --git a/assets/js/59227a29.015c5e57.js b/assets/js/c7697309.ca7bf5b7.js similarity index 64% rename from assets/js/59227a29.015c5e57.js rename to assets/js/c7697309.ca7bf5b7.js index 0efcc3a2..399d3488 100644 --- a/assets/js/59227a29.015c5e57.js +++ b/assets/js/c7697309.ca7bf5b7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5413],{2776:e=>{e.exports=JSON.parse('{"name":"@easyops-cn/docusaurus-search-local","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9944],{2776:e=>{e.exports=JSON.parse('{"name":"@easyops-cn/docusaurus-search-local","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/ccd61d8c.061f7992.js b/assets/js/ccd61d8c.061f7992.js deleted file mode 100644 index 3b1ae2f0..00000000 --- a/assets/js/ccd61d8c.061f7992.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[128],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var o=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function n(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=o.createContext({}),c=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):n(n({},t),e)),r},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(r),h=i,f=d["".concat(l,".").concat(h)]||d[h]||p[h]||a;return r?o.createElement(f,n(n({ref:t},u),{},{components:r})):o.createElement(f,n({ref:t},u))}));function h(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,n=new Array(a);n[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,n[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=r(7462),i=(r(7294),r(3905));const a={sidebar_position:2,title:"Providers Portal Use Case"},n=void 0,s={unversionedId:"UseCases/ProvidersPortal",id:"UseCases/ProvidersPortal",title:"Providers Portal Use Case",description:"The EOSC Providers Portal (https://providers.eosc-portal.eu/) is a single platform for providers to onboard their organization into EOSC portal, register and manage their resources and gain rich insights about their offerings in the catalogue. It also offers the Provider dashboard, where representatives from provider organizations have a detailed view on their offerings in the EOSC portal as well as various usage statistics on their resources.",source:"@site/docs/UseCases/ProvidersPortal.md",sourceDirName:"UseCases",slug:"/UseCases/ProvidersPortal",permalink:"/argo-monitoring/docs/UseCases/ProvidersPortal",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Providers Portal Use Case"},sidebar:"tutorialSidebar",previous:{title:"Use Cases",permalink:"/argo-monitoring/docs/category/use-cases"},next:{title:"Communication",permalink:"/argo-monitoring/docs/category/communication"}},l={},c=[],u={toc:c};function p(e){let{components:t,...a}=e;return(0,i.kt)("wrapper",(0,o.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"The EOSC Providers Portal (",(0,i.kt)("a",{parentName:"p",href:"https://providers.eosc-portal.eu/"},"https://providers.eosc-portal.eu/"),") is a single platform for providers to onboard their organization into EOSC portal, register and manage their resources and gain rich insights about their offerings in the catalogue. It also offers the Provider dashboard, where representatives from provider organizations have a detailed view on their offerings in the EOSC portal as well as various usage statistics on their resources. "),(0,i.kt)("p",null,"EOSC Monitoring (",(0,i.kt)("a",{parentName:"p",href:"https://monitoring.eosc-portal.eu/"},"https://monitoring.eosc-portal.eu/"),") is the key service needed to gain insights into the Resources Onboarded in EOSC. It is continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. EOSC Monitoring continuously checks the service so\xa0\xa0\u2028"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Providers can have a more reliable service with better availability\xa0"),(0,i.kt)("li",{parentName:"ul"},"Users select the service without facing unexpected service errors.\xa0")),(0,i.kt)("p",null,"The EOSC Providers Portal is integrated with the EOSC Monitoring and it allows Providers to specify monitoring aspects for their resources, whilst at the same time it presents monitoring statistics. From the techical point of view the EOSC Monitoring API is used to fetch information about the availability and reliability of the services. Each service has a unique id in the EOSC ecosystem and this supports the integration of both systems, as it is used as a unique identifier in both systems. The EOSC Monitoring API offers the latest availability/reliability results either in a daily or a monthly basis. "),(0,i.kt)("p",null,"Providers Portal uses Monitoring data to display a diagram for each service as you can see in the example below."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Argo Monitoring Service",src:r(4537).Z,width:"1717",height:"873"})),(0,i.kt)("p",null,"The display of the monitoring data help Providers\xa0to: "),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"\u0399ncrease customer satisfaction"),(0,i.kt)("li",{parentName:"ul"},"Diagnose and prevent internal , or user related issues"),(0,i.kt)("li",{parentName:"ul"},"build trust with the end users or potential new customer")))}p.isMDXComponent=!0},4537:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/Providers_Portal_usecase-080c780c1449434197193dbe3f58d3f5.png"}}]); \ No newline at end of file diff --git a/assets/js/ccd61d8c.35ae371e.js b/assets/js/ccd61d8c.35ae371e.js new file mode 100644 index 00000000..34780bd3 --- /dev/null +++ b/assets/js/ccd61d8c.35ae371e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[128],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var i=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,i)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=i.createContext({}),c=function(e){var t=i.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=c(e.components);return i.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(r),h=o,f=d["".concat(l,".").concat(h)]||d[h]||p[h]||n;return r?i.createElement(f,a(a({ref:t},u),{},{components:r})):i.createElement(f,a({ref:t},u))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,a=new Array(n);a[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var i=r(7462),o=(r(7294),r(3905));const n={sidebar_position:2,title:"Monitoring Data in the Providers Portal"},a=void 0,s={unversionedId:"UseCases/ProvidersPortal",id:"UseCases/ProvidersPortal",title:"Monitoring Data in the Providers Portal",description:"The EOSC Providers Portal (https://providers.eosc-portal.eu/) is a single platform for providers to onboard their organization into EOSC portal, register and manage their resources and gain rich insights about their offerings in the catalogue. It also offers the Provider dashboard, where representatives from provider organizations have a detailed view on their offerings in the EOSC portal as well as various usage statistics on their resources.",source:"@site/docs/UseCases/ProvidersPortal.md",sourceDirName:"UseCases",slug:"/UseCases/ProvidersPortal",permalink:"/argo-monitoring/docs/UseCases/ProvidersPortal",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Monitoring Data in the Providers Portal"},sidebar:"tutorialSidebar",previous:{title:"Use Cases",permalink:"/argo-monitoring/docs/category/use-cases"},next:{title:"Communication",permalink:"/argo-monitoring/docs/category/communication"}},l={},c=[],u={toc:c};function p(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,i.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The EOSC Providers Portal (",(0,o.kt)("a",{parentName:"p",href:"https://providers.eosc-portal.eu/"},"https://providers.eosc-portal.eu/"),") is a single platform for providers to onboard their organization into EOSC portal, register and manage their resources and gain rich insights about their offerings in the catalogue. It also offers the Provider dashboard, where representatives from provider organizations have a detailed view on their offerings in the EOSC portal as well as various usage statistics on their resources. "),(0,o.kt)("p",null,"EOSC Monitoring (",(0,o.kt)("a",{parentName:"p",href:"https://monitoring.eosc-portal.eu/"},"https://monitoring.eosc-portal.eu/"),") is the key service needed to gain insights into the Resources Onboarded in EOSC. It is continuous and on-demand to quickly detect, correlate, and analyse data for a fast reaction to anomalous behaviour. EOSC Monitoring continuously checks the service so\xa0\xa0\u2028"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Providers can have a more reliable service with better availability\xa0"),(0,o.kt)("li",{parentName:"ul"},"Users select the service without facing unexpected service errors.\xa0")),(0,o.kt)("p",null,"The EOSC Providers Portal is integrated with the EOSC Monitoring and it allows Providers to specify monitoring aspects for their resources, whilst at the same time it presents monitoring statistics. From the techical point of view the EOSC Monitoring API is used to fetch information about the availability and reliability of the services. Each service has a unique id in the EOSC ecosystem and this supports the integration of both systems, as it is used as a unique identifier in both systems. The EOSC Monitoring API offers the latest availability/reliability results either in a daily or a monthly basis. "),(0,o.kt)("p",null,"Providers Portal uses Monitoring data to display a diagram for each service as you can see in the example below."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Argo Monitoring Service",src:r(9312).Z,width:"1717",height:"873"})),(0,o.kt)("p",null,"The display of the monitoring data help Providers\xa0to: "),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u0399ncrease customer satisfaction"),(0,o.kt)("li",{parentName:"ul"},"Diagnose and prevent internal , or user related issues"),(0,o.kt)("li",{parentName:"ul"},"build trust with the end users or potential new customer")))}p.isMDXComponent=!0},9312:(e,t,r)=>{r.d(t,{Z:()=>i});const i=r.p+"assets/images/Providers_Portal_usecase-080c780c1449434197193dbe3f58d3f5.png"}}]); \ No newline at end of file diff --git a/assets/js/d7abbfd8.5914d25a.js b/assets/js/d7abbfd8.47412356.js similarity index 99% rename from assets/js/d7abbfd8.5914d25a.js rename to assets/js/d7abbfd8.47412356.js index 0b272b27..f642a4e2 100644 --- a/assets/js/d7abbfd8.5914d25a.js +++ b/assets/js/d7abbfd8.47412356.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3786],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),p=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=p(r),h=n,g=m["".concat(l,".").concat(h)]||m[h]||u[h]||a;return r?o.createElement(g,i(i({ref:t},c),{},{components:r})):o.createElement(g,i({ref:t},c))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var o=r(7462),n=(r(7294),r(3905));const a={sidebar_position:1,title:"Topology"},i=void 0,s={unversionedId:"information_feeds/topology",id:"information_feeds/topology",title:"Topology",description:"One of the main sources of truth used in the Monitoring Service is the topology. It helps to discover and map relationships between services / resources. Via the topology the owner may have in-depth visibility into the infrastructure, by enabling the Monitoring Service to categorize, classify, and finally monitor the services in it.",source:"@site/docs/information_feeds/topology.md",sourceDirName:"information_feeds",slug:"/information_feeds/topology",permalink:"/argo-monitoring/docs/information_feeds/topology",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Topology"},sidebar:"tutorialSidebar",previous:{title:"Information Feeds",permalink:"/argo-monitoring/docs/category/information-feeds"},next:{title:"Downtimes",permalink:"/argo-monitoring/docs/information_feeds/downtimes"}},l={},p=[{value:"Examples",id:"examples",level:2},{value:"Example 1: Monitoring the services of a Project- The topology:",id:"example-1-monitoring-the-services-of-a-project--the-topology",level:3},{value:"Example 2: Monitoring the services of 1 or more Organisations - The topology:",id:"example-2-monitoring-the-services-of-1-or-more-organisations---the-topology",level:3}],c={toc:p};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,o.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"One of the main sources of truth used in the Monitoring Service is the topology. It helps to discover and map relationships between services / resources. Via the topology the owner may have in-depth visibility into the infrastructure, by enabling the Monitoring Service to categorize, classify, and finally monitor the services in it. "),(0,n.kt)("p",null,"Topology includes all the necessary information about how an infrastructure is structured and organized. ARGO Monitoring Service via the connectors (components used to connect to well known Configuration Databases (DPMT, GOCDB, csv files, json) retrieves information about the infrastructure, the hierarchy of the services that will be monitored, and the service owners."),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Topology information includes :")),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"the monitored services"),(0,n.kt)("li",{parentName:"ul"},"the way they are organized (ex. in groups of sites, in groups of services, in projects). The Service can model different types of infrastructure architectures"),(0,n.kt)("li",{parentName:"ul"},"the service actors (owners, admins)")),(0,n.kt)("p",null,"The ways the services are organized (sites, services, projects) can be part of a bigger structure, that gathers a number of groups. "),(0,n.kt)("p",null,"Organisations offer services that can be grouped based on the location (SITES), or based on the project they are used by (PROJECT) . This can be one more level to the topology hierarchy. The topology should also provide information about this bigger group, it's type and the services it contains."),(0,n.kt)("p",null,"The ARGO Monitoring Service allows the users to model their infrastructure by defining multiple level of groups, starting from groups of Service Endpoints and moving to higher level groups of groups. In this way it is easy to model different infrastructure architectures. We have to mention here that the levels of the topology is something that can be updated and depends on the requirements of each infrastructure."),(0,n.kt)("p",null,"But before we start lets explain a few acronyms. "),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"th"},"Type")),(0,n.kt)("th",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"th"},"Description")),(0,n.kt)("th",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"th"},"Example")))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Grouping")),(0,n.kt)("td",{parentName:"tr",align:null},"A way to organize and group the services ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"SITE")," An organization responsible for the service ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"PROJECT")," When you offer services on behalf of a project ",(0,n.kt)("br",null)," ",(0,n.kt)("strong",{parentName:"td"},"SERVICE GROUPS")," A group of related services"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"SITE")," GRNET ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"PROJECT")," MyProject ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"SERVICE GROUP")," Cluster of databases")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Service Type")),(0,n.kt)("td",{parentName:"tr",align:null},"Each service type can have a defined sets of metrics, which are explicit tests when we check"),(0,n.kt)("td",{parentName:"tr",align:null},"repository")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Endpoint")),(0,n.kt)("td",{parentName:"tr",align:null},"the combination of hostname and Service Type, defining where the service runs"),(0,n.kt)("td",{parentName:"tr",align:null},"a repository at ",(0,n.kt)("a",{parentName:"td",href:"http://www.example-repository.com"},"www.example-repository.com")," uses port 4333")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Service actors")),(0,n.kt)("td",{parentName:"tr",align:null},"the people responsible for the service operation"),(0,n.kt)("td",{parentName:"tr",align:null},"Administrator : John Smith jsmith ","[AT]"," grnet.gr ",(0,n.kt)("br",null),"Site Owner: John Doe jDoe ","[AT]"," grnet.gr ",(0,n.kt)("br",null),"Security: George Papadopoulos jpapad ","[AT]"," grnet.gr")))),(0,n.kt)("h2",{id:"examples"},"Examples"),(0,n.kt)("p",null,"Via a Topology the structure of a Project, an Organization, a SITE, can be monitored. For example: "),(0,n.kt)("h3",{id:"example-1-monitoring-the-services-of-a-project--the-topology"},"Example 1: Monitoring the services of a Project- The topology:"),(0,n.kt)("p",null,"When we participate at a Project we offer a number of services. Based on this a project gathers the services to offer to a higher level and creates one more level of hierarchy. Project acts as a group, at the top level of the infrastructure definition. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"Project \n |---Service or Group of services \n |--Service Endpoints \n")),(0,n.kt)("p",null,"As an example, we may say that we have a project (MyProject) which offers an AAI Service and a Document Management Service. The information about the topology includes the group (MyProject), the services (AAI service, Document Management Service) that combine the service endpoints (aai.myproject.org, aai1.myproject.org) and (docu.myproject.org, database.myproject.org) . The following image is trying to represent the hierarchy of the topology. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"}," MyProject\n |---AAI service |---Document Management Service \n |------aai.myproject.org |------docu.myproject.org\n |------aai1.myproject.org |------database.myproject.org \n")),(0,n.kt)("h3",{id:"example-2-monitoring-the-services-of-1-or-more-organisations---the-topology"},"Example 2: Monitoring the services of 1 or more Organisations - The topology:"),(0,n.kt)("p",null,"Another way to organise the topology is to add a new layer of group which is the Organisations. An Organisation usually has a number of Sites where it hosts the services used by the users. In the following example the hierarchy of this type of topology is represented. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"ORGANINATION \n |----SITE \n |---Service or Group of services \n |------Service Endpoints \n\n")),(0,n.kt)("p",null,"As an example, we may say that we have an organization, such as GRNET, which has a number of Sites like HEBLAB,IASA,EKT. Each Site gathers a number of services like SRM and WEBDAV. These services combine a number of like service-endpoints grid02.physics.uoi.gr, se01.marie.hellasgrid.gr, se01.athena.hellasgrid.gr. The following image is trying to represent the hierarchy of the topology. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"}," GRNET \n|---- HEBLAB\n |-- SRM \n |-- grid02.physics.uoi.gr\n|---- IASA \n |-- WEBDAV \n |-- se01.marie.hellasgrid.\n|---- EKT\n |-- SRM \n |-- se01.athena.hellasgrid.gr\n")),(0,n.kt)("p",null,"A visual representation of the above topology example can be represented from the image below: "),(0,n.kt)("p",null,(0,n.kt)("img",{src:r(2612).Z,width:"1161",height:"657"})," "),(0,n.kt)("p",null,"Monitoring Service has a number of connectors for well-known configuration databases and sources like: "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"DPMT (Data Project Management Tool, that also manages topology and resources information) "),(0,n.kt)("li",{parentName:"ul"},"GOCDB (Repository for storing and presenting topology and resources information) "),(0,n.kt)("li",{parentName:"ul"},"CSV files (predefined format)"),(0,n.kt)("li",{parentName:"ul"},"Json files (predefined format)")),(0,n.kt)("p",null,"An example of the Json file is as follows: "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},'[ \n {\n"Service Description (Alphanumeric and basic punctuation)": "My service", \n"URL": "https://example.com", \n"SITENAME-SERVICEGROUP": "MY_SITE", \n"Service Unique ID": "1234", \n"COUNTRY_NAME": "Greece", \n"notification flag?": "Yes", \n"CONTACT_EMAIL": "address@example.com", \n"Status ": "Development", \n"SERVICE_TYPE": "my.service.type"\n } \n\u2026\n]\n\n')),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"xml files (predefined format)")))}u.isMDXComponent=!0},2612:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/topology-bdb633d4948060e86915e5cc1b634de8.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3786],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),p=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=p(r),h=n,g=m["".concat(l,".").concat(h)]||m[h]||u[h]||a;return r?o.createElement(g,i(i({ref:t},c),{},{components:r})):o.createElement(g,i({ref:t},c))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var o=r(7462),n=(r(7294),r(3905));const a={sidebar_position:1,title:"Topology"},i=void 0,s={unversionedId:"information_feeds/topology",id:"information_feeds/topology",title:"Topology",description:"One of the main sources of truth used in the Monitoring Service is the topology. It helps to discover and map relationships between services / resources. Via the topology the owner may have in-depth visibility into the infrastructure, by enabling the Monitoring Service to categorize, classify, and finally monitor the services in it.",source:"@site/docs/information_feeds/topology.md",sourceDirName:"information_feeds",slug:"/information_feeds/topology",permalink:"/argo-monitoring/docs/information_feeds/topology",draft:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Topology"},sidebar:"tutorialSidebar",previous:{title:"Information Feeds",permalink:"/argo-monitoring/docs/category/information-feeds"},next:{title:"Downtimes",permalink:"/argo-monitoring/docs/information_feeds/downtimes"}},l={},p=[{value:"Examples",id:"examples",level:2},{value:"Example 1: Monitoring the services of a Project- The topology:",id:"example-1-monitoring-the-services-of-a-project--the-topology",level:3},{value:"Example 2: Monitoring the services of 1 or more Organisations - The topology:",id:"example-2-monitoring-the-services-of-1-or-more-organisations---the-topology",level:3}],c={toc:p};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,o.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"One of the main sources of truth used in the Monitoring Service is the topology. It helps to discover and map relationships between services / resources. Via the topology the owner may have in-depth visibility into the infrastructure, by enabling the Monitoring Service to categorize, classify, and finally monitor the services in it. "),(0,n.kt)("p",null,"Topology includes all the necessary information about how an infrastructure is structured and organized. ARGO Monitoring Service via the connectors (components used to connect to well known Configuration Databases (DPMT, GOCDB, csv files, json) retrieves information about the infrastructure, the hierarchy of the services that will be monitored, and the service owners."),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Topology information includes :")),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"the monitored services"),(0,n.kt)("li",{parentName:"ul"},"the way they are organized (ex. in groups of sites, in groups of services, in projects). The Service can model different types of infrastructure architectures"),(0,n.kt)("li",{parentName:"ul"},"the service actors (owners, admins)")),(0,n.kt)("p",null,"The ways the services are organized (sites, services, projects) can be part of a bigger structure, that gathers a number of groups. "),(0,n.kt)("p",null,"Organisations offer services that can be grouped based on the location (SITES), or based on the project they are used by (PROJECT) . This can be one more level to the topology hierarchy. The topology should also provide information about this bigger group, it's type and the services it contains."),(0,n.kt)("p",null,"The ARGO Monitoring Service allows the users to model their infrastructure by defining multiple level of groups, starting from groups of Service Endpoints and moving to higher level groups of groups. In this way it is easy to model different infrastructure architectures. We have to mention here that the levels of the topology is something that can be updated and depends on the requirements of each infrastructure."),(0,n.kt)("p",null,"But before we start lets explain a few acronyms. "),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"th"},"Type")),(0,n.kt)("th",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"th"},"Description")),(0,n.kt)("th",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"th"},"Example")))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Grouping")),(0,n.kt)("td",{parentName:"tr",align:null},"A way to organize and group the services ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"SITE")," An organization responsible for the service ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"PROJECT")," When you offer services on behalf of a project ",(0,n.kt)("br",null)," ",(0,n.kt)("strong",{parentName:"td"},"SERVICE GROUPS")," A group of related services"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"SITE")," GRNET ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"PROJECT")," MyProject ",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"SERVICE GROUP")," Cluster of databases")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Service Type")),(0,n.kt)("td",{parentName:"tr",align:null},"Each service type can have a defined sets of metrics, which are explicit tests when we check"),(0,n.kt)("td",{parentName:"tr",align:null},"repository")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Endpoint")),(0,n.kt)("td",{parentName:"tr",align:null},"the combination of hostname and Service Type, defining where the service runs"),(0,n.kt)("td",{parentName:"tr",align:null},"a repository at ",(0,n.kt)("a",{parentName:"td",href:"http://www.example-repository.com"},"www.example-repository.com")," uses port 4333")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("strong",{parentName:"td"},"Service actors")),(0,n.kt)("td",{parentName:"tr",align:null},"the people responsible for the service operation"),(0,n.kt)("td",{parentName:"tr",align:null},"Administrator : John Smith jsmith ","[AT]"," grnet.gr ",(0,n.kt)("br",null),"Site Owner: John Doe jDoe ","[AT]"," grnet.gr ",(0,n.kt)("br",null),"Security: George Papadopoulos jpapad ","[AT]"," grnet.gr")))),(0,n.kt)("h2",{id:"examples"},"Examples"),(0,n.kt)("p",null,"Via a Topology the structure of a Project, an Organization, a SITE, can be monitored. For example: "),(0,n.kt)("h3",{id:"example-1-monitoring-the-services-of-a-project--the-topology"},"Example 1: Monitoring the services of a Project- The topology:"),(0,n.kt)("p",null,"When we participate at a Project we offer a number of services. Based on this a project gathers the services to offer to a higher level and creates one more level of hierarchy. Project acts as a group, at the top level of the infrastructure definition. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"Project \n |---Service or Group of services \n |--Service Endpoints \n")),(0,n.kt)("p",null,"As an example, we may say that we have a project (MyProject) which offers an AAI Service and a Document Management Service. The information about the topology includes the group (MyProject), the services (AAI service, Document Management Service) that combine the service endpoints (aai.myproject.org, aai1.myproject.org) and (docu.myproject.org, database.myproject.org) . The following image is trying to represent the hierarchy of the topology. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"}," MyProject\n |---AAI service |---Document Management Service \n |------aai.myproject.org |------docu.myproject.org\n |------aai1.myproject.org |------database.myproject.org \n")),(0,n.kt)("h3",{id:"example-2-monitoring-the-services-of-1-or-more-organisations---the-topology"},"Example 2: Monitoring the services of 1 or more Organisations - The topology:"),(0,n.kt)("p",null,"Another way to organise the topology is to add a new layer of group which is the Organisations. An Organisation usually has a number of Sites where it hosts the services used by the users. In the following example the hierarchy of this type of topology is represented. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"ORGANINATION \n |----SITE \n |---Service or Group of services \n |------Service Endpoints \n\n")),(0,n.kt)("p",null,"As an example, we may say that we have an organization, such as GRNET, which has a number of Sites like HEBLAB,IASA,EKT. Each Site gathers a number of services like SRM and WEBDAV. These services combine a number of like service-endpoints grid02.physics.uoi.gr, se01.marie.hellasgrid.gr, se01.athena.hellasgrid.gr. The following image is trying to represent the hierarchy of the topology. "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"}," GRNET \n|---- HEBLAB\n |-- SRM \n |-- grid02.physics.uoi.gr\n|---- IASA \n |-- WEBDAV \n |-- se01.marie.hellasgrid.\n|---- EKT\n |-- SRM \n |-- se01.athena.hellasgrid.gr\n")),(0,n.kt)("p",null,"A visual representation of the above topology example can be represented from the image below: "),(0,n.kt)("p",null,(0,n.kt)("img",{src:r(8982).Z,width:"1161",height:"657"})," "),(0,n.kt)("p",null,"Monitoring Service has a number of connectors for well-known configuration databases and sources like: "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"DPMT (Data Project Management Tool, that also manages topology and resources information) "),(0,n.kt)("li",{parentName:"ul"},"GOCDB (Repository for storing and presenting topology and resources information) "),(0,n.kt)("li",{parentName:"ul"},"CSV files (predefined format)"),(0,n.kt)("li",{parentName:"ul"},"Json files (predefined format)")),(0,n.kt)("p",null,"An example of the Json file is as follows: "),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},'[ \n {\n"Service Description (Alphanumeric and basic punctuation)": "My service", \n"URL": "https://example.com", \n"SITENAME-SERVICEGROUP": "MY_SITE", \n"Service Unique ID": "1234", \n"COUNTRY_NAME": "Greece", \n"notification flag?": "Yes", \n"CONTACT_EMAIL": "address@example.com", \n"Status ": "Development", \n"SERVICE_TYPE": "my.service.type"\n } \n\u2026\n]\n\n')),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"xml files (predefined format)")))}u.isMDXComponent=!0},8982:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/topology-bdb633d4948060e86915e5cc1b634de8.png"}}]); \ No newline at end of file diff --git a/assets/js/main.32a4ebc6.js b/assets/js/main.32a4ebc6.js deleted file mode 100644 index acd4ac77..00000000 --- a/assets/js/main.32a4ebc6.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.32a4ebc6.js.LICENSE.txt */ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),o=n(7462),a=n(8356),i=n.n(a),l=n(6887);const s={"00bbc47a":[()=>n.e(4827).then(n.bind(n,6135)),"@site/docs/reports/timelines_&_ar.md",6135],"0367abdc":[()=>n.e(9081).then(n.t.bind(n,561,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-policies-851.json",561],"046c673b":[()=>n.e(441).then(n.bind(n,5820)),"@site/docs/communication/communication.md",5820],"0e384e19":[()=>n.e(9671).then(n.bind(n,9881)),"@site/docs/intro.md",9881],"11c5563e":[()=>n.e(4066).then(n.t.bind(n,1093,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-information-feeds-cec.json",1093],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(2666),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"193cf812":[()=>n.e(3355).then(n.bind(n,6999)),"@site/docs/guides/intro.md",6999],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,2027)),"@theme/SearchPage",2027],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1de2b0b2":[()=>n.e(1413).then(n.bind(n,1370)),"@site/docs/monitoring/SP_guide.md",1370],"1f391b9e":[()=>Promise.all([n.e(532),n.e(2666),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"2029e309":[()=>n.e(7628).then(n.t.bind(n,3915,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-monitoring-46b.json",3915],"294a922a":[()=>n.e(8123).then(n.t.bind(n,573,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-use-cases-074.json",573],"2e4f6044":[()=>n.e(4870).then(n.t.bind(n,3769,19)),"/home/jenkins/workspace/ARGO_argo-monitoring_devel/argo-monitoring/website/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"333e92ea":[()=>n.e(4599).then(n.bind(n,8686)),"@site/docs/policies/Terms.md",8686],"338d3536":[()=>n.e(7014).then(n.bind(n,6128)),"@site/docs/policies/tom.md",6128],"393be207":[()=>n.e(7414).then(n.bind(n,9286)),"@site/src/pages/markdown-page.md",9286],"467b5c36":[()=>n.e(3435).then(n.bind(n,7646)),"@site/docs/reports/status_timelines.md",7646],"46c50c88":[()=>n.e(1668).then(n.bind(n,9578)),"@site/docs/profiles/aggregation-profile.md",9578],"4f4de028":[()=>n.e(7615).then(n.t.bind(n,3703,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-communication-0c3.json",3703],"5118b09a":[()=>n.e(8765).then(n.bind(n,2397)),"@site/docs/guides/case5.md",2397],51742127:[()=>n.e(1731).then(n.t.bind(n,9984,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-training-c80.json",9984],"55f7549f":[()=>n.e(2385).then(n.bind(n,1683)),"@site/docs/profiles/operations-profile.md",1683],"58e2c8d2":[()=>n.e(8002).then(n.bind(n,5570)),"@site/docs/reports/ar.md",5570],"59227a29":[()=>n.e(5413).then(n.t.bind(n,2776,19)),"/home/jenkins/workspace/ARGO_argo-monitoring_devel/argo-monitoring/website/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",2776],"5c6d4c36":[()=>n.e(5728).then(n.bind(n,3572)),"@site/docs/policies/CookiePolicy.md",3572],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"7199fc16":[()=>n.e(3655).then(n.bind(n,982)),"@site/docs/guides/case2.md",982],"75973a64":[()=>n.e(3619).then(n.bind(n,9967)),"@site/docs/guides/EOSC-getARData.md",9967],"7c4a6447":[()=>n.e(6298).then(n.bind(n,3198)),"@site/docs/guides/case3.md",3198],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"97b3f2a4":[()=>n.e(3785).then(n.bind(n,6073)),"@site/docs/profiles/thresholds-profile.md",6073],"9940d760":[()=>n.e(7666).then(n.bind(n,371)),"@site/docs/information_feeds/downtimes.md",371],"9d18ebaf":[()=>n.e(7159).then(n.bind(n,712)),"@site/docs/policies/Privacy.md",712],"9fa647f5":[()=>n.e(1590).then(n.t.bind(n,468,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-guides-d3b.json",468],a58661e5:[()=>n.e(6991).then(n.t.bind(n,7142,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-profiles-55a.json",7142],aa486901:[()=>n.e(1812).then(n.bind(n,9766)),"@site/docs/profiles/metrics-tags.md",9766],aacc8e6b:[()=>n.e(461).then(n.bind(n,6483)),"@site/docs/guides/case4.md",6483],aff6198c:[()=>n.e(3341).then(n.bind(n,7401)),"@site/docs/monitoring/guidelines.md",7401],b311e722:[()=>n.e(3358).then(n.t.bind(n,5745,19)),"/home/jenkins/workspace/ARGO_argo-monitoring_devel/argo-monitoring/website/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],b439c477:[()=>n.e(9948).then(n.bind(n,4459)),"@site/docs/guides/AMS-consume-publish-events.md",4459],b8ba37ed:[()=>n.e(5583).then(n.bind(n,6842)),"@site/docs/reports/flapping-trends.md",6842],bc796c94:[()=>n.e(980).then(n.bind(n,6388)),"@site/docs/reports/status-critical-warning-unknown.md",6388],c0ddcfc2:[()=>n.e(1938).then(n.bind(n,4024)),"@site/docs/training/training.md",4024],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],cb9d497c:[()=>n.e(5334).then(n.bind(n,6769)),"@site/docs/profiles/metrics-profile.md",6769],ccd61d8c:[()=>n.e(128).then(n.bind(n,4128)),"@site/docs/UseCases/ProvidersPortal.md",4128],d7abbfd8:[()=>n.e(3786).then(n.bind(n,9380)),"@site/docs/information_feeds/topology.md",9380],e25f2072:[()=>n.e(4395).then(n.bind(n,2775)),"@site/docs/guides/EOSC-getStatusData.md",2775],f091d670:[()=>n.e(8049).then(n.bind(n,1896)),"@site/docs/guides/case1.md",1896],feb7051b:[()=>n.e(5945).then(n.bind(n,5181)),"@site/docs/information_feeds/weights.md",5181],ff599285:[()=>n.e(9526).then(n.t.bind(n,1456,19)),"~docs/default/category-argo-monitoringdocs-tutorialsidebar-category-reports-a82.json",1456]};function u(e){let{error:t,retry:n,pastDelay:o}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):o?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const a=l[e+"-"+t],f={},p=[],m=[],h=(0,c.Z)(a);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(a));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let a=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{a=a[e]})),a[l[l.length-1]]=o}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,o.Z)({},i,n)))}})}const p=[{path:"/argo-monitoring/markdown-page",component:f("/argo-monitoring/markdown-page","91a"),exact:!0},{path:"/argo-monitoring/search",component:f("/argo-monitoring/search","b7d"),exact:!0},{path:"/argo-monitoring/docs",component:f("/argo-monitoring/docs","dc6"),routes:[{path:"/argo-monitoring/docs/category/communication",component:f("/argo-monitoring/docs/category/communication","267"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/guides",component:f("/argo-monitoring/docs/category/guides","1e2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/information-feeds",component:f("/argo-monitoring/docs/category/information-feeds","f0f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/monitoring",component:f("/argo-monitoring/docs/category/monitoring","fcd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/policies",component:f("/argo-monitoring/docs/category/policies","d14"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/profiles",component:f("/argo-monitoring/docs/category/profiles","586"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/reports",component:f("/argo-monitoring/docs/category/reports","2df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/training",component:f("/argo-monitoring/docs/category/training","18b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/category/use-cases",component:f("/argo-monitoring/docs/category/use-cases","ef8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/communication/",component:f("/argo-monitoring/docs/communication/","d3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/AMS-consume-publish-events",component:f("/argo-monitoring/docs/guides/AMS-consume-publish-events","1e8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/case1",component:f("/argo-monitoring/docs/guides/case1","0c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/case2",component:f("/argo-monitoring/docs/guides/case2","ed0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/case3",component:f("/argo-monitoring/docs/guides/case3","aa7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/case4",component:f("/argo-monitoring/docs/guides/case4","6a9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/case5",component:f("/argo-monitoring/docs/guides/case5","de4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/EOSC-getARData",component:f("/argo-monitoring/docs/guides/EOSC-getARData","1dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/EOSC-getStatusData",component:f("/argo-monitoring/docs/guides/EOSC-getStatusData","2ee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/guides/intro",component:f("/argo-monitoring/docs/guides/intro","a68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/information_feeds/downtimes",component:f("/argo-monitoring/docs/information_feeds/downtimes","dbe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/information_feeds/topology",component:f("/argo-monitoring/docs/information_feeds/topology","744"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/information_feeds/weights",component:f("/argo-monitoring/docs/information_feeds/weights","967"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/intro",component:f("/argo-monitoring/docs/intro","d84"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/monitoring/guidelines",component:f("/argo-monitoring/docs/monitoring/guidelines","07f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/monitoring/SP_guide",component:f("/argo-monitoring/docs/monitoring/SP_guide","06e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/policies/CookiePolicy",component:f("/argo-monitoring/docs/policies/CookiePolicy","db4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/policies/Privacy",component:f("/argo-monitoring/docs/policies/Privacy","72a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/policies/Terms",component:f("/argo-monitoring/docs/policies/Terms","ee2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/policies/tom",component:f("/argo-monitoring/docs/policies/tom","8b5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/profiles/aggregation-profile",component:f("/argo-monitoring/docs/profiles/aggregation-profile","3a5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/profiles/metrics-profile",component:f("/argo-monitoring/docs/profiles/metrics-profile","814"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/profiles/metrics-tags",component:f("/argo-monitoring/docs/profiles/metrics-tags","6f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/profiles/operations-profile",component:f("/argo-monitoring/docs/profiles/operations-profile","2dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/profiles/thresholds-profile",component:f("/argo-monitoring/docs/profiles/thresholds-profile","244"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/reports/ar",component:f("/argo-monitoring/docs/reports/ar","4f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/reports/flapping-trends",component:f("/argo-monitoring/docs/reports/flapping-trends","2ee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/reports/status_timelines",component:f("/argo-monitoring/docs/reports/status_timelines","669"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/reports/status-critical-warning-unknown",component:f("/argo-monitoring/docs/reports/status-critical-warning-unknown","4cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/reports/timelines_&_ar",component:f("/argo-monitoring/docs/reports/timelines_&_ar","213"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/training/",component:f("/argo-monitoring/docs/training/","873"),exact:!0,sidebar:"tutorialSidebar"},{path:"/argo-monitoring/docs/UseCases/ProvidersPortal",component:f("/argo-monitoring/docs/UseCases/ProvidersPortal","530"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/argo-monitoring/",component:f("/argo-monitoring/","d99"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>a});var r=n(7294);const o=r.createContext(!1);function a(e){let{children:t}=e;const[n,a]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{a(!0)}),[]),r.createElement(o.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),o=n(3935),a=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6775),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),h=n(2263),g=n(4996),v=n(6668),y=n(1944),b=n(4711),w=n(9727),k=n(3320),E=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,b.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:o}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:o})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),o=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,c.TH)();return e+(0,g.Z)(t)}(),a=t?""+n+t:o;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function _(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,v.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(y.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),R=n(8940);function A(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r,o;const a=null!=(r=null==(o=t.default)?void 0:o[e])?r:t[e];return null==a?void 0:a(...n)}));return()=>o.forEach((e=>null==e?void 0:e()))}const P=function(e){let{children:t,location:n,previousLocation:o}=e;return(0,r.useLayoutEffect)((()=>{o!==n&&(o&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);null==n||n.scrollIntoView()}else window.scrollTo(0,0)}(n),A("onRouteDidUpdate",{previousLocation:o,location:n}))}),[o,n]),t};function O(e){const t=(0,d.f)(u.Z,e);return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class N extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?A("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=A("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(P,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const I=N,D="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function j(e){return"\nwindow['"+F+"'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['"+F+"'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('"+D+"');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = "+JSON.stringify(function(e){return'\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n
\n'}(e)).replace(/{window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,j(e))),r.createElement("div",{id:D}))}function z(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(B,null):null}function U(){const{siteConfig:{favicon:e,title:t},i18n:{currentLocale:n,localeConfigs:o}}=(0,h.Z)(),a=(0,g.Z)(e),{htmlLang:i,direction:l}=o[n];return r.createElement(m.Z,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),e&&r.createElement("link",{rel:"icon",href:a}))}var q=n(4763);function $(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(q.Z,null,r.createElement(R.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(_,null),r.createElement(z,null),r.createElement(I,{location:T(t)},e)))))}var G=n(6887);const H=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r,o;if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(o=document.getElementsByName("script")[0])?void 0:o.parentNode;null==i||i.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(9670);const Z=new Set,V=new Set,W=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},K={prefetch(e){if(!(e=>!W()&&!V.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?H(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!W()&&!V.has(e))(e)&&(V.add(e),O(e))},Y=Object.freeze(K);if(l.Z.canUseDOM){window.docusaurus=Y;const e=o.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(a.VK,null,r.createElement($,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/argo-monitoring/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/argo-monitoring/docs","mainDocId":"guides/intro","docs":[{"id":"communication/communication_channels","path":"/argo-monitoring/docs/communication/","sidebar":"tutorialSidebar"},{"id":"guides/AMS-consume-publish-events","path":"/argo-monitoring/docs/guides/AMS-consume-publish-events","sidebar":"tutorialSidebar"},{"id":"guides/case1","path":"/argo-monitoring/docs/guides/case1","sidebar":"tutorialSidebar"},{"id":"guides/case2","path":"/argo-monitoring/docs/guides/case2","sidebar":"tutorialSidebar"},{"id":"guides/case3","path":"/argo-monitoring/docs/guides/case3","sidebar":"tutorialSidebar"},{"id":"guides/case4","path":"/argo-monitoring/docs/guides/case4","sidebar":"tutorialSidebar"},{"id":"guides/case5","path":"/argo-monitoring/docs/guides/case5","sidebar":"tutorialSidebar"},{"id":"guides/EOSC-getARData","path":"/argo-monitoring/docs/guides/EOSC-getARData","sidebar":"tutorialSidebar"},{"id":"guides/EOSC-getStatusData","path":"/argo-monitoring/docs/guides/EOSC-getStatusData","sidebar":"tutorialSidebar"},{"id":"guides/intro","path":"/argo-monitoring/docs/guides/intro","sidebar":"tutorialSidebar"},{"id":"information_feeds/downtimes","path":"/argo-monitoring/docs/information_feeds/downtimes","sidebar":"tutorialSidebar"},{"id":"information_feeds/topology","path":"/argo-monitoring/docs/information_feeds/topology","sidebar":"tutorialSidebar"},{"id":"information_feeds/weights","path":"/argo-monitoring/docs/information_feeds/weights","sidebar":"tutorialSidebar"},{"id":"intro","path":"/argo-monitoring/docs/intro","sidebar":"tutorialSidebar"},{"id":"monitoring/guidelines","path":"/argo-monitoring/docs/monitoring/guidelines","sidebar":"tutorialSidebar"},{"id":"monitoring/SP_guide","path":"/argo-monitoring/docs/monitoring/SP_guide","sidebar":"tutorialSidebar"},{"id":"policies/CookiePolicy","path":"/argo-monitoring/docs/policies/CookiePolicy","sidebar":"tutorialSidebar"},{"id":"policies/Privacy","path":"/argo-monitoring/docs/policies/Privacy","sidebar":"tutorialSidebar"},{"id":"policies/Terms","path":"/argo-monitoring/docs/policies/Terms","sidebar":"tutorialSidebar"},{"id":"policies/tom","path":"/argo-monitoring/docs/policies/tom","sidebar":"tutorialSidebar"},{"id":"profiles/aggregation-profile","path":"/argo-monitoring/docs/profiles/aggregation-profile","sidebar":"tutorialSidebar"},{"id":"profiles/metrics-profile","path":"/argo-monitoring/docs/profiles/metrics-profile","sidebar":"tutorialSidebar"},{"id":"profiles/metrics-tags","path":"/argo-monitoring/docs/profiles/metrics-tags","sidebar":"tutorialSidebar"},{"id":"profiles/operations-profile","path":"/argo-monitoring/docs/profiles/operations-profile","sidebar":"tutorialSidebar"},{"id":"profiles/thresholds-profile","path":"/argo-monitoring/docs/profiles/thresholds-profile","sidebar":"tutorialSidebar"},{"id":"reports/ar","path":"/argo-monitoring/docs/reports/ar","sidebar":"tutorialSidebar"},{"id":"reports/flapping-trends","path":"/argo-monitoring/docs/reports/flapping-trends","sidebar":"tutorialSidebar"},{"id":"reports/status_timelines","path":"/argo-monitoring/docs/reports/status_timelines","sidebar":"tutorialSidebar"},{"id":"reports/status-critical-warning-unknown","path":"/argo-monitoring/docs/reports/status-critical-warning-unknown","sidebar":"tutorialSidebar"},{"id":"reports/timelines_&_ar","path":"/argo-monitoring/docs/reports/timelines_&_ar","sidebar":"tutorialSidebar"},{"id":"training/training","path":"/argo-monitoring/docs/training/","sidebar":"tutorialSidebar"},{"id":"UseCases/ProvidersPortal","path":"/argo-monitoring/docs/UseCases/ProvidersPortal","sidebar":"tutorialSidebar"},{"id":"/category/guides","path":"/argo-monitoring/docs/category/guides","sidebar":"tutorialSidebar"},{"id":"/category/information-feeds","path":"/argo-monitoring/docs/category/information-feeds","sidebar":"tutorialSidebar"},{"id":"/category/monitoring","path":"/argo-monitoring/docs/category/monitoring","sidebar":"tutorialSidebar"},{"id":"/category/profiles","path":"/argo-monitoring/docs/category/profiles","sidebar":"tutorialSidebar"},{"id":"/category/reports","path":"/argo-monitoring/docs/category/reports","sidebar":"tutorialSidebar"},{"id":"/category/policies","path":"/argo-monitoring/docs/category/policies","sidebar":"tutorialSidebar"},{"id":"/category/training","path":"/argo-monitoring/docs/category/training","sidebar":"tutorialSidebar"},{"id":"/category/use-cases","path":"/argo-monitoring/docs/category/use-cases","sidebar":"tutorialSidebar"},{"id":"/category/communication","path":"/argo-monitoring/docs/category/communication","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/argo-monitoring/docs/category/guides","label":"Guides"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.0.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.1"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.31.0"}}}'),u={siteConfig:o.default,siteMetadata:s,globalData:a,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7294),o=n(412),a=n(5742),i=n(4730);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){var n;const e={error:t,tryAgain:()=>this.setState({error:null})};return(null!=(n=this.props.fallback)?n:u)(e)}return null!=e?e:null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(405);function a(e){return r.createElement(o.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),o=n(7294),a=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=o.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){var n,f;let{isNavLink:p,to:m,href:h,activeClassName:g,isActive:v,"data-noBrokenLinkCheck":y,autoAddBaseUrl:b=!0,...w}=e;const{siteConfig:{trailingSlash:k,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:S}=(0,d.C)(),x=(0,o.useContext)(c),_=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>_.current));const C=m||h;const T=(0,s.Z)(C),L=null==C?void 0:C.replace("pathname://","");let R=void 0!==L?(A=L,b&&(e=>e.startsWith("/"))(A)?S(A):A):void 0;var A;R&&T&&(R=(0,i.applyTrailingSlash)(R,{trailingSlash:k,baseUrl:E}));const P=(0,o.useRef)(!1),O=p?a.OL:a.rU,N=u.Z.canUseIntersectionObserver,I=(0,o.useRef)();(0,o.useEffect)((()=>(!N&&T&&null!=R&&window.docusaurus.prefetch(R),()=>{N&&I.current&&I.current.disconnect()})),[I,R,N,T]);const D=null!=(n=null==(f=R)?void 0:f.startsWith("#"))&&n,M=!R||!T||D;return M||y||x.collectLink(R),M?o.createElement("a",(0,r.Z)({ref:_,href:R},C&&!T&&{target:"_blank",rel:"noopener noreferrer"},w)):o.createElement(O,(0,r.Z)({},w,{onMouseEnter:()=>{P.current||null==R||(window.docusaurus.preload(R),P.current=!0)},innerRef:e=>{_.current=e,N&&e&&T&&(I.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(I.current.unobserve(e),I.current.disconnect(),null!=R&&window.docusaurus.prefetch(R))}))})),I.current.observe(e))},to:R},p&&{isActive:v,activeClassName:g}))}const p=o.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var a=n(7529);function i(e){var t,n;let{id:r,message:o}=e;if(void 0===r&&void 0===o)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=a[null!=r?r:o])?n:o)?t:r}function l(e,t){let{message:n,id:r}=e;return o(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:a}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,o(l,a))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>a,Z:()=>i});var r=n(2263),o=n(3919);function a(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=a();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8940);function a(){return(0,r.useContext)(o._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8934);function a(){return(0,r.useContext)(o._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[o,a]=n;const i=r?r+"."+o:o;var l;"object"==typeof(l=a)&&l&&Object.keys(l).length>0?e(a,i):t[i]=a}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>a});var r=n(7294);const o=r.createContext(null);function a(e){let{children:t,value:n}=e;const a=r.useContext(o),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:a,value:n})),[a,n]);return r.createElement(o.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>h,gA:()=>f,_r:()=>c,Jo:()=>g,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6775),o=n(2263),a=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();return e}()[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),o=null==n?void 0:n.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},c=()=>{var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:u},d=e=>function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=i(e),o=null==r?void 0:r[t];if(!o&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return o}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((e=>e.path)).join(", "));return a}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)("./prism-"+e)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);const o="iconExternalLink_nPIU";function a(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:o},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},4730:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ut});var r=n(7294),o=n(6010),a=n(4763),i=n(1944),l=n(5281),s=n(9727),u=n(5999),c=n(6775),d=n(5936);function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const p="skipToContent_fXgn";function m(){const{containerRef:e,handleSkip:t}=function(){const e=(0,r.useRef)(null),{action:t}=(0,c.k6)(),n=(0,r.useCallback)((e=>{var t;e.preventDefault();const n=null!=(t=document.querySelector("main:first-of-type"))?t:document.querySelector("."+l.k.wrapper.main);n&&f(n)}),[]);return(0,d.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,handleSkip:n}}();return r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:p,onClick:t},r.createElement(u.Z,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var h=n(6668),g=n(9689),v=n(7462);function y(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:a=1.2,className:i,...l}=e;return r.createElement("svg",(0,v.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:o,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const b="announcementBar_mb4j",w="announcementBarPlaceholder_vyr4",k="announcementBarClose_gvF7",E="announcementBarContent_xLdY";function S(){const{isActive:e,close:t}=(0,g.nT)(),{announcementBar:n}=(0,h.L)();if(!e)return null;const{content:a,backgroundColor:i,textColor:l,isCloseable:s}=n;return r.createElement("div",{className:b,style:{backgroundColor:i,color:l},role:"banner"},s&&r.createElement("div",{className:w}),r.createElement("div",{className:E,dangerouslySetInnerHTML:{__html:a}}),s?r.createElement("button",{type:"button",className:(0,o.Z)("clean-btn close",k),onClick:t,"aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(y,{width:14,height:14,strokeWidth:3.1})):null)}var x=n(2961),_=n(2466);var C=n(902),T=n(3102);const L=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,x.e)(),t=(0,T.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,C.D9)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return r.createElement(L.Provider,{value:n},t)}function A(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function P(){const e=(0,r.useContext)(L);if(!e)throw new C.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,T.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:A(a)})),[o,a,t])}function O(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:i}=P();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},a)))}var N=n(2949),I=n(2389);function D(e){return r.createElement("svg",(0,v.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function M(e){return r.createElement("svg",(0,v.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const F={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function j(e){let{className:t,value:n,onChange:a}=e;const i=(0,I.Z)(),l=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,o.Z)(F.toggle,t)},r.createElement("button",{className:(0,o.Z)("clean-btn",F.toggleButton,!i&&F.toggleButtonDisabled),type:"button",onClick:()=>a("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l},r.createElement(D,{className:(0,o.Z)(F.toggleIcon,F.lightToggleIcon)}),r.createElement(M,{className:(0,o.Z)(F.toggleIcon,F.darkToggleIcon)})))}const B=r.memo(j);function z(e){let{className:t}=e;const n=(0,h.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,N.I)();return n?null:r.createElement(B,{className:t,value:o,onChange:a})}var U=n(1327);function q(){return r.createElement(U.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function $(){const e=(0,x.e)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(y,{color:"var(--ifm-color-emphasis-600)"}))}function G(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(q,null),r.createElement(z,{className:"margin-right--md"}),r.createElement($,null))}var H=n(9960),Q=n(4996),Z=n(3919);function V(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var W=n(9471);function K(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:a,label:i,html:l,isDropdownLink:s,prependBaseUrlToHref:u,...c}=e;const d=(0,Q.Z)(o),f=(0,Q.Z)(t),p=(0,Q.Z)(a,{forcePrependBaseUrl:!0}),m=i&&a&&!(0,Z.Z)(a),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(W.Z,s&&{width:12,height:12}))};return a?r.createElement(H.Z,(0,v.Z)({href:u?p:a},c,h)):r.createElement(H.Z,(0,v.Z)({to:d,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?V(n,t.pathname):t.pathname.startsWith(f)},c,h))}function Y(e){let{className:t,isDropdownItem:n=!1,...a}=e;const i=r.createElement(K,(0,v.Z)({className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},a));return n?r.createElement("li",null,i):i}function X(e){let{className:t,isDropdownItem:n,...a}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(K,(0,v.Z)({className:(0,o.Z)("menu__link",t)},a)))}function J(e){var t;let{mobile:n=!1,position:o,...a}=e;const i=n?X:Y;return r.createElement(i,(0,v.Z)({},a,{activeClassName:null!=(t=a.activeClassName)?t:n?"menu__link--active":"navbar__link--active"}))}var ee=n(6043),te=n(8596),ne=n(2263);function re(e,t){return e.some((e=>function(e,t){return!!(0,te.Mg)(e.to,t)||!!V(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function oe(e){var t;let{items:n,position:a,className:i,onClick:l,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),r.createElement("div",{ref:u,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===a,"dropdown--show":c})},r.createElement(K,(0,v.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.Z)("navbar__link",i)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),null!=(t=s.children)?t:s.label),r.createElement("ul",{className:"dropdown__menu"},n.map(((e,t)=>r.createElement(nt,(0,v.Z)({isDropdownItem:!0,onKeyDown:e=>{if(t===n.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=u.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:t}))))))}function ae(e){var t;let{items:n,className:a,position:i,onClick:l,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,ne.Z)(),{pathname:t}=(0,c.TH)();return t.replace(e,"/")}(),d=re(n,u),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ee.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(K,(0,v.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",a)},s,{onClick:e=>{e.preventDefault(),p()}}),null!=(t=s.children)?t:s.label),r.createElement(ee.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},n.map(((e,t)=>r.createElement(nt,(0,v.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))))))}function ie(e){let{mobile:t=!1,...n}=e;const o=t?ae:oe;return r.createElement(o,n)}var le=n(4711);function se(e){let{width:t=20,height:n=20,...o}=e;return r.createElement("svg",(0,v.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},o),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ue="iconLanguage_nlXk";var ce=n(1029),de=n(412),fe=n(373),pe=n(143),me=n(22),he=n(8202),ge=n(3926),ve=n(1073),ye=n(2539),be=n(726);const we="searchBar_RVTs",ke="dropdownMenu_qbY6",Ee="suggestion_fB_2",Se="cursor_eG29",xe="hitTree_kk6K",_e="hitIcon_a7Zy",Ce="hitPath_ieM4",Te="noResultsIcon_EBY5",Le="hitFooter_E9YW",Re="hitWrapper_sAK8",Ae="hitTitle_vyVt",Pe="hitAction_NqkB",Oe="noResults_l6Q3",Ne="searchBarContainer_NW3z",Ie="searchBarLoadingRing_YnHq",De="searchClearButton_qk4g",Me="searchIndexLoading_EJ1f",Fe="searchHintContainer_Pkmr",je="searchHint_iIMx",Be="focused_OWtg",ze="input_FOTf",Ue="hint_URu1",qe="suggestions_X8XU",$e="dataset_QiCy",Ge="empty_eITn";function He(e){let{document:t,type:n,page:r,metadata:o,tokens:a,isInterOfTree:i,isLastOfTree:l}=e;const s=0===n,u=1===n,c=[];i?c.push(''):l&&c.push('');const d=c.map((e=>''+e+"")),f=''+(s?'':u?'':'')+"",p=[''+(0,be.o)(t.t,(0,ve.m)(o,"t"),a)+""];if(!i&&!l&&ce.H6){var m;const e=r?(null!=(m=r.b)?m:[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;p.push(''+(0,ge.e)(null!=e?e:[])+"")}else s||p.push(''+(0,ye.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),a)+"");const h='';return[...d,f,'',...p,"",h].join("")}function Qe(){return''+(0,u.I)({id:"theme.SearchBar.noResultsText",message:"No results"})+""}var Ze=n(311);async function Ve(){const e=await Promise.all([n.e(8443),n.e(5525)]).then(n.t.bind(n,8443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const We="_highlight";const Ke=function(e){var t,n;let{handleSearchBarToggle:a}=e;const{siteConfig:{baseUrl:i}}=(0,ne.Z)(),l=(0,pe.gA)();let s=i;try{var d;const{preferredVersion:e}=(0,fe.J)(null!=(d=null==l?void 0:l.pluginId)?d:ce.gQ);e&&!e.isLast&&(s=e.path+"/")}catch(I){if(ce.l9&&!(I instanceof C.i6))throw I}const f=(0,c.k6)(),p=(0,c.TH)(),m=(0,r.useRef)(null),h=(0,r.useRef)("empty"),g=(0,r.useRef)(!1),[v,y]=(0,r.useState)(!1),[b,w]=(0,r.useState)(!1),[k,E]=(0,r.useState)(""),S=(0,r.useRef)(null),x=(0,r.useCallback)((async()=>{if("empty"!==h.current)return;h.current="loading",y(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,me.w)(s),Ve()]);if(S.current=n(m.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:we,noPrefix:!0,dropdownMenu:ke,input:ze,hint:Ue,suggestions:qe,suggestion:Ee,cursor:Se,dataset:$e,empty:Ge}},[{source:(0,he.v)(e,t,ce.qo),templates:{suggestion:He,empty:Qe,footer:e=>{let{query:t,isEmpty:n}=e;if(n)return;const r=document.createElement("a"),o=i+"search?q="+encodeURIComponent(t);r.href=o,r.textContent=(0,u.I)({id:"theme.SearchBar.seeAll",message:"See all results"}),r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),S.current.autocomplete.close(),f.push(o))}));const a=document.createElement("div");return a.className=Le,a.appendChild(r),a}}}]).on("autocomplete:selected",(function(e,t){var n;let{document:{u:r,h:o},tokens:a}=t;null==(n=m.current)||n.blur();let i=r;if(ce.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(We,t);i+="?"+e.toString()}o&&(i+=o),f.push(i)})).on("autocomplete:closed",(()=>{var e;null==(e=m.current)||e.blur()})),h.current="done",y(!1),g.current){const e=m.current;e.value&&S.current.autocomplete.open(),e.focus()}}),[i,s,f]);(0,r.useEffect)((()=>{if(!ce.vc)return;const e=de.Z.canUseDOM?new URLSearchParams(p.search).getAll(We):[];setTimeout((()=>{var t;const n=document.querySelector("article");if(!n)return;const r=new ce.vc(n);r.unmark(),0!==e.length&&r.mark(e),E(e.join(" ")),null==(t=S.current)||t.autocomplete.setVal(e.join(" "))}))}),[p.search,p.pathname]);const[_,T]=(0,r.useState)(!1),L=(0,r.useCallback)((()=>{g.current=!0,x(),T(!0),null==a||a(!0)}),[a,x]),R=(0,r.useCallback)((()=>{T(!1),null==a||a(!1)}),[a]),A=(0,r.useCallback)((()=>{x()}),[x]),P=(0,r.useCallback)((e=>{E(e.target.value),e.target.value&&w(!0)}),[]),O=!!de.Z.canUseDOM&&/mac/i.test(null!=(t=null==(n=navigator.userAgentData)?void 0:n.platform)?t:navigator.platform);(0,r.useEffect)((()=>{if(!ce.AY)return;const e=e=>{var t;(O?e.metaKey:e.ctrlKey)&&"KeyK"===e.code&&(e.preventDefault(),null==(t=m.current)||t.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[O,L]);const N=(0,r.useCallback)((()=>{var e;const t=new URLSearchParams(p.search);t.delete(We);const n=t.toString(),r=p.pathname+(""!=n?"?"+n:"")+p.hash;r!=p.pathname+p.search+p.hash&&f.push(r),E(""),null==(e=S.current)||e.autocomplete.setVal("")}),[p.pathname,p.search,p.hash,f]);return r.createElement("div",{className:(0,o.Z)("navbar__search",Ne,{[Me]:v&&b,[Be]:_})},r.createElement("input",{placeholder:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:A,onFocus:L,onBlur:R,onChange:P,ref:m,value:k}),r.createElement(Ze.Z,{className:Ie}),ce.AY&&ce.t_&&(""!==k?r.createElement("button",{className:De,onClick:N},"\u2715"):r.createElement("div",{className:Fe},r.createElement("kbd",{className:je},O?"\u2318":"ctrl"),r.createElement("kbd",{className:je},"K"))))},Ye="searchBox_ZlJk";function Xe(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,o.Z)(n,Ye)},t)}var Je=n(2802);const et=e=>e.docs.find((t=>t.id===e.mainDocId));const tt={default:J,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:o,...a}=e;const{i18n:{currentLocale:i,locales:l,localeConfigs:s}}=(0,ne.Z)(),c=(0,le.l)(),d=[...n,...l.map((e=>{const n="pathname://"+c.createUrl({locale:e,fullyQualified:!1});return{label:s[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...o],f=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):s[i].label;return r.createElement(ie,(0,v.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(se,{className:ue}),f),items:d}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Xe,{className:n},r.createElement(Ke,null))},dropdown:ie,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,o.Z)({navbar__item:!a&&!i,"menu__list-item":a},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:i}=(0,pe.Iw)(o),l=(0,Je.vY)(t,o);return null===l?null:r.createElement(J,(0,v.Z)({exact:!0},a,{isActive:()=>(null==i?void 0:i.path)===l.path||!(null==i||!i.sidebar)&&i.sidebar===l.sidebar,label:null!=n?n:l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:i}=(0,pe.Iw)(o),l=(0,Je.oz)(t,o).link;if(!l)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(J,(0,v.Z)({exact:!0},a,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:null!=n?n:l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...a}=e;const i=(0,Je.lO)(o)[0],l=null!=t?t:i.label,s=null!=n?n:(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(J,(0,v.Z)({},a,{label:l,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:a,dropdownItemsAfter:i,...l}=e;const s=(0,pe.Iw)(n),c=(0,pe.gB)(n),{savePreferredVersionName:d}=(0,fe.J)(n),f=[...a,...c.map((e=>{var t;const n=null!=(t=s.alternateDocVersions[e.name])?t:et(e);return{label:e.label,to:n.path,isActive:()=>e===s.activeVersion,onClick:()=>d(e.name)}})),...i],p=(0,Je.lO)(n)[0],m=t&&f.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):p.label,h=t&&f.length>1?void 0:et(p).path;return f.length<=1?r.createElement(J,(0,v.Z)({},l,{mobile:t,label:m,to:h,isActive:o?()=>!1:void 0})):r.createElement(ie,(0,v.Z)({},l,{mobile:t,label:m,to:h,items:f,isActive:o?()=>!1:void 0}))}};function nt(e){let{type:t,...n}=e;const o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=tt[o];if(!a)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(a,n)}function rt(){const e=(0,x.e)(),t=(0,h.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(nt,(0,v.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function ot(e){return r.createElement("button",(0,v.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function at(){const e=0===(0,h.L)().navbar.items.length,t=P();return r.createElement(r.Fragment,null,!e&&r.createElement(ot,{onClick:()=>t.hide()}),t.content)}function it(){const e=(0,x.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(O,{header:r.createElement(G,null),primaryMenu:r.createElement(rt,null),secondaryMenu:r.createElement(at,null)}):null}const lt="navbarHideable_m1mJ",st="navbarHidden_jGov";function ut(e){return r.createElement("div",(0,v.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function ct(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,h.L)(),i=(0,x.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,_.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(e)return t.location.hash?(o.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,o.Z)("navbar","navbar--fixed-top",n&&[lt,!s&&st],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown})},t,r.createElement(ut,{onClick:i.toggle}),r.createElement(it,null))}function dt(e){let{width:t=30,height:n=30,className:o,...a}=e;return r.createElement("svg",(0,v.Z)({className:o,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},a),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function ft(){const e=(0,x.e)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(dt,null))}const pt="colorModeToggle_DEke";function mt(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(nt,(0,v.Z)({},e,{key:t})))))}function ht(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function gt(){const e=(0,x.e)(),t=(0,h.L)().navbar.items,[n,o]=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement(ht,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(ft,null),r.createElement(q,null),r.createElement(mt,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(mt,{items:o}),r.createElement(z,{className:pt}),!a&&r.createElement(Xe,null,r.createElement(Ke,null)))})}function vt(){return r.createElement(ct,null,r.createElement(gt,null))}function yt(e){let{item:t}=e;const{to:n,href:o,label:a,prependBaseUrlToHref:i,...l}=t,s=(0,Q.Z)(n),u=(0,Q.Z)(o,{forcePrependBaseUrl:!0});return r.createElement(H.Z,(0,v.Z)({className:"footer__link-item"},o?{href:i?u:o}:{to:s},l),a,o&&!(0,Z.Z)(o)&&r.createElement(W.Z,null))}function bt(e){var t;let{item:n}=e;return n.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):r.createElement("li",{key:null!=(t=n.href)?t:n.to,className:"footer__item"},r.createElement(yt,{item:n}))}function wt(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(bt,{key:t,item:e})))))}function kt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(wt,{key:t,column:e}))))}function Et(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function St(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(yt,{item:t})}function xt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(St,{item:e}),t.length!==n+1&&r.createElement(Et,null))))))}function _t(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(kt,{columns:t}):r.createElement(xt,{links:t})}var Ct=n(941);const Tt="footerLogoLink_BH7S";function Lt(e){var t;let{logo:n}=e;const{withBaseUrl:a}=(0,Q.C)(),i={light:a(n.src),dark:a(null!=(t=n.srcDark)?t:n.src)};return r.createElement(Ct.Z,{className:(0,o.Z)("footer__logo",n.className),alt:n.alt,sources:i,width:n.width,height:n.height,style:n.style})}function Rt(e){let{logo:t}=e;return t.href?r.createElement(H.Z,{href:t.href,className:Tt,target:t.target},r.createElement(Lt,{logo:t})):r.createElement(Lt,{logo:t})}function At(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Pt(e){let{style:t,links:n,logo:a,copyright:i}=e;return r.createElement("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(a||i)&&r.createElement("div",{className:"footer__bottom text--center"},a&&r.createElement("div",{className:"margin-bottom--sm"},a),i)))}function Ot(){const{footer:e}=(0,h.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:a}=e;return r.createElement(Pt,{style:a,links:n&&n.length>0&&r.createElement(_t,{links:n}),logo:o&&r.createElement(Rt,{logo:o}),copyright:t&&r.createElement(At,{copyright:t})})}const Nt=r.memo(Ot);var It=n(12);const Dt="docusaurus.tab.",Mt=r.createContext(void 0);const Ft=(0,C.Qc)([N.S,g.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,It.W)("docusaurus.tab."+e).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,It._)().forEach((t=>{if(t.startsWith(Dt)){const n=t.substring(Dt.length);e[n]=(0,It.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const o=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:o})),[e,o])}();return r.createElement(Mt.Provider,{value:n},t)},_.OC,fe.L5,i.VC,function(e){let{children:t}=e;return r.createElement(T.n2,null,r.createElement(x.M,null,r.createElement(R,null,t)))}]);function jt(e){let{children:t}=e;return r.createElement(Ft,null,t)}function Bt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const zt="mainWrapper_z2l0";function Ut(e){const{children:t,noFooter:n,wrapperClassName:u,title:c,description:d}=e;return(0,s.t)(),r.createElement(jt,null,r.createElement(i.d,{title:c,description:d}),r.createElement(m,null),r.createElement(S,null),r.createElement(vt,null),r.createElement("div",{className:(0,o.Z)(l.k.wrapper.main,zt,u)},r.createElement(a.Z,{fallback:e=>r.createElement(Bt,e)},t)),!n&&r.createElement(Nt,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),o=n(7294),a=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=o.createElement(u.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},l):l}function d(e){var t;const{siteConfig:{title:n}}=(0,l.Z)(),{navbar:{title:u,logo:d}}=(0,s.L)(),{imageClassName:f,titleClassName:p,...m}=e,h=(0,i.Z)((null==d?void 0:d.href)||"/"),g=u?"":n,v=null!=(t=null==d?void 0:d.alt)?t:g;return o.createElement(a.Z,(0,r.Z)({to:h},m,(null==d?void 0:d.target)&&{target:d.target}),d&&o.createElement(c,{logo:d,alt:v,imageClassName:f}),null!=u&&o.createElement("b",{className:p},u))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(5742);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return r.createElement(o.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),a&&r.createElement("meta",{name:"docusaurus_tag",content:a}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),a&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:a}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),o=n(7294),a=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return o.createElement(o.Fragment,null,p.map((e=>o.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,a.Z)(s.themedImage,s["themedImage--"+e],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(7462),o=n(7294),a=n(412);function i(e){let{initialState:t}=e;const[n,r]=(0,o.useState)(null!=t&&t),a=(0,o.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:a}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function c(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const a=(0,o.useRef)(!1);(0,o.useEffect)((()=>{const e=t.current;function o(){var t,n;const o=e.scrollHeight,a=null!=(t=null==r?void 0:r.duration)?t:function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(o);return{transition:"height "+a+"ms "+(null!=(n=null==r?void 0:r.easing)?n:"ease-in-out"),height:o+"px"}}function i(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return u(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!a.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,o.useRef)(null);return c({collapsibleRef:f,collapsed:n,animation:a}),o.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(f.current,n),null==i||i(n))},className:l},r)}function p(e){let{collapsed:t,...n}=e;const[a,i]=(0,o.useState)(!t),[l,s]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,o.useLayoutEffect)((()=>{a&&s(t)}),[a,t]),a?o.createElement(f,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?p:f;return o.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),o=n(2389),a=n(12),i=n(902),l=n(6668);const s=(0,a.W)("docusaurus.announcement.dismiss"),u=(0,a.W)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{a(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),o=n(412),a=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.W)(u),d="light",f="dark",p=e=>e===f?f:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,i]=(0,r.useState)((e=>o.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(i(t),o&&(e=>{c.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:s,get isDarkTheme(){return a===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[a,s])}function h(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>b,L5:()=>v});var r=n(7294),o=n(143),a=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>"docs-preferred-version-"+e,d=(e,t,n)=>{(0,u.W)(c(e),{persistence:t}).set(n)},f=(e,t)=>(0,u.W)(c(e),{persistence:t}).get(),p=(e,t)=>{(0,u.W)(c(e),{persistence:t}).del()};const m=r.createContext(null);function h(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=f(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return r.createElement(m.Provider,{value:n},t)}function v(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function y(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function b(e){var t;void 0===e&&(e=a.m);const n=(0,o.zh)(e),[i,l]=y(),{preferredVersionName:s}=i[e];return{preferredVersion:null!=(t=n.versions.find((e=>e.name===s)))?t:null,savePreferredVersionName:(0,r.useCallback)((t=>{l.savePreferredVersion(e,t)}),[l,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),o=n(902);const a=Symbol("EmptyContext"),i=r.createContext(a);function l(e){let{children:t,name:n,items:o}=e;const a=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return r.createElement(i.Provider,{value:a},t)}function s(){const e=(0,r.useContext)(i);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>i});var r=n(7294),o=n(902);const a=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(a.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(a);if(null===e)throw new o.i6("DocsVersionProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),o=n(3102),a=n(7524),i=n(6775),l=n(902);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),o=n(902);const a=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(a.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(a);if(!i)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,o.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(7294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),o=n(412);const a="desktop",i="mobile",l="ssr";function s(){return o.Z.canUseDOM?window.innerWidth>996?a:i:l}function u(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>"theme-admonition-"+e},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>"theme-doc-sidebar-item-category-level-"+e,docSidebarItemLinkLevel:e=>"theme-doc-sidebar-item-link-level-"+e},blog:{}}},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>h,_F:()=>y,cE:()=>f,jA:()=>g,xz:()=>p,hI:()=>S,lO:()=>w,vY:()=>E,oz:()=>k,s1:()=>b});var r=n(7294),o=n(6775),a=n(8790),i=n(143),l=n(373),s=n(4477),u=n(1116);function c(e){return Array.from(new Set(e))}var d=n(8596);const f=!!i._r;function p(e){const t=(0,s.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error("no version doc found by id="+e);return n}function m(e,t){for(const n of e)if("category"===n.type){if(t(n))return n;const e=m(n.items,t);if(e)return e}}function h(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=h(t);if(e)return e}}}function g(){const{pathname:e}=(0,o.TH)(),t=(0,u.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=m(t.items,(t=>(0,d.Mg)(t.href,e)));if(!n)throw new Error(e+" is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.");return n}const v=(e,t)=>void 0!==e&&(0,d.Mg)(e,t);function y(e,t){return"link"===e.type?v(e.href,t):"category"===e.type&&(v(e.href,t)||((e,t)=>e.some((e=>y(e,t))))(e.items,t))}function b(){var e;const t=(0,u.V)(),{pathname:n}=(0,o.TH)();if(!1===(null==(e=(0,i.gA)())?void 0:e.pluginData.breadcrumbs)||!t)return null;const r=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n))return r.push(o),!0;return!1}(t.items),r.reverse()}function w(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>c([t,n,o].filter(Boolean))),[t,n,o])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\n Available sidebar ids are:\n - '+Object.keys(t).join("\n- "));return r[1]}),[e,n])}function E(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error("DocNavbarItem: couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\nAvailable doc ids are:\n- '+c(t.map((e=>e.id))).join("\n- "))}return r}),[e,n])}function S(e){let{route:t,versionMetadata:n}=e;const r=(0,o.TH)(),i=t.routes,l=i.find((e=>(0,o.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,a.H)(i),sidebarName:s,sidebarItems:u}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),o=n(6010),a=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:o,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return null!=e&&e.trim().length?e.trim()+" "+r+" "+n:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),o&&r.createElement("meta",{name:"keywords",content:Array.isArray(o)?o.join(","):o}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,o.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(a.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),a="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"");const i="plugin-id-"+n.plugin.id;return r.createElement(f,{className:(0,o.Z)(a,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>a});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function a(e){const t=(0,r.useRef)(e);return o((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return o((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,o,a;super(),this.name="ReactContextError",this.message="Hook "+(null!=(n=null==(r=this.stack)||null==(o=r.split("\n")[1])||null==(a=o.match(/at (?:\w+\.)?(?\w+)/))?void 0:a.groups.name)?n:"")+" is called outside the <"+e+">. "+(null!=t?t:"")}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),o=n(723),a=n(2263);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>{var t;return null!=(t=e.routes)?t:[]})))}(n)}({routes:o.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),o=n(412),a=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(c()),a=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>o});n(2263);const r="default";function o(e,t){return"docs-"+e+"-"+t}},12:(e,t,n)=>{"use strict";n.d(t,{W:()=>l,_:()=>s});const r="localStorage";function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,a||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),a=!0),null}var t}let a=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t}}(e);const n=o(null==t?void 0:t.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}}}}function s(e){void 0===e&&(e=r);const t=o(e);if(!t)return[];const n=[];for(let r=0;r{"use strict";n.d(t,{l:()=>a});var r=n(2263),o=n(6775);function a(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:a}}=(0,r.Z)(),{pathname:i}=(0,o.TH)(),l=a===n?e:e.replace("/"+a+"/","/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:o}=e;return""+(o?t:"")+function(e){return e===n?""+l:""+l+e+"/"}(r)+s}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),o=n(6775),a=n(902);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:e+"/"}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}})},311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),o=n(6010);const a="loadingRing_RJI3";function i(e){let{className:t}=e;return r.createElement("div",{className:(0,o.Z)(a,t)},r.createElement("div",null),r.createElement("div",null),r.createElement("div",null),r.createElement("div",null))}},22:(e,t,n)=>{"use strict";n.d(t,{w:()=>i});var r=n(1336),o=n.n(r),a=n(1029);async function i(e){{const t=await(await fetch(""+e+a.J)).json(),n=t.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:o().Index.load(r)}})),r=t.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:n,zhDictionary:Array.from(r)}}}},8202:(e,t,n)=>{"use strict";n.d(t,{v:()=>s});var r=n(1336),o=n.n(r);var a=n(1029);function i(e){return l(e).concat(l(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function l(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:o().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?o().Query.wildcard.TRAILING:o().Query.wildcard.NONE})))})))}function s(e,t,n){return function(r,l){const s=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return o()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,a.dK);if(0===s.length)return void l([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,o){if(0===r.length)return void n.push(o);const a=r[0];if(/\p{Unified_Ideograph}/u.test(a)){const n=function(e,t){const n=[];return function e(r,o){let a=0,i=!1;for(const l of t)if(r.substr(0,l.length)===l){const t={missed:o.missed,term:o.term.concat({value:l})};r.length>l.length?e(r.substr(l.length),t):n.push(t),i=!0}else for(let t=l.length-1;t>a;t-=1){const s=l.substr(0,t);if(r.substr(0,t)===s){a=t;const l={missed:o.missed,term:o.term.concat({value:s,trailing:!0})};r.length>t?e(r.substr(t),l):n.push(l),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:o.missed+1,term:o.term}):o.term.length>0&&n.push(o))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(a,t);for(const t of n){const n=o.concat(...t);e(r.slice(1),n)}}else{const t=o.concat({value:a});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:o().Query.presence.REQUIRED,wildcard:o().Query.wildcard.LEADING|o().Query.wildcard.TRAILING})))}];for(const o of n)o[o.length-1].maybeTyping=!0;const r=[];for(const i of a.dK)if("en"===i)a._k||r.unshift(o().stopWordFilter);else{const e=o()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let l;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);l=[];const t=[];for(const r of n){const n=e(r);l.push(n),n.length0&&t.push(n)}n.push(...t)}else l=n.slice();const s=[];for(const o of l)if(o.length>2)for(let e=o.length-1;e>=0;e-=1)s.push(o.slice(0,e).concat(o.slice(e+1)));return i(n).concat(i(s))}(s,t),c=[];e:for(const{term:t,tokens:o}of u)for(const{documents:r,index:a,type:i}of e)if(c.push(...a.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!c.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-c.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:o,score:t.score}}))),c.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,o=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===o&&(o=n.index),r===o?0===t.type?-1:0===n.type?1:t.index-n.index:r-o}))}(c),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},1690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},1073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},2539:(e,t,n)=>{"use strict";n.d(t,{C:()=>o});var r=n(1690);function o(e,t,n){const a=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&a.push(o(e.substr(0,n),t)),a.push(""+(0,r.X)(e.substr(n,i.length))+"");const l=n+i.length;l"+(0,r.X)(e)+"":(0,r.X)(e):a.join("")}},726:(e,t,n)=>{"use strict";n.d(t,{o:()=>s});var r=n(1690),o=n(2539);const a=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const o=r.match(a);if(!o){t.push(r);break}o.index>0&&t.push(r.substring(0,o.index)),t.push(o[0]),n+=o.index+o[0].length,r=e.substring(n)}return t}var l=n(1029);function s(e,t,n,a){void 0===a&&(a=l.Hk);const{chunkIndex:s,chunks:u}=function(e,t,n){const a=[];let l=0,s=0,u=-1;for(;ls){const t=i(e.substring(s,c)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)a.push(e)}-1===u&&(u=a.length),s=c+d,a.push({html:(0,o.C)(e.substring(c,s),n,!0),textLength:d})}}if(s({html:(0,r.X)(e),textLength:e.length})));for(const e of t)a.push(e)}return{chunkIndex:u,chunks:a}}(e,t,n),c=u.slice(0,s),d=u[s],f=[d.html],p=u.slice(s+1);let m=d.textLength,h=0,g=0,v=!1,y=!1;for(;m0){const e=c.pop();m+e.textLength<=a?(f.unshift(e.html),h+=e.textLength,m+=e.textLength):(v=!0,c.length=0)}else{if(!(p.length>0))break;{const e=p.shift();m+e.textLength<=a?(f.push(e.html),g+=e.textLength,m+=e.textLength):(y=!0,p.length=0)}}return(v||c.length>0)&&f.unshift("\u2026"),(y||p.length>0)&&f.push("\u2026"),f.join("")}},1029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>i(),gQ:()=>h,H6:()=>f,l9:()=>g,dK:()=>l,_k:()=>s,AY:()=>p,t_:()=>m,J:()=>u,Hk:()=>d,qo:()=>c});var r=n(1336),o=n.n(r),a=n(813),i=n.n(a);n(892)(o()),n(1728).w(o()),n(4182)(o());const l=["en","zh"],s=!1,u="search-index.json?_=996f9e63",c=8,d=50,f=!0,p=!0,m=!0,h=void 0,g=!0},1728:(e,t,n)=>{"use strict";function r(e){const t=new RegExp("^[^"+e+"]+","u"),n=new RegExp("[^"+e+"]+$","u");return function(e){return e.update((function(e){return e.replace(t,"").replace(n,"")}))}}function o(e,t){e.trimmerSupport.generateTrimmer=r,e.zh=function(){this.pipeline.reset(),this.pipeline.add(e.zh.trimmer,e.zh.stopWordFilter),t&&(this.tokenizer=t)},t&&(e.zh.tokenizer=t),e.zh.wordCharacters="\\u3400-\\u4DBF\\u4E00-\\u9FFC\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29\\u{20000}-\\u{2A6DD}\\u{2A700}-\\u{2B734}\\u{2B740}-\\u{2B81D}\\u{2B820}-\\u{2CEA1}\\u{2CEB0}-\\u{2EBE0}\\u{30000}-\\u{3134A}",e.zh.trimmer=e.trimmerSupport.generateTrimmer(e.zh.wordCharacters),e.Pipeline.registerFunction(e.zh.trimmer,"trimmer-zh"),e.zh.stopWordFilter=e.generateStopWordFilter("\u7684 \u4e00 \u4e0d \u5728 \u4eba \u6709 \u662f \u4e3a \u4ee5 \u4e8e \u4e0a \u4ed6 \u800c \u540e \u4e4b \u6765 \u53ca \u4e86 \u56e0 \u4e0b \u53ef \u5230 \u7531 \u8fd9 \u4e0e \u4e5f \u6b64 \u4f46 \u5e76 \u4e2a \u5176 \u5df2 \u65e0 \u5c0f \u6211 \u4eec \u8d77 \u6700 \u518d \u4eca \u53bb \u597d \u53ea \u53c8 \u6216 \u5f88 \u4ea6 \u67d0 \u628a \u90a3 \u4f60 \u4e43 \u5b83 \u5427 \u88ab \u6bd4 \u522b \u8d81 \u5f53 \u4ece \u5230 \u5f97 \u6253 \u51e1 \u513f \u5c14 \u8be5 \u5404 \u7ed9 \u8ddf \u548c \u4f55 \u8fd8 \u5373 \u51e0 \u65e2 \u770b \u636e \u8ddd \u9760 \u5566 \u4e86 \u53e6 \u4e48 \u6bcf \u4eec \u561b \u62ff \u54ea \u90a3 \u60a8 \u51ed \u4e14 \u5374 \u8ba9 \u4ecd \u5565 \u5982 \u82e5 \u4f7f \u8c01 \u867d \u968f \u540c \u6240 \u5979 \u54c7 \u55e1 \u5f80 \u54ea \u4e9b \u5411 \u6cbf \u54df \u7528 \u4e8e \u54b1 \u5219 \u600e \u66fe \u81f3 \u81f4 \u7740 \u8bf8 \u81ea".split(" ")),e.Pipeline.registerFunction(e.zh.stopWordFilter,"stopWordFilter-zh")}n.d(t,{w:()=>o})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>L,Ep:()=>f});var r=n(7462);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;f--){var p=i[f];"."===p?a(i,f):".."===p?(a(i,f),d++):d&&(a(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(2177);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function p(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,h(),w.location);c.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:b,goBack:function(){b(-1)},goForward:function(){b(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=p(n);o&&o!==m&&e(t,o,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,a,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},4182:function(e,t,n){var r,o;r=function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),n=t.join("-"),r="",o=[],a=[],i=0;i=n&&t[(o-=n)>>3]&1<<(7&o))return this.cursor++,!0}return!1},in_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var o=e.charCodeAt(this.cursor-1);if(o<=r&&o>=n&&t[(o-=n)>>3]&1<<(7&o))return this.cursor--,!0}return!1},out_grouping:function(t,n,r){if(this.cursorr||o>3]&1<<(7&o)))return this.cursor++,!0}return!1},out_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var o=e.charCodeAt(this.cursor-1);if(o>r||o>3]&1<<(7&o)))return this.cursor--,!0}return!1},eq_s:function(t,n){if(this.limit-this.cursor>1),d=0,f=l0||o==r||u)break;u=!0}}for(;;){if(l>=(p=t[r]).s_size){if(this.cursor=a+p.s_size,!p.method)return p.result;var h=p.method();if(this.cursor=a+p.s_size,h)return p.result}if((r=p.substring_i)<0)return 0}},find_among_b:function(t,n){for(var r=0,o=n,a=this.cursor,i=this.limit_backward,l=0,s=0,u=!1;;){for(var c=r+(o-r>>1),d=0,f=l=0;p--){if(a-f==i){d=-1;break}if(d=e.charCodeAt(a-1-f)-m.s[p])break;f++}if(d<0?(o=c,s=f):(r=c,l=f),o-r<=1){if(r>0||o==r||u)break;u=!0}}for(;;){var m;if(l>=(m=t[r]).s_size){if(this.cursor=a-m.s_size,!m.method)return m.result;var h=m.method();if(this.cursor=a-m.s_size,h)return m.result}if((r=m.substring_i)<0)return 0}},replace_s:function(t,n,r){var o=r.length-(n-t),a=e.substring(0,t),i=e.substring(n);return e=a+r+i,this.limit+=o,this.cursor>=n?this.cursor+=o:this.cursor>t&&(this.cursor=t),o},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>e.length)throw"faulty slice operation"},slice_from:function(e){this.slice_check(),this.replace_s(this.bra,this.ket,e)},slice_del:function(){this.slice_from("")},insert:function(e,t,n){var r=this.replace_s(e,t,n);e<=this.bra&&(this.bra+=r),e<=this.ket&&(this.ket+=r)},slice_to:function(){return this.slice_check(),e.substring(this.bra,this.ket)},eq_v_b:function(e){return this.eq_s_b(e.length,e)}}}},e.trimmerSupport={generateTrimmer:function(e){var t=new RegExp("^[^"+e+"]+"),n=new RegExp("[^"+e+"]+$");return function(e){return"function"==typeof e.update?e.update((function(e){return e.replace(t,"").replace(n,"")})):e.replace(t,"").replace(n,"")}}}}})?r.call(t,n,t,e):r)||(e.exports=o)},1336:(e,t,n)=>{var r,o;!function(){var a,i,l,s,u,c,d,f,p,m,h,g,v,y,b,w,k,E,S,x,_,C,T,L,R,A,P=function(e){var t=new P.Builder;return t.pipeline.add(P.trimmer,P.stopWordFilter,P.stemmer),t.searchPipeline.add(P.stemmer),e.call(t,t),t.build()};P.version="2.3.9",P.utils={},P.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),P.utils.asString=function(e){return null==e?"":e.toString()},P.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var s=P.utils.clone(t)||{};s.position=[i,l],s.index=o.length,o.push(new P.Token(n.slice(i,a),s))}i=a+1}}return o},P.tokenizer.separator=/[\s\-]+/,P.Pipeline=function(){this._stack=[]},P.Pipeline.registeredFunctions=Object.create(null),P.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&P.utils.warn("Overwriting existing registered function: "+t),e.label=t,P.Pipeline.registeredFunctions[e.label]=e},P.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||P.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},P.Pipeline.load=function(e){var t=new P.Pipeline;return e.forEach((function(e){var n=P.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},P.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){P.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},P.Pipeline.prototype.after=function(e,t){P.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},P.Pipeline.prototype.before=function(e,t){P.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},P.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},P.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:al?u+=2:i==l&&(t+=n[s+1]*r[u+1],s+=2,u+=2);return t},P.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},P.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new P.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new P.TokenSet;o.node.edges["*"]=l}if(0==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new P.TokenSet;o.node.edges["*"]=s}1==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var u,c=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?u=o.node.edges[d]:(u=new P.TokenSet,o.node.edges[d]=u),1==o.str.length&&(u.final=!0),r.push({node:u,editsRemaining:o.editsRemaining-1,str:c+o.str.slice(2)})}}}return n},P.TokenSet.fromString=function(e){for(var t=new P.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},P.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},P.Index.prototype.search=function(e){return this.query((function(t){new P.QueryParser(e,t).parse()}))},P.Index.prototype.query=function(e){for(var t=new P.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),l=0;l1?1:e},P.Builder.prototype.k1=function(e){this._k1=e},P.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return P.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},P.QueryLexer.prototype.width=function(){return this.pos-this.start},P.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},P.QueryLexer.prototype.backup=function(){this.pos-=1},P.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=P.QueryLexer.EOS&&this.backup()},P.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(P.QueryLexer.TERM)),e.ignore(),e.more())return P.QueryLexer.lexText},P.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(P.QueryLexer.EDIT_DISTANCE),P.QueryLexer.lexText},P.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(P.QueryLexer.BOOST),P.QueryLexer.lexText},P.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(P.QueryLexer.TERM)},P.QueryLexer.termSeparator=P.tokenizer.separator,P.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==P.QueryLexer.EOS)return P.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return P.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(P.QueryLexer.TERM),P.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(P.QueryLexer.TERM),P.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(P.QueryLexer.PRESENCE),P.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(P.QueryLexer.PRESENCE),P.QueryLexer.lexText;if(t.match(P.QueryLexer.termSeparator))return P.QueryLexer.lexTerm}else e.escapeCharacter()}},P.QueryParser=function(e,t){this.lexer=new P.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},P.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=P.QueryParser.parseClause;e;)e=e(this);return this.query},P.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},P.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},P.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},P.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case P.QueryLexer.PRESENCE:return P.QueryParser.parsePresence;case P.QueryLexer.FIELD:return P.QueryParser.parseField;case P.QueryLexer.TERM:return P.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new P.QueryParseError(n,t.start,t.end)}},P.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=P.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=P.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new P.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new P.QueryParseError(n,t.start,t.end)}switch(r.type){case P.QueryLexer.FIELD:return P.QueryParser.parseField;case P.QueryLexer.TERM:return P.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new P.QueryParseError(n,r.start,r.end)}}},P.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new P.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new P.QueryParseError(r,t.start,t.end)}if(o.type===P.QueryLexer.TERM)return P.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new P.QueryParseError(r,o.start,o.end)}},P.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case P.QueryLexer.TERM:return e.nextClause(),P.QueryParser.parseTerm;case P.QueryLexer.FIELD:return e.nextClause(),P.QueryParser.parseField;case P.QueryLexer.EDIT_DISTANCE:return P.QueryParser.parseEditDistance;case P.QueryLexer.BOOST:return P.QueryParser.parseBoost;case P.QueryLexer.PRESENCE:return e.nextClause(),P.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new P.QueryParseError(r,n.start,n.end)}else e.nextClause()}},P.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new P.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case P.QueryLexer.TERM:return e.nextClause(),P.QueryParser.parseTerm;case P.QueryLexer.FIELD:return e.nextClause(),P.QueryParser.parseField;case P.QueryLexer.EDIT_DISTANCE:return P.QueryParser.parseEditDistance;case P.QueryLexer.BOOST:return P.QueryParser.parseBoost;case P.QueryLexer.PRESENCE:return e.nextClause(),P.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new P.QueryParseError(r,o.start,o.end)}else e.nextClause()}},P.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new P.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case P.QueryLexer.TERM:return e.nextClause(),P.QueryParser.parseTerm;case P.QueryLexer.FIELD:return e.nextClause(),P.QueryParser.parseField;case P.QueryLexer.EDIT_DISTANCE:return P.QueryParser.parseEditDistance;case P.QueryLexer.BOOST:return P.QueryParser.parseBoost;case P.QueryLexer.PRESENCE:return e.nextClause(),P.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new P.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return P})?r.call(t,n,t,e):r)||(e.exports=o)}()},813:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=o,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var o=e.contentWindow;if(r=o.document,!o||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,o=!1,a=null,i=function i(){if(!o){o=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(l){n()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),l=i.length,s=0;i=Array.prototype.slice.call(i);var u=function(){--l<=0&&a(s)};l||u(),i.forEach((function(t){e.matches(t,o.exclude)?u():o.onIframeReady(t,(function(e){n(t)&&(s++,r(e)),u()}),u)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var o=!1,a=!1;return r.forEach((function(e,t){e.val===n&&(o=t,a=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==o||a?!1===o||a||(r[o].handled=!0):r.push({val:n,handled:!0}),!0):(!1===o&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var o=this;e.forEach((function(e){e.handled||o.getIframeContents(e.val,(function(e){o.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,o){for(var a=this,i=this.createIterator(t,e,r),l=[],s=[],u=void 0,c=void 0,d=function(){var e=a.getIteratorNode(i);return c=e.prevNode,u=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return a.checkIframeFilter(u,c,e,l)}),(function(t){a.createInstanceOnIframe(t).forEachNode(e,(function(e){return s.push(e)}),r)})),s.push(u);s.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(l,e,n,r),o()}},{key:"forEachNode",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),i=a.length;i||o(),a.forEach((function(a){var l=function(){r.iterateThroughNodes(e,a,t,n,(function(){--i<=0&&o()}))};r.iframes?r.waitForIframes(a,l):l()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var o=!1;return n.every((function(t){return!r.call(e,t)||(o=!0,!1)})),o}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o),l="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==i&&""!==l&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(l)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(l)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(o){n.every((function(n){if(-1!==n.indexOf(o)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,o="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,i="";switch(a.forEach((function(e){i+="|"+t.escapeStr(e)})),o){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var o=t.callNoMatchOnInvalidRanges(e,r),a=o.start,i=o.end;o.valid&&(e.start=a,e.length=i-a,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,o=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?o=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:o}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,o=!0,a=n.length,i=t-a,l=parseInt(e.start,10)-i;return(r=(l=l>a?a:l)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),l<0||r-l<0||l>a||r>a?(o=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(l,r).replace(/\s+/g,"")&&(o=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:r,valid:o}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return o.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",o=e.splitText(t),a=o.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=o.textContent,o.parentNode.replaceChild(i,o),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,o){var a=this;e.nodes.every((function(i,l){var s=e.nodes[l+1];if(void 0===s||s.start>t){if(!r(i.node))return!1;var u=t-i.start,c=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),f=e.value.substr(c+i.start);if(i.node=a.wrapRangeInTextNode(i.node,u,c),e.value=d+f,e.nodes.forEach((function(t,n){n>=l&&(e.nodes[n].start>0&&n!==l&&(e.nodes[n].start-=c),e.nodes[n].end-=c)})),n-=c,o(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,o){var a=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var o=void 0;null!==(o=e.exec(t.textContent))&&""!==o[i];)if(n(o[i],t)){var l=o.index;if(0!==i)for(var s=1;s{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),u=a.querySelector(r.barSelector),c=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function o(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,a){for(var i,l,s=o(e),u=1;u{var r=n(5826);e.exports=p,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],v=n[4],y=n[5],b=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=m&&m!==h,E="+"===b||"*"===b,S="?"===b||"*"===b,x=n[2]||c,_=v||y;r.push({name:g||a++,prefix:h||"",delimiter:x,optional:S,repeat:E,partial:k,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(x)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>a});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof o)){var _,C=1;if(y){if(!(_=a(k,S,e,v))||_.index>=e.length)break;var T=_.index,L=_.index+_[0].length,R=S;for(R+=E.value.length;T>=R;)R+=(E=E.next).value.length;if(S=R-=E.value.length,E.value instanceof o)continue;for(var A=E;A!==t.tail&&(Rd.reach&&(d.reach=I);var D=E.prev;if(O&&(D=s(t,D,O),S+=O.length),u(t,D,C),E=s(t,D,new o(f,g?r.tokenize(P,g):P,b,P)),N&&s(t,E,N),C>1){var M={cause:f+","+m,reach:I};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function u(e,t,n){for(var r=t.next,o=0;o"+a.content+""},r}(),o=r;r.default=r,o.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},o.languages.markup.tag.inside["attr-value"].inside.entity=o.languages.markup.entity,o.languages.markup.doctype.inside["internal-subset"].inside=o.languages.markup,o.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(o.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:o.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:o.languages[t]};var a={};a[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},o.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(o.languages.markup.tag,"addAttribute",{value:function(e,t){o.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:o.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),o.languages.html=o.languages.markup,o.languages.mathml=o.languages.markup,o.languages.svg=o.languages.markup,o.languages.xml=o.languages.extend("markup",{}),o.languages.ssml=o.languages.xml,o.languages.atom=o.languages.xml,o.languages.rss=o.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},o.languages.c=o.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),o.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),o.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},o.languages.c.string],char:o.languages.c.char,comment:o.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:o.languages.c}}}}),o.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete o.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(o),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(o),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},o={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:o,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:o})}(o),o.languages.javascript=o.languages.extend("clike",{"class-name":[o.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),o.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,o.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:o.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:o.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:o.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:o.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:o.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),o.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:o.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),o.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),o.languages.markup&&(o.languages.markup.tag.addInlined("script","javascript"),o.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),o.languages.js=o.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(o),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(o),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(o),o.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:o.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},o.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var o={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(o.code,o.grammar),e.hooks.run("after-tokenize",o),o.tokens}function u(t){var n={};n["interpolation-punctuation"]=o;var a=e.tokenize(t,n);if(3===a.length){var i=[1,1];i.push.apply(i,s(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,i)}return new e.Token("interpolation",a,r.alias,t)}function c(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),i=0,c={},d=s(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=o,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var o=f[i],a="string"==typeof r?r:r.content,l=a.indexOf(o);if(-1!==l){++i;var s=a.substring(0,l),d=u(c[o]),p=a.substring(l+o.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,o=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(o),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function a(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return o})),RegExp(e,t)}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(o.content[0].content[1])&&n.pop():"/>"===o.content[o.content.length-1].content||n.push({tagName:i(o.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(o);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}o.content&&"string"!=typeof o.content&&l(o.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(o),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(o),o.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},o.languages.go=o.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),o.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete o.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=a.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=a[o],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++o;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=f.substring(m+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),v&&y.push.apply(y,i([v])),"string"==typeof u?l.splice.apply(l,[s,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(o),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(o),o.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},o.languages.webmanifest=o.languages.json,o.languages.less=o.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),o.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),o.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},o.languages.objectivec=o.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete o.languages.objectivec["class-name"],o.languages.objc=o.languages.objectivec,o.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},o.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},o.languages.python["string-interpolation"].inside.interpolation.inside.rest=o.languages.python,o.languages.py=o.languages.python,o.languages.reason=o.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),o.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete o.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(o),o.languages.scss=o.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),o.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),o.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),o.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),o.languages.scss.atrule.inside.rest=o.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(o),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(o),o.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const a=o},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),o=n(9642),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),a.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6726},6500:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in o(t,a),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(s),m=c;o(m);){for(var h in f={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var v in d)if(!(v in c))for(var y in p(v))if(y in c){f[v]=!0;break}for(var b in m=f)c[b]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var o,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)o=r(e);else{var f=i(c.map((function(e){var t=u(e);return delete s[e],t})));a?o=a(f,(function(){return r(e)})):r(e)}return l[e]=o}for(var c in n)u(c);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),o=n(7418),a=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n