From 7a0855c1484fb649fa565cec952f7913a3cc712c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:34:53 +0000 Subject: [PATCH] Deployed 05604d4 with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 962 +++ architecture/architecture/index.html | 1155 +++ architecture/arquitetura_v2.png | Bin 0 -> 131182 bytes architecture/arquiteturav2.png | Bin 0 -> 134113 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.83f73b43.min.js | 16 + assets/javascripts/bundle.83f73b43.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.6ce7567c.min.js | 42 + .../workers/search.6ce7567c.min.js.map | 7 + assets/stylesheets/main.6f8fc17f.min.css | 1 + assets/stylesheets/main.6f8fc17f.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + configuracao/configuracao/index.html | 1304 ++++ documentation/Roadmap.jpg | Bin 0 -> 505733 bytes documentation/miro/index.html | 1063 +++ documentation/productbacklog/index.html | 1320 ++++ documentation/releasesnotes/index.html | 1061 +++ documentation/requisitos/index.html | 1199 +++ documentation/sprints/index.html | 1243 +++ index.html | 1091 +++ politicas/branchs/index.html | 1107 +++ politicas/commits/index.html | 1168 +++ politicas/conduta/index.html | 1149 +++ politicas/contribuicao/index.html | 1122 +++ politicas/issue_tamplates/index.html | 1399 ++++ politicas/plano_comunicacao/index.html | 1141 +++ prototipo/prototipo/index.html | 1086 +++ registros/estudos/index.html | 1185 +++ registros/meetings/index.html | 1020 +++ registros/organizacaoequipe/index.html | 998 +++ search/search_index.json | 1 + sitemap.xml | 3 + sitemap.xml.gz | Bin 0 -> 127 bytes usage/faqs/index.html | 989 +++ usage/license/index.html | 989 +++ usage/tutorials/index.html | 989 +++ 72 files changed, 32021 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 architecture/architecture/index.html create mode 100644 architecture/arquitetura_v2.png create mode 100644 architecture/arquiteturav2.png create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.83f73b43.min.js create mode 100644 assets/javascripts/bundle.83f73b43.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js.map create mode 100644 assets/stylesheets/main.6f8fc17f.min.css create mode 100644 assets/stylesheets/main.6f8fc17f.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 configuracao/configuracao/index.html create mode 100644 documentation/Roadmap.jpg create mode 100644 documentation/miro/index.html create mode 100644 documentation/productbacklog/index.html create mode 100644 documentation/releasesnotes/index.html create mode 100644 documentation/requisitos/index.html create mode 100644 documentation/sprints/index.html create mode 100644 index.html create mode 100644 politicas/branchs/index.html create mode 100644 politicas/commits/index.html create mode 100644 politicas/conduta/index.html create mode 100644 politicas/contribuicao/index.html create mode 100644 politicas/issue_tamplates/index.html create mode 100644 politicas/plano_comunicacao/index.html create mode 100644 prototipo/prototipo/index.html create mode 100644 registros/estudos/index.html create mode 100644 registros/meetings/index.html create mode 100644 registros/organizacaoequipe/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 usage/faqs/index.html create mode 100644 usage/license/index.html create mode 100644 usage/tutorials/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..ffaaa1ac --- /dev/null +++ b/404.html @@ -0,0 +1,962 @@ + + + + + + + + + + + + + + + + + + + Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ +

404 - Not found

+ +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/architecture/architecture/index.html b/architecture/architecture/index.html new file mode 100644 index 00000000..354deb10 --- /dev/null +++ b/architecture/architecture/index.html @@ -0,0 +1,1155 @@ + + + + + + + + + + + + + + + + + + + + + + + Arquitetura - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Arquitetura

+ +

Arquitetura

+

Para o desenvolvimento do nosso projeto, utilizaremos o framework Django como base.

+

Diagrama de arquitetura

+

Diagrama de Arquitetura

+

Módulos arquiteturais

+

A arquitetura escolhida foi uma variação da arquitetura MVC (Model - View - Controller) utilizada pelo Django.

+

View

+

Aqui é onde os resultados são apresentados aos usuários finais:

+
    +
  1. +

    Streamlit: Ferramenta para a construção de aplicativos web interativos em Python. Exibe visualmente os resultados da classificação de sentimentos de forma acessível e fácil de interpretar.

    +
  2. +
  3. +

    Interface Web: A conexão entre o Streamlit e os usuários finais. Proporciona um meio para que os usuários interajam com o sistema, visualizem análises e dados processados.

    +
  4. +
+

Manipulação

+

Esta seção é responsável pelo processamento e preparação dos dados para análise:

+
    +
  1. +

    Airflow: Uma plataforma de fluxo de trabalho que gerencia o fluxo de dados. Coordena a extração dos dados do banco de dados e realiza transformações necessárias, garantindo que estejam prontos para o Classificador.

    +
  2. +
  3. +

    Classificador: O núcleo do sistema de análise de sentimentos. Utiliza engenharia de prompt para LLM's para categorizar e atribuir sentimentos (positivo, negativo, neutro) aos dados processados. É integrado com a OpenAI API para utilizar modelos de linguagem na execução da análise de sentimento.

    +
  4. +
+

Dados

+

Nessa seção, encontramos as fontes de dados primárias:

+
    +
  1. +

    PostGre: Banco de dados PostgreSQL. É responsável por armazenar os dados brutos que serão utilizados no processo de análise junto com todos os dados que já foram analisados.

    +
  2. +
  3. +

    Metabase: Fonte dos dados brutos com todos os comentários e propostas do Brasil Participativo.

    +
  4. +
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.001/12/2024Criação inicialCaio Pacheco
2.010/12/2024Arquitetura de 3 modulosCaio Pacheco
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/architecture/arquitetura_v2.png b/architecture/arquitetura_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..464559678b2a34844ad1410575e9b586a84130c6 GIT binary patch literal 131182 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 H*w_C93(L>B literal 0 HcmV?d00001 diff --git a/architecture/arquiteturav2.png b/architecture/arquiteturav2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e2ecab8376754fbac728675d34f65c486959f3 GIT binary patch literal 134113 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 Gwf_V=17imO literal 0 HcmV?d00001 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.83f73b43.min.js b/assets/javascripts/bundle.83f73b43.min.js new file mode 100644 index 00000000..43d8b70f --- /dev/null +++ b/assets/javascripts/bundle.83f73b43.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Wi=Object.create;var gr=Object.defineProperty;var Di=Object.getOwnPropertyDescriptor;var Vi=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,Ni=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,ao=Object.prototype.propertyIsEnumerable;var io=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&io(e,r,t[r]);if(Vt)for(var r of Vt(t))ao.call(t,r)&&io(e,r,t[r]);return e};var so=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&ao.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var zi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Vi(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Di(t,n))||o.enumerable});return e};var Mt=(e,t,r)=>(r=e!=null?Wi(Ni(e)):{},zi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var co=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var lo=xr((Er,po)=>{(function(e,t){typeof Er=="object"&&typeof po!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function L(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function te(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,te())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",L,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var qr=xr((hy,On)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var $a=/["'&<>]/;On.exports=Pa;function Pa(e){var t=""+e,r=$a.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof It=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ui}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(A){return!1}}var d=function(A){var M=f()(A);return u("cut"),M},y=d;function L(V){var A=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(F,"px"),M.setAttribute("readonly",""),M.value=V,M}var X=function(A,M){var F=L(A);M.container.appendChild(F);var D=f()(F);return u("copy"),F.remove(),D},te=function(A){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=X(A,M):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=X(A.value,M):(F=f()(A),u("copy")),F},J=te;function k(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(M){return typeof M}:k=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},k(V)}var ft=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=A.action,F=M===void 0?"copy":M,D=A.container,Y=A.target,$e=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&k(Y)==="object"&&Y.nodeType===1){if(F==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if($e)return J($e,{container:D});if(Y)return F==="cut"?y(Y):J(Y,{container:D})},qe=ft;function Fe(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(M){return typeof M}:Fe=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Fe(V)}function ki(V,A){if(!(V instanceof A))throw new TypeError("Cannot call a class as a function")}function no(V,A){for(var M=0;M0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Fe(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,$e=this.action(Y)||"copy",Dt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Dt?"success":"error",{action:$e,text:Dt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return y(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,$e=!!document.queryCommandSupported;return Y.forEach(function(Dt){$e=$e&&!!document.queryCommandSupported(Dt)}),$e}}]),M}(s()),Ui=Fi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,d,y){var L=c.apply(this,arguments);return l.addEventListener(u,L,y),{destroy:function(){l.removeEventListener(u,L,y)}}}function p(l,f,u,d,y){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(L){return s(L,f,u,d,y)}))}function c(l,f,u,d){return function(y){y.delegateTarget=a(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(y))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,d,y);if(a.nodeList(u))return l(u,d,y);if(a.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(L){L.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(L){L.removeEventListener(d,y)})}}}function f(u,d,y){return s(document.body,u,d,y)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||p(d,L)})},y&&(n[d]=y(n[d])))}function p(d,y){try{c(o[d](y))}catch(L){u(i[0][3],L)}}function c(d){d.value instanceof nt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){p("next",d)}function f(d){p("throw",d)}function u(d,y){d(y),i.shift(),i.length&&p(i[0][0],i[0][1])}}function uo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof he=="function"?he(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function H(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ue=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(L){t={error:L}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(H(l))try{l()}catch(L){i=L instanceof zt?L.errors:[L]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{ho(y)}catch(L){i=i!=null?i:[],L instanceof zt?i=q(q([],N(i)),N(L.errors)):i.push(L)}}}catch(L){o={error:L}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ho(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Ue.EMPTY;function qt(e){return e instanceof Ue||e&&"closed"in e&&H(e.remove)&&H(e.add)&&H(e.unsubscribe)}function ho(e){H(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Ue(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new To(r,o)},t}(j);var To=function(e){oe(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){oe(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var At={now:function(){return(At.delegate||Date).now()},delegate:void 0};var Ct=function(e){oe(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=At);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(gt);var Lo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(yt);var kr=new Lo(Oo);var Mo=function(e){oe(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(gt);var _o=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(yt);var me=new _o(Mo);var S=new j(function(e){return e.complete()});function Yt(e){return e&&H(e.schedule)}function Hr(e){return e[e.length-1]}function Xe(e){return H(Hr(e))?e.pop():void 0}function ke(e){return Yt(Hr(e))?e.pop():void 0}function Bt(e,t){return typeof Hr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return H(e==null?void 0:e.then)}function Jt(e){return H(e[bt])}function Xt(e){return Symbol.asyncIterator&&H(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Zi();function tr(e){return H(e==null?void 0:e[er])}function rr(e){return fo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return H(e==null?void 0:e.getReader)}function U(e){if(e instanceof j)return e;if(e!=null){if(Jt(e))return ea(e);if(xt(e))return ta(e);if(Gt(e))return ra(e);if(Xt(e))return Ao(e);if(tr(e))return oa(e);if(or(e))return na(e)}throw Zt(e)}function ea(e){return new j(function(t){var r=e[bt]();if(H(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ta(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?De(t):Qo(function(){return new ir}))}}function jr(e){return e<=0?function(){return S}:E(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,d=0,y=!1,L=!1,X=function(){f==null||f.unsubscribe(),f=void 0},te=function(){X(),l=u=void 0,y=L=!1},J=function(){var k=l;te(),k==null||k.unsubscribe()};return E(function(k,ft){d++,!L&&!y&&X();var qe=u=u!=null?u:r();ft.add(function(){d--,d===0&&!L&&!y&&(f=Ur(J,p))}),qe.subscribe(ft),!l&&d>0&&(l=new at({next:function(Fe){return qe.next(Fe)},error:function(Fe){L=!0,X(),f=Ur(te,n,Fe),qe.error(Fe)},complete:function(){y=!0,X(),f=Ur(te,a),qe.complete()}}),U(k).subscribe(l))})(c)}}function Ur(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var wa=O(h(document.body,"focusin"),h(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return wa.pipe(m(t=>e.contains(t)),K())}function $t(e,t){return C(()=>O(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Le(+!r*t)):le,Q(e.matches(":hover"))))}function Jo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Jo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Jo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(h(t,"load"),h(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),Te(1))))}var Xo=new g,Ta=C(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Xo.next(t)))),v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ta.pipe(w(r=>r.observe(t)),v(r=>Xo.pipe(b(o=>o.target===t),_(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Zo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ve(e){return{x:e.offsetLeft,y:e.offsetTop}}function en(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function tn(e){return O(h(window,"load"),h(window,"resize")).pipe(Me(0,me),m(()=>Ve(e)),Q(Ve(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ne(e){return O(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe(Me(0,me),m(()=>pr(e)),Q(pr(e)))}var rn=new g,Sa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)rn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function tt(e){return Sa.pipe(w(t=>t.observe(e)),v(t=>rn.pipe(b(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function on(e,t=16){return Ne(e).pipe(m(({y:r})=>{let o=ce(e),n=St(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function nn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function ze(e){let t=lr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function Oa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function La(){return O(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function an(){let e=h(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:nn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Oa(o,r)}return!0}),pe());return La().pipe(v(t=>t?S:e))}function ye(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function sn(){return new g}function cn(){return location.hash.slice(1)}function pn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Ma(e){return O(h(window,"hashchange"),e).pipe(m(cn),Q(cn()),b(t=>t.length>0),G(1))}function ln(e){return Ma(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function Pt(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function mn(){let e=matchMedia("print");return O(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():S))}function zr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function je(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function fn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function un(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function dn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function hn(){return O(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(dn),Q(dn()))}function bn(){return{width:innerWidth,height:innerHeight}}function vn(){return h(window,"resize",{passive:!0}).pipe(m(bn),Q(bn()))}function gn(){return z([hn(),vn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=z([o,r]).pipe(m(()=>Ve(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function _a(e){return h(e,"message",t=>t.data)}function Aa(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function yn(e,t=new Worker(e)){let r=_a(t),o=Aa(t),n=new g;n.subscribe(o);let i=o.pipe(Z(),ie(!0));return n.pipe(Z(),Re(r.pipe(W(i))),pe())}var Ca=R("#__config"),Ot=JSON.parse(Ca.textContent);Ot.base=`${new URL(Ot.base,ye())}`;function xe(){return Ot}function B(e){return Ot.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function ka(e){let t=R(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function xn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),ka(e).pipe(w(r=>t.next(r)),_(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ha(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function En(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ha(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))}function Rt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Tn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Sn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var Ln=Mt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,Ln.default)(c))," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=xe();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function _n(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function An(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ra(e){var o;let t=xe(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Cn(e,t){var o;let r=xe();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ra)))}var Ia=0;function ja(e){let t=z([et(e),$t(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Zo(e)).pipe(ne(Ne),pt(1),He(t),m(()=>en(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Fa(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ia++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(Z(),ie(!1)).subscribe(a);let s=a.pipe(Ht(c=>Le(+!c*250,kr)),K(),v(c=>c?r:S),w(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>$t(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),re(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),d=u.width/2;if(l.role==="tooltip")return{x:d,y:8+u.height};if(u.y>=f.height/2){let{height:y}=ce(l);return{x:d,y:-16-y}}else return{x:d,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),re(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),re(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ja(e).pipe(w(c=>i.next(c)),_(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Fa(e,{content$:new j(o=>{let n=e.title,i=wn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Ua(e,t){let r=C(()=>z([tn(e),Ne(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function kn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(W(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Me(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(W(a),re(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(W(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Ua(e,t).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function Wa(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Da(e){let t=[];for(let r of Wa(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function Hn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Da(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,Tn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?Hn(f,u):Hn(u,f)}),O(...[...a].map(([,l])=>kn(l,t,{target$:r}))).pipe(_(()=>s.complete()),pe())})}function $n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return $n(t)}}function Pn(e,t){return C(()=>{let r=$n(e);return typeof r!="undefined"?fr(r,e,t):S})}var Rn=Mt(Br());var Va=0;function In(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return In(t)}}function Na(e){return ge(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),ee("scrollable"))}function jn(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(jr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Rn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Va++}`;let l=Sn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=In(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(W(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),Na(e).pipe(w(c=>n.next(c)),_(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function za(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Fn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),za(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}var Un=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Gr,Qa=0;function Ka(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=Ka().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Un,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>co(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Qa++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Dn=x("table");function Vn(e){return e.replaceWith(Dn),Dn.replaceWith(An(e)),I({ref:e})}function Ya(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>h(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Nn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(Z(),ie(!0));z([s,ge(e),tt(e)]).pipe(W(p),Me(1,me)).subscribe({next([{active:c},l]){let f=Ve(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=pr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ne(o),ge(o)]).pipe(W(p)).subscribe(([c,l])=>{let f=St(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(W(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(W(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(p),b(f=>!(f.metaKey||f.ctrlKey)),w(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),re(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of P("[data-tabs]"))for(let L of P(":scope > input",y)){let X=R(`label[for="${L.id}"]`);if(X!==c&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),L.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(W(p)).subscribe(()=>{for(let c of P("audio, video",e))c.pause()}),Ya(n).pipe(w(c=>s.next(c)),_(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function zn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>Pn(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>jn(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Vn(n)),...P("details",e).map(n=>Fn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>Nn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ba(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function qn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ba(e,t).pipe(w(n=>o.next(n)),_(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ga=0;function Ja(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?Ne(o):I({x:0,y:0}),i=O(et(t),$t(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ve(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ga++}`,o=Rt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Me(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ja(o,e).pipe(w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Xa({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=ze("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Kn(e,t){return C(()=>z([ge(e),Xa(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Yn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(Z(),ie(!0));o.pipe(ee("active"),He(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),ne(a=>Qn(a)));return r.subscribe(o),t.pipe(W(n),m(a=>$({ref:e},a)),Re(i.pipe(W(n))))})}function Za(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),ee("active"))}function Bn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Za(o,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))})}function Gn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function es(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(ne(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Jn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Pt("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),re(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),es(t).pipe(W(n.pipe(Ce(1))),ct(),w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))})}function Xn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Mt(Br());function ts(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Zn({alert$:e}){Jr.default.isSupported()&&new j(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||ts(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function ei(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function rs(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[ei(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(ei(new URL(s),t))}}return r}function ur(e){return un(new URL("sitemap.xml",e)).pipe(m(t=>rs(t,new URL(e))),de(()=>I(new Map)))}function os(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ti(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ri(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function ns(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ti(document);for(let[o,n]of ti(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return We(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),Z(),ie(document))}function oi({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ri);let i=h(document.body,"click").pipe(He(n),v(([p,c])=>os(p,c)),pe()),a=h(window,"popstate").pipe(m(ye),pe());i.pipe(re(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(ee("pathname"),v(p=>fn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ri),v(ns),pe());return O(s.pipe(re(e,(p,c)=>c)),s.pipe(v(()=>e),ee("pathname"),v(()=>e),ee("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),w(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",pn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(ee("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ni=Mt(qr());function ii(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ni.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function jt(e){return e.type===1}function dr(e){return e.type===3}function ai(e,t){let r=yn(e);return O(I(location.protocol!=="file:"),ze("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function si(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=Xr(n))==null?void 0:l.pathname;if(i===void 0)return;let a=ss(o.pathname,i);if(a===void 0)return;let s=ps(t.keys());if(!t.has(s))return;let p=Xr(a,s);if(!p||!t.has(p.href))return;let c=Xr(a,r);if(c)return c.hash=o.hash,c.search=o.search,c}function Xr(e,t){try{return new URL(e,t)}catch(r){return}}function ss(e,t){if(e.startsWith(t))return e.slice(t.length)}function cs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oS)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),re(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(new URL(p)))}}return S}),v(i=>ur(i).pipe(m(a=>{var s;return(s=si({selectedVersionSitemap:a,selectedVersionBaseURL:i,currentLocation:ye(),currentBaseURL:t.base}))!=null?s:i})))))).subscribe(n=>lt(n,!0)),z([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(Cn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ls(e,{worker$:t}){let{searchParams:r}=ye();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),ze("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=ye();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(jt)),h(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function pi(e,{worker$:t}){let r=new g,o=r.pipe(Z(),ie(!0));z([t.pipe(Ae(jt)),r],(i,a)=>a).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ls(e,{worker$:t}).pipe(w(i=>r.next(i)),_(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function li(e,{worker$:t,query$:r}){let o=new g,n=on(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);ze("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(re(r),Wr(t.pipe(Ae(jt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(w(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Vr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(ne(l=>{let f=fe("details",l);return typeof f=="undefined"?S:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),_(()=>o.complete()),m(l=>$({ref:e},l)))}function ms(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ye();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function mi(e,t){let r=new g,o=r.pipe(Z(),ie(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),ms(e,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))}function fi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(h(n,"keydown"),h(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(He(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(w(s=>o.next(s)),_(()=>o.complete()),m(()=>({ref:e})))}function ui(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ai(o.search,t),i=Se("search-query",e),a=Se("search-result",e);h(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=pi(i,{worker$:n});return O(s,li(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>mi(p,{query$:s})),...ae("search-suggest",e).map(p=>fi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function di(e,{index$:t,location$:r}){return z([t,r.pipe(Q(ye()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ii(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function fs(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Zr(e,o){var n=o,{header$:t}=n,r=so(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=Ve(i);return C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=s.pipe(Me(0,me));return c.pipe(re(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2})}}}),ue(P("label[tabindex]",e)).pipe(ne(l=>h(l,"click").pipe(ve(se),m(()=>l),W(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),fs(e,r).pipe(w(l=>s.next(l)),_(()=>s.complete()),m(l=>$({ref:e},l)))})}function hi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(je(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),De({})),je(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(o=>({repositories:o.public_repos})),De({}))}}function bi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(je(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),De({})),je(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}function vi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return hi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return bi(r,o)}return S}var us;function ds(e){return us||(us=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return vi(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function gi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(_n(o)),t.classList.add("md-source__repository--active")}),ds(e).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function hs(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function yi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):hs(e,t)).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function bs(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(ee("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(ee("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),He(i),v(([p,c])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(s.height);for(;f.length;){let[,L]=f[0];if(L-c=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(Z(),ie(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),He(o.pipe(ve(se))),re(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(W(a),ee("offset"),_e(250),Ce(1),W(n.pipe(Ce(1))),ct({delay:250}),re(i)).subscribe(([,{prev:s}])=>{let p=ye(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),bs(e,{viewport$:t,header$:r}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function vs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),W(o.pipe(Ce(1))),ie(!0),ct({delay:250}),m(a=>({hidden:a})))}function Ei(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(a),ee("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),vs(e,{viewport$:t,main$:o,target$:n}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))}function wi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),ne(r=>tt(r).pipe(W(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(W(e.pipe(Ce(1))),_(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),ne(r=>mt(r,{viewport$:t}))).subscribe()}function Ti({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>h(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),re(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function gs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Si({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),b(gs),ne(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Oi({viewport$:e,tablet$:t}){z([ze("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),re(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ys(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",eo.base)}`).pipe(m(()=>__index),G(1)):je(new URL("search/search_index.json",eo.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Go(),Ut=sn(),Lt=ln(Ut),to=an(),Oe=gn(),hr=Pt("(min-width: 960px)"),Mi=Pt("(min-width: 1220px)"),_i=mn(),eo=xe(),Ai=document.forms.namedItem("search")?ys():Ye,ro=new g;Zn({alert$:ro});var oo=new g;B("navigation.instant")&&oi({location$:Ut,viewport$:Oe,progress$:oo}).subscribe(ot);var Li;((Li=eo.version)==null?void 0:Li.provider)==="mike"&&ci({document$:ot});O(Ut,Lt).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});to.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});wi({viewport$:Oe,document$:ot});Ti({document$:ot,tablet$:hr});Si({document$:ot});Oi({viewport$:Oe,tablet$:hr});var rt=Kn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Gn(e,{viewport$:Oe,header$:rt})),G(1)),xs=O(...ae("consent").map(e=>En(e,{target$:Lt})),...ae("dialog").map(e=>qn(e,{alert$:ro})),...ae("palette").map(e=>Jn(e)),...ae("progress").map(e=>Xn(e,{progress$:oo})),...ae("search").map(e=>ui(e,{index$:Ai,keyboard$:to})),...ae("source").map(e=>gi(e))),Es=C(()=>O(...ae("announce").map(e=>xn(e)),...ae("content").map(e=>zn(e,{viewport$:Oe,target$:Lt,print$:_i})),...ae("content").map(e=>B("search.highlight")?di(e,{index$:Ai,location$:Ut}):S),...ae("header").map(e=>Yn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("header-title").map(e=>Bn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Mi,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>yi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>xi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})),...ae("top").map(e=>Ei(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})))),Ci=ot.pipe(v(()=>Es),Re(xs),G(1));Ci.subscribe();window.document$=ot;window.location$=Ut;window.target$=Lt;window.keyboard$=to;window.viewport$=Oe;window.tablet$=hr;window.screen$=Mi;window.print$=_i;window.alert$=ro;window.progress$=oo;window.component$=Ci;})(); +//# sourceMappingURL=bundle.83f73b43.min.js.map + diff --git a/assets/javascripts/bundle.83f73b43.min.js.map b/assets/javascripts/bundle.83f73b43.min.js.map new file mode 100644 index 00000000..fe920b7d --- /dev/null +++ b/assets/javascripts/bundle.83f73b43.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/findurl/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + +
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.001/01/2024Criação inicialLuiz Henrique
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/documentation/productbacklog/index.html b/documentation/productbacklog/index.html new file mode 100644 index 00000000..52fc6737 --- /dev/null +++ b/documentation/productbacklog/index.html @@ -0,0 +1,1320 @@ + + + + + + + + + + + + + + + + + + + + + + + Product Backlog - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Product Backlog

+ +
O Backlog do Produto é uma lista ordenada que reúne todas as funcionalidades, melhorias e correções essenciais para o desenvolvimento do produto. Trata-se de um artefato dinâmico, constantemente revisado e atualizado à medida que novas informações surgem, assegurando que a equipe de desenvolvimento mantenha o foco nas tarefas de maior valor para os usuários e stakeholders.
+ +
+

Tabela de Backlog

+
+A Tabela de Backlog apresentada a seguir lista os épicos e histórias de usuário priorizados, com as respectivas estimativas de esforço (Story Points) e prioridade de implementação. A priorização foi realizada utilizando a técnica Planning Poker, onde a equipe de desenvolvimento atribui valores de prioridade baseados em consenso, considerando a importância e a complexidade de cada item. Esta abordagem permite que a equipe se concentre nas tarefas mais relevantes para atender às necessidades dos usuários e stakeholders. A Tabela 1 abaixo resume os principais itens do backlog do produto, enquanto a Tabela 2 apresenta uma legenda para facilitar o entendimento. +
+ + +
+

Tabela 1: Tabela de Backlog.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ÉpicoHistória de UsuárioStory PointsPrioridade
PLanejamento (E01)Como cliente, eu quero saber se a opinião sobre um determinado tópico é positiva, negativa ou neutra. Para poder realizar a análise de sentimentos.05Alta
Análise de Sentimentos (E02)Como cliente, eu quero saber se a opinião sobre um determinado tópico é positiva, negativa ou neutra. Para poder realizar a análise de sentimentos.13Alta
Visualização da Análise (E03)Como cliente, eu quero  visualizar por meio de gráficos o sentimento predominantes, de forma simples  e claro. Para entender como aquilo impacta a população.08Alta
Tópicos Recorrentes (E04)Como cliente eu quero identificar os tópicos recorrentes em um determinado plano. Para entender quais assuntos estão em destaque.08Baixa
+
O épico Tópicos Recorrentes (E04), que tem como objetivo permitir que os clientes identifiquem tópicos recorrentes em um determinado plano para entender quais assuntos estão em destaque, será reservado para futuras versões do projeto. + +Essa decisão se baseia na prioridade baixa atribuída a esse épico no momento atual, considerando que os esforços da equipe estão concentrados em funcionalidades com maior impacto direto para os usuários e stakeholders, como análise de sentimentos e visualização de dados. + +Embora seja uma funcionalidade relevante e que trará valor ao produto, sua implementação será planejada para uma etapa posterior, garantindo que as entregas prioritárias sejam realizadas de forma eficiente e dentro dos prazos estabelecidos.
+ +

Legenda

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LegendaDescrição
ÉpicoUm Épico é uma grande funcionalidade ou objetivo de alto nível, que é dividido em User Stories menores para desenvolvimento.
História de UsuárioUma História de Usuário é uma breve descrição de uma funcionalidade escrita da perspectiva do usuário, representando uma necessidade ou desejo.
Story PointsEstimativa do esforço necessário para concluir a tarefa, seguindo a sequência de Fibonacci: 1, 2, 3, 5, 8, 13...
AltaPrioridade máxima. Deve ser desenvolvida imediatamente por oferecer alto valor ao produto.
MédiaPrioridade intermediária. Requer mais detalhes antes de ser implementada.
BaixaPrioridade menor. Pode ser deixada para fases futuras do projeto.
+
+

Story Map

+
O Story Map é uma ferramenta visual que organiza e prioriza as histórias de usuários, alinhando-as à jornada do usuário e ao valor entregue por cada funcionalidade. Ele facilita a comunicação entre a equipe e os stakeholders, ajudando a identificar lacunas no desenvolvimento, conforme ilustrado a seguir. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpicsFeaturesUser StoriesDescrição
Análise de SentimentosExtração e TratamentoEu como usuário desejo poder extrair dados do Metabase para utilizá-los na análise de sentimentos.Criar integração para extração de dados do Metabase.
Eu como usuário desejo tratar os dados para garantir a consistência e adequação à análise.Implementar rotina de tratamento de dados.
Eu como usuário desejo acessar os dados de eventos por meio de um endpoint no Django.Desenvolver endpoint de eventos no Django.
Eu como usuário desejo acessar os dados de propostas por meio de um endpoint no Django.Desenvolver endpoint de propostas no Django.
Eu como usuário desejo acessar os dados de comentários por meio de um endpoint no Django.Desenvolver endpoint de comentários no Django.
Eu como usuário desejo armazenar os dados em um banco PostgreSQL para facilitar o acesso.Configurar armazenamento no PostgreSQL.
Automatização do processo de coleta e armazenamentoEu como desenvolvedor desejo entender o Airflow para automatizar o fluxo de coleta e armazenamento.Estudar o funcionamento do Airflow.
Eu como usuário desejo automatizar o processo de coleta e armazenamento de dados.Criar DAGs no Airflow para coleta e armazenamento.
Classificação de DadosEu como analista desejo estudar as categorias de classificação para entender melhor os dados (neutro, positivo, negativo, contributiva).Realizar estudo das categorias.
Eu como usuário desejo utilizar a OpenAI para classificar os dados de forma automática.Implementar classificação de dados utilizando a OpenAI.
Eu como desenvolvedor desejo automatizar o processo de classificação usando o Airflow.Automatizar o processo de classificação via Airflow.
Eu como desenvolvedor desejo conteinerizar a automatização de classificação e coleta de dados.Conteinerizar o processo de classificação e coleta de dados.
Visualização de AnálisePrototipação do DashboardEu como designer desejo criar um protótipo de baixa fidelidade para definir a estrutura inicial do dashboard de análise.Criar protótipo de baixa fidelidade.
Eu como designer desejo criar um protótipo de alta fidelidade para validar a aparência e funcionalidade do dashboard.Criar protótipo de alta fidelidade.
Eu como usuário desejo realizar testes no protótipo para garantir que o design seja funcional e intuitivo.Realizar testes no protótipo (Isaque é bom de visualização).
Desenvolvimento Web (Streamlit)Eu como usuário desejo acessar uma página inicial que me apresente uma visão geral do sistema de análise de sentimento.Desenvolver a página inicial.
Eu como usuário desejo acessar uma página de planos participativos para visualizar informações relevantes.Desenvolver a página de planos participativos.
Eu como usuário desejo acessar um dashboard que me permita visualizar as análises de sentimento de forma clara e detalhada.Desenvolver o dashboard de análise de sentimento.
Eu como usuário desejo que o sistema integre os dados coletados para que o dashboard esteja sempre atualizado.Implementar integração com os dados coletados.
Eu como desenvolvedor desejo conteinerizar a página para facilitar o deploy e garantir portabilidade.Conteinerizar a página.
Eu como desenvolvedor desejo realizar o deploy do projeto para torná-lo acessível aos usuários finais.Realizar o deploy do projeto.
+ +
As Features descritas na tabela acima foram organizadas em um board visual, que facilita o planejamento e execução do projeto ao oferecer uma visualização clara das tarefas, permitindo colaboração em tempo real, flexibilidade para reordenar prioridades e transparência no acompanhamento por meio do registro de comentários e histórico de mudanças. Isso garante maior alinhamento e eficiência entre os membros da equipe.
+ + + +
+

Roadmap

+
O Roadmap é um plano estratégico que descreve os objetivos do produto e as principais entregas ao longo do tempo. Ele define as etapas que a equipe seguirá para alcançar as metas do produto, servindo como um guia para o planejamento de releases e sprints. O roadmap proporciona uma visão clara para todos os envolvidos no projeto, alinhando a direção e as expectativas do desenvolvimento, conforme ilustrado abaixo. +
+ +

Roadmap

+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.028/11/2024Criação inicialGabriel Pinto
1.101/12/2024Estruturação e atualizaçãoGabriel Pinto
1.210/12/2024Atualização do StoryMapGabriel Pinto
1.311/12/2024Atualização do RoadmapGabriel Pinto
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/documentation/releasesnotes/index.html b/documentation/releasesnotes/index.html new file mode 100644 index 00000000..f2ee2272 --- /dev/null +++ b/documentation/releasesnotes/index.html @@ -0,0 +1,1061 @@ + + + + + + + + + + + + + + + + + + + + + + + Releases Notes - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Releases Notes

+ +

Releases Notes

+

(resumo individual de cada uma das sprints que fizemos até agora 0,1,2 Gabs/ 3,4 Lary)

+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.028/11/2024Criação inicialGabriel Pinto
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/documentation/requisitos/index.html b/documentation/requisitos/index.html new file mode 100644 index 00000000..08f0a9f9 --- /dev/null +++ b/documentation/requisitos/index.html @@ -0,0 +1,1199 @@ + + + + + + + + + + + + + + + + + + + + + + + Requisitos - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Requisitos

+ +
Este documento descreve os requisitos do sistema são divididos em funcionais e não funcionais, conforme descrito abaixo.
+ +

Requisitos Funcionais

+

Os requisitos funcionais descrevem as funcionalidades específicas que o sistema deve oferecer para atender às necessidades do usuário ou ao propósito do software.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NúmeroRequisito
RF01O dashboard deve mostrar de forma visual (gráficos/tabelas) o resultado da análise, auxiliando assim o usuário na tomada de decisão.
RF02O dashboard deve atualizar os dados diariamente, para garantir a atualização das informações.
RF03O dashboard deve conter filtros para personalização de dados e visualização de acordo com suas necessidades, como tempo e sentimento.
RF04O dashboard deve ter elementos gráficos interativos.
RF05O sistema deve integrar-se ao Metabase para extrair dados automaticamente.
RF06O sistema deve identificar se os sentimentos relacionados a um tópico são positivos, negativos ou neutros.
RF07O sistema deve classificar os dados em categorias predefinidas, como contributivas ou irrelevantes.
RF08O sistema deve exibir os resultados da análise de sentimentos em gráficos claros e interativos.
RF09O sistema deve conter DAGs configuradas no Airflow para coleta, processamento e armazenamento de dados.
RF10O sistema deve armazenar os dados processados em um banco de dados PostgreSQL.
+
+

Requisitos Não Funcionais

+

Os requisitos não funcionais descrevem características de qualidade do sistema, como desempenho, usabilidade, segurança, e outras restrições relacionadas ao ambiente ou à arquitetura.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NúmeroRequisito
RNF01A interface do dashboard deve ser responsiva e adaptar-se a diferentes dispositivos (desktop, tablet, mobile).
RNF02O dashboard deve ter uma interface fácil de navegar, com elementos bem organizados e uma hierarquia visual clara, incluindo menus e links.
RNF03O dashboard deve ter uma identidade visual agradável.
RNF04O dashboard precisa estar disponível 24 horas por dia.
RNF05O dashboard precisa ser acessado na página designada.
RNF06O dashboard deve funcionar nos principais navegadores: Safari, Firefox, Chrome.
RNF07O dashboard deve poder ser acessado no computador (WEB).
RNF08O código deve ser bem documentado e estruturado para facilitar futuras manutenções e permitir a adição de novas funcionalidades sem impacto negativo nas existentes.
RNF09A infraestrutura deve suportar o aumento do volume de dados sem comprometer o desempenho.
RNF10O sistema deve garantir uma disponibilidade mínima de 90% ao longo do mês.
RNF11A interface do sistema deve ser intuitiva, permitindo que um novo usuário compreenda seu funcionamento sem treinamento adicional.
RNF12O sistema deve ser conteinerizado para facilitar implantação em diferentes ambientes.
RNF13O sistema deve atender às regulamentações de proteção de dados, como a LGPD.
+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.028/11/2024Criação inicialGabriel Pinto
1.101/12/2024Estruturação e atualizaçãoGabriel Pinto
1.211/12/2024AtualizaçãoGabriel Pinto
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/documentation/sprints/index.html b/documentation/sprints/index.html new file mode 100644 index 00000000..f686f8db --- /dev/null +++ b/documentation/sprints/index.html @@ -0,0 +1,1243 @@ + + + + + + + + + + + + + + + + + + + + + + + Sprints - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Sprints

+ +

Descrição do que será feito em cada Sprint:

+

Sprint 0 e 1

+
    +
  • Onboarding de Adaptação
  • +
  • Organização de Horários e Disponibilidade
  • +
  • Definição do Modelo de Dailys
  • +
  • Divisão de Capacitação em Tecnologias (Regra do Coelho)
  • +
  • Definição de Canais de Comunicação
  • +
  • Discussão sobre Possíveis Temas
  • +
  • Planejamento das Próximas Sprints
  • +
+

Sprint 2

+
    +
  • Estruturar o README
  • +
  • Criar Milestones
  • +
  • Definir Prazos das Sprints
  • +
  • Definição de Tema do Projeto
  • +
  • Planejamento de Sprints e Releases
  • +
  • Rotação do Cargo de Scrum Master
  • +
  • Considerações para Organização das Sprints
  • +
  • Estudo sobre tema do projeto
  • +
  • Definição do tema e escopo do projeto
  • +
+

Sprint 3

+

Sprint 4

+

Sprint 5

+
    +
  • Finalização dos protótipos de baixa fidelidade
  • +
  • Atualização da documentação do projeto (Storymap, User Stories, etc)
  • +
  • Estudos sobre o funcionamento da API do Brasil Participativo
  • +
  • Estudo do funcionamento do 'Streamlit'
  • +
+

Sprint 6

+
    +
  • Início do desenvolvimento dos protótipos de alta fidelidade
  • +
  • Desenvolvimento da configuração do ambiente de desenvolvimento Docker
  • +
  • Início da definição da arquitetura do projeto
  • +
  • Início da escolha das tecnologias a serem utilizadas no projeto
  • +
+

Sprint 7

+
    +
  • Preparação para a apresentação da release
  • +
  • Finalização dos protótipos de alta fidelidade
  • +
  • Finalização da configuração do ambiente de desenvolvimento Docker
  • +
  • Finalização da definição da arquitetura do projeto
  • +
  • Finalização da escolha das tecnologias a serem utilizadas no projeto
  • +
  • Criação da release notes
  • +
+

Sprint 8

+

Sprint 9

+

Sprint 10

+

Sprint 11

+

Sprint 12

+

Sprint 13

+

Sprint 14

+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.028/11/2024Criação inicialGabriel Pinto
1.101/12/2024Atualização das Sprints 0, 1 e 2Gabriel Pinto
1.212/12/2024Atualização das Sprints 5, 6 e 7Luiz Henrique
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..9a571a59 --- /dev/null +++ b/index.html @@ -0,0 +1,1091 @@ + + + + + + + + + + + + + + + + + + + + + Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Análise de Sentimentos e Tendências Governamentais do Brasil Participativo

+

Sobre o Projeto

+

Bem-vindo ao repositório do Squad 5 de Métodos e Desenvolvimento de Software – Análise de Sentimento e Tendências Governamentais do Brasil Participativo!

+

Aqui você encontrará toda a documentação, código e informações relevantes sobre o desenvolvimento deste projeto. O projeto foi concebido para atender à necessidade de uma visão aprofundada sobre as opiniões e percepções populares expressas na plataforma Brasil Participativo. A partir de comentários e discussões na plataforma, buscamos identificar as principais emoções e temas discutidos pela população, oferecendo uma visão panorâmica e detalhada das tendências de opinião pública.

+

Acreditamos que, ao oferecer uma análise clara dos sentimentos da sociedade e das principais tendências sociais, contribuímos para uma gestão pública mais inclusiva, responsável e conectada com as reais necessidades da população. Explore as seções abaixo para se aprofundar nos detalhes técnicos e contribuir com a nossa comunidade.

+

Desenvolvedores

+

+ + + + + + + + + +
+ + +
Arthur Fernandes
+
+
+ + +
Caio Pacheco
+
+
+ + +
Gabriel Santos
+
+
+ + +
Laryssa Felix
+
+
+ + +
Luiz Henrique
+
+
+ + +
Letícia Monteiro
+
+
+

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/politicas/branchs/index.html b/politicas/branchs/index.html new file mode 100644 index 00000000..e0a454aa --- /dev/null +++ b/politicas/branchs/index.html @@ -0,0 +1,1107 @@ + + + + + + + + + + + + + + + + + + + + + + + Branchs - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Branchs

+ +

Padrão de Nomes para Branches

+

Os nomes das branches devem seguir um padrão composto por 3 partes:

+
    +
  1. Type ou Categoria
    + Indica o tipo de alteração feita no branch. Os types permitidos são:
  2. +
  3. docs: Apenas mudanças na documentação.
  4. +
  5. feat: Uma nova funcionalidade.
  6. +
  7. fix: Correção de um bug.
  8. +
  9. perf: Mudança de código focada em melhorar a performance.
  10. +
  11. refactor: Mudança de código que não adiciona uma funcionalidade nem corrige um bug.
  12. +
  13. style: Alterações que não impactam o comportamento do código (ex.: espaços em branco, formatação, ponto e vírgula).
  14. +
  15. +

    test: Adicionar ou corrigir testes.

    +
  16. +
  17. +

    Descrição
    + Um resumo claro e objetivo do que o branch faz.

    +
  18. +
  19. +

    Número da Issue
    + O identificador numérico da issue relacionada, precedido por #.

    +
  20. +
+

Exemplos de Nomes de Branches

+
    +
  • +

    feat-login-page-12
    +Adiciona a funcionalidade da página de login, relacionada à issue #12.

    +
  • +
  • +

    refactor-edicao-colaboradores-35
    +Refatora o código relacionado à edição de colaboradores, issue #35.

    +
  • +
  • +

    fix-busca-checklists-23
    +Corrige um bug na funcionalidade de busca em checklists, issue #23.

    +
  • +
+

Seguir este padrão ajuda a manter o controle e a organização do repositório.

+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.009/12/2024Criação inicialLARYSSA FELIX
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/politicas/commits/index.html b/politicas/commits/index.html new file mode 100644 index 00000000..0f178678 --- /dev/null +++ b/politicas/commits/index.html @@ -0,0 +1,1168 @@ + + + + + + + + + + + + + + + + + + + + + + + Commits - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Commits

+ +

Padronização de Commits

+

Conventional Commits

+

Conventional Commits é uma especificação para criar mensagens de commit que sejam legíveis por humanos e máquinas, facilitando a colaboração e a manutenção de projetos.

+

Formato

+

<type>[scope]: <subject>

+

Exemplos

+
    +
  1. docs: update README to add developer tips
  2. +
  3. feat[auth]: add password recovery flow
  4. +
+

Explicação dos Campos

+

1. type (tipo) +Define o tipo de mudança realizada no commit. Os valores mais comuns incluem:

+
    +
  • feat: Uma nova funcionalidade.
  • +
  • fix: Correção de um bug.
  • +
  • docs: Mudanças apenas na documentação.
  • +
  • style: Alterações que não afetam a lógica do código (espaço em branco, formatação, etc.).
  • +
  • refactor: Alteração no código que não adiciona funcionalidades nem corrige bugs.
  • +
  • test: Adição ou correção de testes.
  • +
  • chore: Alterações em ferramentas ou processos auxiliares (ex.: scripts de build).
  • +
  • perf: Mudança que melhora o desempenho do código.
  • +
  • ci: Alterações nas configurações de integração contínua (CI).
  • +
  • build: Alterações no sistema de build ou dependências externas.
  • +
  • temp: Commit temporário que será removido e não entrará no changelog.
  • +
+

2. scope (escopo)

+
    +
  • Opcional.
  • +
  • +

    Especifica a área ou módulo impactado pela mudança. Exemplos:

    +
  • +
  • +

    [auth] para mudanças relacionadas à autenticação.

    +
  • +
  • [api] para alterações na API.
  • +
  • [dashboard] para o painel administrativo.
  • +
+

3. subject (assunto) +- Um resumo breve e claro da mudança, escrito em tempo presente.

+
    +
  • Regras:
  • +
  • Escreva no presente (ex.: add, fix, update).
  • +
  • Minúsculo no início.
  • +
  • Sem ponto final ao final da frase.
  • +
+

Benefícios

+
    +
  • Melhor legibilidade e consistência em projetos colaborativos.
  • +
  • Facilita a geração de changelogs automáticos.
  • +
  • Simplifica o entendimento do histórico de commits e as áreas impactadas.
  • +
+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.009/12/2024Criação inicialLARYSSA FELIX
1.111/12/2024CrorreçõesLARYSSA FELIX
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/politicas/conduta/index.html b/politicas/conduta/index.html new file mode 100644 index 00000000..da2eb93a --- /dev/null +++ b/politicas/conduta/index.html @@ -0,0 +1,1149 @@ + + + + + + + + + + + + + + + + + + + + + + + Conduta - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Conduta

+ +

Propósito

+

O projeto é conduzido por estudantes como parte da disciplina Métodos de Desenvolvimento de Software da Universidade de Brasília. Com o objetivo de promover um ambiente inclusivo e acolhedor, os participantes, tanto colaboradores quanto responsáveis, comprometem-se a atuar de forma ativa e responsável na execução do projeto e na interação com a comunidade, assegurando que todos os envolvidos tenham uma experiência livre de assédio.

+

Comportamento

+

Comportamentos Aceitáveis:

+
    +
  • Valorizar opiniões, perspectivas e experiências diversas.
  • +
  • Incentivar a prática de críticas construtivas, tanto ao recebê-las quanto ao oferecê-las.
  • +
  • Reconhecer erros próprios e buscar aprendizado a partir deles.
  • +
  • Utilizar uma linguagem acolhedora e inclusiva.
  • +
  • Demonstrar empatia e respeito pelos demais membros da comunidade.
  • +
+

Comportamentos Inaceitáveis:

+
    +
  • Uso de linguagem ou imagens com conotação sexual.
  • +
  • Realizar provocações, insultos, depreciações ou ataques pessoais ou políticos.
  • +
  • Praticar assédio, seja ele público ou privado.
  • +
  • Compartilhar informações pessoais de terceiros sem autorização (ex.: fotos ou e-mails).
  • +
  • Adotar qualquer conduta que, de forma razoável, possa ser considerada inadequada em um ambiente profissional.
  • +
+

Responsabilidades

+

Os mantenedores do projeto são responsáveis por:

+
    +
  • Definir e esclarecer os padrões de conduta esperados.
  • +
  • Tomar medidas justas e corretivas em casos de comportamentos inadequados.
  • +
  • Editar, remover ou rejeitar comentários, confirmações, código ou outras contribuições que violem este Código de Conduta.
  • +
  • Aplicar sanções temporárias ou permanentes, como exclusão de membros, caso suas ações sejam consideradas prejudiciais, ofensivas ou inadequadas.
  • +
+

Escopo

+

Este Código de Conduta se aplica:

+
    +
  • A todas as interações realizadas no âmbito do projeto.
  • +
  • A situações públicas onde um indivíduo represente o projeto ou sua comunidade (ex.: uso de e-mail oficial ou participação em eventos como representante do projeto).
  • +
+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.009/12/2024Criação inicialLARYSSA FELIX
1.111/12/2024CorreçõesLARYSSA FELIX
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/politicas/contribuicao/index.html b/politicas/contribuicao/index.html new file mode 100644 index 00000000..211c28d3 --- /dev/null +++ b/politicas/contribuicao/index.html @@ -0,0 +1,1122 @@ + + + + + + + + + + + + + + + + + + + + + + + Contribuição - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Contribuição

+ +

Como contribuir?

+

Sua participação é essencial para o sucesso do nosso projeto. Você pode contribuir identificando problemas, sugerindo melhorias ou realizando alterações no código. Siga as etapas abaixo para colaborar conosco:

+

1. Abra ou encontre uma Issue

+

Verifique na seção de Issues se já existe uma relacionada ao problema ou melhoria que você deseja abordar. +Caso não encontre, crie uma nova issue.

+

Certifique-se de: + - Adicionar um título claro e objetivo + - Fornecer uma descrição detalhada para que todos possam compreender o contexto + - Designar pelo menos um Assignee + - Adicionar as Labels apropriadas e vinculá-la à milestone correspondente

+

2. Trabalhe na sua proposta

+

Após abrir ou se responsabilizar por uma issue, crie uma branch para o seu trabalho. +Realize as alterações necessárias utilizando sua IDE preferida e siga as boas práticas de desenvolvimento.

+

3. Envie um Pull Request

+

Quando finalizar o trabalho, crie um Pull Request vinculado à sua issue.

+

Lembre-se de: + - Linkar o PR a sua Issue correspondente + - Solicitar a revisão de um dos responsáveis pelo projeto + - Garantir que sua proposta atende aos critérios definidos

+

Dúvidas ou sugestões?

+

Se tiver alguma dúvida ou sugestão sobre como contribuir, não hesite em entrar em contato com nossa equipe. Juntos, construiremos um projeto ainda melhor!

+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.008/12/2024Criação inicialLARYSSA FELIX
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/politicas/issue_tamplates/index.html b/politicas/issue_tamplates/index.html new file mode 100644 index 00000000..e0494d0d --- /dev/null +++ b/politicas/issue_tamplates/index.html @@ -0,0 +1,1399 @@ + + + + + + + + + + + + + + + + + + + + + + + Issues - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Issues

+ +

Bug

+

Descrição

+

[Descreva aqui o problema ou a solicitação de recurso de forma clara e concisa]

+

Etapas para Reproduzir o Problema

+
    +
  1. [Descreva a primeira etapa para reproduzir o problema]
  2. +
  3. [Descreva a segunda etapa]
  4. +
  5. [Continue listando as etapas, se necessário]
  6. +
+

Comportamento Esperado

+

[Descreva o comportamento que você espera que ocorra]

+

Comportamento Atual

+

[Descreva o comportamento atual que está causando o problema]

+

Ambiente

+
    +
  • Sistema operacional: [Insira o nome e a versão do sistema operacional]
  • +
  • Versão do Speak Up: [Insira a versão do Speak Up que você está usando]
  • +
+

Informações Adicionais

+

[Inclua informações adicionais relevantes, como logs de erro ou outras informações que possam ser úteis para entender e resolver o problema]

+
+

Feature

+

Descrição da Solicitação de Recurso

+

[Descreva aqui a solicitação de recurso de forma clara e concisa]

+

Benefícios

+

[Explique como esse recurso irá beneficiar o projeto ou os usuários finais]

+

Detalhes Técnicos

+

[Se aplicável, forneça detalhes técnicos sobre como essa solicitação de recurso pode ser implementada]

+

Informações Adicionais

+

[Inclua informações adicionais relevantes, como links para recursos externos, exemplos de outros projetos que possam ter uma implementação semelhante etc.]

+
+

Custom

+

Descrição da Issue

+

[Descrever de forma sucinta a issue, colocando quaisquer informações necessárias para a realização dessa.]

+

Tasks

+
    +
  • [ ] Task 1
  • +
  • [ ] Task 2
  • +
  • [ ] Task 3
  • +
+

Critérios de Aceitação

+
    +
  • [ ] Critério 1
  • +
  • [ ] Critério 2
  • +
  • [ ] Critério 3
  • +
+

Assignees

+

A issue deve ser atribuída a pelo menos um colaborador do projeto.

+

Labels

+

A issue deve ser marcada com uma ou mais tags adequadas, para fins de rastreamento do projeto.

+

Milestone

+

A issue deve ser atribuída ao Milestone (sprint) correspondente previsto para sua execução.

+

Estimate

+

Deve-se definir uma estimativa de dificuldade (pontuação) à issue em questão, levando em consideração os critérios estabelecidos no documento de contribuição.

+
+

Pull Request

+

O que mudou?

+

Qual foi a mudança significativa para que haja um Pull Request?
+- [ ] Documentação atualizada
+- [ ] Novo arquivo (mudança que adiciona funcionalidade)
+- [ ] Correção de bug (mudança que NÃO muda funcionalidade)
+- [ ] Mudança decisiva no arquivo (correção ou recurso que faz com que funcionalidade existente seja alterada)

+

Descrição

+

Por favor, faça um resumo do que mudou e qual(is) issue(s) foi(ram) resolvida(s). Liste também todas as dependências necessárias para essa mudança.

+

Close

+ + + + + + + + + + + + + + + + + +
IssueTítulo
#numero1título 1
#numero2título 2
+

Lista de controle

+
    +
  • [ ] Você verificou se não há outras solicitações de pull para a mesma atualização/alteração?
  • +
  • [ ] As mudanças seguem as políticas de commit e branch
  • +
  • [ ] Todos os membros estão de acordo com a atualização
  • +
+

Quem contribuiu?

+

@fulano @ciclano

+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.012/12/2024Criação inicialLARYSSA FELIX
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/politicas/plano_comunicacao/index.html b/politicas/plano_comunicacao/index.html new file mode 100644 index 00000000..e52dcb11 --- /dev/null +++ b/politicas/plano_comunicacao/index.html @@ -0,0 +1,1141 @@ + + + + + + + + + + + + + + + + + + + + + + + Plano de Comunicação - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Plano de Comunicação

+ +

Objetivo

+

Este documento tem como objetivo estabelecer um protocolo de comunicação claro e eficiente para o projeto Lumina, garantindo que todas as informações relevantes sejam compartilhadas de forma oportuna e organizada. Ao definir os canais de comunicação, as ferramentas a serem utilizadas e os processos para gestão da informação, este documento visa facilitar a colaboração entre os membros da equipe, otimizar a tomada de decisões e garantir o cumprimento dos objetivos do projeto.

+

Diretrizes e procedimentos usados para comunicar

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ÍconeFerramentaDescrição
GitHubGitHubFerramenta de versionamento, onde temos os códigos do produto, e por ela comentamos as Issues que são trabalhadas.
WhatsAppWhatsAppUtilizado para a comunicação rápida e do dia a dia, para dinamizar a troca de informações entre a equipe.
Google Meet IconGoogle MeetUtilizado para reuniões como pré-planejamento e planejamento da sprint, sprint review, às vezes daily e quaisquer outras reuniões que forem marcadas.
+

Comunicação Geral

+

Uma comunicação clara e objetiva é o pilar central para o bom desenvolvimento da disciplina e do projeto. Considerando a importância desse aspecto devemos priorizar os seguintes cuidados:

+
    +
  • Seguir os rituais ágeis, para conseguir manter a comunicação eficaz do projeto;
  • +
  • Manter as partes interessadas "alinhadas", evitando ao máximo ruídos e sempre comunicando ao fazer algo novo ou alterações.
  • +
+

Gerência de Reuniões

+

Para garantir a agilidade e o contínuo aprimoramento, nossa reunião semanal, realizada aos sábados, é estruturadas em três momentos colaborativos:

+
    +
  1. Sprint Retrospective: Usamos um template no Miro para refletir sobre a sprint passada. Essa etapa é fundamental para aprendermos com nossas experiências, celebrar nossos sucessos e identificar áreas de melhoria.
  2. +
  3. Sprint Review: Avaliamos as entregas da sprint anterior, comparando com os objetivos definidos no início. Esse momento é crucial para obter feedback e garantir que estamos no caminho certo.
  4. +
  5. Sprint Planning: Definimos as prioridades e tarefas para a próxima sprint, garantindo que todos os membros da equipe estejam alinhados e comprometidos com os objetivos.
  6. +
+

Nas terças e quintas, realizamos atualizações sobre o andamento das demandas de cada integrante da equipe durante a sprint. Esse momento é estruturado em três tópicos:

+
    +
  1. O que foi feito ontem
  2. +
  3. O que será feito hoje
  4. +
  5. Quais obstáculos ou impedimentos estou enfrentando
  6. +
+

O objetivo é manter as comunicações claras e objetivas. Geralmente, essa atualização ocorre de forma assíncrona pelo WhatsApp. No entanto, quando necessário, realizamos encontros síncronos utilizando o Google Meet.

+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.009/12/2024Criação inicialLARYSSA FELIX
1.111/12/2024Correções e aprimoramentoLARYSSA FELIX
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/prototipo/prototipo/index.html b/prototipo/prototipo/index.html new file mode 100644 index 00000000..25291886 --- /dev/null +++ b/prototipo/prototipo/index.html @@ -0,0 +1,1086 @@ + + + + + + + + + + + + + + + + + + + + + + + Protótipo - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Protótipo

+ +
Explore os protótipos do Lumina. Nesta seção, você poderá visualizar e interagir com as diferentes versões do produto, desde os primeiros esboços até os protótipos mais recentes. Utilizamos a plataforma Figma para criar protótipos que visualizam de forma clara as funcionalidades e prioridades do nosso projeto.
+ +

Primeira versão

+ + +

Segunda versão

+
Após a criação do primeiro protótipo, nossa equipe realizou uma análise aprofundada e identificou pontos de melhoria e novas possibilidades. Refletimos sobre o que poderia agregar mais valor à versão definitiva. Assim, ajustaremos funcionalidades e priorizaremos elementos que melhor atendam às expectativas. Continuamos comprometidos com um produto final de alta qualidade!
+ + + +
Ainda não estamos na versão final, mas estamos bem perto de alcançá-la. Já temos uma base sólida, e agora estamos focados em ajustar e refinar cada detalhe. Queremos garantir que tudo esteja alinhado com o que planejamos, entregando a melhor versão possível!
+
+

Tabela de Versionamento

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)
1.028/11/2024Criação inicialArthur Fernandes, Laryssa Felix e Letícia Monteiro
1.101/12/2024Estruturação e atualizaçãoGabriel Pinto
1.113/12/2024Atualização e inserção dos modelos criadosLetícia Monteiro
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/registros/estudos/index.html b/registros/estudos/index.html new file mode 100644 index 00000000..fba83f12 --- /dev/null +++ b/registros/estudos/index.html @@ -0,0 +1,1185 @@ + + + + + + + + + + + + + + + + + + + + + Estudos - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Conteúdo de Estudos

+

Esta página apresenta os conteúdos utilizados como referência para orientar nossos estudos durante o desenvolvimento deste projeto. Foi utilizado a técnica do coelho apresentada pela professora Carla, onde cada integrante do grupo ficou responsável por pesquisar um tema e compartilhar o conhecimento adquirido com os demais integrantes.

+

Continuous Integration (CI)

+

Pesquisado por: Caio Pacheco +Durante a : Sprint 0

+
Descrição
+

O objetivo deste estudo foi entender o conceito de integração contínua e como ele pode ser aplicado em nosso projeto. +O Caio criou o seguinte documento para compartilhar o conhecimento adquirido.

+ + +


+

Padronização de Mensagens de Commit e Issues

+

Criado por: Larissa Félix +Durante a : Sprint 0

+
Descrição
+

O objetivo deste estudo foi entender a importância de padronizar as mensagens de commit e issues e como isso pode ajudar a manter um histórico de alterações mais organizado. Ela também pesquisou sobre a importância de se criar issues para cada tarefa a ser realizada como deixou uma git cheat sheet para facilitar o entendimento de comandos git. +A Larissa criou o seguinte documento para compartilhar o conhecimento adquirido.

+ + +


+

Markdown, GitHub Pages e Deploys usando GitHub Actions

+

Pesquisado por: Arthur Fernandes +Durante a : Sprint 0

+
Descrição
+

O objetivo deste estudo foi entender como utilizar o Markdown para criar documentações e como utilizar o GitHub Pages para hospedar essas documentações. Além disso, o Arthur também pesquisou sobre como fazer deploys automáticos utilizando o GitHub Actions.

+ + +


+

Docker

+

Pesquisado por: Luiz Henrique Soares +Durante a : Sprint 0

+
Descrição
+

O objetivo deste estudo foi entender o que é Docker e como ele pode ser utilizado para facilitar o desenvolvimento e deploy de aplicações. Ele encontrou um livro chamado Descomplicando Docker e assistiu a um vídeo introdutório sobre Docker para iniciantes, além de ter consultado a documentação oficial do Docker. Como forma de prática, ele utilizou o Play with Docker Labs para realizar alguns testes. Segue abaixo os links para o livro, vídeo e documentação consultados.

+ + +


+

Documentação, Scrum, Roadmap do Produto, Story Mapping e User Stories

+

Pesquisado por: Gabriel S Pinto +Durante a : Sprint 0

+
Descrição
+

O objetivo deste estudo foi entender a importância da documentação, do Scrum, do Roadmap do Produto, do Story Mapping e das User Stories para o desenvolvimento de um projeto. Como primeiro scrum master do projeto, o Gabriel pesquisou sobre esses temas e compartilhou o conhecimento adquirido com o grupo, além de ter encontrado documentos com um resumo sobre cada um deles.

+ + +


+

Funcionalidades da Plataforma GitHub

+

Pesquisado por: Letícia Monteiro +Durante a : Sprint 0

+
Descrição
+

O objetivo deste estudo foi entender as funcionalidades da plataforma GitHub e como elas podem ser utilizadas para facilitar o desenvolvimento de um projeto. A Letícia pesquisou sobre os principais recursos do GitHub e encontrou alguns links que explicam como utilizar essas funcionalidades.

+ + +


+

Análise de Sentimentos

+

Pesquisado por: Caio Pacheco +Durante a : Sprint 2

+
Descrição
+

O objetivo deste estudo foi entender o que é análise de sentimentos e como ela pode ser aplicada em nosso projeto. O Caio pesquisou sobre o assunto e encontrou um artigo que explica como funciona a análise de sentimentos e como ela pode ser utilizada para analisar a opinião dos usuários sobre um determinado produto ou serviço.

+ + +


+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/registros/meetings/index.html b/registros/meetings/index.html new file mode 100644 index 00000000..82085020 --- /dev/null +++ b/registros/meetings/index.html @@ -0,0 +1,1020 @@ + + + + + + + + + + + + + + + + + + + + + + + Reuniões - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Reuniões

+ +
O +Para garantir a agilidade e o contínuo aprimoramento, nossa reunião semanal, realizada aos sábados, é estruturadas em três momentos colaborativos: +
+ +1. **Sprint Retrospective:** Usamos um template no Miro para refletir sobre a sprint passada. Essa etapa é fundamental para aprendermos com nossas experiências, celebrar nossos sucessos e identificar áreas de melhoria. +2. **Sprint Review:** Avaliamos as entregas da sprint anterior, comparando com os objetivos definidos no início. Esse momento é crucial para obter feedback e garantir que estamos no caminho certo. +3. **Sprint Planning:** Definimos as prioridades e tarefas para a próxima sprint, garantindo que todos os membros da equipe estejam alinhados e comprometidos com os objetivos. + +Nas terças e quintas, realizamos atualizações sobre o andamento das demandas de cada integrante da equipe durante a sprint. Esse momento é estruturado em três tópicos: + +1. **O que foi feito ontem** +2. **O que será feito hoje** +3. **Quais obstáculos ou impedimentos estou enfrentando** + +O objetivo é manter as comunicações claras e objetivas. Geralmente, essa atualização ocorre de forma assíncrona pelo WhatsApp. No entanto, quando necessário, realizamos encontros síncronos utilizando o Google Meet. + +--- + +Tabela de Versionamento + +| Versão | Data | Descrição | Autor(es) | +|--------|------------|---------------------------------------------------------------|------------------| +| 1.0 | 13/12/2024 | Criação inicial | LARYSSA FELIX | + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/registros/organizacaoequipe/index.html b/registros/organizacaoequipe/index.html new file mode 100644 index 00000000..78c10146 --- /dev/null +++ b/registros/organizacaoequipe/index.html @@ -0,0 +1,998 @@ + + + + + + + + + + + + + + + + + + + + + + + Organização da equipe - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Organização da equipe

+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..e79a9de7 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["pt"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"An\u00e1lise de Sentimentos e Tend\u00eancias Governamentais do Brasil Participativo","text":""},{"location":"#sobre-o-projeto","title":"Sobre o Projeto","text":"

Bem-vindo ao reposit\u00f3rio do Squad 5 de M\u00e9todos e Desenvolvimento de Software \u2013 An\u00e1lise de Sentimento e Tend\u00eancias Governamentais do Brasil Participativo!

Aqui voc\u00ea encontrar\u00e1 toda a documenta\u00e7\u00e3o, c\u00f3digo e informa\u00e7\u00f5es relevantes sobre o desenvolvimento deste projeto. O projeto foi concebido para atender \u00e0 necessidade de uma vis\u00e3o aprofundada sobre as opini\u00f5es e percep\u00e7\u00f5es populares expressas na plataforma Brasil Participativo. A partir de coment\u00e1rios e discuss\u00f5es na plataforma, buscamos identificar as principais emo\u00e7\u00f5es e temas discutidos pela popula\u00e7\u00e3o, oferecendo uma vis\u00e3o panor\u00e2mica e detalhada das tend\u00eancias de opini\u00e3o p\u00fablica.

Acreditamos que, ao oferecer uma an\u00e1lise clara dos sentimentos da sociedade e das principais tend\u00eancias sociais, contribu\u00edmos para uma gest\u00e3o p\u00fablica mais inclusiva, respons\u00e1vel e conectada com as reais necessidades da popula\u00e7\u00e3o. Explore as se\u00e7\u00f5es abaixo para se aprofundar nos detalhes t\u00e9cnicos e contribuir com a nossa comunidade.

"},{"location":"#desenvolvedores","title":"Desenvolvedores","text":"

Arthur Fernandes Caio Pacheco Gabriel Santos Laryssa Felix Luiz Henrique Let\u00edcia Monteiro

"},{"location":"architecture/architecture/","title":"Arquitetura","text":""},{"location":"architecture/architecture/#arquitetura","title":"Arquitetura","text":"

Para o desenvolvimento do nosso projeto, utilizaremos o framework Django como base.

"},{"location":"architecture/architecture/#diagrama-de-arquitetura","title":"Diagrama de arquitetura","text":""},{"location":"architecture/architecture/#modulos-arquiteturais","title":"M\u00f3dulos arquiteturais","text":"

A arquitetura escolhida foi uma varia\u00e7\u00e3o da arquitetura MVC (Model - View - Controller) utilizada pelo Django.

"},{"location":"architecture/architecture/#view","title":"View","text":"

Aqui \u00e9 onde os resultados s\u00e3o apresentados aos usu\u00e1rios finais:

  1. Streamlit: Ferramenta para a constru\u00e7\u00e3o de aplicativos web interativos em Python. Exibe visualmente os resultados da classifica\u00e7\u00e3o de sentimentos de forma acess\u00edvel e f\u00e1cil de interpretar.

  2. Interface Web: A conex\u00e3o entre o Streamlit e os usu\u00e1rios finais. Proporciona um meio para que os usu\u00e1rios interajam com o sistema, visualizem an\u00e1lises e dados processados.

"},{"location":"architecture/architecture/#manipulacao","title":"Manipula\u00e7\u00e3o","text":"

Esta se\u00e7\u00e3o \u00e9 respons\u00e1vel pelo processamento e prepara\u00e7\u00e3o dos dados para an\u00e1lise:

  1. Airflow: Uma plataforma de fluxo de trabalho que gerencia o fluxo de dados. Coordena a extra\u00e7\u00e3o dos dados do banco de dados e realiza transforma\u00e7\u00f5es necess\u00e1rias, garantindo que estejam prontos para o Classificador.

  2. Classificador: O n\u00facleo do sistema de an\u00e1lise de sentimentos. Utiliza engenharia de prompt para LLM's para categorizar e atribuir sentimentos (positivo, negativo, neutro) aos dados processados. \u00c9 integrado com a OpenAI API para utilizar modelos de linguagem na execu\u00e7\u00e3o da an\u00e1lise de sentimento.

"},{"location":"architecture/architecture/#dados","title":"Dados","text":"

Nessa se\u00e7\u00e3o, encontramos as fontes de dados prim\u00e1rias:

  1. PostGre: Banco de dados PostgreSQL. \u00c9 respons\u00e1vel por armazenar os dados brutos que ser\u00e3o utilizados no processo de an\u00e1lise junto com todos os dados que j\u00e1 foram analisados.

  2. Metabase: Fonte dos dados brutos com todos os coment\u00e1rios e propostas do Brasil Participativo.

"},{"location":"architecture/architecture/#tabela-de-versionamento","title":"Tabela de Versionamento","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 01/12/2024 Cria\u00e7\u00e3o inicial Caio Pacheco 2.0 10/12/2024 Arquitetura de 3 modulos Caio Pacheco"},{"location":"configuracao/configuracao/","title":"Guia de Configura\u00e7\u00e3o e Execu\u00e7\u00e3o do Projeto","text":"

Este guia fornece instru\u00e7\u00f5es detalhadas para configurar e executar o projeto Lumina. Voc\u00ea pode optar por configurar o projeto em um ambiente local ou utilizar Docker para simplificar o processo. Recomendamos o uso do Docker para uma configura\u00e7\u00e3o mais r\u00e1pida e consistente, garantindo que todos os servi\u00e7os necess\u00e1rios estejam dispon\u00edveis.

Nota: Este guia assume que voc\u00ea possui conhecimentos b\u00e1sicos de Python, Django, PostgreSQL e Docker. Se voc\u00ea n\u00e3o estiver familiarizado com essas tecnologias, recomendamos que voc\u00ea fa\u00e7a um curso introdut\u00f3rio ou leia a documenta\u00e7\u00e3o oficial antes de prosseguir.

"},{"location":"configuracao/configuracao/#pre-requisitos","title":"Pr\u00e9-requisitos","text":"

Certifique-se de ter os seguintes pr\u00e9-requisitos instalados:

"},{"location":"configuracao/configuracao/#ambiente-local","title":"Ambiente Local","text":"
  • Python 3.13 ou superior
  • PostgreSQL
  • pip
  • venv (opcional, para criar um ambiente virtual)
  • Git (opcional, para gerenciar o reposit\u00f3rio)
"},{"location":"configuracao/configuracao/#docker","title":"Docker","text":"
  • Docker
  • Docker Compose
"},{"location":"configuracao/configuracao/#configuracao-e-execucao","title":"Configura\u00e7\u00e3o e Execu\u00e7\u00e3o","text":"

Nossa aplica\u00e7\u00e3o \u00e9 composta por dois servi\u00e7os: web (Django) e db (PostgreSQL). A configura\u00e7\u00e3o e execu\u00e7\u00e3o do projeto pode ser feita de duas formas: localmente ou usando Docker. Siga as instru\u00e7\u00f5es abaixo de acordo com a sua prefer\u00eancia.

A aplica\u00e7\u00e3o utiliza a API do OpenAI par gerar an\u00e1lise de sentimentos de textos. Para utilizar a API, \u00e9 necess\u00e1rio criar uma conta no site da OpenAI e obter uma chave de API.

Voc\u00ea pode optar por desenvolver localmente ou utilizar Docker para simplificar o processo de configura\u00e7\u00e3o. A seguir, s\u00e3o apresentadas as instru\u00e7\u00f5es para cada uma das op\u00e7\u00f5es.

"},{"location":"configuracao/configuracao/#1-docker","title":"1. Docker","text":"

\u00c9 necess\u00e1rio a instala\u00e7\u00e3o do Docker e Docker Compose para executar o projeto com Docker. Voc\u00ea pode instalar o Docker Desktop para Windows e Mac ou o Docker Engine para Linux. Para instalar o Docker Compose, siga as instru\u00e7\u00f5es dispon\u00edveis na documenta\u00e7\u00e3o oficial.

"},{"location":"configuracao/configuracao/#passo-1-clonar-o-repositorio","title":"Passo 1: Clonar o reposit\u00f3rio","text":"
git clone https://github.com/unb-mds/2024-2-Squad05.git\ncd 2024-2-Squad05\n
"},{"location":"configuracao/configuracao/#passo-2-construir-e-iniciar-os-conteineres","title":"Passo 2: Construir e iniciar os cont\u00eaineres","text":"

Primeiramente, certifique-se que a instala\u00e7\u00e3o do Docker e Docker Compose foram bem sucedidas e que est\u00e3o sendo executados. Em seguida, execute o comando abaixo para construir e iniciar os cont\u00eaineres:

docker compose up --build\n
"},{"location":"configuracao/configuracao/#passo-3-verificar-logs-e-garantir-que-tudo-esta-funcionando","title":"Passo 3: Verificar logs e garantir que tudo est\u00e1 funcionando","text":"

Para verificar os logs dos cont\u00eaineres e garantir que tudo est\u00e1 funcionando corretamente, execute o comando abaixo:

docker compose logs -f\n
"},{"location":"configuracao/configuracao/#passo-4-acessar-a-aplicacao","title":"Passo 4: Acessar a aplica\u00e7\u00e3o","text":"

Acesse em: http://127.0.0.1:8000.

Dica: Para facilitar o processo de desenvolvimento, considere utilizar extens\u00f5es do VS Code como o Python e o Docker. Essas extens\u00f5es fornecem suporte avan\u00e7ado para desenvolvimento em Python e gerenciamento de cont\u00eaineres Docker diretamente do editor. Al\u00e9m disso, o Docker Desktop oferece uma interface gr\u00e1fica amig\u00e1vel para gerenciar seus cont\u00eaineres e imagens Docker.

"},{"location":"configuracao/configuracao/#2-desenvolvimento-local","title":"2. Desenvolvimento Local","text":""},{"location":"configuracao/configuracao/#passo-1-clonar-o-repositorio_1","title":"Passo 1: Clonar o reposit\u00f3rio","text":"
git clone https://github.com/unb-mds/2024-2-Squad05.git\ncd 2024-2-Squad05\n
"},{"location":"configuracao/configuracao/#passo-2-configurar-o-ambiente-virtual-e-instalar-dependencias","title":"Passo 2: Configurar o ambiente virtual e instalar depend\u00eancias","text":"

Ap\u00f3s clonar o reposit\u00f3rio, crie um ambiente virtual e instale as depend\u00eancias. Isso garante que as depend\u00eancias do projeto n\u00e3o entrem em conflito com outras aplica\u00e7\u00f5es Python instaladas no seu sistema. Execute os comandos abaixo:

python -m venv venv\n\nsource venv/bin/activate        # Para Linux/Mac\nvenv\\Scripts\\activate           # Para Windows\n

Em seguida, instale as depend\u00eancias do projeto:

pip install --upgrade pip\npip install -r requirements.txt\n
"},{"location":"configuracao/configuracao/#passo-3-configurar-o-banco-de-dados-local","title":"Passo 3: Configurar o banco de dados local","text":"

Esta etapa \u00e9 necess\u00e1ria apenas se voc\u00ea optar por desenvolver localmente. Ser\u00e1 necess\u00e1rio instalar o PostgreSQL e criar um banco de dados e um usu\u00e1rio para o projeto. Um tutorial de como fazer a instala\u00e7\u00e3o do PostgreSQL pode ser encontrado aqui.

Atualize as seguintes vari\u00e1veis no arquivo settings.py para refletir as configura\u00e7\u00f5es do seu banco de dados local:

DATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': 'lumina_db',\n        'USER': 'lumina_user',\n        'PASSWORD': 'lumina_password',\n        'HOST': '127.0.0.1',  # ou 'localhost'\n        'PORT': '5432',\n    }\n}\n
"},{"location":"configuracao/configuracao/#passo-4-executar-as-migracoes","title":"Passo 4: Executar as migra\u00e7\u00f5es","text":"

O projeto utiliza o Django ORM para gerenciar o banco de dados, ent\u00e3o \u00e9 necess\u00e1rio executar as migra\u00e7\u00f5es para criar as tabelas necess\u00e1rias. Execute os comandos abaixo:

# Criar as migra\u00e7\u00f5es iniciais\npython manage.py makemigrations\n\n# Aplicar as migra\u00e7\u00f5es no banco de dados\npython manage.py migrate\n
"},{"location":"configuracao/configuracao/#passo-5-executar-o-servidor-local","title":"Passo 5: Executar o servidor local","text":"
python manage.py runserver\n

Acesse em: http://127.0.0.1:8000.

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 09/12/2024 Cria\u00e7\u00e3o inicial Luiz Henrique 1.1 10/12/2024 Atualiza\u00e7\u00e3o das etapas Luiz Henrique 1.2 12/12/2024 Atualiza\u00e7\u00e3o das etapas Luiz Henrique"},{"location":"documentation/miro/","title":"Documenta\u00e7\u00e3o Visual","text":""},{"location":"documentation/miro/#documentacao-visual-do-miro","title":"Documenta\u00e7\u00e3o Visual do Miro","text":"

Utilizamos o Miro para criar e organizar visualmente nossas ideias e processos, facilitando a colabora\u00e7\u00e3o e o planejamento do projeto. Com ele, conseguimos mapear fluxos de trabalho, brainstorms e outras atividades essenciais, garantindo que todos os membros da equipe estejam alinhados e possam contribuir de maneira eficaz.

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 01/01/2024 Cria\u00e7\u00e3o inicial Luiz Henrique"},{"location":"documentation/productbacklog/","title":"Product Backlog","text":"O Backlog do Produto \u00e9 uma lista ordenada que re\u00fane todas as funcionalidades, melhorias e corre\u00e7\u00f5es essenciais para o desenvolvimento do produto. Trata-se de um artefato din\u00e2mico, constantemente revisado e atualizado \u00e0 medida que novas informa\u00e7\u00f5es surgem, assegurando que a equipe de desenvolvimento mantenha o foco nas tarefas de maior valor para os usu\u00e1rios e stakeholders."},{"location":"documentation/productbacklog/#tabela-de-backlog","title":"Tabela de Backlog","text":"A Tabela de Backlog apresentada a seguir lista os \u00e9picos e hist\u00f3rias de usu\u00e1rio priorizados, com as respectivas estimativas de esfor\u00e7o (Story Points) e prioridade de implementa\u00e7\u00e3o. A prioriza\u00e7\u00e3o foi realizada utilizando a t\u00e9cnica Planning Poker, onde a equipe de desenvolvimento atribui valores de prioridade baseados em consenso, considerando a import\u00e2ncia e a complexidade de cada item. Esta abordagem permite que a equipe se concentre nas tarefas mais relevantes para atender \u00e0s necessidades dos usu\u00e1rios e stakeholders. A Tabela 1 abaixo resume os principais itens do backlog do produto, enquanto a Tabela 2 apresenta uma legenda para facilitar o entendimento.

Tabela 1: Tabela de Backlog.

\u00c9pico Hist\u00f3ria de Usu\u00e1rio Story Points Prioridade PLanejamento (E01) Como cliente, eu quero saber se a opini\u00e3o sobre um determinado t\u00f3pico \u00e9 positiva, negativa ou neutra. Para poder realizar a an\u00e1lise de sentimentos. 05 Alta An\u00e1lise de Sentimentos (E02) Como cliente, eu quero saber se a opini\u00e3o sobre um determinado t\u00f3pico \u00e9 positiva, negativa ou neutra. Para poder realizar a an\u00e1lise de sentimentos. 13 Alta Visualiza\u00e7\u00e3o da An\u00e1lise (E03) Como cliente, eu quero\u00a0 visualizar por meio de gr\u00e1ficos o sentimento predominantes, de forma simples\u00a0 e claro. Para entender como aquilo impacta a popula\u00e7\u00e3o. 08 Alta T\u00f3picos Recorrentes (E04) Como cliente eu quero identificar os t\u00f3picos recorrentes em um determinado plano. Para entender quais assuntos est\u00e3o em destaque. 08 Baixa O \u00e9pico T\u00f3picos Recorrentes (E04), que tem como objetivo permitir que os clientes identifiquem t\u00f3picos recorrentes em um determinado plano para entender quais assuntos est\u00e3o em destaque, ser\u00e1 reservado para futuras vers\u00f5es do projeto. Essa decis\u00e3o se baseia na prioridade baixa atribu\u00edda a esse \u00e9pico no momento atual, considerando que os esfor\u00e7os da equipe est\u00e3o concentrados em funcionalidades com maior impacto direto para os usu\u00e1rios e stakeholders, como an\u00e1lise de sentimentos e visualiza\u00e7\u00e3o de dados. Embora seja uma funcionalidade relevante e que trar\u00e1 valor ao produto, sua implementa\u00e7\u00e3o ser\u00e1 planejada para uma etapa posterior, garantindo que as entregas priorit\u00e1rias sejam realizadas de forma eficiente e dentro dos prazos estabelecidos."},{"location":"documentation/productbacklog/#legenda","title":"Legenda","text":"Legenda Descri\u00e7\u00e3o \u00c9pico Um \u00c9pico \u00e9 uma grande funcionalidade ou objetivo de alto n\u00edvel, que \u00e9 dividido em User Stories menores para desenvolvimento. Hist\u00f3ria de Usu\u00e1rio Uma Hist\u00f3ria de Usu\u00e1rio \u00e9 uma breve descri\u00e7\u00e3o de uma funcionalidade escrita da perspectiva do usu\u00e1rio, representando uma necessidade ou desejo. Story Points Estimativa do esfor\u00e7o necess\u00e1rio para concluir a tarefa, seguindo a sequ\u00eancia de Fibonacci: 1, 2, 3, 5, 8, 13... Alta Prioridade m\u00e1xima. Deve ser desenvolvida imediatamente por oferecer alto valor ao produto. M\u00e9dia Prioridade intermedi\u00e1ria. Requer mais detalhes antes de ser implementada. Baixa Prioridade menor. Pode ser deixada para fases futuras do projeto."},{"location":"documentation/productbacklog/#story-map","title":"Story Map","text":"O Story Map \u00e9 uma ferramenta visual que organiza e prioriza as hist\u00f3rias de usu\u00e1rios, alinhando-as \u00e0 jornada do usu\u00e1rio e ao valor entregue por cada funcionalidade. Ele facilita a comunica\u00e7\u00e3o entre a equipe e os stakeholders, ajudando a identificar lacunas no desenvolvimento, conforme ilustrado a seguir. Epics Features User Stories Descri\u00e7\u00e3o An\u00e1lise de Sentimentos Extra\u00e7\u00e3o e Tratamento Eu como usu\u00e1rio desejo poder extrair dados do Metabase para utiliz\u00e1-los na an\u00e1lise de sentimentos. Criar integra\u00e7\u00e3o para extra\u00e7\u00e3o de dados do Metabase. Eu como usu\u00e1rio desejo tratar os dados para garantir a consist\u00eancia e adequa\u00e7\u00e3o \u00e0 an\u00e1lise. Implementar rotina de tratamento de dados. Eu como usu\u00e1rio desejo acessar os dados de eventos por meio de um endpoint no Django. Desenvolver endpoint de eventos no Django. Eu como usu\u00e1rio desejo acessar os dados de propostas por meio de um endpoint no Django. Desenvolver endpoint de propostas no Django. Eu como usu\u00e1rio desejo acessar os dados de coment\u00e1rios por meio de um endpoint no Django. Desenvolver endpoint de coment\u00e1rios no Django. Eu como usu\u00e1rio desejo armazenar os dados em um banco PostgreSQL para facilitar o acesso. Configurar armazenamento no PostgreSQL. Automatiza\u00e7\u00e3o do processo de coleta e armazenamento Eu como desenvolvedor desejo entender o Airflow para automatizar o fluxo de coleta e armazenamento. Estudar o funcionamento do Airflow. Eu como usu\u00e1rio desejo automatizar o processo de coleta e armazenamento de dados. Criar DAGs no Airflow para coleta e armazenamento. Classifica\u00e7\u00e3o de Dados Eu como analista desejo estudar as categorias de classifica\u00e7\u00e3o para entender melhor os dados (neutro, positivo, negativo, contributiva). Realizar estudo das categorias. Eu como usu\u00e1rio desejo utilizar a OpenAI para classificar os dados de forma autom\u00e1tica. Implementar classifica\u00e7\u00e3o de dados utilizando a OpenAI. Eu como desenvolvedor desejo automatizar o processo de classifica\u00e7\u00e3o usando o Airflow. Automatizar o processo de classifica\u00e7\u00e3o via Airflow. Eu como desenvolvedor desejo conteinerizar a automatiza\u00e7\u00e3o de classifica\u00e7\u00e3o e coleta de dados. Conteinerizar o processo de classifica\u00e7\u00e3o e coleta de dados. Visualiza\u00e7\u00e3o de An\u00e1lise Prototipa\u00e7\u00e3o do Dashboard Eu como designer desejo criar um prot\u00f3tipo de baixa fidelidade para definir a estrutura inicial do dashboard de an\u00e1lise. Criar prot\u00f3tipo de baixa fidelidade. Eu como designer desejo criar um prot\u00f3tipo de alta fidelidade para validar a apar\u00eancia e funcionalidade do dashboard. Criar prot\u00f3tipo de alta fidelidade. Eu como usu\u00e1rio desejo realizar testes no prot\u00f3tipo para garantir que o design seja funcional e intuitivo. Realizar testes no prot\u00f3tipo (Isaque \u00e9 bom de visualiza\u00e7\u00e3o). Desenvolvimento Web (Streamlit) Eu como usu\u00e1rio desejo acessar uma p\u00e1gina inicial que me apresente uma vis\u00e3o geral do sistema de an\u00e1lise de sentimento. Desenvolver a p\u00e1gina inicial. Eu como usu\u00e1rio desejo acessar uma p\u00e1gina de planos participativos para visualizar informa\u00e7\u00f5es relevantes. Desenvolver a p\u00e1gina de planos participativos. Eu como usu\u00e1rio desejo acessar um dashboard que me permita visualizar as an\u00e1lises de sentimento de forma clara e detalhada. Desenvolver o dashboard de an\u00e1lise de sentimento. Eu como usu\u00e1rio desejo que o sistema integre os dados coletados para que o dashboard esteja sempre atualizado. Implementar integra\u00e7\u00e3o com os dados coletados. Eu como desenvolvedor desejo conteinerizar a p\u00e1gina para facilitar o deploy e garantir portabilidade. Conteinerizar a p\u00e1gina. Eu como desenvolvedor desejo realizar o deploy do projeto para torn\u00e1-lo acess\u00edvel aos usu\u00e1rios finais. Realizar o deploy do projeto. As Features descritas na tabela acima foram organizadas em um board visual, que facilita o planejamento e execu\u00e7\u00e3o do projeto ao oferecer uma visualiza\u00e7\u00e3o clara das tarefas, permitindo colabora\u00e7\u00e3o em tempo real, flexibilidade para reordenar prioridades e transpar\u00eancia no acompanhamento por meio do registro de coment\u00e1rios e hist\u00f3rico de mudan\u00e7as. Isso garante maior alinhamento e efici\u00eancia entre os membros da equipe."},{"location":"documentation/productbacklog/#roadmap","title":"Roadmap","text":"O Roadmap \u00e9 um plano estrat\u00e9gico que descreve os objetivos do produto e as principais entregas ao longo do tempo. Ele define as etapas que a equipe seguir\u00e1 para alcan\u00e7ar as metas do produto, servindo como um guia para o planejamento de releases e sprints. O roadmap proporciona uma vis\u00e3o clara para todos os envolvidos no projeto, alinhando a dire\u00e7\u00e3o e as expectativas do desenvolvimento, conforme ilustrado abaixo.

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 28/11/2024 Cria\u00e7\u00e3o inicial Gabriel Pinto 1.1 01/12/2024 Estrutura\u00e7\u00e3o e atualiza\u00e7\u00e3o Gabriel Pinto 1.2 10/12/2024 Atualiza\u00e7\u00e3o do StoryMap Gabriel Pinto 1.3 11/12/2024 Atualiza\u00e7\u00e3o do Roadmap Gabriel Pinto"},{"location":"documentation/releasesnotes/","title":"Releases Notes","text":""},{"location":"documentation/releasesnotes/#releases-notes","title":"Releases Notes","text":"

(resumo individual de cada uma das sprints que fizemos at\u00e9 agora 0,1,2 Gabs/ 3,4 Lary)

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 28/11/2024 Cria\u00e7\u00e3o inicial Gabriel Pinto"},{"location":"documentation/requisitos/","title":"Requisitos","text":"Este documento descreve os requisitos do sistema s\u00e3o divididos em funcionais e n\u00e3o funcionais, conforme descrito abaixo."},{"location":"documentation/requisitos/#requisitos-funcionais","title":"Requisitos Funcionais","text":"

Os requisitos funcionais descrevem as funcionalidades espec\u00edficas que o sistema deve oferecer para atender \u00e0s necessidades do usu\u00e1rio ou ao prop\u00f3sito do software.

N\u00famero Requisito RF01 O dashboard deve mostrar de forma visual (gr\u00e1ficos/tabelas) o resultado da an\u00e1lise, auxiliando assim o usu\u00e1rio na tomada de decis\u00e3o. RF02 O dashboard deve atualizar os dados diariamente, para garantir a atualiza\u00e7\u00e3o das informa\u00e7\u00f5es. RF03 O dashboard deve conter filtros para personaliza\u00e7\u00e3o de dados e visualiza\u00e7\u00e3o de acordo com suas necessidades, como tempo e sentimento. RF04 O dashboard deve ter elementos gr\u00e1ficos interativos. RF05 O sistema deve integrar-se ao Metabase para extrair dados automaticamente. RF06 O sistema deve identificar se os sentimentos relacionados a um t\u00f3pico s\u00e3o positivos, negativos ou neutros. RF07 O sistema deve classificar os dados em categorias predefinidas, como contributivas ou irrelevantes. RF08 O sistema deve exibir os resultados da an\u00e1lise de sentimentos em gr\u00e1ficos claros e interativos. RF09 O sistema deve conter DAGs configuradas no Airflow para coleta, processamento e armazenamento de dados. RF10 O sistema deve armazenar os dados processados em um banco de dados PostgreSQL."},{"location":"documentation/requisitos/#requisitos-nao-funcionais","title":"Requisitos N\u00e3o Funcionais","text":"

Os requisitos n\u00e3o funcionais descrevem caracter\u00edsticas de qualidade do sistema, como desempenho, usabilidade, seguran\u00e7a, e outras restri\u00e7\u00f5es relacionadas ao ambiente ou \u00e0 arquitetura.

N\u00famero Requisito RNF01 A interface do dashboard deve ser responsiva e adaptar-se a diferentes dispositivos (desktop, tablet, mobile). RNF02 O dashboard deve ter uma interface f\u00e1cil de navegar, com elementos bem organizados e uma hierarquia visual clara, incluindo menus e links. RNF03 O dashboard deve ter uma identidade visual agrad\u00e1vel. RNF04 O dashboard precisa estar dispon\u00edvel 24 horas por dia. RNF05 O dashboard precisa ser acessado na p\u00e1gina designada. RNF06 O dashboard deve funcionar nos principais navegadores: Safari, Firefox, Chrome. RNF07 O dashboard deve poder ser acessado no computador (WEB). RNF08 O c\u00f3digo deve ser bem documentado e estruturado para facilitar futuras manuten\u00e7\u00f5es e permitir a adi\u00e7\u00e3o de novas funcionalidades sem impacto negativo nas existentes. RNF09 A infraestrutura deve suportar o aumento do volume de dados sem comprometer o desempenho. RNF10 O sistema deve garantir uma disponibilidade m\u00ednima de 90% ao longo do m\u00eas. RNF11 A interface do sistema deve ser intuitiva, permitindo que um novo usu\u00e1rio compreenda seu funcionamento sem treinamento adicional. RNF12 O sistema deve ser conteinerizado para facilitar implanta\u00e7\u00e3o em diferentes ambientes. RNF13 O sistema deve atender \u00e0s regulamenta\u00e7\u00f5es de prote\u00e7\u00e3o de dados, como a LGPD.

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 28/11/2024 Cria\u00e7\u00e3o inicial Gabriel Pinto 1.1 01/12/2024 Estrutura\u00e7\u00e3o e atualiza\u00e7\u00e3o Gabriel Pinto 1.2 11/12/2024 Atualiza\u00e7\u00e3o Gabriel Pinto"},{"location":"documentation/sprints/","title":"Sprints","text":"

Descri\u00e7\u00e3o do que ser\u00e1 feito em cada Sprint:

"},{"location":"documentation/sprints/#sprint-0-e-1","title":"Sprint 0 e 1","text":"
  • Onboarding de Adapta\u00e7\u00e3o
  • Organiza\u00e7\u00e3o de Hor\u00e1rios e Disponibilidade
  • Defini\u00e7\u00e3o do Modelo de Dailys
  • Divis\u00e3o de Capacita\u00e7\u00e3o em Tecnologias (Regra do Coelho)
  • Defini\u00e7\u00e3o de Canais de Comunica\u00e7\u00e3o
  • Discuss\u00e3o sobre Poss\u00edveis Temas
  • Planejamento das Pr\u00f3ximas Sprints
"},{"location":"documentation/sprints/#sprint-2","title":"Sprint 2","text":"
  • Estruturar o README
  • Criar Milestones
  • Definir Prazos das Sprints
  • Defini\u00e7\u00e3o de Tema do Projeto
  • Planejamento de Sprints e Releases
  • Rota\u00e7\u00e3o do Cargo de Scrum Master
  • Considera\u00e7\u00f5es para Organiza\u00e7\u00e3o das Sprints
  • Estudo sobre tema do projeto
  • Defini\u00e7\u00e3o do tema e escopo do projeto
"},{"location":"documentation/sprints/#sprint-3","title":"Sprint 3","text":""},{"location":"documentation/sprints/#sprint-4","title":"Sprint 4","text":""},{"location":"documentation/sprints/#sprint-5","title":"Sprint 5","text":"
  • Finaliza\u00e7\u00e3o dos prot\u00f3tipos de baixa fidelidade
  • Atualiza\u00e7\u00e3o da documenta\u00e7\u00e3o do projeto (Storymap, User Stories, etc)
  • Estudos sobre o funcionamento da API do Brasil Participativo
  • Estudo do funcionamento do 'Streamlit'
"},{"location":"documentation/sprints/#sprint-6","title":"Sprint 6","text":"
  • In\u00edcio do desenvolvimento dos prot\u00f3tipos de alta fidelidade
  • Desenvolvimento da configura\u00e7\u00e3o do ambiente de desenvolvimento Docker
  • In\u00edcio da defini\u00e7\u00e3o da arquitetura do projeto
  • In\u00edcio da escolha das tecnologias a serem utilizadas no projeto
"},{"location":"documentation/sprints/#sprint-7","title":"Sprint 7","text":"
  • Prepara\u00e7\u00e3o para a apresenta\u00e7\u00e3o da release
  • Finaliza\u00e7\u00e3o dos prot\u00f3tipos de alta fidelidade
  • Finaliza\u00e7\u00e3o da configura\u00e7\u00e3o do ambiente de desenvolvimento Docker
  • Finaliza\u00e7\u00e3o da defini\u00e7\u00e3o da arquitetura do projeto
  • Finaliza\u00e7\u00e3o da escolha das tecnologias a serem utilizadas no projeto
  • Cria\u00e7\u00e3o da release notes
"},{"location":"documentation/sprints/#sprint-8","title":"Sprint 8","text":""},{"location":"documentation/sprints/#sprint-9","title":"Sprint 9","text":""},{"location":"documentation/sprints/#sprint-10","title":"Sprint 10","text":""},{"location":"documentation/sprints/#sprint-11","title":"Sprint 11","text":""},{"location":"documentation/sprints/#sprint-12","title":"Sprint 12","text":""},{"location":"documentation/sprints/#sprint-13","title":"Sprint 13","text":""},{"location":"documentation/sprints/#sprint-14","title":"Sprint 14","text":"

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 28/11/2024 Cria\u00e7\u00e3o inicial Gabriel Pinto 1.1 01/12/2024 Atualiza\u00e7\u00e3o das Sprints 0, 1 e 2 Gabriel Pinto 1.2 12/12/2024 Atualiza\u00e7\u00e3o das Sprints 5, 6 e 7 Luiz Henrique"},{"location":"politicas/branchs/","title":"Branchs","text":""},{"location":"politicas/branchs/#padrao-de-nomes-para-branches","title":"Padr\u00e3o de Nomes para Branches","text":"

Os nomes das branches devem seguir um padr\u00e3o composto por 3 partes:

  1. Type ou Categoria Indica o tipo de altera\u00e7\u00e3o feita no branch. Os types permitidos s\u00e3o:
  2. docs: Apenas mudan\u00e7as na documenta\u00e7\u00e3o.
  3. feat: Uma nova funcionalidade.
  4. fix: Corre\u00e7\u00e3o de um bug.
  5. perf: Mudan\u00e7a de c\u00f3digo focada em melhorar a performance.
  6. refactor: Mudan\u00e7a de c\u00f3digo que n\u00e3o adiciona uma funcionalidade nem corrige um bug.
  7. style: Altera\u00e7\u00f5es que n\u00e3o impactam o comportamento do c\u00f3digo (ex.: espa\u00e7os em branco, formata\u00e7\u00e3o, ponto e v\u00edrgula).
  8. test: Adicionar ou corrigir testes.

  9. Descri\u00e7\u00e3o Um resumo claro e objetivo do que o branch faz.

  10. N\u00famero da Issue O identificador num\u00e9rico da issue relacionada, precedido por #.

"},{"location":"politicas/branchs/#exemplos-de-nomes-de-branches","title":"Exemplos de Nomes de Branches","text":"
  • feat-login-page-12 Adiciona a funcionalidade da p\u00e1gina de login, relacionada \u00e0 issue #12.

  • refactor-edicao-colaboradores-35 Refatora o c\u00f3digo relacionado \u00e0 edi\u00e7\u00e3o de colaboradores, issue #35.

  • fix-busca-checklists-23 Corrige um bug na funcionalidade de busca em checklists, issue #23.

Seguir este padr\u00e3o ajuda a manter o controle e a organiza\u00e7\u00e3o do reposit\u00f3rio.

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 09/12/2024 Cria\u00e7\u00e3o inicial LARYSSA FELIX"},{"location":"politicas/commits/","title":"Commits","text":""},{"location":"politicas/commits/#padronizacao-de-commits","title":"Padroniza\u00e7\u00e3o de Commits","text":""},{"location":"politicas/commits/#conventional-commits","title":"Conventional Commits","text":"

Conventional Commits \u00e9 uma especifica\u00e7\u00e3o para criar mensagens de commit que sejam leg\u00edveis por humanos e m\u00e1quinas, facilitando a colabora\u00e7\u00e3o e a manuten\u00e7\u00e3o de projetos.

"},{"location":"politicas/commits/#formato","title":"Formato","text":"

<type>[scope]: <subject>

"},{"location":"politicas/commits/#exemplos","title":"Exemplos","text":"
  1. docs: update README to add developer tips
  2. feat[auth]: add password recovery flow
"},{"location":"politicas/commits/#explicacao-dos-campos","title":"Explica\u00e7\u00e3o dos Campos","text":"

1. type (tipo) Define o tipo de mudan\u00e7a realizada no commit. Os valores mais comuns incluem:

  • feat: Uma nova funcionalidade.
  • fix: Corre\u00e7\u00e3o de um bug.
  • docs: Mudan\u00e7as apenas na documenta\u00e7\u00e3o.
  • style: Altera\u00e7\u00f5es que n\u00e3o afetam a l\u00f3gica do c\u00f3digo (espa\u00e7o em branco, formata\u00e7\u00e3o, etc.).
  • refactor: Altera\u00e7\u00e3o no c\u00f3digo que n\u00e3o adiciona funcionalidades nem corrige bugs.
  • test: Adi\u00e7\u00e3o ou corre\u00e7\u00e3o de testes.
  • chore: Altera\u00e7\u00f5es em ferramentas ou processos auxiliares (ex.: scripts de build).
  • perf: Mudan\u00e7a que melhora o desempenho do c\u00f3digo.
  • ci: Altera\u00e7\u00f5es nas configura\u00e7\u00f5es de integra\u00e7\u00e3o cont\u00ednua (CI).
  • build: Altera\u00e7\u00f5es no sistema de build ou depend\u00eancias externas.
  • temp: Commit tempor\u00e1rio que ser\u00e1 removido e n\u00e3o entrar\u00e1 no changelog.

2. scope (escopo)

  • Opcional.
  • Especifica a \u00e1rea ou m\u00f3dulo impactado pela mudan\u00e7a. Exemplos:

  • [auth] para mudan\u00e7as relacionadas \u00e0 autentica\u00e7\u00e3o.

  • [api] para altera\u00e7\u00f5es na API.
  • [dashboard] para o painel administrativo.

3. subject (assunto) - Um resumo breve e claro da mudan\u00e7a, escrito em tempo presente.

  • Regras:
  • Escreva no presente (ex.: add, fix, update).
  • Min\u00fasculo no in\u00edcio.
  • Sem ponto final ao final da frase.
"},{"location":"politicas/commits/#beneficios","title":"Benef\u00edcios","text":"
  • Melhor legibilidade e consist\u00eancia em projetos colaborativos.
  • Facilita a gera\u00e7\u00e3o de changelogs autom\u00e1ticos.
  • Simplifica o entendimento do hist\u00f3rico de commits e as \u00e1reas impactadas.

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 09/12/2024 Cria\u00e7\u00e3o inicial LARYSSA FELIX 1.1 11/12/2024 Crorre\u00e7\u00f5es LARYSSA FELIX"},{"location":"politicas/conduta/","title":"Conduta","text":""},{"location":"politicas/conduta/#proposito","title":"Prop\u00f3sito","text":"

O projeto \u00e9 conduzido por estudantes como parte da disciplina M\u00e9todos de Desenvolvimento de Software da Universidade de Bras\u00edlia. Com o objetivo de promover um ambiente inclusivo e acolhedor, os participantes, tanto colaboradores quanto respons\u00e1veis, comprometem-se a atuar de forma ativa e respons\u00e1vel na execu\u00e7\u00e3o do projeto e na intera\u00e7\u00e3o com a comunidade, assegurando que todos os envolvidos tenham uma experi\u00eancia livre de ass\u00e9dio.

"},{"location":"politicas/conduta/#comportamento","title":"Comportamento","text":""},{"location":"politicas/conduta/#comportamentos-aceitaveis","title":"Comportamentos Aceit\u00e1veis:","text":"
  • Valorizar opini\u00f5es, perspectivas e experi\u00eancias diversas.
  • Incentivar a pr\u00e1tica de cr\u00edticas construtivas, tanto ao receb\u00ea-las quanto ao oferec\u00ea-las.
  • Reconhecer erros pr\u00f3prios e buscar aprendizado a partir deles.
  • Utilizar uma linguagem acolhedora e inclusiva.
  • Demonstrar empatia e respeito pelos demais membros da comunidade.
"},{"location":"politicas/conduta/#comportamentos-inaceitaveis","title":"Comportamentos Inaceit\u00e1veis:","text":"
  • Uso de linguagem ou imagens com conota\u00e7\u00e3o sexual.
  • Realizar provoca\u00e7\u00f5es, insultos, deprecia\u00e7\u00f5es ou ataques pessoais ou pol\u00edticos.
  • Praticar ass\u00e9dio, seja ele p\u00fablico ou privado.
  • Compartilhar informa\u00e7\u00f5es pessoais de terceiros sem autoriza\u00e7\u00e3o (ex.: fotos ou e-mails).
  • Adotar qualquer conduta que, de forma razo\u00e1vel, possa ser considerada inadequada em um ambiente profissional.
"},{"location":"politicas/conduta/#responsabilidades","title":"Responsabilidades","text":"

Os mantenedores do projeto s\u00e3o respons\u00e1veis por:

  • Definir e esclarecer os padr\u00f5es de conduta esperados.
  • Tomar medidas justas e corretivas em casos de comportamentos inadequados.
  • Editar, remover ou rejeitar coment\u00e1rios, confirma\u00e7\u00f5es, c\u00f3digo ou outras contribui\u00e7\u00f5es que violem este C\u00f3digo de Conduta.
  • Aplicar san\u00e7\u00f5es tempor\u00e1rias ou permanentes, como exclus\u00e3o de membros, caso suas a\u00e7\u00f5es sejam consideradas prejudiciais, ofensivas ou inadequadas.
"},{"location":"politicas/conduta/#escopo","title":"Escopo","text":"

Este C\u00f3digo de Conduta se aplica:

  • A todas as intera\u00e7\u00f5es realizadas no \u00e2mbito do projeto.
  • A situa\u00e7\u00f5es p\u00fablicas onde um indiv\u00edduo represente o projeto ou sua comunidade (ex.: uso de e-mail oficial ou participa\u00e7\u00e3o em eventos como representante do projeto).

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 09/12/2024 Cria\u00e7\u00e3o inicial LARYSSA FELIX 1.1 11/12/2024 Corre\u00e7\u00f5es LARYSSA FELIX"},{"location":"politicas/contribuicao/","title":"Contribui\u00e7\u00e3o","text":""},{"location":"politicas/contribuicao/#como-contribuir","title":"Como contribuir?","text":"

Sua participa\u00e7\u00e3o \u00e9 essencial para o sucesso do nosso projeto. Voc\u00ea pode contribuir identificando problemas, sugerindo melhorias ou realizando altera\u00e7\u00f5es no c\u00f3digo. Siga as etapas abaixo para colaborar conosco:

"},{"location":"politicas/contribuicao/#1-abra-ou-encontre-uma-issue","title":"1. Abra ou encontre uma Issue","text":"

Verifique na se\u00e7\u00e3o de Issues se j\u00e1 existe uma relacionada ao problema ou melhoria que voc\u00ea deseja abordar. Caso n\u00e3o encontre, crie uma nova issue.

Certifique-se de: - Adicionar um t\u00edtulo claro e objetivo - Fornecer uma descri\u00e7\u00e3o detalhada para que todos possam compreender o contexto - Designar pelo menos um Assignee - Adicionar as Labels apropriadas e vincul\u00e1-la \u00e0 milestone correspondente

"},{"location":"politicas/contribuicao/#2-trabalhe-na-sua-proposta","title":"2. Trabalhe na sua proposta","text":"

Ap\u00f3s abrir ou se responsabilizar por uma issue, crie uma branch para o seu trabalho. Realize as altera\u00e7\u00f5es necess\u00e1rias utilizando sua IDE preferida e siga as boas pr\u00e1ticas de desenvolvimento.

"},{"location":"politicas/contribuicao/#3-envie-um-pull-request","title":"3. Envie um Pull Request","text":"

Quando finalizar o trabalho, crie um Pull Request vinculado \u00e0 sua issue.

Lembre-se de: - Linkar o PR a sua Issue correspondente - Solicitar a revis\u00e3o de um dos respons\u00e1veis pelo projeto - Garantir que sua proposta atende aos crit\u00e9rios definidos

"},{"location":"politicas/contribuicao/#duvidas-ou-sugestoes","title":"D\u00favidas ou sugest\u00f5es?","text":"

Se tiver alguma d\u00favida ou sugest\u00e3o sobre como contribuir, n\u00e3o hesite em entrar em contato com nossa equipe. Juntos, construiremos um projeto ainda melhor!

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 08/12/2024 Cria\u00e7\u00e3o inicial LARYSSA FELIX"},{"location":"politicas/issue_tamplates/","title":"Issues","text":""},{"location":"politicas/issue_tamplates/#bug","title":"Bug","text":""},{"location":"politicas/issue_tamplates/#descricao","title":"Descri\u00e7\u00e3o","text":"

[Descreva aqui o problema ou a solicita\u00e7\u00e3o de recurso de forma clara e concisa]

"},{"location":"politicas/issue_tamplates/#etapas-para-reproduzir-o-problema","title":"Etapas para Reproduzir o Problema","text":"
  1. [Descreva a primeira etapa para reproduzir o problema]
  2. [Descreva a segunda etapa]
  3. [Continue listando as etapas, se necess\u00e1rio]
"},{"location":"politicas/issue_tamplates/#comportamento-esperado","title":"Comportamento Esperado","text":"

[Descreva o comportamento que voc\u00ea espera que ocorra]

"},{"location":"politicas/issue_tamplates/#comportamento-atual","title":"Comportamento Atual","text":"

[Descreva o comportamento atual que est\u00e1 causando o problema]

"},{"location":"politicas/issue_tamplates/#ambiente","title":"Ambiente","text":"
  • Sistema operacional: [Insira o nome e a vers\u00e3o do sistema operacional]
  • Vers\u00e3o do Speak Up: [Insira a vers\u00e3o do Speak Up que voc\u00ea est\u00e1 usando]
"},{"location":"politicas/issue_tamplates/#informacoes-adicionais","title":"Informa\u00e7\u00f5es Adicionais","text":"

[Inclua informa\u00e7\u00f5es adicionais relevantes, como logs de erro ou outras informa\u00e7\u00f5es que possam ser \u00fateis para entender e resolver o problema]

"},{"location":"politicas/issue_tamplates/#feature","title":"Feature","text":""},{"location":"politicas/issue_tamplates/#descricao-da-solicitacao-de-recurso","title":"Descri\u00e7\u00e3o da Solicita\u00e7\u00e3o de Recurso","text":"

[Descreva aqui a solicita\u00e7\u00e3o de recurso de forma clara e concisa]

"},{"location":"politicas/issue_tamplates/#beneficios","title":"Benef\u00edcios","text":"

[Explique como esse recurso ir\u00e1 beneficiar o projeto ou os usu\u00e1rios finais]

"},{"location":"politicas/issue_tamplates/#detalhes-tecnicos","title":"Detalhes T\u00e9cnicos","text":"

[Se aplic\u00e1vel, forne\u00e7a detalhes t\u00e9cnicos sobre como essa solicita\u00e7\u00e3o de recurso pode ser implementada]

"},{"location":"politicas/issue_tamplates/#informacoes-adicionais_1","title":"Informa\u00e7\u00f5es Adicionais","text":"

[Inclua informa\u00e7\u00f5es adicionais relevantes, como links para recursos externos, exemplos de outros projetos que possam ter uma implementa\u00e7\u00e3o semelhante etc.]

"},{"location":"politicas/issue_tamplates/#custom","title":"Custom","text":""},{"location":"politicas/issue_tamplates/#descricao-da-issue","title":"Descri\u00e7\u00e3o da Issue","text":"

[Descrever de forma sucinta a issue, colocando quaisquer informa\u00e7\u00f5es necess\u00e1rias para a realiza\u00e7\u00e3o dessa.]

"},{"location":"politicas/issue_tamplates/#tasks","title":"Tasks","text":"
  • [ ] Task 1
  • [ ] Task 2
  • [ ] Task 3
"},{"location":"politicas/issue_tamplates/#criterios-de-aceitacao","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o","text":"
  • [ ] Crit\u00e9rio 1
  • [ ] Crit\u00e9rio 2
  • [ ] Crit\u00e9rio 3
"},{"location":"politicas/issue_tamplates/#assignees","title":"Assignees","text":"

A issue deve ser atribu\u00edda a pelo menos um colaborador do projeto.

"},{"location":"politicas/issue_tamplates/#labels","title":"Labels","text":"

A issue deve ser marcada com uma ou mais tags adequadas, para fins de rastreamento do projeto.

"},{"location":"politicas/issue_tamplates/#milestone","title":"Milestone","text":"

A issue deve ser atribu\u00edda ao Milestone (sprint) correspondente previsto para sua execu\u00e7\u00e3o.

"},{"location":"politicas/issue_tamplates/#estimate","title":"Estimate","text":"

Deve-se definir uma estimativa de dificuldade (pontua\u00e7\u00e3o) \u00e0 issue em quest\u00e3o, levando em considera\u00e7\u00e3o os crit\u00e9rios estabelecidos no documento de contribui\u00e7\u00e3o.

"},{"location":"politicas/issue_tamplates/#pull-request","title":"Pull Request","text":""},{"location":"politicas/issue_tamplates/#o-que-mudou","title":"O que mudou?","text":"

Qual foi a mudan\u00e7a significativa para que haja um Pull Request? - [ ] Documenta\u00e7\u00e3o atualizada - [ ] Novo arquivo (mudan\u00e7a que adiciona funcionalidade) - [ ] Corre\u00e7\u00e3o de bug (mudan\u00e7a que N\u00c3O muda funcionalidade) - [ ] Mudan\u00e7a decisiva no arquivo (corre\u00e7\u00e3o ou recurso que faz com que funcionalidade existente seja alterada)

"},{"location":"politicas/issue_tamplates/#descricao_1","title":"Descri\u00e7\u00e3o","text":"

Por favor, fa\u00e7a um resumo do que mudou e qual(is) issue(s) foi(ram) resolvida(s). Liste tamb\u00e9m todas as depend\u00eancias necess\u00e1rias para essa mudan\u00e7a.

"},{"location":"politicas/issue_tamplates/#close","title":"Close","text":"Issue T\u00edtulo #numero1 t\u00edtulo 1 #numero2 t\u00edtulo 2"},{"location":"politicas/issue_tamplates/#lista-de-controle","title":"Lista de controle","text":"
  • [ ] Voc\u00ea verificou se n\u00e3o h\u00e1 outras solicita\u00e7\u00f5es de pull para a mesma atualiza\u00e7\u00e3o/altera\u00e7\u00e3o?
  • [ ] As mudan\u00e7as seguem as pol\u00edticas de commit e branch
  • [ ] Todos os membros est\u00e3o de acordo com a atualiza\u00e7\u00e3o
"},{"location":"politicas/issue_tamplates/#quem-contribuiu","title":"Quem contribuiu?","text":"

@fulano @ciclano

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 12/12/2024 Cria\u00e7\u00e3o inicial LARYSSA FELIX"},{"location":"politicas/plano_comunicacao/","title":"Plano de Comunica\u00e7\u00e3o","text":""},{"location":"politicas/plano_comunicacao/#objetivo","title":"Objetivo","text":"

Este documento tem como objetivo estabelecer um protocolo de comunica\u00e7\u00e3o claro e eficiente para o projeto Lumina, garantindo que todas as informa\u00e7\u00f5es relevantes sejam compartilhadas de forma oportuna e organizada. Ao definir os canais de comunica\u00e7\u00e3o, as ferramentas a serem utilizadas e os processos para gest\u00e3o da informa\u00e7\u00e3o, este documento visa facilitar a colabora\u00e7\u00e3o entre os membros da equipe, otimizar a tomada de decis\u00f5es e garantir o cumprimento dos objetivos do projeto.

"},{"location":"politicas/plano_comunicacao/#diretrizes-e-procedimentos-usados-para-comunicar","title":"Diretrizes e procedimentos usados para comunicar","text":"\u00cdcone Ferramenta Descri\u00e7\u00e3o GitHub Ferramenta de versionamento, onde temos os c\u00f3digos do produto, e por ela comentamos as Issues que s\u00e3o trabalhadas. WhatsApp Utilizado para a comunica\u00e7\u00e3o r\u00e1pida e do dia a dia, para dinamizar a troca de informa\u00e7\u00f5es entre a equipe. Google Meet Utilizado para reuni\u00f5es como pr\u00e9-planejamento e planejamento da sprint, sprint review, \u00e0s vezes daily e quaisquer outras reuni\u00f5es que forem marcadas."},{"location":"politicas/plano_comunicacao/#comunicacao-geral","title":"Comunica\u00e7\u00e3o Geral","text":"

Uma comunica\u00e7\u00e3o clara e objetiva \u00e9 o pilar central para o bom desenvolvimento da disciplina e do projeto. Considerando a import\u00e2ncia desse aspecto devemos priorizar os seguintes cuidados:

  • Seguir os rituais \u00e1geis, para conseguir manter a comunica\u00e7\u00e3o eficaz do projeto;
  • Manter as partes interessadas \"alinhadas\", evitando ao m\u00e1ximo ru\u00eddos e sempre comunicando ao fazer algo novo ou altera\u00e7\u00f5es.
"},{"location":"politicas/plano_comunicacao/#gerencia-de-reunioes","title":"Ger\u00eancia de Reuni\u00f5es","text":"

Para garantir a agilidade e o cont\u00ednuo aprimoramento, nossa reuni\u00e3o semanal, realizada aos s\u00e1bados, \u00e9 estruturadas em tr\u00eas momentos colaborativos:

  1. Sprint Retrospective: Usamos um template no Miro para refletir sobre a sprint passada. Essa etapa \u00e9 fundamental para aprendermos com nossas experi\u00eancias, celebrar nossos sucessos e identificar \u00e1reas de melhoria.
  2. Sprint Review: Avaliamos as entregas da sprint anterior, comparando com os objetivos definidos no in\u00edcio. Esse momento \u00e9 crucial para obter feedback e garantir que estamos no caminho certo.
  3. Sprint Planning: Definimos as prioridades e tarefas para a pr\u00f3xima sprint, garantindo que todos os membros da equipe estejam alinhados e comprometidos com os objetivos.

Nas ter\u00e7as e quintas, realizamos atualiza\u00e7\u00f5es sobre o andamento das demandas de cada integrante da equipe durante a sprint. Esse momento \u00e9 estruturado em tr\u00eas t\u00f3picos:

  1. O que foi feito ontem
  2. O que ser\u00e1 feito hoje
  3. Quais obst\u00e1culos ou impedimentos estou enfrentando

O objetivo \u00e9 manter as comunica\u00e7\u00f5es claras e objetivas. Geralmente, essa atualiza\u00e7\u00e3o ocorre de forma ass\u00edncrona pelo WhatsApp. No entanto, quando necess\u00e1rio, realizamos encontros s\u00edncronos utilizando o Google Meet.

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 09/12/2024 Cria\u00e7\u00e3o inicial LARYSSA FELIX 1.1 11/12/2024 Corre\u00e7\u00f5es e aprimoramento LARYSSA FELIX"},{"location":"prototipo/prototipo/","title":"Prot\u00f3tipo","text":"Explore os prot\u00f3tipos do Lumina. Nesta se\u00e7\u00e3o, voc\u00ea poder\u00e1 visualizar e interagir com as diferentes vers\u00f5es do produto, desde os primeiros esbo\u00e7os at\u00e9 os prot\u00f3tipos mais recentes. Utilizamos a plataforma Figma para criar prot\u00f3tipos que visualizam de forma clara as funcionalidades e prioridades do nosso projeto."},{"location":"prototipo/prototipo/#primeira-versao","title":"Primeira vers\u00e3o","text":""},{"location":"prototipo/prototipo/#segunda-versao","title":"Segunda vers\u00e3o","text":"Ap\u00f3s a cria\u00e7\u00e3o do primeiro prot\u00f3tipo, nossa equipe realizou uma an\u00e1lise aprofundada e identificou pontos de melhoria e novas possibilidades. Refletimos sobre o que poderia agregar mais valor \u00e0 vers\u00e3o definitiva. Assim, ajustaremos funcionalidades e priorizaremos elementos que melhor atendam \u00e0s expectativas. Continuamos comprometidos com um produto final de alta qualidade! Ainda n\u00e3o estamos na vers\u00e3o final, mas estamos bem perto de alcan\u00e7\u00e1-la. J\u00e1 temos uma base s\u00f3lida, e agora estamos focados em ajustar e refinar cada detalhe. Queremos garantir que tudo esteja alinhado com o que planejamos, entregando a melhor vers\u00e3o poss\u00edvel!

Tabela de Versionamento

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) 1.0 28/11/2024 Cria\u00e7\u00e3o inicial Arthur Fernandes, Laryssa Felix e Let\u00edcia Monteiro 1.1 01/12/2024 Estrutura\u00e7\u00e3o e atualiza\u00e7\u00e3o Gabriel Pinto 1.1 13/12/2024 Atualiza\u00e7\u00e3o e inser\u00e7\u00e3o dos modelos criados Let\u00edcia Monteiro"},{"location":"registros/estudos/","title":"Conte\u00fado de Estudos","text":"

Esta p\u00e1gina apresenta os conte\u00fados utilizados como refer\u00eancia para orientar nossos estudos durante o desenvolvimento deste projeto. Foi utilizado a t\u00e9cnica do coelho apresentada pela professora Carla, onde cada integrante do grupo ficou respons\u00e1vel por pesquisar um tema e compartilhar o conhecimento adquirido com os demais integrantes.

"},{"location":"registros/estudos/#continuous-integration-ci","title":"Continuous Integration (CI)","text":"

Pesquisado por: Caio Pacheco Durante a : Sprint 0

"},{"location":"registros/estudos/#descricao","title":"Descri\u00e7\u00e3o","text":"

O objetivo deste estudo foi entender o conceito de integra\u00e7\u00e3o cont\u00ednua e como ele pode ser aplicado em nosso projeto. O Caio criou o seguinte documento para compartilhar o conhecimento adquirido.

"},{"location":"registros/estudos/#links","title":"Links","text":"
  • Integra\u00e7\u00e3o C\u00f3ntinua
"},{"location":"registros/estudos/#padronizacao-de-mensagens-de-commit-e-issues","title":"Padroniza\u00e7\u00e3o de Mensagens de Commit e Issues","text":"

Criado por: Larissa F\u00e9lix Durante a : Sprint 0

"},{"location":"registros/estudos/#descricao_1","title":"Descri\u00e7\u00e3o","text":"

O objetivo deste estudo foi entender a import\u00e2ncia de padronizar as mensagens de commit e issues e como isso pode ajudar a manter um hist\u00f3rico de altera\u00e7\u00f5es mais organizado. Ela tamb\u00e9m pesquisou sobre a import\u00e2ncia de se criar issues para cada tarefa a ser realizada como deixou uma git cheat sheet para facilitar o entendimento de comandos git. A Larissa criou o seguinte documento para compartilhar o conhecimento adquirido.

"},{"location":"registros/estudos/#links_1","title":"Links","text":"
  • Padroniza\u00e7\u00e3o de Mensagens de Commit
  • Padroniza\u00e7\u00e3o de Issues
  • Git Cheat Sheet
"},{"location":"registros/estudos/#markdown-github-pages-e-deploys-usando-github-actions","title":"Markdown, GitHub Pages e Deploys usando GitHub Actions","text":"

Pesquisado por: Arthur Fernandes Durante a : Sprint 0

"},{"location":"registros/estudos/#descricao_2","title":"Descri\u00e7\u00e3o","text":"

O objetivo deste estudo foi entender como utilizar o Markdown para criar documenta\u00e7\u00f5es e como utilizar o GitHub Pages para hospedar essas documenta\u00e7\u00f5es. Al\u00e9m disso, o Arthur tamb\u00e9m pesquisou sobre como fazer deploys autom\u00e1ticos utilizando o GitHub Actions.

"},{"location":"registros/estudos/#links_2","title":"Links","text":"
  • Markdown
  • GitHub Pages
  • GitHub Actions
"},{"location":"registros/estudos/#docker","title":"Docker","text":"

Pesquisado por: Luiz Henrique Soares Durante a : Sprint 0

"},{"location":"registros/estudos/#descricao_3","title":"Descri\u00e7\u00e3o","text":"

O objetivo deste estudo foi entender o que \u00e9 Docker e como ele pode ser utilizado para facilitar o desenvolvimento e deploy de aplica\u00e7\u00f5es. Ele encontrou um livro chamado Descomplicando Docker e assistiu a um v\u00eddeo introdut\u00f3rio sobre Docker para iniciantes, al\u00e9m de ter consultado a documenta\u00e7\u00e3o oficial do Docker. Como forma de pr\u00e1tica, ele utilizou o Play with Docker Labs para realizar alguns testes. Segue abaixo os links para o livro, v\u00eddeo e documenta\u00e7\u00e3o consultados.

"},{"location":"registros/estudos/#links_3","title":"Links","text":"
  • Docker Learning Roadmap
  • Docker Cheat Sheet
  • Livro Descomplicando Docker
  • V\u00eddeo: Introdu\u00e7\u00e3o ao Docker para iniciantes | Docker Tutorial
  • Documenta\u00e7\u00e3o Oficial do Docker
  • Play with Docker Labs
"},{"location":"registros/estudos/#documentacao-scrum-roadmap-do-produto-story-mapping-e-user-stories","title":"Documenta\u00e7\u00e3o, Scrum, Roadmap do Produto, Story Mapping e User Stories","text":"

Pesquisado por: Gabriel S Pinto Durante a : Sprint 0

"},{"location":"registros/estudos/#descricao_4","title":"Descri\u00e7\u00e3o","text":"

O objetivo deste estudo foi entender a import\u00e2ncia da documenta\u00e7\u00e3o, do Scrum, do Roadmap do Produto, do Story Mapping e das User Stories para o desenvolvimento de um projeto. Como primeiro scrum master do projeto, o Gabriel pesquisou sobre esses temas e compartilhou o conhecimento adquirido com o grupo, al\u00e9m de ter encontrado documentos com um resumo sobre cada um deles.

"},{"location":"registros/estudos/#links_4","title":"Links","text":"
  • Scrum
  • Roadmap
  • Story Mapping
  • Exemplo de outra Documenta\u00e7\u00e3o Visual
"},{"location":"registros/estudos/#funcionalidades-da-plataforma-github","title":"Funcionalidades da Plataforma GitHub","text":"

Pesquisado por: Let\u00edcia Monteiro Durante a : Sprint 0

"},{"location":"registros/estudos/#descricao_5","title":"Descri\u00e7\u00e3o","text":"

O objetivo deste estudo foi entender as funcionalidades da plataforma GitHub e como elas podem ser utilizadas para facilitar o desenvolvimento de um projeto. A Let\u00edcia pesquisou sobre os principais recursos do GitHub e encontrou alguns links que explicam como utilizar essas funcionalidades.

"},{"location":"registros/estudos/#links_5","title":"Links","text":"
  • Issues
  • Milestones
  • Labels
  • GitHub Projects
"},{"location":"registros/estudos/#analise-de-sentimentos","title":"An\u00e1lise de Sentimentos","text":"

Pesquisado por: Caio Pacheco Durante a : Sprint 2

"},{"location":"registros/estudos/#descricao_6","title":"Descri\u00e7\u00e3o","text":"

O objetivo deste estudo foi entender o que \u00e9 an\u00e1lise de sentimentos e como ela pode ser aplicada em nosso projeto. O Caio pesquisou sobre o assunto e encontrou um artigo que explica como funciona a an\u00e1lise de sentimentos e como ela pode ser utilizada para analisar a opini\u00e3o dos usu\u00e1rios sobre um determinado produto ou servi\u00e7o.

"},{"location":"registros/estudos/#links_6","title":"Links","text":"
  • An\u00e1lise de Sentimentos
"},{"location":"registros/meetings/","title":"Reuni\u00f5es","text":"O Para garantir a agilidade e o cont\u00ednuo aprimoramento, nossa reuni\u00e3o semanal, realizada aos s\u00e1bados, \u00e9 estruturadas em tr\u00eas momentos colaborativos: 1. **Sprint Retrospective:** Usamos um template no Miro para refletir sobre a sprint passada. Essa etapa \u00e9 fundamental para aprendermos com nossas experi\u00eancias, celebrar nossos sucessos e identificar \u00e1reas de melhoria. 2. **Sprint Review:** Avaliamos as entregas da sprint anterior, comparando com os objetivos definidos no in\u00edcio. Esse momento \u00e9 crucial para obter feedback e garantir que estamos no caminho certo. 3. **Sprint Planning:** Definimos as prioridades e tarefas para a pr\u00f3xima sprint, garantindo que todos os membros da equipe estejam alinhados e comprometidos com os objetivos. Nas ter\u00e7as e quintas, realizamos atualiza\u00e7\u00f5es sobre o andamento das demandas de cada integrante da equipe durante a sprint. Esse momento \u00e9 estruturado em tr\u00eas t\u00f3picos: 1. **O que foi feito ontem** 2. **O que ser\u00e1 feito hoje** 3. **Quais obst\u00e1culos ou impedimentos estou enfrentando** O objetivo \u00e9 manter as comunica\u00e7\u00f5es claras e objetivas. Geralmente, essa atualiza\u00e7\u00e3o ocorre de forma ass\u00edncrona pelo WhatsApp. No entanto, quando necess\u00e1rio, realizamos encontros s\u00edncronos utilizando o Google Meet. --- Tabela de Versionamento | Vers\u00e3o | Data | Descri\u00e7\u00e3o | Autor(es) | |--------|------------|---------------------------------------------------------------|------------------| | 1.0 | 13/12/2024 | Cria\u00e7\u00e3o inicial | LARYSSA FELIX |"},{"location":"usage/faqs/","title":"Faqs","text":""},{"location":"usage/faqs/#lorem-ipsum","title":"Lorem Ipsum","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/faqs/#subtitulo","title":"Subt\u00edtulo","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/faqs/#outro-subtitulo","title":"Outro Subt\u00edtulo","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/license/","title":"License","text":""},{"location":"usage/license/#lorem-ipsum","title":"Lorem Ipsum","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/license/#subtitulo","title":"Subt\u00edtulo","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/license/#outro-subtitulo","title":"Outro Subt\u00edtulo","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/tutorials/","title":"Tutorials","text":""},{"location":"usage/tutorials/#lorem-ipsum","title":"Lorem Ipsum","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/tutorials/#subtitulo","title":"Subt\u00edtulo","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"},{"location":"usage/tutorials/#outro-subtitulo","title":"Outro Subt\u00edtulo","text":"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..0f8724ef --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..614cde08ec09af8afcfd427f732b6c92e582552d GIT binary patch literal 127 zcmV-_0D%7=iwFn+d0S@!|8r?{Wo=<_E_iKh04<9_3V)_WXo8&M?ytk3HC}0~zlG)Vu + + + + + + + + + + + + + + + + + Faqs - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Faqs

+ +

Lorem Ipsum

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Subtítulo

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Outro Subtítulo

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/usage/license/index.html b/usage/license/index.html new file mode 100644 index 00000000..8bddf62e --- /dev/null +++ b/usage/license/index.html @@ -0,0 +1,989 @@ + + + + + + + + + + + + + + + + + + + License - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

License

+ +

Lorem Ipsum

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Subtítulo

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Outro Subtítulo

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/usage/tutorials/index.html b/usage/tutorials/index.html new file mode 100644 index 00000000..c2e70266 --- /dev/null +++ b/usage/tutorials/index.html @@ -0,0 +1,989 @@ + + + + + + + + + + + + + + + + + + + Tutorials - Lumina - Análise de Sentimentos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Tutorials

+ +

Lorem Ipsum

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Subtítulo

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+

Outro Subtítulo

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file