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..4161bc03 --- /dev/null +++ b/404.html @@ -0,0 +1,1313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Apresentacoes/apresentacao01/index.html b/Apresentacoes/apresentacao01/index.html new file mode 100644 index 00000000..52e5feef --- /dev/null +++ b/Apresentacoes/apresentacao01/index.html @@ -0,0 +1,1487 @@ + + + + + + + + + + + + + + + + + + + + + + + Apresentação 1 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Apresentação 1 - 02/11/2024

+

Introdução

+

Essa página tem como objetivo guardar/documentar a gravação da apresentação da entrega 1

+

Vídeo da apresentação

+

+Vídeo 1: Requisitos - Apresentação 1

+ +

Fonte: Víctor Schmidt +

+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.002/11/2024Criação do documentoVíctor SchmidtThales Euflauzino
1.102/11/2024Pequenas alteraçõesVíctor SchmidtThales Euflauzino
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Atas/ata01/index.html b/Atas/ata01/index.html new file mode 100644 index 00000000..9397a522 --- /dev/null +++ b/Atas/ata01/index.html @@ -0,0 +1,1597 @@ + + + + + + + + + + + + + + + + + + + + + + + Ata 1 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Reunião 23/10/2024

+

Início: 20:45 | Fim: 21:30

+ + +

Participantes Convocados

+ +

Na Tabela 1, são apresentados os participantes da reunião juntamente com os indicadores que demonstram se estão presentes ou não, onde ✅ significa que o participante está presente e ❌ significa que o participante não compareceu à reunião.

+

+

Tabela 1: Participantes Convocados e Presença na Reunião

+ + + + + + + + + +
NomeMatrículaPresente
Julia Takaki221029249
Maria Helena222006982
Thales Euflauzino222006178
Victor Guimaraes211063256
Víctor Schmidt222021924
+ +

Fonte: Víctor Schmidt

+

+

Pautas

+ + +
    +
  • Divisão das tarefas
  • +
  • Comunicação sobre organização inicial no Notion
  • +
+

Decisões

+ + +
    +
  • Foram decididos/comunicados os apps que cada um escolheu para expor o porque do app ser escolhido
  • +
  • Foram definidos os prazos das entregas
  • +
+

Compromissos

+ +

Na reunião, foram definidos compromissos para os participantes executarem com o objetivo de dar continuidade ao projeto. Os compromissos, a pessoa responsável, a data da entrega e o revisor estão especificados na Tabela 2.

+

+

Tabela 2: Compromisso dos participantes decididos da reunião

+ + + + + + + + + +
CompromissoResponsávelData de EntregaRevisor
Planejamento do CronogramaMaria Helena e Víctor Schmidt25/10/2024Todos
App EscolhidoVictor Guimaraes26/10/2024Julia Takaki
Criação do GitHub PagesThales Euflauzino24/10/2024Víctor Schmidt
Termo de Uso do Aplicativo SelecionadoVictor Guimaraes26/10/2024Julia Takaki
Ferramentas Utilizadas para o ProjetoJulia Takaki27/10/2024Víctor Schmidt
+ +

Fonte: Víctor Schmidt

+

+

Gravação da reunião

+ + +

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.023/10/2024Primeira ataVíctor SchmidtJulia Takaki
1.124/10/2024Adicionando videoVíctor SchmidtJulia Takaki
1.224/10/2024Corrigindo fontesVictor RodriguesThales Euflauzino
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Atas/ata02/index.html b/Atas/ata02/index.html new file mode 100644 index 00000000..cca07f50 --- /dev/null +++ b/Atas/ata02/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + Ata 2 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Reunião 23/10/2024

+

Início: 21:32 | Fim: 21:40

+ + +

Participantes Convocados

+ +

Na Tabela 1, são apresentados os participantes da reunião juntamente com os indicadores que demonstram se estão presentes ou não, onde ✅ significa que o participante está presente e ❌ significa que o participante não compareceu à reunião.

+

+

Tabela 1: Participantes Convocados e Presença na Reunião

+ + + + + + + + + +
NomeMatrículaPresente
Julia Takaki221029249
Maria Helena222006982
Thales Euflauzino222006178
Victor Guimaraes211063256
Víctor Schmidt222021924
+ +

Fonte: Víctor Rodrigues

+

+

Pautas

+ + +
    +
  • Divisão das tarefas
  • +
+

Decisões

+ + +
    +
  • Artefatos divididos conforme cronograma do projeto.
  • +
+

Compromissos

+ + +
    +
  • Todos se comprometerão a entregar os artefatos dentro do prazo de entrega.
  • +
+

Gravação da reunião

+ + +

Histórico de versões

+ + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.006/11/2024Estruturação inicial e preenchimentoVíctor RodriguesMaria Helena
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Planejamento-do-projeto/app-escolhido/index.html b/Planejamento-do-projeto/app-escolhido/index.html new file mode 100644 index 00000000..52773115 --- /dev/null +++ b/Planejamento-do-projeto/app-escolhido/index.html @@ -0,0 +1,1598 @@ + + + + + + + + + + + + + + + + + + + + + + + App Escolhido - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

App Escolhido

+ +

Introdução

+

No início do processo da disciplina, o grupo examinou uma série de aplicativos sugeridos por cada membro, discutindo os prós e contras de cada um. Foi feita uma análise minuciosa com base nos critérios definidos para selecionar o aplicativo que melhor se encaixasse no projeto.

+

Critérios para escolha

+
    +
  • App não foi trabalhado anteriormente na disciplina;
  • +
  • Fácil acesso ao público-alvo;
  • +
  • Disponibilidade de informações;
  • +
  • Complexidade do aplicativo.
  • +
+

Motivações de escolha

+

Com base nos critérios anteriores, o grupo se reuniu e decidiu que seria usado o Tesouro Direto. A escolha se deu por ser um aplicativo de complexidade média, porém com muitas funcionalidades para explorarmos ao longo do projeto. O público-alvo é grande e facilmente acessível, além de não ter sido utilizado para estudos na disciplina.

+

Termos de uso

+

Para realizar o projeto em conformidade com as normas legais, verificamos os termos de uso do Tesouro Direto no dia 28 de outubro de 2024. Conforme mostra a Figura 2, é vedado o uso para fins comerciais sem autorização prévia. No entanto, como o projeto tem como único e exclusivo objetivo aplicar na prática os conhecimentos adquiridos em aula, não estaremos infringindo qualquer termo.

+
Figura 2: Termo de Uso
+

Figura 2

+
+

Fonte: Tesouro Direto

+
+ +

Bibliografia

+
+

Tesouro Direto. Disponível em: https://www.tesourodireto.com.br. Acesso em 28 de outubro de 2024

+

Planejamento - Bilheteria Digital. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/planejamento/aplicativo/. Acesso em 28 de outubro de 2024.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.028/10/2024Estruturação InicialVictor RodriguesVíctor Schmidt
1.128/10/2024Adição de InformaçõesVictor RodriguesVíctor Schmidt
1.229/10/2024Adicionando Rich PictureJúlia TakakiThales Euflauzino
1.329/10/2024Adicionando Fontes e AutoresJúlia TakakiThales Euflauzino
1.412/11/2024Colocando data do termo de usoThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Planejamento-do-projeto/cronograma/index.html b/Planejamento-do-projeto/cronograma/index.html new file mode 100644 index 00000000..b3bef525 --- /dev/null +++ b/Planejamento-do-projeto/cronograma/index.html @@ -0,0 +1,2995 @@ + + + + + + + + + + + + + + + + + + + + + + + Cronograma - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Cronograma

+

O cronograma estabelece a organização temporal de todas as atividades previstas para o projeto, dividindo-as em entregas e fases específicas. Cada entrega é detalhada com uma descrição das tarefas a serem concluídas e as datas limites, de modo a garantir que o progresso do projeto se mantenha constante e que todos os membros da equipe estejam alinhados às expectativas e prazos estabelecidos.

+

Cronograma das Entregas do Projeto

+


+Tabela 1: Cronograma geral das entregas.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtividadeDescriçãoData Limite de Entrega
Entrega 1Planejamento do Projeto, equipe, Heatmap de disponibilidade dos integrantes, lista de App avaliados, App selecionado para o projeto da disciplina, cópia do Termo de Uso do aplicativo permitindo o estudo na disciplina, Ferramentas do projeto, cronograma detalhado das atividades do projeto (com data de início e fim de cada atividade, responsáveis e período de gravação da apresentação), Rich Picture06/11
Entrega 2Elicitação – Técnicas e Priorização. Perfil dos usuários, técnicas de elicitação utilizadas e que serão utilizadas, técnicas de priorização aplicadas e que serão aplicadas no projeto.24/11
Entrega 3Modelagem de Requisitos: Cenários, Léxico, Use Case, Especificação Suplementar08/12
Entrega 4Modelagem de Requisitos - Ágil (Histórias de Usuário, Backlogs, NFR Framework)15/12
Entrega 5Análise de Requisitos: Verificação e Validação29/01
Entrega 6Pós-Rastreabilidade – Gerência II19/01
Projeto FinalEntrega da apresentação do projeto final10/02
+

Autor: Maria Helena

+

Cronograma Entrega 1 - Planejamento

+

A primeira entrega foca no planejamento do projeto. Isso inclui a definição da equipe, levantamento das ferramentas, escolha do aplicativo a ser analisado e elaboração do cronograma. Também envolve o desenvolvimento de uma representação visual do projeto, como o Rich Picture, para facilitar o entendimento das principais partes interessadas.

+

Cronograma Planejado

+


+Tabela 2: Cronograma com o planejamento da primeira entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioPrazoPeríodo de revisão
HeatmapVictor RodriguesTodos22/1022/10de 22/10 a 23/10
Integrantes da EquipeThales EuflauzinoVictor Schmidt23/1025/10de 25/10 a 26/10
Documentação MKDocsThales EuflauzinoJúlia Takaki23/1025/10de 25/10 a 26/10
Estruturação do GitHub PagesThales EuflauzinoVictor Schmidt23/1024/10de 24/10 a 25/10
Cronograma PlanejadoMaria HelenaVictor Schmidt23/1025/10de 25/10 a 26/10
Lista de Apps AvaliadosTodosMaria Helena23/1025/10de 25/10 a 26/10
App EscolhidoVictor RodriguesJúlia Takaki25/1026/10de 26/10 a 27/10
Termo de Uso do aplicativo selecionadoVictor RodriguesJúlia Takaki23/1026/10de 26/10 a 27/10
Ferramentas utilizadas para o ProjetoJúlia TakakiVictor Rodrigues23/1027/10de 27/10 a 28/10
Rich Picture do ProjetoVictor SchmidtMaria Helena23/1027/10de 27/10 a 28/10
Gravação da ApresentaçãoTodosMaria Helena27/1028/1028/10
Revisão pós apresentaçãoThales EuflauzinoVictor Rodrigues07/1109/1109/11
+

Autor: Maria Helena

+

Cronograma Executado

+


+Tabela 3: Cronograma com as datas oficiais da primeira entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioEntregaPeríodo de revisão
HeatmapVictor RodriguesTodos22/1022/10de 22/10 a 23/10
Integrantes da EquipeThales EuflauzinoVictor Schmidt23/1024/10de 24/10 a 25/10
Documentação MKDocsThales EuflauzinoJúlia Takaki23/1024/10de 24/10 a 25/10
Estruturação da GitHub PagesThales EuflauzinoVictor Schmidt23/1024/10de 24/10 a 25/10
Cronograma PlanejadoMaria HelenaVictor Schmidt23/1024/10de 24/10 a 02/11
Lista de Apps AvaliadosTodosThales Euflauzino, Victor Rodrigues, Victor Schmidt23/1029/10de 29/10 a 30/10
App EscolhidoJúlia Takaki e Victor RodriguesTodos28/1028/10de 28/10 a 29/10
Termo de Uso do aplicativo selecionadoVictor RodriguesJúlia Takaki28/1028/10de 28/10 a 29/10
Ferramentas Utilizadas para o ProjetoJúlia TakakiVictor Rodrigues e Thales Euflauzino23/1028/10de 28/10 a 29/10
Rich Picture do ProjetoJúlia TakakiThales Euflauzino23/1028/10de 28/10 a 29/10
Gravação da ApresentaçãoTodosMaria Helena28/1002/1102/11
Revisão pós apresentaçãoThales EuflauzinoVictor Rodrigues12/1113/1113/11
+

Autor: Maria Helena

+

Cronograma Entrega 2 - Elicitação

+

Nesta fase, ocorre a elicitação e priorização dos requisitos. As técnicas de elicitação e priorização são selecionadas e aplicadas para definir claramente os perfis de usuários e as necessidades do projeto. Essa etapa é crucial para garantir que todos os requisitos essenciais sejam capturados de forma clara e organizada.

+

Cronograma Planejado

+


+Tabela 4: Planejamento da segunda entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioPrazoPeríodo de revisão
Definições de personas e perfis de usuárioVictor RodriguesMaria Helena02/1105/11de 22/10 a 23/10
Definição das técnicas que serão usadas no projetoMaria HelenaJúlia Takaki05/1108/11de 08/10 a 01/10
Introspecção para a elicitação dos requisitosVictor SchmidtVictor Rodrigues09/1111/11de 11/10 a 12/10
Criação dos questionáriosJúlia TakakiThales Euflauzino11/1113/11de 13/10 a 14/10
Entrevista para elicitação de requisitosThales EuflauzinoMaria Helena13/1114/11de 14/10 a 15/10
BrainstormingVictor SchmidtVictor Rodrigues15/1118/11de 18/10 a 19/10
Priorização dos requisitosJúlia TakakiVictor Rodrigues19/1121/11de 21/10 a 22/10
Gravação da ApresentaçãoTodosVictor Schmidt22/1123/1123/11
Revisão pós apresentaçãoMaria HelenaVictor Schmidt25/1125/1125/11
+

Autor: Maria Helena

+

Cronograma Executado

+


+Tabela 5: Cronograma das datas oficiais da segunda entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioEntregaPeríodo de revisão
Definições de personas e perfis de usuárioVictor RodriguesMaria Helena02/11-de 22/10 a 23/10
Definição das técnicas que serão usadas no projetoMaria HelenaJúlia Takaki05/11-de 08/10 a 09/10
Introspecção para a elicitação dos requisitosVictor SchmidtVictor Rodrigues09/11-de 11/10 a 12/10
Criação dos questionáriosJúlia TakakiThales Euflauzino11/1116/11de 16/10 a 17/10
Entrevista para elicitação de requisitosThales EuflauzinoMaria Helena13/11-de 14/10 a 15/10
BrainstormingVictor SchmidtVictor Rodrigues15/11-de 18/10 a 19/10
Priorização dos requisitosJúlia TakakiVictor Rodrigues19/11-de 21/10 a 22/10
Gravação da ApresentaçãoTodosVictor Schmidt22/11-23/11
Revisão pós apresentaçãoMaria HelenaVictor Schmidt - - -
+

Autor: Maria Helena

+

Cronograma Entrega 3 - Modelagem de Requisitos 1.1

+

A terceira entrega concentra-se na modelagem dos requisitos por meio de cenários, léxicos, casos de uso e especificações suplementares. Esta etapa visa documentar o comportamento esperado do sistema e detalhar os requisitos de maneira formal.

+

Cronograma Planejado

+


+Tabela 6: Planejamento da terceira entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioPrazoPeríodo de revisão
Modelagem de Requisitos: CenáriosVictor Rodrigues e Maria HelenaThales Euflauzino27/1130/11de 30/11 a 01/12
Modelagem de Requisitos: LéxicosJúlia Takaki e Thales EuflauzinoMaria Helena27/1130/11de 30/11 a 01/12
Modelagem de Requisitos: Use CasesVictor Schmidt e Victor RodriguesJúlia Takaki01/1205/12de 05/12 a 06/12
Modelagem de Requisitos: Especificação SuplementarThales Euflauzino e Maria HelenaVictor Schmidt01/1205/12de 06/12 a 07/12
Gravação da ApresentaçãoTodosVictor Rodrigues06/1207/1207/12
Revisão pós apresentaçãoJulia TakakiThales Euflauzino 09/12 09/12 09/12
+

Autor: Maria Helena

+

Cronograma Executado

+


+Tabela 7: Cronograma com as datas oficiais da terceira entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioEntregaPeríodo de revisão
Modelagem de Requisitos: CenáriosVictor Rodrigues e Maria HelenaThales Euflauzino27/11-de 30/11 a 01/12
Modelagem de Requisitos: LéxicosJúlia Takaki e Thales EuflauzinoMaria Helena27/11-de 30/11 a 01/12
Modelagem de Requisitos: Use CasesVictor Schmidt e Victor RodriguesJúlia Takaki01/12-de 05/12 a 06/12
Modelagem de Requisitos: Especificação SuplementarThales Euflauzino e Maria HelenaVictor Schmidt01/12-de 06/12 a 07/12
Gravação da ApresentaçãoTodosVictor Rodrigues06/12-07/12
Revisão pós apresentaçãoJulia TakakiThales Euflauzino - - -
+

Autor: Maria Helena

+

Cronograma Entrega 4 - Modelagem de Requisitos 1.2

+

A quarta entrega adota uma abordagem ágil para a modelagem de requisitos, utilizando histórias de usuário e backlog. Isso permite uma adaptação mais flexível aos requisitos, proporcionando uma visão iterativa e incremental do desenvolvimento do projeto.

+

Cronograma Planejado

+


+Tabela 8: Planejamento da quarta entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioPrazoPeríodo de revisão
Modelagem de Requisitos - Ágil: Histórias de UsuárioVictor Rodrigues e Maria HelenaThales Euflauzino10/1211/12de 11/12 a 12/12
Modelagem de Requisitos - Ágil: BacklogsJúlia Takaki e Thales EuflauzinoVictor Schmidt11/1212/12de 12/12 a 13/12
Modelagem de Requisitos - Ágil: NFR FrameworkVictor Schmidt e Victor RodriguesJúlia Takaki12/1213/12de 13/12 a 14/12
Gravação da ApresentaçãoTodosVictor Rodrigues14/1215/1215/12
Revisão pós apresentaçãoVictor RodriguesMaria Helena 15/12 15/12 15/12
+

Autor: Maria Helena

+

Cronograma Executado

+


+Tabela 9: Cronograma com as datas oficiais da quarta entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioEntregaPeríodo de revisão
Modelagem de Requisitos - Ágil: Histórias de UsuárioVictor Rodrigues e Maria HelenaThales Euflauzino10/12-de 11/12 a 12/12
Modelagem de Requisitos - Ágil: BacklogsJúlia Takaki e Thales EuflauzinoVictor Schmidt11/12-de 12/12 a 13/12
Modelagem de Requisitos - Ágil: NFR FrameworkVictor Schmidt e Victor RodriguesJúlia Takaki12/12-de 13/12 a 14/12
Gravação da ApresentaçãoTodosVictor Rodrigues14/12-15/12
Revisão pós apresentaçãoVictor RodriguesMaria Helena - - -
+

Autor: Maria Helena

+

Cronograma Entrega 5 - Análise de Requisitos

+

Aqui, a ênfase é na Verificação e Validação dos requisitos coletados. Este é o momento de garantir que os requisitos estejam completos, consistentes e que o sistema esteja alinhado com as expectativas dos usuários.

+

Cronograma Planejado

+


+Tabela 10: Planejamento da quinta entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioPrazoPeríodo de revisão
Verificação dos RequisitosMaria Helena e Júlia TakakiVictor Rodrigues21/0122/01de 22/01 a 23/01
Validação dos RequisitosThales Euflauzino e Victor SchmidtMaria Helena23/0124/01de 24/01 a 25/01
Inspeção de todos os artefatosVictor RodriguesThales Euflauzino25/0127/01de 27/01 a 28/01
Gravação da ApresentaçãoTodosJúlia Takaki28/0129/0129/01
Revisão pós apresentaçãoVictor SchmidtJulia Takaki 29/01 29/01 29/01
+

Autor: Maria Helena

+

Cronograma Executado

+


+Tabela 11: Cronograma com as datas oficiais da quinta entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioEntregaPeríodo de revisão
Verificação dos RequisitosMaria Helena e Júlia TakakiVictor Rodrigues21/01-de 22/01 a 23/01
Validação dos RequisitosThales Euflauzino e Victor SchmidtMaria Helena23/01-de 24/01 a 25/01
Inspeção de todos os artefatosVictor RodriguesThales Euflauzino25/01-de 27/01 a 28/01
Gravação da ApresentaçãoTodosJúlia Takaki28/01-29/01
Revisão pós apresentaçãoVictor SchmidtJulia Takaki - - -
+

Autor: Maria Helena

+

Cronograma Entrega 6 - Pós-Rastreabilidade

+

Nesta fase, a pós-rastreabilidade e a gestão avançada dos requisitos são abordados, permitindo que o projeto mantenha uma trilha clara de cada requisito ao longo do desenvolvimento e possibilite um acompanhamento eficiente das mudanças.

+

Cronograma Planejado

+


+Tabela 12: Planejamento da sexta entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioPrazoPeríodo de revisão
Criação do documento inicial de pós-rastreabilidadeMaria HelenaThales Euflauzino17/1218/12de 18/12 a 19/12
Pós-Rastreabilidade: Backward FormThales Euflauzino e Victor SchmidtMaria Helena19/1205/01de 05/01 ate 06/01
Pós-Rastreabilidade: Forward FormVictor Rodrigues e Júlia TakakiVictor Schmidt06/0117/01de 17/01 ate 18/01
Gravação da ApresentaçãoTodosJúlia Takaki18/0119/0119/01
Revisão pós apresentaçãoThales EuflauzinoVictor Rodrigues 19/01 19/01 19/01
+

Autor: Maria Helena

+

Cronograma Executado

+


+Tabela 13: Cronograma com as datas oficiais da sexta entrega.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioEntregaPeríodo de revisão
Criação do documento inicial de pós-rastreabilidadeMaria HelenaThales Euflauzino17/12-de 18/12 a 19/12
Pós-Rastreabilidade: Backward FormThales Euflauzino e Victor SchmidtMaria Helena19/12-de 05/01 ate 06/01
Pós-Rastreabilidade: Forward FormVictor Rodrigues e Júlia TakakiVictor Schmidt06/01-de 17/01 ate 18/01
Gravação da ApresentaçãoTodosJúlia Takaki18/01-19/01
Revisão pós apresentaçãoThales EuflauzinoVictor Rodrigues - - -
+

Autor: Maria Helena

+

Cronograma Entrega Final

+

A última etapa do cronograma é a entrega do projeto final, culminando na apresentação do trabalho desenvolvido.

+

Cronograma Planejado

+


+Tabela 14: Planejamento da entrega final.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioPrazoPeríodo de revisão
Complementos e Revisões do Projeto FinalTodos os membrosVictor Rodrigues, Maria Helena e Júlia Takaki21/0105/02de 05/02 a 06/02
Desenvolvimento de relatório das revisões e ajustes dos artefatosTodos os membrosVictor Schmidt e Thales Euflauzino01/0107/02de 07/02 a 08/02
Gravação da ApresentaçãoTodos os membrosJúlia Takaki08/0209/0209/02
+

Autor: Maria Helena

+

Cronograma Executado

+


+Tabela 15: Cronograma com as datas oficiais da entrega final.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloAutor(es)RevisorInícioEntregaPeríodo de revisão
Complementos e Revisões do Projeto FinalTodos os membrosVictor Rodrigues, Maria Helena e Júlia Takaki21/01-de 05/02 a 06/02
Desenvolvimento de relatório das revisões e ajustes dos artefatosTodos os membrosVictor Schmidt e Thales Euflauzino01/01-de 07/02 a 08/02
Gravação da ApresentaçãoTodos os membrosJúlia Takaki08/02-09/02
+

Autor: Maria Helena

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.028/10/2024Estruturação InicialMaria HelenaVíctor Schmidt
1.128/10/2024Estruturação no MkDocs e pequenas alteraçõesVíctor SchmidtMaria Helena
1.202/11/2024Correção das datas de entrega e etapas do cronograma, correção dos título das tabelasMaria HelenaThales Euflauzino
1.302/11/2024Adição de fontes e títulos das tabelasMaria HelenaThales Euflauzino
1.302/11/2024Adição das etapas de verificaçãoMaria HelenaThales Euflauzino
1.412/11/2024Corringindo fonte para autorThales EuflauzinoVictor Rodrigues
1.514/11/2024Adicionando periodo de revisão pós apresentaçõesVictor RodriguesMaria Helena
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Planejamento-do-projeto/ferramentas/index.html b/Planejamento-do-projeto/ferramentas/index.html new file mode 100644 index 00000000..9729f9ef --- /dev/null +++ b/Planejamento-do-projeto/ferramentas/index.html @@ -0,0 +1,1553 @@ + + + + + + + + + + + + + + + + + + + + + + + Ferramentas - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ferramentas Utilizadas

+

Introdução

+

Este documento apresenta as ferramentas que estamos utilizando para facilitar tanto a criação quanto a apresentação das atividades do grupo 05. A Tabela 1 lista essas ferramentas, abrangendo softwares e plataformas que otimizam o desenvolvimento e a comunicação do projeto. Nossa organização e planejamento foram inspirados no trabalho realizado pela Economia DF durante o semestre de 2023/2. Também oferecemos uma breve explicação sobre a função de cada ferramenta e como irão atuar para alcançar os objetivos e resultados esperados do projeto.

+
+

Tabela 1: Ferramentas utilizadas

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FerramentasDescrição
GitHub: Utilizado para documentar artefatos do projeto [1].
Canva: Ferramenta utilizada para montar apresentações e diagramas [2].
Google Docs: Criação e edição de tabelas e listas [3].
Microsoft Teams: Utilizado para as reuniões da equipe [4].
Whatsapp: Ferramenta principal de comunicação da equipe [5].
Visual Studio Code: Ferramenta de programação e edição dos arquivos de documentação [6].
MkDocs: Criação e edição do GitPages do projeto [7].
Google Planilhas: Criação de planilhas relacionadas ao cronograma e horários [8].
Notion: Organização de atas e cronograma [9].
+ +

Autor: Júlia Takaki, 2024.

+
+ +

Referências Bibliográficas

+
+

[1] GitHub. Disponível em: https://docs.github.com/pt. Acesso em: 29 de Out. de 2024.

+

[2] Canva. Disponível em: https://www.canva.com/. Acesso em: 29 de Out. de 2024.

+

[3] GoogleDocs. Disponível em: https://www.google.com/intl/pt-BR/docs/about/. Acesso em: 29 de Out. de 2024.

+

[4] Microsoft Teams. Disponível em: https://www.microsoft.com/pt-br/microsoft-teams/group-chat-software. Acesso em: 29 de Out. de 2024.

+

[5] Whatsapp. Disponível em: https://www.whatsapp.com/?lang=pt_br. Acesso em: 29 de Out. de 2024.

+

[6] Visual Studio Code. Disponível em: https://code.visualstudio.com/. Acesso em: 29 de Out. de 2024.

+

[7] MkDocs. Disponível em: https://www.mkdocs.org/. Acesso em: 29 de Out. de 2024.

+

[8] Google Planilhas. Disponível em: https://www.google.com/intl/pt-BR/sheets/about/. Acesso em: 29 de Out. de 2024.

+

[9] Notion. Disponível em: https://www.notion.so/pt. Acesso em: 29 de Out. de 2024. +

+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.029/10/2024Criação da página de ferramentas.Júlia TakakiVictor Rodrigues e Thales Euflauzino
1.112/11/2024Corringindo fonte para autorThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Planejamento-do-projeto/heatmap/index.html b/Planejamento-do-projeto/heatmap/index.html new file mode 100644 index 00000000..f78ab600 --- /dev/null +++ b/Planejamento-do-projeto/heatmap/index.html @@ -0,0 +1,1503 @@ + + + + + + + + + + + + + + + + + + + + + + + Heatmap - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Heatmap

+ +

Introdução

+

Para o desenvolvimento do projeto, é indispensável a reunião dos membros para encontros de planejamento e gravações de entregas. Pensando em facilitar o processo de agendamento dessas reuniões, foi elaborado o heatmap de disponibilidade dos membros.

+

Como representado pela Figura 1, as células com o número 0 representam 0 membros disponíveis, enquanto as células com 5 membros indicam os horários possíveis para a reunião da equipe.

+
Figura 1: Heatmap de disponibilidade do grupo 5
+

heatmap

+ + +

Resultados

+

A partir da análise do heatmap preenchido pelos membros do grupo, ficaram reservados para reunião os dias de quarta-feira às 20:30 e/ou sábado às 14:00

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.028/10/2024Estruturação InicialVictor RodriguesThales Euflauzino
1.131/10/2024Adicionando horário das reuniõesThales EuflauzinoVíctor Schmidt
1.212/11/2024Corringindo fonte para autorThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Planejamento-do-projeto/lista-apps-avaliados/index.html b/Planejamento-do-projeto/lista-apps-avaliados/index.html new file mode 100644 index 00000000..3a1307f9 --- /dev/null +++ b/Planejamento-do-projeto/lista-apps-avaliados/index.html @@ -0,0 +1,1725 @@ + + + + + + + + + + + + + + + + + + + + + + + Lista de apps avaliados - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Aplicativos avaliados

+

Introdução

+

Na fase inicial do projeto, os estudantes selecionaram individualmente aplicativos do governo ou de comunidades. Essa escolha tinha como propósito apresentar sugestões para o aplicativo a ser analisado em conjunto durante a disciplina. A Tabela 1 fornece detalhes sobre os websites/aplicativos avaliados por cada membro da equipe.

+
+

Tabela 1: Tabela de aplicativos avaliados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Aplicativo avaliadoAvaliador
Tesouro DiretoJúlia Takaki
Quinto AndarMaria Helena
Meu SUS DigitalThales Euflauzino
Google ChromeVictor Hugo
eOuve - Juiz de ForaVíctor Schmidt
+ +

Autor: Thales Euflauzino, 2024

+
+ +

Tesouro Direto

+

O Tesouro Direto é uma iniciativa desenvolvida pelo Governo Federal do Brasil que visa tornar mais acessível o investimento em títulos públicos para os cidadãos. Por meio da plataforma, é possível fazer o investimento diretamente em títulos do Tesouro Nacional, facilitando o planejamento financeiro para prazos variados. O aplicativo permite que os usuários acompanhem suas carteiras de investimentos, verifiquem os rendimentos, consultem os preços atualizados dos títulos e acessem o histórico de operações. A escolha deste aplicativo se baseou nos seguintes critérios:

+
    +
  • +

    Requisito: Por ser um aplicativo governamental se encaixa nos requisitos da disciplina.

    +
  • +
  • +

    Novidade: O aplicativo não foi analisado nos semestres anteriores.

    +
  • +
  • +

    Complexidade: O aplicativo conta com diversas funcionalidades e, em decorrência disso, requer uma análise mais complexa.

    +
  • +
  • +

    Público-alvo amplo: O aplicativo é amplamente utilizado por diversos usuários, tornando-o mais acessível para análise e coleta de feedback.

    +
  • +
+

Quinto Andar

+

O Quinto Andar é uma plataforma que facilita o encontro de imóveis para alugar ou comprar em várias regiões do Brasil. Por meio dela, usuários podem buscar imóveis com filtros por características e localidade, além de anunciar seus próprios imóveis para venda ou aluguel. A plataforma conecta pessoas interessadas em comprar ou alugar com proprietários e vendedores, tornando o processo mais rápido e acessível. A escolha da plataforma foi feita levando em conta os seguintes pontos:

+
    +
  • +

    Requisito: Alinha-se ao escopo de análise de software proposto pela disciplina.

    +
  • +
  • +

    Novidade: O aplicativo ainda não foi analisado por grupos anteriores da disciplina.

    +
  • +
  • +

    Complexidade: Sendo um e-commerce voltado para o mercado imobiliário, o aplicativo apresenta funcionalidades específicas e complexas, representando um objeto de estudo promissor.

    +
  • +
  • +

    Público-alvo amplo: A plataforma Quinto Andar atende adultos no Brasil interessados em anunciar ou buscar imóveis. É um dos aplicativos mais populares do setor, com mais de 1 milhão de downloads no Google Play.

    +
  • +
+

Meu SUS Digital

+

O Meu SUS Digital é uma plataforma criada pelo Governo Federal do Brasil para centralizar os dados de saúde dos cidadãos no Sistema Único de Saúde (SUS). Através dela, qualquer pessoa cadastrada no gov.br pode acessar facilmente seu cartão único de saúde (CNS), cartão de vacinas, informações sobre exames agendados ou realizados, medicamentos prescritos e consultas no SUS, entre outras funcionalidades. O aplicativo foi analisado pelo estudante Thales Euflauzino e a escolha foi feita levando em conta os seguintes pontos:

+
    +
  • +

    Requisito: O aplicativo é do governo, se encaixando nos requisitos da disciplina.

    +
  • +
  • +

    Novidade: O aplicativo não foi analisado nos semestres anteriores.

    +
  • +
  • +

    Complexidade: O aplicativo conta com diversas operações/funcionalidades com diferentes complexidades.

    +
  • +
  • +

    Público-alvo amplo: O aplicativo é amplamente utilizado por diversos tipos de pessoas, sendo assim, de fácil acesso para possíveis pesquisas com usuários.

    +
  • +
+

Google Chrome

+

O Google Chrome é um navegador desenvolvido pela Google, amplamente utilizado em dispositivos móveis e desktops ao redor do mundo. Ele oferece uma plataforma robusta e versátil para navegação na web, contando com funcionalidades como sincronização de dados entre dispositivos, suporte para extensões, e recursos de privacidade e segurança avançados. A escolha desse navegador foi feita com base nos seguintes critérios:

+
    +
  • +

    Requisito: se encaixa no escopo de análise de software proposto pela disciplina.

    +
  • +
  • +

    Novidade: O App recebe atualizações constantes, garantindo que análises anteriores possam ser enriquecidas com novas funcionalidades e recursos.

    +
  • +
  • +

    Complexidade: O navegador apresenta uma estrutura complexa, com diversas funcionalidades, desde a navegação básica até recursos avançados de desenvolvedor, demandando uma análise detalhada.

    +
  • +
  • +

    Público-alvo amplo: É utilizado por uma vasta gama de usuários, de diferentes faixas etárias e perfis, tornando-se uma escolha acessível para a coleta de feedback e análise de usabilidade.

    +
  • +
+

eOuve Juiz de Fora

+

O eOuve é um aplicativo desenvolvido pela Prefeitura de Juiz de Fora para promover a comunicação direta entre a administração municipal e os cidadãos. Por meio desta plataforma, os moradores podem registrar suas solicitações, como denúncias de problemas públicos, sugestões e elogios, proporcionando uma forma prática e eficaz de participação cidadã. O aplicativo permite o envio de fotos, descrição detalhada dos problemas, além de possibilitar o acompanhamento do status das solicitações, o que reforça a transparência e a eficiência na gestão pública. A escolha do eOuve para análise se baseou nos seguintes critérios:

+
    +
  • +

    Requisito: O aplicativo atende aos requisitos da disciplina por ser uma ferramenta governamental de comunicação com os cidadãos.

    +
  • +
  • +

    Novidade: Por ser atualizado regularmente, o eOuve incorpora novas funcionalidades e melhorias, o que permite uma análise sempre atualizada e enriquecida.

    +
  • +
  • +

    Complexidade: O aplicativo oferece diversas funcionalidades, como o registro de solicitações, envio de imagens, e acompanhamento em tempo real das demandas, exigindo uma análise detalhada de seus recursos e usabilidade.

    +
  • +
  • +

    Público-alvo amplo: O eOuve é utilizado por uma ampla faixa de moradores de Juiz de Fora, facilitando a coleta de feedback e análise de usabilidade, já que é acessível e relevante para diversos perfis de cidadãos.

    +
  • +
+

Bibliografia

+
+

Meu SUS Digital. Google Play, 2024. Disponível em: https://play.google.com/store/apps/details?id=br.gov.datasus.cnsdigital&hl=pt_BR Acesso em: 25 de outubro de 2024

+

Google Chrome. Google Play, 2024. Disponível em: https://play.google.com/store/apps/details?id=com.android.chrome&hl=pt_BR. Acesso em: 28 de outubro de 2024.>

+

Tesouro Direto. Google Play, 2024. Disponível em: https://play.google.com/store/apps/details?id=br.gov.fazenda.tesouro.td&hl=pt_BR. Acesso em: 28 de outubro de 2024.

+

eOuve. Prefeitura de Juiz de Fora, 2024. Disponível em: https://eouve.com.br/#/. Acesso em: 29 de outubro de 2024.

+

Quinto Andar. Google Play, 2024. Disponível em: https://play.google.com/store/apps/details?id=br.com.quintoandar.inquilinos&hl=pt&gl=BR. Acesso em: 31 de outubro de 2024.

+
+

Histórico de Versão

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.028/10/2024Criação do documento e informações do Meu SUS DigitalThales EuflauzinoVictor Hugo
1.128/10/2024Informações Google ChromeVictor HugoVíctor Schmidt
1.228/10/2024Informações Tesouro DiretoJúlia TakakiThales Euflauzino
1.329/10/2024Informações eOuve Juiz de ForaVíctor SchmidtThales Euflauzino
1.429/10/2024Informações Quinto AndarMaria HelenaVíctor Schmidt
1.531/10/2024Adicionando Referência Bibliográfica Quinto AndarMaria HelenaVíctor Schmidt
1.612/11/2024Corringindo fonte para autorThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Planejamento-do-projeto/rich-picture/index.html b/Planejamento-do-projeto/rich-picture/index.html new file mode 100644 index 00000000..db879746 --- /dev/null +++ b/Planejamento-do-projeto/rich-picture/index.html @@ -0,0 +1,1513 @@ + + + + + + + + + + + + + + + + + + + + + + + Rich Picture - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Rich Picture

+

Introdução

+

Rich Picture é uma ferramenta visual para expressar ideias e analisar problemas, tudo isso de forma informal e de fácil entendimento. No contexto da engenharia de software, ele é utilizado para abstrair o funcionamento de sistemas de software e se apresenta na forma de um diagrama com alguns elementos básicos como: atores, funcionalidades, armazenamento de dados, fluxo de dados e limites do sistema. 1

+

Metodologia e Ferramentas

+

A aplicação Canva foi utilizada para elaborar tanto o richpicture quanto sua legenda que podem ser vistas na Figura 1 e todas as ilustrações usadas são da mesma plataforma.

+

Figura 1: Richpicture versão 1.

+

Figura 1: Rich Picture

+
+

Autor: Júlia Takaki

+
+ +

Referências

+
+

1. SERRANO, Maurício; SERRANO, Milene. Requisitos - Aula 4. Aprender 3. Distrito Federal, 2016. Disponível em: <https://aprender3.unb.br/pluginfile.php/2972425/mod_resource/content/4/Requisitos%20-%20Aula%2004%20-%20Parte%202%20RichPicture.pdf>. Acesso em: 28/10/2024.

+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.029/10/2024Adição da primeira versão do richpictureJúlia TakakiThales Euflauzino
1.102/11/2024Adicionando introdução e motodologiaThales EuflauzinoVíctor Schmidt
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/Distribuicao_100_reais_pergunta.pdf b/assets/Distribuicao_100_reais_pergunta.pdf new file mode 100644 index 00000000..8b6ab692 Binary files /dev/null and b/assets/Distribuicao_100_reais_pergunta.pdf differ diff --git a/assets/RichPictureTesouroDireto.png b/assets/RichPictureTesouroDireto.png new file mode 100644 index 00000000..c52b69e3 Binary files /dev/null and b/assets/RichPictureTesouroDireto.png differ diff --git a/assets/Termo_de_Consentimento_Brainstorm.pdf b/assets/Termo_de_Consentimento_Brainstorm.pdf new file mode 100644 index 00000000..d531d050 Binary files /dev/null and b/assets/Termo_de_Consentimento_Brainstorm.pdf differ diff --git a/assets/age-distribution-(tesourodireto).png b/assets/age-distribution-(tesourodireto).png new file mode 100644 index 00000000..edfac3c6 Binary files /dev/null and b/assets/age-distribution-(tesourodireto).png differ diff --git a/assets/gender-distribution-(tesourodireto).png b/assets/gender-distribution-(tesourodireto).png new file mode 100644 index 00000000..0101e811 Binary files /dev/null and b/assets/gender-distribution-(tesourodireto).png differ diff --git a/assets/header-logo-tesourodireto.png b/assets/header-logo-tesourodireto.png new file mode 100644 index 00000000..0433bd3a Binary files /dev/null and b/assets/header-logo-tesourodireto.png differ diff --git a/assets/heatmap.png b/assets/heatmap.png new file mode 100644 index 00000000..ce1f1017 Binary files /dev/null and b/assets/heatmap.png differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/inspecao-fagan.png b/assets/inspecao-fagan.png new file mode 100644 index 00000000..319a15d9 Binary files /dev/null and b/assets/inspecao-fagan.png differ 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 + +
+

+

Termo de Consentimento

+

O termo de consentimento utilizado neste grupo de foco permite o uso de imagem, áudio e dados fornecidos pelos participantes exclusivamente para fins educativos e de pesquisa.

+

Para abrir o documento completo do termo de consentimento,

+ + + + +

Bibliografia

+
+

Barbosa, S. D. J.; Silva, B. S. da; Silveira, M. S.; Gasparini, I.; Darin, T.; Barbosa, G. D. J. (2021) Interação Humano-Computador e Experiência do usuário. Cap 7. Autopublicação. ISBN: 978-65-00-19677-1.

+

Economia DF - Grupo de Foco. Disponível em: https://requisitos-de-software.github.io/2023.2-Economia-DF/elicitacao/tecnicas-perfil-usuario/grupo_de_foco/. Acesso em 19 de novembro de 2024

+
+ + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.019/11/2024Estruturação InicialThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/elicitacao/grupo5/introspeccao/index.html b/elicitacao/grupo5/introspeccao/index.html new file mode 100644 index 00000000..7017487f --- /dev/null +++ b/elicitacao/grupo5/introspeccao/index.html @@ -0,0 +1,1834 @@ + + + + + + + + + + + + + + + + + + + + + + + Introspecção - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Introspecção da Elicitação de Requisitos

+

Introdução

+

Este artefato tem como objetivo realizar uma introspecção para a elicitação dos requisitos do projeto Tesouro Direto. A técnica de introspecção consiste em uma análise pessoal e aprofundada que busca identificar elementos essenciais para o software. Nesse método, o responsável deve imaginar uma situação hipotética em que uma tarefa específica do sistema é realizada, permitindo a identificação de necessidades e funcionalidades indispensáveis. Dessa forma, os requisitos levantados são apresentados na Tabela 1 e na Tabela 2.

+

Metodologia

+

A técnica de introspecção foi aplicada individualmente por Víctor Schmidt no período de 09/11/2024 a 16/11/2024. Após essa etapa, os requisitos identificados foram organizados em duas tabelas: Tabela 1 para Requisitos Funcionais e Tabela 2 para Requisitos Não-Funcionais. Concluído o levantamento, revisamos o aplicativo do Tesouro Direto selecionado pelo grupo, verificando a presença ou ausência dos requisitos elicitados.

+

Introspecção do Autor

+

Para aplicar essa metodologia, imaginei-me em uma situação onde eu, como usuário, desejasse investir no Tesouro Direto e acessasse o aplicativo para realizar essa tarefa. Sem visualizar o aplicativo, procurei listar todas as funções essenciais que ele deveria oferecer para tornar o processo de investimento mais simples e eficiente. Além disso, considerei as dificuldades comuns que um investidor iniciante poderia enfrentar e como o aplicativo deveria abordar esses desafios, proporcionando soluções intuitivas e funcionais.

+

Esse processo de introspecção para elicitação de requisitos consiste justamente em colocar-se no lugar do usuário sem a referência visual direta do produto, buscando compreender quais funcionalidades (tanto funcionais quanto não funcionais) são fundamentais. No contexto do aplicativo do Tesouro Direto, essa abordagem me permitiu estruturar uma visão clara dos recursos necessários, levando em conta a experiência do usuário e o conhecimento prévio de funcionalidades encontradas em aplicativos semelhantes.

+

Requisitos Elicitados

+
Legenda das Tabelas:
+
    +
  • RFx: Requisito Funcional número x;
  • +
  • RNFx: Requisito Não Funcional número x;
  • +
  • ITx: Requisito número x;
  • +
+
+

Requisitos Funcionais

+

+Tabela 1 - Requisitos Funcionais.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TipoDescriçãoIDElaborado (Sim/Não)Priorização (MoSCoW)
RF1Permitir a consulta de investimentos por instituição financeira.IT1SimMust Have
RF2Permitir a simulação, realização e visualização de detalhes de investimentos nos títulos SELIC, Prefixado e Inflação.IT2SimMust Have
RF3Permitir o resgate de investimentos, considerando a instituição financeira associada.IT3SimMust Have
RF4Oferecer funcionalidade para salvar metas de investimentos (Sonhos).IT4SimShould Have
RF5Permitir simulação e planejamento de aposentadoria indicando o ano esperado de aposentadoria.IT5SimShould Have
RF6Disponibilizar consulta à taxa de custódia da B3 e taxa de administração da instituição financeira.IT6SimMust Have
RF7Incluir um simulador para ajudar o usuário a encontrar títulos adequados ao perfil dele.IT7SimCould Have
RF8Permitir a consulta de operações realizadas e agendadas.IT8SimMust Have
RF9Oferecer a funcionalidade de “Fale Conosco”.IT9SimMust Have
RF10Permitir a visualização de notificações recebidas.IT10SimShould Have
RF11Incluir funcionalidades sobre o aplicativo (avaliar, indicar para um amigo ou limpar cache).IT11SimCould Have
RF12Permitir a visualização de dados do usuário.IT12SimMust Have
RF13Implementar notificações personalizadas para lembrar o usuário de metas ou vencimento de títulos.IT13NãoShould Have
RF14Permitir a transferência automática entre investimentos com base em metas ou cenários predefinidos.IT14NãoCould Have
RF15Incluir relatórios personalizados para análise detalhada de rentabilidade e evolução de investimentos.IT16NãoShould Have
RF16Disponibilizar um recurso educativo com vídeos e artigos sobre como investir no Tesouro Direto.IT17NãoShould Have
RF17Oferecer integração com carteiras digitais para pagamento direto de investimentos.IT18NãoCould Have
RF18Incorporar alertas de mercado com base em mudanças na taxa SELIC ou inflação.IT19NãoMust Have
RF19Adicionar gamificação, como conquistas ou recompensas simbólicas ao atingir metas financeiras.IT20NãoCould Have
+

Autor: Víctor Schmidt, 2024 +

+
+

Requisitos Não Funcionais

+

+Tabela 2 - Requisitos Não Funcionais.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TipoDescriçãoIDElaborado (Sim/Não)Priorização (MoSCoW)
RNF1O sistema deve ter tempo de resposta inferior a 2 segundos para consultas básicas.IT13NãoMust Have
RNF2Garantir a segurança dos dados sensíveis do usuário conforme a LGPD.IT21SimMust Have
RNF3O aplicativo deve ser responsivo para dispositivos móveis e tablets.IT22SimMust Have
RNF4A interface deve ser intuitiva e seguir as diretrizes de acessibilidade.IT23NãoShould Have
RNF5O sistema deve permitir integrações seguras com APIs de instituições financeiras.IT24SimMust Have
RNF6Disponibilizar suporte para múltiplos idiomas (português como padrão).IT25NãoCould Have
+

Autor: Víctor Schmidt, 2024 +

+
+

Bibliografia

+
+

Bilheteria Digital - Instrospecção. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/elicitacao/tecnicas/introspeccao/. Acesso em 15 de novembro de 2024

+

SERRANO, Milene; SERRANO, Maurício. Apresentação Elicitação de Requisitos - Técnicas - Priorização. Brasília: UnB Gama, s.d. 1 apresentação em slides.

+
+ + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.015/11/2024Estruturação InicialVíctor SchmidtThales Euflauzino
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/elicitacao/grupo5/perfil-usuario/index.html b/elicitacao/grupo5/perfil-usuario/index.html new file mode 100644 index 00000000..b4f73175 --- /dev/null +++ b/elicitacao/grupo5/perfil-usuario/index.html @@ -0,0 +1,1478 @@ + + + + + + + + + + + + + + + + + + + Perfil de Usuário - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Perfil de Usuário

+

Introdução

+

O perfil de usuário é uma descrição detalhada das características, comportamentos e objetivos de quem utiliza um produto, serviço ou sistema. Ele pode incluir aspectos como interesses, habilidades, faixa etária, experiência tecnológica, preferências e desafios enfrentados. Essa análise permite às equipes de design, desenvolvimento e marketing criem soluções mais personalizadas e eficientes, alinhadas às expectativas do público-alvo.

+

Metodologia

+

A definição do perfil de usuário foi realizada por meio de uma abordagem combinada que incluiu a aplicação de um questionário online, pode ser verificado em Questionario. Paralelamente, foi utilizado um site especializado em análise de tráfego para validar e complementar os dados obtidos, permitindo identificar padrões de navegação e comportamento dos usuários.

+

Ferramenta de Tráfego

+

Ao utilizar a ferramenta de tráfego Similarweb [adicionar nas ferramentas], foi possível concluir, conforme as Figura 1 e a Figura 2, que o aplicativo é predominantemente usado por pessoas do sexo masculino e na faixa etária de 25 a 34 anos.

+
Figura 1
+

distribuição de genero

+
+

Fonte: SimilarWeb, 2024

+
+ +
Figura 2
+

distribuição de idade

+
+

Fonte: SimilarWeb, 2024

+
+ +

Definição do Perfil

+

Após uma análise das respostas, foi traçado um Perfil de Usuário para o aplicativo com as seguintes descrições:

+
    +
  • Gênero:
  • +
  • Idade:
  • +
  • Experiência:
  • +
  • Atitudes:
  • +
  • Tarefas primárias:
  • +
+

Bibliografia

+
+

BARBOSA, S. D. J.; SILVA, B. S. Interação Humano-Computador. Rio de Janeiro: Elsevier, 2011.

+

BARROS, Philipe de Sousa. Perfil do Usuário. Repositório da disciplina de Requisitos de Software da Universidade de Brasília, 2022. Disponível em: https://requisitos-de-software.github.io/2022.2-Grasshopper/elicitacao/perfil-do-usuario/. Acesso em: 19 nov. 2024.

+

HENRIQUE, M. et al. Perfil do Usuário. Repositório da disciplina de Requisitos de Software da Universidade de Brasília, 2023. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/elicitacao/perfil_de_usuario/. Acesso em: 19 nov. 2024.

+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.019/11/2024Estruturação InicialVíctor RodriguesThales Euflauzino
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/elicitacao/grupo5/personas/index.html b/elicitacao/grupo5/personas/index.html new file mode 100644 index 00000000..b6c05769 --- /dev/null +++ b/elicitacao/grupo5/personas/index.html @@ -0,0 +1,1563 @@ + + + + + + + + + + + + + + + + + + + Personas - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Personas

+

Introdução

+

Personas são representações fictícias de usuários criadas para ajudar equipes de design e desenvolvimento a compreender melhor o público-alvo e suas necessidades. Essas representações são baseadas em dados reais, combinando informações demográficas, comportamentais e psicográficas, e têm como objetivo facilitar a empatia e a tomada de decisões centradas no usuário. Ao criar personas, é possível personalizar soluções, melhorar a comunicação entre equipes e garantir que o produto atenda às expectativas dos diferentes tipos de usuários.

+

Metodologia

+

A construção das personas seguiu uma metodologia estruturada em três etapas principais:

+
    +
  1. +

    Coleta e Análise de Dados: Utilizamos informações obtidas a partir de questionários aplicados aos usuários, combinadas com dados de ferramentas de análise de tráfego, como Similarweb. Os dados obtivos permitiram identificar padrões de comportamento e características demográficas, como idade, sexo e preferências de uso do aplicativo.

    +
  2. +
  3. +

    Definição das Personas: Com base nas análises realizadas, criamos cinco personas principais: quatro que representam diferentes tipos de usuários (primários e secundários) e uma antipersona, que simboliza o público que não é o foco do sistema. Cada persona recebeu um nome fictício, características detalhadas, uma breve história e objetivos, tornando-as representações completas e fáceis de compreender.

    +
  4. +
  5. +

    Visualização e Validação: Para ilustrar as personas, utilizamos a ferramenta This Person Doesn't Exist para gerar imagens fictícias e representá-las visualmente. As personas foram compartilhadas com a equipe para validação, garantindo que refletem adequadamente os perfis de usuários identificados e são úteis para o processo de design.

    +
  6. +
+

Elenco

+

Persona Primária 1

+

Nome: +Idade: +Gênero: +Profissão: +Escolaridade: +Habilidades: +Afinidade com tecnologia: +Relacionamento: +Objetivo: +Tarefas: +Requisitos: +Expectativa:

+

Persona Primária 2

+

Nome: +Idade: +Gênero: +Profissão: +Escolaridade: +Habilidades: +Afinidade com tecnologia: +Relacionamento: +Objetivo: +Tarefas: +Requisitos: +Expectativa:

+

Persona Secundária 1

+

Nome: +Idade: +Gênero: +Profissão: +Escolaridade: +Habilidades: +Afinidade com tecnologia: +Relacionamento: +Objetivo: +Tarefas: +Requisitos: +Expectativa:

+

Persona Secundária 2

+

Nome: +Idade: +Gênero: +Profissão: +Escolaridade: +Habilidades: +Afinidade com tecnologia: +Relacionamento: +Objetivo: +Tarefas: +Requisitos: +Expectativa:

+

Antipersona 1

+

Nome: +Idade: +Gênero: +Profissão: +Escolaridade: +Habilidades: +Afinidade com tecnologia: +Relacionamento: +Objetivo: +Tarefas: +Requisitos: +Expectativa:

+

Referências Bibliográficas

+
    +
  1. Imagem gerada através da aplicação This Person Doesn't Exist. Disponível em: https://this-person-does-not-exist.com/. Acesso em: 20 de nov. de 2024.
  2. +
+

Bibliografia

+
+

BARBOSA, S. D. J.; SILVA, B. S. Interação Humano-Computador. Rio de Janeiro: Elsevier, 2011.

+

BARROS, Philipe de Sousa. Personas. Repositório da disciplina de Requisitos de Software da Universidade de Brasília, 2022. Disponível em: https://requisitos-de-software.github.io/2023.2-Economia-DF/elicitacao/personas/. Acesso em: 19 nov. 2024.

+

HENRIQUE, M. et al. Personas. Repositório da disciplina de Requisitos de Software da Universidade de Brasília, 2023. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/elicitacao/personas/. Acesso em: 19 nov. 2024.

+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutorRevisor
1.019/11/2024Estruturação InicialVíctor RodriguesThales Euflauzino
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..2d219b58 --- /dev/null +++ b/index.html @@ -0,0 +1,1501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + +
+
+ + + + + + + +

Grupo 05

+

Figura 1: Logo do Tesouro Direto

+

Fonte: Tesouro Direto

+ +

Esta página é um espaço dedicado à documentação de todos os artefatos desenvolvidos pelo Grupo 05 na disciplina de Requisitos de Software da Universidade de Brasília, Campus Gama (FGA-UnB) ao longo do segundo semestre de 2024. O objetivo do projeto é fazer a avaliação sobre requisitos do aplicativo Tesouro Direto. O aplicativo, cuja logo está explicitada na Figura 1, desenvolvido pela Secretaria do Tesouro Nacional do Brasil em parceria com a B3, tem o objetivo de democratizar a compra e venda de títulos públicos federais para pessoas físicas de forma 100% online.

+

👨‍💻 Desenvolvedores

+ + +

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.024/10/2024Criação do GitHub PagesThales EuflauzinoVíctor Schmidt
1.130/10/2024Adição das informações do app escolhidoThales EuflauzinoVíctor Schmidt
+ + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..d8ecef7a --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Grupo 05","text":"

Figura 1: Logo do Tesouro Direto

Fonte: Tesouro Direto

Esta p\u00e1gina \u00e9 um espa\u00e7o dedicado \u00e0 documenta\u00e7\u00e3o de todos os artefatos desenvolvidos pelo Grupo 05 na disciplina de Requisitos de Software da Universidade de Bras\u00edlia, Campus Gama (FGA-UnB) ao longo do segundo semestre de 2024. O objetivo do projeto \u00e9 fazer a avalia\u00e7\u00e3o sobre requisitos do aplicativo Tesouro Direto. O aplicativo, cuja logo est\u00e1 explicitada na Figura 1, desenvolvido pela Secretaria do Tesouro Nacional do Brasil em parceria com a B3, tem o objetivo de democratizar a compra e venda de t\u00edtulos p\u00fablicos federais para pessoas f\u00edsicas de forma 100% online.

"},{"location":"#desenvolvedores","title":"\ud83d\udc68\u200d\ud83d\udcbb Desenvolvedores","text":"ThalesEuflauzino V\u00edctorSchmidt MariaHelena J\u00faliaTakaki VictorHugo"},{"location":"#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 24/10/2024 Cria\u00e7\u00e3o do GitHub Pages Thales Euflauzino V\u00edctor Schmidt 1.1 30/10/2024 Adi\u00e7\u00e3o das informa\u00e7\u00f5es do app escolhido Thales Euflauzino V\u00edctor Schmidt"},{"location":"tutorial/","title":"Instala\u00e7\u00e3o e Comandos B\u00e1sicos do MkDocs","text":""},{"location":"tutorial/#1-instalando-o-mkdocs-e-o-tema-do-projeto","title":"1. Instalando o MkDocs e o tema do projeto","text":"

Primeiro, \u00e9 necess\u00e1rio ter o Python e o pip instalados. Com eles prontos, instale o MkDocs utilizando o seguinte comando:

pip install mkdocs mkdocs-material\n
"},{"location":"tutorial/#2-iniciando-um-projeto-mkdocs","title":"2. Iniciando um Projeto MkDocs","text":"

Para criar um novo projeto com MkDocs, use:

mkdocs new nome_do_projeto\ncd nome_do_projeto\n
"},{"location":"tutorial/#3-visualizando-o-site-localmente","title":"3. Visualizando o Site Localmente","text":"

Dentro do diret\u00f3rio do projeto, execute o comando abaixo para iniciar o servidor de desenvolvimento e visualizar seu site localmente:

mkdocs serve\n

Ap\u00f3s isso, acesse http://127.0.0.1:8000 no navegador para ver o site.

"},{"location":"tutorial/#4-criando-a-documentacao","title":"4. Criando a Documenta\u00e7\u00e3o","text":"

Com o site configurado, adicione e organize suas p\u00e1ginas no arquivo mkdocs.yml, conforme o exemplo abaixo.

"},{"location":"tutorial/#configuracao-simplificada-do-mkdocsyml","title":"Configura\u00e7\u00e3o Simplificada do mkdocs.yml","text":"

Este \u00e9 um guia b\u00e1sico e simplificado para configurar o arquivo mkdocs.yml no MkDocs.

# Nome do site (exibido no cabe\u00e7alho e t\u00edtulo da p\u00e1gina)\nsite_name: \"Meu Projeto\"\n\n# URL do site (\u00fatil para SEO e links)\nsite_url: \"https://meusite.com\"\n\n# Descri\u00e7\u00e3o do site (aparece nos metadados, bom para SEO)\nsite_description: \"Documenta\u00e7\u00e3o do Meu Projeto\"\n\n# Nome do autor (opcional, usado em metadados)\nsite_author: \"Seu Nome\"\n\n# URL do reposit\u00f3rio (opcional, aparece no cabe\u00e7alho com um link)\nrepo_url: \"https://github.com/usuario/projeto\"\nrepo_name: \"GitHub\"\n\n# Tema do site (pode ser 'material' ou outro tema que preferir)\ntheme:\n  name: \"material\"\n  palette:\n    primary: \"indigo\"\n    accent: \"deep orange\"\n\n# Navega\u00e7\u00e3o (define a ordem das p\u00e1ginas no menu)\nnav:\n  - Home: index.md\n  - Instala\u00e7\u00e3o: instalacao.md\n  - Uso:\n      - B\u00e1sico: uso_basico.md\n      - Avan\u00e7ado: uso_avancado.md\n\n# Plugins (adiciona funcionalidades extras)\nplugins:\n  - search  # Pesquisa interna do site\n  - minify:  # Otimiza HTML, CSS e JS para menor tamanho\n      minify_html: true\n\n# Extens\u00f5es Markdown (adiciona funcionalidades extras ao Markdown)\nmarkdown_extensions:\n  - toc         # Gera automaticamente uma tabela de conte\u00fados\n  - admonition  # Blocos de alerta (informa\u00e7\u00e3o, aviso, etc)\n\n# Arquivos CSS e JS extras (personalize a apar\u00eancia e comportamento)\nextra_css:\n  - \"css/estilos_custom.css\"\n\nextra_javascript:\n  - \"js/scripts_custom.js\"\n ```\n\n# Exemplos de Como Adicionar Itens\n\n### 1. Adicionando uma P\u00e1gina Simples\n\nPara adicionar uma nova p\u00e1gina simples \u00e0 navega\u00e7\u00e3o:\n\n```yaml\nnav:\n  - Home: index.md\n  - Sobre: sobre.md  # Adicionando a p\u00e1gina \"Sobre\"\n
"},{"location":"tutorial/#2-adicionando-subpaginas","title":"2. Adicionando Subp\u00e1ginas","text":"

Para organizar suas p\u00e1ginas em uma hierarquia, voc\u00ea pode adicionar subp\u00e1ginas. Aqui est\u00e1 como fazer isso:

nav:\n  - Home: index.md\n  - Tutoriais:\n      - Introdu\u00e7\u00e3o: tutoriais/introducao.md\n      - Avan\u00e7ado: tutoriais/avancado.md  # Adicionando uma subp\u00e1gina\n
"},{"location":"tutorial/#3-modificando-um-item-existente","title":"3. Modificando um Item Existente","text":"

Se voc\u00ea deseja alterar o t\u00edtulo ou o arquivo de uma p\u00e1gina existente, basta modificar o item correspondente. Por exemplo, para mudar \"Sobre\" para \"Quem Somos\":

nav:\n  - Home: index.md\n  - Quem Somos: sobre.md  # Alterando o t\u00edtulo de \"Sobre\" para \"Quem Somos\"\n
"},{"location":"tutorial/#4-removendo-um-item","title":"4. Removendo um Item","text":"

Para remover um item, basta exclu\u00ed-lo da se\u00e7\u00e3o nav. Por exemplo, se voc\u00ea quiser remover a p\u00e1gina \"Sobre\":

nav:\n  - Home: index.md\n  # - Sobre: sobre.md  # Comentado ou removido\n
"},{"location":"tutorial/#5-agrupando-itens","title":"5. Agrupando Itens","text":"

Voc\u00ea pode agrupar v\u00e1rias p\u00e1ginas em um \u00fanico item para manter a navega\u00e7\u00e3o organizada. Aqui est\u00e1 um exemplo:

nav:\n  - Home: index.md\n  - Tutoriais:\n      - Introdu\u00e7\u00e3o: tutoriais/introducao.md\n      - Avan\u00e7ado: tutoriais/avancado.md\n  - Refer\u00eancia:\n      - API: referencia/api.md\n      - FAQ: referencia/faq.md\n
"},{"location":"tutorial/#dicas-importantes","title":"Dicas Importantes","text":"
  • Caminhos Relativos: Os caminhos dos arquivos devem ser relativos \u00e0 pasta docs. Se o seu arquivo estiver em uma subpasta, inclua o caminho completo.
  • Ordena\u00e7\u00e3o: A ordem dos itens na se\u00e7\u00e3o nav reflete a ordem em que eles aparecer\u00e3o no menu de navega\u00e7\u00e3o. Basta reorganizar os itens para mudar a ordem.
  • Consist\u00eancia: Certifique-se de que os nomes dos arquivos Markdown estejam corretos e correspondam aos que voc\u00ea criou na pasta docs.
"},{"location":"Apresentacoes/apresentacao01/","title":"Apresenta\u00e7\u00e3o 1 - 02/11/2024","text":""},{"location":"Apresentacoes/apresentacao01/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Essa p\u00e1gina tem como objetivo guardar/documentar a grava\u00e7\u00e3o da apresenta\u00e7\u00e3o da entrega 1

"},{"location":"Apresentacoes/apresentacao01/#video-da-apresentacao","title":"V\u00eddeo da apresenta\u00e7\u00e3o","text":"

V\u00eddeo 1: Requisitos - Apresenta\u00e7\u00e3o 1

Fonte: V\u00edctor Schmidt

"},{"location":"Apresentacoes/apresentacao01/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 02/11/2024 Cria\u00e7\u00e3o do documento V\u00edctor Schmidt Thales Euflauzino 1.1 02/11/2024 Pequenas altera\u00e7\u00f5es V\u00edctor Schmidt Thales Euflauzino"},{"location":"Atas/ata01/","title":"Reuni\u00e3o 23/10/2024","text":"

In\u00edcio: 20:45 | Fim: 21:30

"},{"location":"Atas/ata01/#participantes-convocados","title":"Participantes Convocados","text":"

Na Tabela 1, s\u00e3o apresentados os participantes da reuni\u00e3o juntamente com os indicadores que demonstram se est\u00e3o presentes ou n\u00e3o, onde \u2705 significa que o participante est\u00e1 presente e \u274c significa que o participante n\u00e3o compareceu \u00e0 reuni\u00e3o.

Tabela 1: Participantes Convocados e Presen\u00e7a na Reuni\u00e3o

NomeMatr\u00edculaPresente Julia Takaki221029249\u2705 Maria Helena222006982\u2705 Thales Euflauzino222006178\u2705 Victor Guimaraes211063256\u2705 V\u00edctor Schmidt222021924\u2705

Fonte: V\u00edctor Schmidt

"},{"location":"Atas/ata01/#pautas","title":"Pautas","text":"
  • Divis\u00e3o das tarefas
  • Comunica\u00e7\u00e3o sobre organiza\u00e7\u00e3o inicial no Notion
"},{"location":"Atas/ata01/#decisoes","title":"Decis\u00f5es","text":"
  • Foram decididos/comunicados os apps que cada um escolheu para expor o porque do app ser escolhido
  • Foram definidos os prazos das entregas
"},{"location":"Atas/ata01/#compromissos","title":"Compromissos","text":"

Na reuni\u00e3o, foram definidos compromissos para os participantes executarem com o objetivo de dar continuidade ao projeto. Os compromissos, a pessoa respons\u00e1vel, a data da entrega e o revisor est\u00e3o especificados na Tabela 2.

Tabela 2: Compromisso dos participantes decididos da reuni\u00e3o

CompromissoRespons\u00e1velData de EntregaRevisor Planejamento do CronogramaMaria Helena e V\u00edctor Schmidt25/10/2024Todos App EscolhidoVictor Guimaraes26/10/2024Julia Takaki Cria\u00e7\u00e3o do GitHub PagesThales Euflauzino24/10/2024V\u00edctor Schmidt Termo de Uso do Aplicativo SelecionadoVictor Guimaraes26/10/2024Julia Takaki Ferramentas Utilizadas para o ProjetoJulia Takaki27/10/2024V\u00edctor Schmidt

Fonte: V\u00edctor Schmidt

"},{"location":"Atas/ata01/#gravacao-da-reuniao","title":"Grava\u00e7\u00e3o da reuni\u00e3o","text":""},{"location":"Atas/ata01/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 23/10/2024 Primeira ata V\u00edctor Schmidt Julia Takaki 1.1 24/10/2024 Adicionando video V\u00edctor Schmidt Julia Takaki 1.2 24/10/2024 Corrigindo fontes Victor Rodrigues Thales Euflauzino"},{"location":"Atas/ata02/","title":"Reuni\u00e3o 23/10/2024","text":"

In\u00edcio: 21:32 | Fim: 21:40

"},{"location":"Atas/ata02/#participantes-convocados","title":"Participantes Convocados","text":"

Na Tabela 1, s\u00e3o apresentados os participantes da reuni\u00e3o juntamente com os indicadores que demonstram se est\u00e3o presentes ou n\u00e3o, onde \u2705 significa que o participante est\u00e1 presente e \u274c significa que o participante n\u00e3o compareceu \u00e0 reuni\u00e3o.

Tabela 1: Participantes Convocados e Presen\u00e7a na Reuni\u00e3o

NomeMatr\u00edculaPresente Julia Takaki221029249\u2705 Maria Helena222006982\u2705 Thales Euflauzino222006178\u2705 Victor Guimaraes211063256\u2705 V\u00edctor Schmidt222021924\u2705

Fonte: V\u00edctor Rodrigues

"},{"location":"Atas/ata02/#pautas","title":"Pautas","text":"
  • Divis\u00e3o das tarefas
"},{"location":"Atas/ata02/#decisoes","title":"Decis\u00f5es","text":"
  • Artefatos divididos conforme cronograma do projeto.
"},{"location":"Atas/ata02/#compromissos","title":"Compromissos","text":"
  • Todos se comprometer\u00e3o a entregar os artefatos dentro do prazo de entrega.
"},{"location":"Atas/ata02/#gravacao-da-reuniao","title":"Grava\u00e7\u00e3o da reuni\u00e3o","text":""},{"location":"Atas/ata02/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 06/11/2024 Estrutura\u00e7\u00e3o inicial e preenchimento V\u00edctor Rodrigues Maria Helena"},{"location":"Planejamento-do-projeto/app-escolhido/","title":"App Escolhido","text":""},{"location":"Planejamento-do-projeto/app-escolhido/#introducao","title":"Introdu\u00e7\u00e3o","text":"

No in\u00edcio do processo da disciplina, o grupo examinou uma s\u00e9rie de aplicativos sugeridos por cada membro, discutindo os pr\u00f3s e contras de cada um. Foi feita uma an\u00e1lise minuciosa com base nos crit\u00e9rios definidos para selecionar o aplicativo que melhor se encaixasse no projeto.

"},{"location":"Planejamento-do-projeto/app-escolhido/#criterios-para-escolha","title":"Crit\u00e9rios para escolha","text":"
  • App n\u00e3o foi trabalhado anteriormente na disciplina;
  • F\u00e1cil acesso ao p\u00fablico-alvo;
  • Disponibilidade de informa\u00e7\u00f5es;
  • Complexidade do aplicativo.
"},{"location":"Planejamento-do-projeto/app-escolhido/#motivacoes-de-escolha","title":"Motiva\u00e7\u00f5es de escolha","text":"

Com base nos crit\u00e9rios anteriores, o grupo se reuniu e decidiu que seria usado o Tesouro Direto. A escolha se deu por ser um aplicativo de complexidade m\u00e9dia, por\u00e9m com muitas funcionalidades para explorarmos ao longo do projeto. O p\u00fablico-alvo \u00e9 grande e facilmente acess\u00edvel, al\u00e9m de n\u00e3o ter sido utilizado para estudos na disciplina.

"},{"location":"Planejamento-do-projeto/app-escolhido/#termos-de-uso","title":"Termos de uso","text":"

Para realizar o projeto em conformidade com as normas legais, verificamos os termos de uso do Tesouro Direto no dia 28 de outubro de 2024. Conforme mostra a Figura 2, \u00e9 vedado o uso para fins comerciais sem autoriza\u00e7\u00e3o pr\u00e9via. No entanto, como o projeto tem como \u00fanico e exclusivo objetivo aplicar na pr\u00e1tica os conhecimentos adquiridos em aula, n\u00e3o estaremos infringindo qualquer termo.

"},{"location":"Planejamento-do-projeto/app-escolhido/#figura-2-termo-de-uso","title":"Figura 2: Termo de Uso","text":"

Fonte: Tesouro Direto

"},{"location":"Planejamento-do-projeto/app-escolhido/#bibliografia","title":"Bibliografia","text":"

Tesouro Direto. Dispon\u00edvel em: https://www.tesourodireto.com.br. Acesso em 28 de outubro de 2024

Planejamento - Bilheteria Digital. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/planejamento/aplicativo/. Acesso em 28 de outubro de 2024.

Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 28/10/2024 Estrutura\u00e7\u00e3o Inicial Victor Rodrigues V\u00edctor Schmidt 1.1 28/10/2024 Adi\u00e7\u00e3o de Informa\u00e7\u00f5es Victor Rodrigues V\u00edctor Schmidt 1.2 29/10/2024 Adicionando Rich Picture J\u00falia Takaki Thales Euflauzino 1.3 29/10/2024 Adicionando Fontes e Autores J\u00falia Takaki Thales Euflauzino 1.4 12/11/2024 Colocando data do termo de uso Thales Euflauzino Victor Rodrigues"},{"location":"Planejamento-do-projeto/cronograma/","title":"Cronograma","text":"

O cronograma estabelece a organiza\u00e7\u00e3o temporal de todas as atividades previstas para o projeto, dividindo-as em entregas e fases espec\u00edficas. Cada entrega \u00e9 detalhada com uma descri\u00e7\u00e3o das tarefas a serem conclu\u00eddas e as datas limites, de modo a garantir que o progresso do projeto se mantenha constante e que todos os membros da equipe estejam alinhados \u00e0s expectativas e prazos estabelecidos.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-das-entregas-do-projeto","title":"Cronograma das Entregas do Projeto","text":"

Tabela 1: Cronograma geral das entregas.

Atividade Descri\u00e7\u00e3o Data Limite de Entrega Entrega 1 Planejamento do Projeto, equipe, Heatmap de disponibilidade dos integrantes, lista de App avaliados, App selecionado para o projeto da disciplina, c\u00f3pia do Termo de Uso do aplicativo permitindo o estudo na disciplina, Ferramentas do projeto, cronograma detalhado das atividades do projeto (com data de in\u00edcio e fim de cada atividade, respons\u00e1veis e per\u00edodo de grava\u00e7\u00e3o da apresenta\u00e7\u00e3o), Rich Picture 06/11 Entrega 2 Elicita\u00e7\u00e3o \u2013 T\u00e9cnicas e Prioriza\u00e7\u00e3o. Perfil dos usu\u00e1rios, t\u00e9cnicas de elicita\u00e7\u00e3o utilizadas e que ser\u00e3o utilizadas, t\u00e9cnicas de prioriza\u00e7\u00e3o aplicadas e que ser\u00e3o aplicadas no projeto. 24/11 Entrega 3 Modelagem de Requisitos: Cen\u00e1rios, L\u00e9xico, Use Case, Especifica\u00e7\u00e3o Suplementar 08/12 Entrega 4 Modelagem de Requisitos - \u00c1gil (Hist\u00f3rias de Usu\u00e1rio, Backlogs, NFR Framework) 15/12 Entrega 5 An\u00e1lise de Requisitos: Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o 29/01 Entrega 6 P\u00f3s-Rastreabilidade \u2013 Ger\u00eancia II 19/01 Projeto Final Entrega da apresenta\u00e7\u00e3o do projeto final 10/02

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-entrega-1-planejamento","title":"Cronograma Entrega 1 - Planejamento","text":"

A primeira entrega foca no planejamento do projeto. Isso inclui a defini\u00e7\u00e3o da equipe, levantamento das ferramentas, escolha do aplicativo a ser analisado e elabora\u00e7\u00e3o do cronograma. Tamb\u00e9m envolve o desenvolvimento de uma representa\u00e7\u00e3o visual do projeto, como o Rich Picture, para facilitar o entendimento das principais partes interessadas.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-planejado","title":"Cronograma Planejado","text":"

Tabela 2: Cronograma com o planejamento da primeira entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Prazo Per\u00edodo de revis\u00e3o Heatmap Victor Rodrigues Todos 22/10 22/10 de 22/10 a 23/10 Integrantes da Equipe Thales Euflauzino Victor Schmidt 23/10 25/10 de 25/10 a 26/10 Documenta\u00e7\u00e3o MKDocs Thales Euflauzino J\u00falia Takaki 23/10 25/10 de 25/10 a 26/10 Estrutura\u00e7\u00e3o do GitHub Pages Thales Euflauzino Victor Schmidt 23/10 24/10 de 24/10 a 25/10 Cronograma Planejado Maria Helena Victor Schmidt 23/10 25/10 de 25/10 a 26/10 Lista de Apps Avaliados Todos Maria Helena 23/10 25/10 de 25/10 a 26/10 App Escolhido Victor Rodrigues J\u00falia Takaki 25/10 26/10 de 26/10 a 27/10 Termo de Uso do aplicativo selecionado Victor Rodrigues J\u00falia Takaki 23/10 26/10 de 26/10 a 27/10 Ferramentas utilizadas para o Projeto J\u00falia Takaki Victor Rodrigues 23/10 27/10 de 27/10 a 28/10 Rich Picture do Projeto Victor Schmidt Maria Helena 23/10 27/10 de 27/10 a 28/10 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Maria Helena 27/10 28/10 28/10 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Thales Euflauzino Victor Rodrigues 07/11 09/11 09/11

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-executado","title":"Cronograma Executado","text":"

Tabela 3: Cronograma com as datas oficiais da primeira entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Entrega Per\u00edodo de revis\u00e3o Heatmap Victor Rodrigues Todos 22/10 22/10 de 22/10 a 23/10 Integrantes da Equipe Thales Euflauzino Victor Schmidt 23/10 24/10 de 24/10 a 25/10 Documenta\u00e7\u00e3o MKDocs Thales Euflauzino J\u00falia Takaki 23/10 24/10 de 24/10 a 25/10 Estrutura\u00e7\u00e3o da GitHub Pages Thales Euflauzino Victor Schmidt 23/10 24/10 de 24/10 a 25/10 Cronograma Planejado Maria Helena Victor Schmidt 23/10 24/10 de 24/10 a 02/11 Lista de Apps Avaliados Todos Thales Euflauzino, Victor Rodrigues, Victor Schmidt 23/10 29/10 de 29/10 a 30/10 App Escolhido J\u00falia Takaki e Victor Rodrigues Todos 28/10 28/10 de 28/10 a 29/10 Termo de Uso do aplicativo selecionado Victor Rodrigues J\u00falia Takaki 28/10 28/10 de 28/10 a 29/10 Ferramentas Utilizadas para o Projeto J\u00falia Takaki Victor Rodrigues e Thales Euflauzino 23/10 28/10 de 28/10 a 29/10 Rich Picture do Projeto J\u00falia Takaki Thales Euflauzino 23/10 28/10 de 28/10 a 29/10 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Maria Helena 28/10 02/11 02/11 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Thales Euflauzino Victor Rodrigues 12/11 13/11 13/11

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-entrega-2-elicitacao","title":"Cronograma Entrega 2 - Elicita\u00e7\u00e3o","text":"

Nesta fase, ocorre a elicita\u00e7\u00e3o e prioriza\u00e7\u00e3o dos requisitos. As t\u00e9cnicas de elicita\u00e7\u00e3o e prioriza\u00e7\u00e3o s\u00e3o selecionadas e aplicadas para definir claramente os perfis de usu\u00e1rios e as necessidades do projeto. Essa etapa \u00e9 crucial para garantir que todos os requisitos essenciais sejam capturados de forma clara e organizada.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-planejado_1","title":"Cronograma Planejado","text":"

Tabela 4: Planejamento da segunda entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Prazo Per\u00edodo de revis\u00e3o Defini\u00e7\u00f5es de personas e perfis de usu\u00e1rio Victor Rodrigues Maria Helena 02/11 05/11 de 22/10 a 23/10 Defini\u00e7\u00e3o das t\u00e9cnicas que ser\u00e3o usadas no projeto Maria Helena J\u00falia Takaki 05/11 08/11 de 08/10 a 01/10 Introspec\u00e7\u00e3o para a elicita\u00e7\u00e3o dos requisitos Victor Schmidt Victor Rodrigues 09/11 11/11 de 11/10 a 12/10 Cria\u00e7\u00e3o dos question\u00e1rios J\u00falia Takaki Thales Euflauzino 11/11 13/11 de 13/10 a 14/10 Entrevista para elicita\u00e7\u00e3o de requisitos Thales Euflauzino Maria Helena 13/11 14/11 de 14/10 a 15/10 Brainstorming Victor Schmidt Victor Rodrigues 15/11 18/11 de 18/10 a 19/10 Prioriza\u00e7\u00e3o dos requisitos J\u00falia Takaki Victor Rodrigues 19/11 21/11 de 21/10 a 22/10 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Victor Schmidt 22/11 23/11 23/11 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Maria Helena Victor Schmidt 25/11 25/11 25/11

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-executado_1","title":"Cronograma Executado","text":"

Tabela 5: Cronograma das datas oficiais da segunda entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Entrega Per\u00edodo de revis\u00e3o Defini\u00e7\u00f5es de personas e perfis de usu\u00e1rio Victor Rodrigues Maria Helena 02/11 - de 22/10 a 23/10 Defini\u00e7\u00e3o das t\u00e9cnicas que ser\u00e3o usadas no projeto Maria Helena J\u00falia Takaki 05/11 - de 08/10 a 09/10 Introspec\u00e7\u00e3o para a elicita\u00e7\u00e3o dos requisitos Victor Schmidt Victor Rodrigues 09/11 - de 11/10 a 12/10 Cria\u00e7\u00e3o dos question\u00e1rios J\u00falia Takaki Thales Euflauzino 11/11 16/11 de 16/10 a 17/10 Entrevista para elicita\u00e7\u00e3o de requisitos Thales Euflauzino Maria Helena 13/11 - de 14/10 a 15/10 Brainstorming Victor Schmidt Victor Rodrigues 15/11 - de 18/10 a 19/10 Prioriza\u00e7\u00e3o dos requisitos J\u00falia Takaki Victor Rodrigues 19/11 - de 21/10 a 22/10 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Victor Schmidt 22/11 - 23/11 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Maria Helena Victor Schmidt - - -

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-entrega-3-modelagem-de-requisitos-11","title":"Cronograma Entrega 3 - Modelagem de Requisitos 1.1","text":"

A terceira entrega concentra-se na modelagem dos requisitos por meio de cen\u00e1rios, l\u00e9xicos, casos de uso e especifica\u00e7\u00f5es suplementares. Esta etapa visa documentar o comportamento esperado do sistema e detalhar os requisitos de maneira formal.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-planejado_2","title":"Cronograma Planejado","text":"

Tabela 6: Planejamento da terceira entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Prazo Per\u00edodo de revis\u00e3o Modelagem de Requisitos: Cen\u00e1rios Victor Rodrigues e Maria Helena Thales Euflauzino 27/11 30/11 de 30/11 a 01/12 Modelagem de Requisitos: L\u00e9xicos J\u00falia Takaki e Thales Euflauzino Maria Helena 27/11 30/11 de 30/11 a 01/12 Modelagem de Requisitos: Use Cases Victor Schmidt e Victor Rodrigues J\u00falia Takaki 01/12 05/12 de 05/12 a 06/12 Modelagem de Requisitos: Especifica\u00e7\u00e3o Suplementar Thales Euflauzino e Maria Helena Victor Schmidt 01/12 05/12 de 06/12 a 07/12 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Victor Rodrigues 06/12 07/12 07/12 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Julia Takaki Thales Euflauzino 09/12 09/12 09/12

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-executado_2","title":"Cronograma Executado","text":"

Tabela 7: Cronograma com as datas oficiais da terceira entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Entrega Per\u00edodo de revis\u00e3o Modelagem de Requisitos: Cen\u00e1rios Victor Rodrigues e Maria Helena Thales Euflauzino 27/11 - de 30/11 a 01/12 Modelagem de Requisitos: L\u00e9xicos J\u00falia Takaki e Thales Euflauzino Maria Helena 27/11 - de 30/11 a 01/12 Modelagem de Requisitos: Use Cases Victor Schmidt e Victor Rodrigues J\u00falia Takaki 01/12 - de 05/12 a 06/12 Modelagem de Requisitos: Especifica\u00e7\u00e3o Suplementar Thales Euflauzino e Maria Helena Victor Schmidt 01/12 - de 06/12 a 07/12 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Victor Rodrigues 06/12 - 07/12 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Julia Takaki Thales Euflauzino - - -

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-entrega-4-modelagem-de-requisitos-12","title":"Cronograma Entrega 4 - Modelagem de Requisitos 1.2","text":"

A quarta entrega adota uma abordagem \u00e1gil para a modelagem de requisitos, utilizando hist\u00f3rias de usu\u00e1rio e backlog. Isso permite uma adapta\u00e7\u00e3o mais flex\u00edvel aos requisitos, proporcionando uma vis\u00e3o iterativa e incremental do desenvolvimento do projeto.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-planejado_3","title":"Cronograma Planejado","text":"

Tabela 8: Planejamento da quarta entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Prazo Per\u00edodo de revis\u00e3o Modelagem de Requisitos - \u00c1gil: Hist\u00f3rias de Usu\u00e1rio Victor Rodrigues e Maria Helena Thales Euflauzino 10/12 11/12 de 11/12 a 12/12 Modelagem de Requisitos - \u00c1gil: Backlogs J\u00falia Takaki e Thales Euflauzino Victor Schmidt 11/12 12/12 de 12/12 a 13/12 Modelagem de Requisitos - \u00c1gil: NFR Framework Victor Schmidt e Victor Rodrigues J\u00falia Takaki 12/12 13/12 de 13/12 a 14/12 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Victor Rodrigues 14/12 15/12 15/12 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Victor Rodrigues Maria Helena 15/12 15/12 15/12

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-executado_3","title":"Cronograma Executado","text":"

Tabela 9: Cronograma com as datas oficiais da quarta entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Entrega Per\u00edodo de revis\u00e3o Modelagem de Requisitos - \u00c1gil: Hist\u00f3rias de Usu\u00e1rio Victor Rodrigues e Maria Helena Thales Euflauzino 10/12 - de 11/12 a 12/12 Modelagem de Requisitos - \u00c1gil: Backlogs J\u00falia Takaki e Thales Euflauzino Victor Schmidt 11/12 - de 12/12 a 13/12 Modelagem de Requisitos - \u00c1gil: NFR Framework Victor Schmidt e Victor Rodrigues J\u00falia Takaki 12/12 - de 13/12 a 14/12 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos Victor Rodrigues 14/12 - 15/12 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Victor Rodrigues Maria Helena - - -

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-entrega-5-analise-de-requisitos","title":"Cronograma Entrega 5 - An\u00e1lise de Requisitos","text":"

Aqui, a \u00eanfase \u00e9 na Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o dos requisitos coletados. Este \u00e9 o momento de garantir que os requisitos estejam completos, consistentes e que o sistema esteja alinhado com as expectativas dos usu\u00e1rios.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-planejado_4","title":"Cronograma Planejado","text":"

Tabela 10: Planejamento da quinta entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Prazo Per\u00edodo de revis\u00e3o Verifica\u00e7\u00e3o dos Requisitos Maria Helena e J\u00falia Takaki Victor Rodrigues 21/01 22/01 de 22/01 a 23/01 Valida\u00e7\u00e3o dos Requisitos Thales Euflauzino e Victor Schmidt Maria Helena 23/01 24/01 de 24/01 a 25/01 Inspe\u00e7\u00e3o de todos os artefatos Victor Rodrigues Thales Euflauzino 25/01 27/01 de 27/01 a 28/01 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos J\u00falia Takaki 28/01 29/01 29/01 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Victor Schmidt Julia Takaki 29/01 29/01 29/01

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-executado_4","title":"Cronograma Executado","text":"

Tabela 11: Cronograma com as datas oficiais da quinta entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Entrega Per\u00edodo de revis\u00e3o Verifica\u00e7\u00e3o dos Requisitos Maria Helena e J\u00falia Takaki Victor Rodrigues 21/01 - de 22/01 a 23/01 Valida\u00e7\u00e3o dos Requisitos Thales Euflauzino e Victor Schmidt Maria Helena 23/01 - de 24/01 a 25/01 Inspe\u00e7\u00e3o de todos os artefatos Victor Rodrigues Thales Euflauzino 25/01 - de 27/01 a 28/01 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos J\u00falia Takaki 28/01 - 29/01 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Victor Schmidt Julia Takaki - - -

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-entrega-6-pos-rastreabilidade","title":"Cronograma Entrega 6 - P\u00f3s-Rastreabilidade","text":"

Nesta fase, a p\u00f3s-rastreabilidade e a gest\u00e3o avan\u00e7ada dos requisitos s\u00e3o abordados, permitindo que o projeto mantenha uma trilha clara de cada requisito ao longo do desenvolvimento e possibilite um acompanhamento eficiente das mudan\u00e7as.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-planejado_5","title":"Cronograma Planejado","text":"

Tabela 12: Planejamento da sexta entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Prazo Per\u00edodo de revis\u00e3o Cria\u00e7\u00e3o do documento inicial de p\u00f3s-rastreabilidade Maria Helena Thales Euflauzino 17/12 18/12 de 18/12 a 19/12 P\u00f3s-Rastreabilidade: Backward Form Thales Euflauzino e Victor Schmidt Maria Helena 19/12 05/01 de 05/01 ate 06/01 P\u00f3s-Rastreabilidade: Forward Form Victor Rodrigues e J\u00falia Takaki Victor Schmidt 06/01 17/01 de 17/01 ate 18/01 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos J\u00falia Takaki 18/01 19/01 19/01 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Thales Euflauzino Victor Rodrigues 19/01 19/01 19/01

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-executado_5","title":"Cronograma Executado","text":"

Tabela 13: Cronograma com as datas oficiais da sexta entrega.

T\u00edtulo Autor(es) Revisor In\u00edcio Entrega Per\u00edodo de revis\u00e3o Cria\u00e7\u00e3o do documento inicial de p\u00f3s-rastreabilidade Maria Helena Thales Euflauzino 17/12 - de 18/12 a 19/12 P\u00f3s-Rastreabilidade: Backward Form Thales Euflauzino e Victor Schmidt Maria Helena 19/12 - de 05/01 ate 06/01 P\u00f3s-Rastreabilidade: Forward Form Victor Rodrigues e J\u00falia Takaki Victor Schmidt 06/01 - de 17/01 ate 18/01 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos J\u00falia Takaki 18/01 - 19/01 Revis\u00e3o p\u00f3s apresenta\u00e7\u00e3o Thales Euflauzino Victor Rodrigues - - -

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-entrega-final","title":"Cronograma Entrega Final","text":"

A \u00faltima etapa do cronograma \u00e9 a entrega do projeto final, culminando na apresenta\u00e7\u00e3o do trabalho desenvolvido.

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-planejado_6","title":"Cronograma Planejado","text":"

Tabela 14: Planejamento da entrega final.

T\u00edtulo Autor(es) Revisor In\u00edcio Prazo Per\u00edodo de revis\u00e3o Complementos e Revis\u00f5es do Projeto Final Todos os membros Victor Rodrigues, Maria Helena e J\u00falia Takaki 21/01 05/02 de 05/02 a 06/02 Desenvolvimento de relat\u00f3rio das revis\u00f5es e ajustes dos artefatos Todos os membros Victor Schmidt e Thales Euflauzino 01/01 07/02 de 07/02 a 08/02 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos os membros J\u00falia Takaki 08/02 09/02 09/02

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#cronograma-executado_6","title":"Cronograma Executado","text":"

Tabela 15: Cronograma com as datas oficiais da entrega final.

T\u00edtulo Autor(es) Revisor In\u00edcio Entrega Per\u00edodo de revis\u00e3o Complementos e Revis\u00f5es do Projeto Final Todos os membros Victor Rodrigues, Maria Helena e J\u00falia Takaki 21/01 - de 05/02 a 06/02 Desenvolvimento de relat\u00f3rio das revis\u00f5es e ajustes dos artefatos Todos os membros Victor Schmidt e Thales Euflauzino 01/01 - de 07/02 a 08/02 Grava\u00e7\u00e3o da Apresenta\u00e7\u00e3o Todos os membros J\u00falia Takaki 08/02 - 09/02

Autor: Maria Helena

"},{"location":"Planejamento-do-projeto/cronograma/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 28/10/2024 Estrutura\u00e7\u00e3o Inicial Maria Helena V\u00edctor Schmidt 1.1 28/10/2024 Estrutura\u00e7\u00e3o no MkDocs e pequenas altera\u00e7\u00f5es V\u00edctor Schmidt Maria Helena 1.2 02/11/2024 Corre\u00e7\u00e3o das datas de entrega e etapas do cronograma, corre\u00e7\u00e3o dos t\u00edtulo das tabelas Maria Helena Thales Euflauzino 1.3 02/11/2024 Adi\u00e7\u00e3o de fontes e t\u00edtulos das tabelas Maria Helena Thales Euflauzino 1.3 02/11/2024 Adi\u00e7\u00e3o das etapas de verifica\u00e7\u00e3o Maria Helena Thales Euflauzino 1.4 12/11/2024 Corringindo fonte para autor Thales Euflauzino Victor Rodrigues 1.5 14/11/2024 Adicionando periodo de revis\u00e3o p\u00f3s apresenta\u00e7\u00f5es Victor Rodrigues Maria Helena"},{"location":"Planejamento-do-projeto/ferramentas/","title":"Ferramentas Utilizadas","text":""},{"location":"Planejamento-do-projeto/ferramentas/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Este documento apresenta as ferramentas que estamos utilizando para facilitar tanto a cria\u00e7\u00e3o quanto a apresenta\u00e7\u00e3o das atividades do grupo 05. A Tabela 1 lista essas ferramentas, abrangendo softwares e plataformas que otimizam o desenvolvimento e a comunica\u00e7\u00e3o do projeto. Nossa organiza\u00e7\u00e3o e planejamento foram inspirados no trabalho realizado pela Economia DF durante o semestre de 2023/2. Tamb\u00e9m oferecemos uma breve explica\u00e7\u00e3o sobre a fun\u00e7\u00e3o de cada ferramenta e como ir\u00e3o atuar para alcan\u00e7ar os objetivos e resultados esperados do projeto.

Tabela 1: Ferramentas utilizadas

Ferramentas Descri\u00e7\u00e3o GitHub: Utilizado para documentar artefatos do projeto [1]. Canva: Ferramenta utilizada para montar apresenta\u00e7\u00f5es e diagramas [2]. Google Docs: Cria\u00e7\u00e3o e edi\u00e7\u00e3o de tabelas e listas [3]. Microsoft Teams: Utilizado para as reuni\u00f5es da equipe [4]. Whatsapp: Ferramenta principal de comunica\u00e7\u00e3o da equipe [5]. Visual Studio Code: Ferramenta de programa\u00e7\u00e3o e edi\u00e7\u00e3o dos arquivos de documenta\u00e7\u00e3o [6]. MkDocs: Cria\u00e7\u00e3o e edi\u00e7\u00e3o do GitPages do projeto [7]. Google Planilhas: Cria\u00e7\u00e3o de planilhas relacionadas ao cronograma e hor\u00e1rios [8]. Notion: Organiza\u00e7\u00e3o de atas e cronograma [9].

Autor: J\u00falia Takaki, 2024.

"},{"location":"Planejamento-do-projeto/ferramentas/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"

[1] GitHub. Dispon\u00edvel em: https://docs.github.com/pt. Acesso em: 29 de Out. de 2024.

[2] Canva. Dispon\u00edvel em: https://www.canva.com/. Acesso em: 29 de Out. de 2024.

[3] GoogleDocs. Dispon\u00edvel em: https://www.google.com/intl/pt-BR/docs/about/. Acesso em: 29 de Out. de 2024.

[4] Microsoft Teams. Dispon\u00edvel em: https://www.microsoft.com/pt-br/microsoft-teams/group-chat-software. Acesso em: 29 de Out. de 2024.

[5] Whatsapp. Dispon\u00edvel em: https://www.whatsapp.com/?lang=pt_br. Acesso em: 29 de Out. de 2024.

[6] Visual Studio Code. Dispon\u00edvel em: https://code.visualstudio.com/. Acesso em: 29 de Out. de 2024.

[7] MkDocs. Dispon\u00edvel em: https://www.mkdocs.org/. Acesso em: 29 de Out. de 2024.

[8] Google Planilhas. Dispon\u00edvel em: https://www.google.com/intl/pt-BR/sheets/about/. Acesso em: 29 de Out. de 2024.

[9] Notion. Dispon\u00edvel em: https://www.notion.so/pt. Acesso em: 29 de Out. de 2024.

"},{"location":"Planejamento-do-projeto/ferramentas/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 29/10/2024 Cria\u00e7\u00e3o da p\u00e1gina de ferramentas. J\u00falia Takaki Victor Rodrigues e Thales Euflauzino 1.1 12/11/2024 Corringindo fonte para autor Thales Euflauzino Victor Rodrigues"},{"location":"Planejamento-do-projeto/heatmap/","title":"Heatmap","text":""},{"location":"Planejamento-do-projeto/heatmap/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Para o desenvolvimento do projeto, \u00e9 indispens\u00e1vel a reuni\u00e3o dos membros para encontros de planejamento e grava\u00e7\u00f5es de entregas. Pensando em facilitar o processo de agendamento dessas reuni\u00f5es, foi elaborado o heatmap de disponibilidade dos membros.

Como representado pela Figura 1, as c\u00e9lulas com o n\u00famero 0 representam 0 membros dispon\u00edveis, enquanto as c\u00e9lulas com 5 membros indicam os hor\u00e1rios poss\u00edveis para a reuni\u00e3o da equipe.

"},{"location":"Planejamento-do-projeto/heatmap/#figura-1-heatmap-de-disponibilidade-do-grupo-5","title":"Figura 1: Heatmap de disponibilidade do grupo 5","text":"

Autor: Victor Rodrigues, 2024

"},{"location":"Planejamento-do-projeto/heatmap/#resultados","title":"Resultados","text":"

A partir da an\u00e1lise do heatmap preenchido pelos membros do grupo, ficaram reservados para reuni\u00e3o os dias de quarta-feira \u00e0s 20:30 e/ou s\u00e1bado \u00e0s 14:00

Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 28/10/2024 Estrutura\u00e7\u00e3o Inicial Victor Rodrigues Thales Euflauzino 1.1 31/10/2024 Adicionando hor\u00e1rio das reuni\u00f5es Thales Euflauzino V\u00edctor Schmidt 1.2 12/11/2024 Corringindo fonte para autor Thales Euflauzino Victor Rodrigues"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/","title":"Aplicativos avaliados","text":""},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Na fase inicial do projeto, os estudantes selecionaram individualmente aplicativos do governo ou de comunidades. Essa escolha tinha como prop\u00f3sito apresentar sugest\u00f5es para o aplicativo a ser analisado em conjunto durante a disciplina. A Tabela 1 fornece detalhes sobre os websites/aplicativos avaliados por cada membro da equipe.

Tabela 1: Tabela de aplicativos avaliados

Aplicativo avaliado Avaliador Tesouro Direto J\u00falia Takaki Quinto Andar Maria Helena Meu SUS Digital Thales Euflauzino Google Chrome Victor Hugo eOuve - Juiz de Fora V\u00edctor Schmidt

Autor: Thales Euflauzino, 2024

"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#tesouro-direto","title":"Tesouro Direto","text":"

O Tesouro Direto \u00e9 uma iniciativa desenvolvida pelo Governo Federal do Brasil que visa tornar mais acess\u00edvel o investimento em t\u00edtulos p\u00fablicos para os cidad\u00e3os. Por meio da plataforma, \u00e9 poss\u00edvel fazer o investimento diretamente em t\u00edtulos do Tesouro Nacional, facilitando o planejamento financeiro para prazos variados. O aplicativo permite que os usu\u00e1rios acompanhem suas carteiras de investimentos, verifiquem os rendimentos, consultem os pre\u00e7os atualizados dos t\u00edtulos e acessem o hist\u00f3rico de opera\u00e7\u00f5es. A escolha deste aplicativo se baseou nos seguintes crit\u00e9rios:

  • Requisito: Por ser um aplicativo governamental se encaixa nos requisitos da disciplina.

  • Novidade: O aplicativo n\u00e3o foi analisado nos semestres anteriores.

  • Complexidade: O aplicativo conta com diversas funcionalidades e, em decorr\u00eancia disso, requer uma an\u00e1lise mais complexa.

  • P\u00fablico-alvo amplo: O aplicativo \u00e9 amplamente utilizado por diversos usu\u00e1rios, tornando-o mais acess\u00edvel para an\u00e1lise e coleta de feedback.

"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#quinto-andar","title":"Quinto Andar","text":"

O Quinto Andar \u00e9 uma plataforma que facilita o encontro de im\u00f3veis para alugar ou comprar em v\u00e1rias regi\u00f5es do Brasil. Por meio dela, usu\u00e1rios podem buscar im\u00f3veis com filtros por caracter\u00edsticas e localidade, al\u00e9m de anunciar seus pr\u00f3prios im\u00f3veis para venda ou aluguel. A plataforma conecta pessoas interessadas em comprar ou alugar com propriet\u00e1rios e vendedores, tornando o processo mais r\u00e1pido e acess\u00edvel. A escolha da plataforma foi feita levando em conta os seguintes pontos:

  • Requisito: Alinha-se ao escopo de an\u00e1lise de software proposto pela disciplina.

  • Novidade: O aplicativo ainda n\u00e3o foi analisado por grupos anteriores da disciplina.

  • Complexidade: Sendo um e-commerce voltado para o mercado imobili\u00e1rio, o aplicativo apresenta funcionalidades espec\u00edficas e complexas, representando um objeto de estudo promissor.

  • P\u00fablico-alvo amplo: A plataforma Quinto Andar atende adultos no Brasil interessados em anunciar ou buscar im\u00f3veis. \u00c9 um dos aplicativos mais populares do setor, com mais de 1 milh\u00e3o de downloads no Google Play.

"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#meu-sus-digital","title":"Meu SUS Digital","text":"

O Meu SUS Digital \u00e9 uma plataforma criada pelo Governo Federal do Brasil para centralizar os dados de sa\u00fade dos cidad\u00e3os no Sistema \u00danico de Sa\u00fade (SUS). Atrav\u00e9s dela, qualquer pessoa cadastrada no gov.br pode acessar facilmente seu cart\u00e3o \u00fanico de sa\u00fade (CNS), cart\u00e3o de vacinas, informa\u00e7\u00f5es sobre exames agendados ou realizados, medicamentos prescritos e consultas no SUS, entre outras funcionalidades. O aplicativo foi analisado pelo estudante Thales Euflauzino e a escolha foi feita levando em conta os seguintes pontos:

  • Requisito: O aplicativo \u00e9 do governo, se encaixando nos requisitos da disciplina.

  • Novidade: O aplicativo n\u00e3o foi analisado nos semestres anteriores.

  • Complexidade: O aplicativo conta com diversas opera\u00e7\u00f5es/funcionalidades com diferentes complexidades.

  • P\u00fablico-alvo amplo: O aplicativo \u00e9 amplamente utilizado por diversos tipos de pessoas, sendo assim, de f\u00e1cil acesso para poss\u00edveis pesquisas com usu\u00e1rios.

"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#google-chrome","title":"Google Chrome","text":"

O Google Chrome \u00e9 um navegador desenvolvido pela Google, amplamente utilizado em dispositivos m\u00f3veis e desktops ao redor do mundo. Ele oferece uma plataforma robusta e vers\u00e1til para navega\u00e7\u00e3o na web, contando com funcionalidades como sincroniza\u00e7\u00e3o de dados entre dispositivos, suporte para extens\u00f5es, e recursos de privacidade e seguran\u00e7a avan\u00e7ados. A escolha desse navegador foi feita com base nos seguintes crit\u00e9rios:

  • Requisito: se encaixa no escopo de an\u00e1lise de software proposto pela disciplina.

  • Novidade: O App recebe atualiza\u00e7\u00f5es constantes, garantindo que an\u00e1lises anteriores possam ser enriquecidas com novas funcionalidades e recursos.

  • Complexidade: O navegador apresenta uma estrutura complexa, com diversas funcionalidades, desde a navega\u00e7\u00e3o b\u00e1sica at\u00e9 recursos avan\u00e7ados de desenvolvedor, demandando uma an\u00e1lise detalhada.

  • P\u00fablico-alvo amplo: \u00c9 utilizado por uma vasta gama de usu\u00e1rios, de diferentes faixas et\u00e1rias e perfis, tornando-se uma escolha acess\u00edvel para a coleta de feedback e an\u00e1lise de usabilidade.

"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#eouve-juiz-de-fora","title":"eOuve Juiz de Fora","text":"

O eOuve \u00e9 um aplicativo desenvolvido pela Prefeitura de Juiz de Fora para promover a comunica\u00e7\u00e3o direta entre a administra\u00e7\u00e3o municipal e os cidad\u00e3os. Por meio desta plataforma, os moradores podem registrar suas solicita\u00e7\u00f5es, como den\u00fancias de problemas p\u00fablicos, sugest\u00f5es e elogios, proporcionando uma forma pr\u00e1tica e eficaz de participa\u00e7\u00e3o cidad\u00e3. O aplicativo permite o envio de fotos, descri\u00e7\u00e3o detalhada dos problemas, al\u00e9m de possibilitar o acompanhamento do status das solicita\u00e7\u00f5es, o que refor\u00e7a a transpar\u00eancia e a efici\u00eancia na gest\u00e3o p\u00fablica. A escolha do eOuve para an\u00e1lise se baseou nos seguintes crit\u00e9rios:

  • Requisito: O aplicativo atende aos requisitos da disciplina por ser uma ferramenta governamental de comunica\u00e7\u00e3o com os cidad\u00e3os.

  • Novidade: Por ser atualizado regularmente, o eOuve incorpora novas funcionalidades e melhorias, o que permite uma an\u00e1lise sempre atualizada e enriquecida.

  • Complexidade: O aplicativo oferece diversas funcionalidades, como o registro de solicita\u00e7\u00f5es, envio de imagens, e acompanhamento em tempo real das demandas, exigindo uma an\u00e1lise detalhada de seus recursos e usabilidade.

  • P\u00fablico-alvo amplo: O eOuve \u00e9 utilizado por uma ampla faixa de moradores de Juiz de Fora, facilitando a coleta de feedback e an\u00e1lise de usabilidade, j\u00e1 que \u00e9 acess\u00edvel e relevante para diversos perfis de cidad\u00e3os.

"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#bibliografia","title":"Bibliografia","text":"

Meu SUS Digital. Google Play, 2024. Dispon\u00edvel em: https://play.google.com/store/apps/details?id=br.gov.datasus.cnsdigital&hl=pt_BR Acesso em: 25 de outubro de 2024

Google Chrome. Google Play, 2024. Dispon\u00edvel em: https://play.google.com/store/apps/details?id=com.android.chrome&hl=pt_BR. Acesso em: 28 de outubro de 2024.>

Tesouro Direto. Google Play, 2024. Dispon\u00edvel em: https://play.google.com/store/apps/details?id=br.gov.fazenda.tesouro.td&hl=pt_BR. Acesso em: 28 de outubro de 2024.

eOuve. Prefeitura de Juiz de Fora, 2024. Dispon\u00edvel em: https://eouve.com.br/#/. Acesso em: 29 de outubro de 2024.

Quinto Andar. Google Play, 2024. Dispon\u00edvel em: https://play.google.com/store/apps/details?id=br.com.quintoandar.inquilinos&hl=pt&gl=BR. Acesso em: 31 de outubro de 2024.

"},{"location":"Planejamento-do-projeto/lista-apps-avaliados/#historico-de-versao","title":"Hist\u00f3rico de Vers\u00e3o","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 28/10/2024 Cria\u00e7\u00e3o do documento e informa\u00e7\u00f5es do Meu SUS Digital Thales Euflauzino Victor Hugo 1.1 28/10/2024 Informa\u00e7\u00f5es Google Chrome Victor Hugo V\u00edctor Schmidt 1.2 28/10/2024 Informa\u00e7\u00f5es Tesouro Direto J\u00falia Takaki Thales Euflauzino 1.3 29/10/2024 Informa\u00e7\u00f5es eOuve Juiz de Fora V\u00edctor Schmidt Thales Euflauzino 1.4 29/10/2024 Informa\u00e7\u00f5es Quinto Andar Maria Helena V\u00edctor Schmidt 1.5 31/10/2024 Adicionando Refer\u00eancia Bibliogr\u00e1fica Quinto Andar Maria Helena V\u00edctor Schmidt 1.6 12/11/2024 Corringindo fonte para autor Thales Euflauzino Victor Rodrigues"},{"location":"Planejamento-do-projeto/rich-picture/","title":"Rich Picture","text":""},{"location":"Planejamento-do-projeto/rich-picture/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Rich Picture \u00e9 uma ferramenta visual para expressar ideias e analisar problemas, tudo isso de forma informal e de f\u00e1cil entendimento. No contexto da engenharia de software, ele \u00e9 utilizado para abstrair o funcionamento de sistemas de software e se apresenta na forma de um diagrama com alguns elementos b\u00e1sicos como: atores, funcionalidades, armazenamento de dados, fluxo de dados e limites do sistema. 1

"},{"location":"Planejamento-do-projeto/rich-picture/#metodologia-e-ferramentas","title":"Metodologia e Ferramentas","text":"

A aplica\u00e7\u00e3o Canva foi utilizada para elaborar tanto o richpicture quanto sua legenda que podem ser vistas na Figura 1 e todas as ilustra\u00e7\u00f5es usadas s\u00e3o da mesma plataforma.

Figura 1: Richpicture vers\u00e3o 1.

Autor: J\u00falia Takaki

"},{"location":"Planejamento-do-projeto/rich-picture/#referencias","title":"Refer\u00eancias","text":"

1. SERRANO, Maur\u00edcio; SERRANO, Milene. Requisitos - Aula 4. Aprender 3. Distrito Federal, 2016. Dispon\u00edvel em: <https://aprender3.unb.br/pluginfile.php/2972425/mod_resource/content/4/Requisitos%20-%20Aula%2004%20-%20Parte%202%20RichPicture.pdf>. Acesso em: 28/10/2024.

"},{"location":"Planejamento-do-projeto/rich-picture/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 29/10/2024 Adi\u00e7\u00e3o da primeira vers\u00e3o do richpicture J\u00falia Takaki Thales Euflauzino 1.1 02/11/2024 Adicionando introdu\u00e7\u00e3o e motodologia Thales Euflauzino V\u00edctor Schmidt"},{"location":"elicitacao/grupo5/brainstorm/","title":"Brainstorm","text":""},{"location":"elicitacao/grupo5/brainstorm/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O brainstorming \u00e9 uma t\u00e9cnica colaborativa amplamente utilizada para a gera\u00e7\u00e3o de ideias, permitindo explorar uma diversidade de perspectivas de forma r\u00e1pida e eficiente. Segundo Barbosa et al. (2021), essa t\u00e9cnica se destaca por sua capacidade de levantar necessidades e desejos dos usu\u00e1rios, resultando em uma lista priorizada que pode alimentar diretamente a especifica\u00e7\u00e3o funcional e a documenta\u00e7\u00e3o de design (Barbosa et al., 2012). Al\u00e9m disso, Vianna et al. (2012) destacam que o brainstorming \u00e9 uma etapa crucial no processo de idea\u00e7\u00e3o, promovendo a criatividade e permitindo a combina\u00e7\u00e3o de diferentes perfis e expertises para solu\u00e7\u00f5es mais ricas e assertivas.

No contexto deste projeto, o brainstorming foi aplicado para explorar e avaliar os requisitos do aplicativo Tesouro Direto, considerando a perspectiva dos usu\u00e1rios e as funcionalidades existentes, com o objetivo de identificar melhorias e novas possibilidades.

"},{"location":"elicitacao/grupo5/brainstorm/#objetivo","title":"Objetivo","text":"

A principal finalidade do brainstorming foi identificar, de maneira colaborativa, as necessidades e desejos dos usu\u00e1rios do aplicativo Tesouro Direto, priorizando caracter\u00edsticas e funcionalidades que promovam uma experi\u00eancia mais eficiente, segura e satisfat\u00f3ria. Essa etapa visa alinhar as percep\u00e7\u00f5es dos participantes ao prop\u00f3sito do aplicativo e \u00e0s demandas reais do p\u00fablico-alvo, utilizando insights gerados para orientar decis\u00f5es de design e desenvolvimento. Claro! Aqui est\u00e1 o resumo com os links de cita\u00e7\u00e3o que voc\u00ea forneceu:

"},{"location":"elicitacao/grupo5/brainstorm/#metodologia-de-priorizacao-de-requisitos-com-brainstorming","title":"Metodologia de Prioriza\u00e7\u00e3o de Requisitos com Brainstorming","text":""},{"location":"elicitacao/grupo5/brainstorm/#preparacao","title":"Prepara\u00e7\u00e3o","text":"

A prepara\u00e7\u00e3o da sess\u00e3o de brainstorming seguiu um planejamento cuidadoso:

  • Participantes: A sele\u00e7\u00e3o de 8 a 12 indiv\u00edduos foi feita de acordo com perfis alinhados ao p\u00fablico-alvo do aplicativo, visando garantir diversidade de perspectivas e garantir que as ideias fossem relevantes e representativas, conforme sugerido por (Barbosa et al., 2012).

  • Ambiente e Material: Foi montado um ambiente colaborativo, com materiais como papel, canetas e est\u00edmulos visuais (imagens e objetos relacionados ao contexto do Tesouro Direto), conforme a abordagem de (Vianna et al., 2012).

"},{"location":"elicitacao/grupo5/brainstorm/#conducao-da-sessao","title":"Condu\u00e7\u00e3o da Sess\u00e3o","text":"

A condu\u00e7\u00e3o da sess\u00e3o seguiu os princ\u00edpios de brainstorming descritos por Barbosa et al. (2012) e Vianna et al. (2012):

  1. Introdu\u00e7\u00e3o: A atividade foi iniciada com uma explica\u00e7\u00e3o do objetivo da sess\u00e3o, destacando a liberdade criativa e a import\u00e2ncia de evitar julgamentos durante o processo, promovendo um ambiente aberto e colaborativo.

  2. Pergunta Norteadora: A quest\u00e3o central foi formulada de forma a estimular a gera\u00e7\u00e3o de ideias: \"Quais funcionalidades ou caracter\u00edsticas o sistema ideal do Tesouro Direto deveria apresentar para atender \u00e0s suas necessidades e superar suas expectativas?\" (Barbosa et al., 2012).

  3. Din\u00e2mica:

    • A gera\u00e7\u00e3o de ideias foi realizada em rodadas r\u00e1pidas, incentivando a quantidade e diversidade de respostas (Vianna et al., 2012).
    • Os participantes foram incentivados a combinar e aprimorar ideias, promovendo uma discuss\u00e3o colaborativa (Barbosa et al., 2012).
"},{"location":"elicitacao/grupo5/brainstorm/#analise-e-priorizacao","title":"An\u00e1lise e Prioriza\u00e7\u00e3o","text":"

Ap\u00f3s a gera\u00e7\u00e3o de ideias, utilizamos a t\u00e9cnica de aloca\u00e7\u00e3o de recursos para priorizar as funcionalidades ou caracter\u00edsticas sugeridas. Cada participante recebeu 100 d\u00f3lares fict\u00edcios para distribuir conforme a sua percep\u00e7\u00e3o de import\u00e2ncia. Optamos por essa abordagem por ser uma maneira intuitiva e pr\u00e1tica de envolver os participantes na prioriza\u00e7\u00e3o, j\u00e1 que o ato de \"gastar\" o dinheiro torna o processo mais acess\u00edvel e compreens\u00edvel. Al\u00e9m disso, essa t\u00e9cnica oferece uma vis\u00e3o clara de quais requisitos s\u00e3o considerados mais valiosos, facilitando o entendimento e a tomada de decis\u00e3o, especialmente em projetos com recursos limitados. A metodologia \u00e9 baseada no racioc\u00ednio descrito no livro Software Requirements (Wigers & Beatty, 2012).

"},{"location":"elicitacao/grupo5/brainstorm/#roteiro-do-brainstorm","title":"Roteiro do Brainstorm","text":"

O roteiro abaixo descreve as etapas da sess\u00e3o de brainstorming que ser\u00e1 realizada no dia 19 de novembro de 2024, \u00e0s 12h, com dura\u00e7\u00e3o de 1 hora. A t\u00e9cnica ser\u00e1 utilizada como m\u00e9todo de elicita\u00e7\u00e3o de requisitos, com o objetivo de identificar funcionalidades e melhorias para o aplicativo Tesouro Direto, priorizando as necessidades do usu\u00e1rio.

"},{"location":"elicitacao/grupo5/brainstorm/#pergunta-norteadora","title":"Pergunta Norteadora","text":"

\"Se voc\u00ea pudesse projetar o sistema ideal do Tesouro Direto, quais funcionalidades, caracter\u00edsticas ou melhorias ele deveria ter para atender \u00e0s suas necessidades de forma eficiente e intuitiva?\"

Essa pergunta busca incentivar os participantes a explorar tanto os requisitos funcionais quanto os n\u00e3o funcionais, com foco na experi\u00eancia do usu\u00e1rio e na efici\u00eancia do sistema.

"},{"location":"elicitacao/grupo5/brainstorm/#cronograma","title":"Cronograma","text":"Etapa Descri\u00e7\u00e3o Tempo Estimado 12:00 at\u00e9 12:05 Abertura e Apresenta\u00e7\u00e3o 5 minutos 12:05 at\u00e9 12:10 Contextualiza\u00e7\u00e3o: breve explica\u00e7\u00e3o sobre o objetivo da sess\u00e3o e as regras do brainstorming. 5 minutos 12:10 at\u00e9 12:25 Gera\u00e7\u00e3o de Ideias: participantes respondem \u00e0 pergunta norteadora com ideias livres. 15 minutos 12:25 at\u00e9 12:40 Discuss\u00e3o e Refinamento: agrupamento das ideias em categorias e identifica\u00e7\u00e3o de requisitos. 15 minutos 12:40 at\u00e9 12:50 Prioriza\u00e7\u00e3o de Requisitos: participantes priorizam utilizando a t\u00e9cnica dos 100 d\u00f3lares os requisitos. 10 minutos 12:50 at\u00e9 13:00 Encerramento: resumo dos requisitos priorizados e pr\u00f3ximos passos. 10 minutos"},{"location":"elicitacao/grupo5/brainstorm/#descricao-das-etapas","title":"Descri\u00e7\u00e3o das Etapas","text":"
  1. Abertura e Apresenta\u00e7\u00e3o:

    • Apresenta\u00e7\u00e3o do moderador e dos participantes.
    • Contextualiza\u00e7\u00e3o breve sobre o objetivo e a import\u00e2ncia da sess\u00e3o.
  2. Contextualiza\u00e7\u00e3o:

    • Explica\u00e7\u00e3o do objetivo principal: elicitar requisitos para o aplicativo Tesouro Direto.
    • Regras principais:
      • Todas as ideias s\u00e3o v\u00e1lidas.
      • N\u00e3o h\u00e1 julgamentos durante a gera\u00e7\u00e3o de ideias.
      • Incentivar combina\u00e7\u00f5es e refinamentos.
  3. Gera\u00e7\u00e3o de Ideias:

    • Resposta \u00e0 pergunta norteadora.
    • Participantes contribuem espontaneamente, enquanto o moderador registra as ideias.
  4. Discuss\u00e3o e Refinamento:

    • Agrupamento das ideias em categorias, como requisitos funcionais e n\u00e3o funcionais.
    • Identifica\u00e7\u00e3o de padr\u00f5es ou temas relevantes.
  5. Prioriza\u00e7\u00e3o de Requisitos:

    • Cada participante gasta seu dinheiro com os requisitos que considera mais importante.
    • Registro das ideias mais votadas para an\u00e1lise posterior.
  6. Encerramento:

    • Apresenta\u00e7\u00e3o do resumo final das ideias priorizadas.
    • Explica\u00e7\u00e3o sobre os pr\u00f3ximos passos para incorporar os requisitos ao projeto.
"},{"location":"elicitacao/grupo5/brainstorm/#resultados-do-brainstorm","title":"Resultados do Brainstorm","text":""},{"location":"elicitacao/grupo5/brainstorm/#ideias-geradas-e-priorizacao","title":"Ideias Geradas e Prioriza\u00e7\u00e3o","text":"

Os valores atribu\u00eddos por cada participante na prioriza\u00e7\u00e3o das ideias, utilizando a t\u00e9cnica dos 100 d\u00f3lares, est\u00e3o dispon\u00edveis no seguinte documento: Distribui\u00e7\u00e3o dos 100 Reais dos Usu\u00e1rios.

  1. Uma autodeclara\u00e7\u00e3o de expertise no aplicativo (novo, m\u00e9dio, experiente): Permitir que o usu\u00e1rio selecione seu n\u00edvel de familiaridade com investimentos no momento do cadastro ou na configura\u00e7\u00e3o do perfil, para personalizar as recomenda\u00e7\u00f5es e a experi\u00eancia de uso. \u2013 Autor: Gustavo

    • M\u00e9dia de valor gasto: R$ 10
  2. Tutorial de uso do aplicativo: Implementar uma se\u00e7\u00e3o ou guia interativo que explique, de forma did\u00e1tica, como navegar e utilizar todas as funcionalidades do app, desde o cadastro at\u00e9 a realiza\u00e7\u00e3o de investimentos. \u2013 Autor: Flores

    • M\u00e9dia de valor gasto: R$ 3,54
  3. Aumento do leque de op\u00e7\u00f5es na simula\u00e7\u00e3o: Ampliar as vari\u00e1veis dispon\u00edveis nas ferramentas de simula\u00e7\u00e3o, como ajustes de taxas, prazos e aportes, para que os usu\u00e1rios possam criar cen\u00e1rios mais personalizados. \u2013 Autor: Alexandre

    • M\u00e9dia de valor gasto: R$ 3,54
  4. Exibi\u00e7\u00e3o da liquidez no t\u00edtulo do Tesouro: Adicionar informa\u00e7\u00f5es sobre a liquidez diretamente no t\u00edtulo de cada op\u00e7\u00e3o de investimento, para que o usu\u00e1rio possa avaliar a disponibilidade dos valores com mais facilidade. \u2013 Autor: Flores

    • M\u00e9dia de valor gasto: R$ 4,64
  5. Compara\u00e7\u00e3o de t\u00edtulos de diferentes origens na simula\u00e7\u00e3o: Adicionar uma funcionalidade que permita colocar lado a lado investimentos de origens diferentes, como Tesouro Direto e outras op\u00e7\u00f5es de renda fixa, para facilitar a an\u00e1lise comparativa. \u2013 Autor: Ana

    • M\u00e9dia de valor gasto: R$ 8,10
  6. Controle ampliado na simula\u00e7\u00e3o de aposentadoria: Reformular a simula\u00e7\u00e3o para que o usu\u00e1rio possa personalizar mais vari\u00e1veis, como idade de in\u00edcio, contribui\u00e7\u00f5es mensais, e metas de renda, garantindo maior flexibilidade no planejamento. \u2013 Autor: Matheus Melo

    • M\u00e9dia de valor gasto: R$ 4,37
  7. Integra\u00e7\u00e3o da simula\u00e7\u00e3o na aba \"Meus Sonhos\": Vincular as simula\u00e7\u00f5es de investimento diretamente aos objetivos definidos na aba \"Meus Sonhos\", oferecendo uma vis\u00e3o integrada entre planejamento e execu\u00e7\u00e3o. \u2013 Autor: Matheus Campos

    • M\u00e9dia de valor gasto: R$ 3,82
  8. Cria\u00e7\u00e3o de um dashboard inicial: Implementar uma tela inicial com um resumo visual das principais informa\u00e7\u00f5es financeiras do usu\u00e1rio, como saldo, metas em andamento, e desempenho dos investimentos. \u2013 Autor: Marcos

    • M\u00e9dia de valor gasto: R$ 9,46
  9. Perfil de recomenda\u00e7\u00e3o de investimento mais vis\u00edvel: Tornar o perfil de indica\u00e7\u00e3o mais claro e acess\u00edvel, apresentando uma explica\u00e7\u00e3o detalhada sobre o que ele significa e como ele \u00e9 calculado. \u2013 Autor: Vilmar

    • M\u00e9dia de valor gasto: R$ 4,10
  10. Mais recursos educativos sobre investimentos: Adicionar ferramentas interativas e conte\u00fados explicativos para ensinar os usu\u00e1rios sobre conceitos financeiros e de investimento de maneira pr\u00e1tica e acess\u00edvel. \u2013 Autoras: Bianca e Yza

    • M\u00e9dia de valor gasto: R$ 8
  11. Aprimorar a acessibilidade do layout: Melhorar a disposi\u00e7\u00e3o visual e os elementos de design do aplicativo para torn\u00e1-lo mais intuitivo e inclusivo para diferentes perfis de usu\u00e1rios. \u2013 Autor: Victor G

    • M\u00e9dia de valor gasto: R$ 9,55
  12. Barra de progresso na aba \"Meus Sonhos\": Implementar uma barra visual para acompanhar o progresso de cada objetivo na aba \"Meus Sonhos\", ajudando o usu\u00e1rio a monitorar quanto falta para atingir suas metas. \u2013 Autor: Thales

    • M\u00e9dia de valor gasto: R$ 4,11
  13. Tema escuro no aplicativo: Disponibilizar uma op\u00e7\u00e3o de tema escuro para maior conforto visual durante o uso do aplicativo, especialmente em ambientes de pouca luz. \u2013 Autor: Marcos

    • M\u00e9dia de valor gasto: R$ 5,25
  14. Compara\u00e7\u00e3o com o padr\u00e3o do INSS na aposentadoria: Incluir uma op\u00e7\u00e3o na simula\u00e7\u00e3o de aposentadoria que permita ao usu\u00e1rio comparar seus resultados esperados com o benef\u00edcio m\u00e9dio do INSS, oferecendo mais contexto na decis\u00e3o. \u2013 Autor: Gustavo

    • M\u00e9dia de valor gasto: R$ 3,55
  15. Sugest\u00f5es personalizadas na p\u00e1gina inicial do \"Meu Investimento\": Quando o usu\u00e1rio n\u00e3o tiver investimentos cadastrados, sugerir op\u00e7\u00f5es alinhadas ao perfil dele, como investimentos em Tesouro Direto que possam ser interessantes. \u2013 Autor Gustavo

    • M\u00e9dia de valor gasto: R$ 9,28
"},{"location":"elicitacao/grupo5/brainstorm/#requisitos-funcionais","title":"Requisitos Funcionais","text":"

Tabela 1 - Requisitos Funcionais Tipo Descri\u00e7\u00e3o ID Elaborado (Sim/N\u00e3o) Prioriza\u00e7\u00e3o (M\u00e9dia) RF1 O aplicativo deve permitir que o usu\u00e1rio fa\u00e7a uma autodeclara\u00e7\u00e3o de expertise (novo, m\u00e9dio, experiente). BF1 N\u00e3o R$10 RF2 O aplicativo deve oferecer um tutorial para guiar o usu\u00e1rio no uso das funcionalidades. BF2 N\u00e3o R$3,54 RF3 O sistema deve disponibilizar um maior leque de op\u00e7\u00f5es para simula\u00e7\u00f5es financeiras. BF3 N\u00e3o R$3,54 RF4 O aplicativo deve exibir a liquidez dos t\u00edtulos do Tesouro Nacional na simula\u00e7\u00e3o. BF4 N\u00e3o R$4,64 RF5 O sistema deve permitir a compara\u00e7\u00e3o de t\u00edtulos de diferentes origens na simula\u00e7\u00e3o. BF5 N\u00e3o R$8,10 RF6 O sistema deve integrar a funcionalidade de simula\u00e7\u00e3o com a aba \"Meus Sonhos\". BF7 N\u00e3o R$3,82 RF7 O aplicativo deve apresentar um dashboard inicial com informa\u00e7\u00f5es relevantes para o usu\u00e1rio. BF8 N\u00e3o R$9,46 RF8 O aplicativo deve disponibilizar mais recursos educativos sobre investimentos. BF10 N\u00e3o R$8 RF9 O sistema deve incluir uma barra de progresso na aba \"Meus Sonhos\". BF12 N\u00e3o R$4,11 RF10 O aplicativo deve permitir a compara\u00e7\u00e3o da simula\u00e7\u00e3o com os padr\u00f5es do INSS na aposentadoria. BF14 N\u00e3o R$3,55 RF11 O sistema deve exibir sugest\u00f5es personalizadas na p\u00e1gina inicial do \"Meu Investimento\". BF15 N\u00e3o R$9,28

Autor: V\u00edctor Schmidt, 2024

"},{"location":"elicitacao/grupo5/brainstorm/#_1","title":"Brainstorm","text":""},{"location":"elicitacao/grupo5/brainstorm/#requisitos-nao-funcionais","title":"Requisitos N\u00e3o Funcionais","text":"

Tabela 2 - Requisitos N\u00e3o Funcionais Tipo Descri\u00e7\u00e3o ID Elaborado (Sim/N\u00e3o) Prioriza\u00e7\u00e3o (M\u00e9dia) RFN1 O sistema deve oferecer controle ampliado para simula\u00e7\u00f5es de aposentadoria. BFN6 N\u00e3o R$4,37 RFN2 O perfil de recomenda\u00e7\u00e3o de investimentos deve ser mais vis\u00edvel e acess\u00edvel no aplicativo. BFN9 N\u00e3o R$4,10 RFN3 O layout do aplicativo deve ser aprimorado para aumentar a acessibilidade. BFN11 N\u00e3o R$9,55 RFN4 O aplicativo deve incluir uma op\u00e7\u00e3o de tema escuro para melhorar a experi\u00eancia do usu\u00e1rio. BFN13 N\u00e3o R$5,25

Autor: V\u00edctor Schmidt, 2024

"},{"location":"elicitacao/grupo5/brainstorm/#video-da-verificacao","title":"V\u00eddeo da Verifica\u00e7\u00e3o","text":"

O termo de consentimento assinado pelos participantes assegura a autoriza\u00e7\u00e3o para uso de suas imagens, vozes e opini\u00f5es expressas durante a atividade de brainstorming. Ele detalha que:

  • Objetivo: O termo \u00e9 exclusivo para fins acad\u00eamicos, como registro, consulta e divulga\u00e7\u00e3o dos resultados do projeto da disciplina de Requisitos de Software.
  • Permiss\u00f5es: Autoriza a publica\u00e7\u00e3o em reposit\u00f3rios p\u00fablicos (GitHub e MkDocs) e v\u00eddeos n\u00e3o listados no YouTube, sem qualquer uso comercial.
  • Garantias: O material ser\u00e1 usado apenas para prop\u00f3sitos educacionais, respeitando as restri\u00e7\u00f5es de confidencialidade e consentimento.
  • Limita\u00e7\u00f5es: Devido \u00e0 natureza p\u00fablica, o conte\u00fado n\u00e3o poder\u00e1 ser removido ap\u00f3s a publica\u00e7\u00e3o.

Para mais detalhes, o termo completo est\u00e1 dispon\u00edvel aqui.

"},{"location":"elicitacao/grupo5/brainstorm/#bibliografia","title":"Bibliografia","text":"

BARBOSA, S. D. J.; SILVA, B. S. da; SILVEIRA, M. S.; GASPARINI, I.; DARIN, T.; BARBOSA, G. D. J. Intera\u00e7\u00e3o Humano-Computador e Experi\u00eancia do Usu\u00e1rio. Autopublica\u00e7\u00e3o, 2021. ISBN: 978-65-00-19677-1.

VIANNA, M.; VIANNA, Y.; ADLER, I. K.; LUCENA, B.; RUSS, B. Design Thinking: Inova\u00e7\u00e3o em Neg\u00f3cios. MJV Press, 2012.

WIGERS, K.; BEATTY, J. Software Requirements. 3. ed. Microsoft Press, 2012. ISBN: 978-0-7356-2701-2.

"},{"location":"elicitacao/grupo5/brainstorm/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 18/11/2024 Cria\u00e7\u00e3o do documento V\u00edctor Schmidt Thales Euflauzino e Maria Helena 1.1 18/11/2024 Adicionando Roteiro V\u00edctor Schmidt Thales Euflauzino e Maria Helena 1.2 19/11/2024 Adicionando Resultados V\u00edctor Schmidt Thales Euflauzino e Maria Helena 1.3 20/11/2024 Adicionando V\u00eddeo V\u00edctor Schmidt Thales Euflauzino e Maria Helena"},{"location":"elicitacao/grupo5/grupo-de-foco/","title":"Grupo de Foco: Avalia\u00e7\u00e3o do Aplicativo Tesouro Direto","text":""},{"location":"elicitacao/grupo5/grupo-de-foco/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A t\u00e9cnica de grupo de foco foi utilizada para coletar insights qualitativos sobre a experi\u00eancia dos usu\u00e1rios do aplicativo Tesouro Direto. O objetivo principal foi entender as percep\u00e7\u00f5es, dificuldades e sugest\u00f5es de melhoria diretamente dos usu\u00e1rios, permitindo uma an\u00e1lise mais rica para subsidiar futuras atualiza\u00e7\u00f5es no aplicativo.

"},{"location":"elicitacao/grupo5/grupo-de-foco/#metodologia","title":"Metodologia","text":"

A t\u00e9cnica do Grupo de Foco foi empregada para conduzir a an\u00e1lise. A reuni\u00e3o contou com tr\u00eas participantes, listados na Tabela 1, que compartilharam suas experi\u00eancias e opini\u00f5es sobre o uso do aplicativo. O roteiro do grupo de foco foi elaborado por Thales Euflauzino, dispon\u00edvel nesse link. Foi conduzido por Maria Helena e teve a revis\u00e3o presencial do V\u00edctor Schmidt, e a grava\u00e7\u00e3o est\u00e1 dispon\u00edvel no V\u00eddeo 1. O grupo de foco teve a inten\u00e7\u00e3o de abranger t\u00f3picos como experi\u00eancia do usu\u00e1rio, funcionalidades, acompanhamento de investimentos, seguran\u00e7a e sugest\u00f5es de melhorias.

Tabela 1 - Nome completo e idade dos participantes. Nome Idade Manoela Silvestre Garcia Chaves 20 Victor Hugo dos Santos Bernardes 23 Marcos Augusto Oliveira Goulart 20

Autor: Elaborado por Thales Euflauzino, 2024

"},{"location":"elicitacao/grupo5/grupo-de-foco/#resultados","title":"Resultados","text":""},{"location":"elicitacao/grupo5/grupo-de-foco/#1-experiencia-do-usuario","title":"1. Experi\u00eancia do Usu\u00e1rio","text":"
  • Manoela: O login foi considerado pouco atraente. Usou o aplicativo apenas algumas vezes.
  • Victor: Achou o simulador interativo e bem projetado.
  • Marcos: Considerou as funcionalidades desconexas, dificultando a navega\u00e7\u00e3o.
"},{"location":"elicitacao/grupo5/grupo-de-foco/#2-funcionalidades-essenciais","title":"2. Funcionalidades Essenciais","text":"
  • Manoela: Utilizou os recursos de investimento e sonhos, relatando que o aplicativo atendeu \u00e0s suas necessidades b\u00e1sicas.
  • Victor: Concentrou-se no simulador e destacou a aus\u00eancia de um modo escuro funcional.
  • Marcos: Recomendou a inclus\u00e3o de uma tela comparativa para diferentes investimentos.
"},{"location":"elicitacao/grupo5/grupo-de-foco/#3-acompanhamento-e-notificacoes","title":"3. Acompanhamento e Notifica\u00e7\u00f5es","text":"
  • Manoela: Acompanha o andamento dos investimentos manualmente, sem utilizar as notifica\u00e7\u00f5es.
  • Marcos e Victor: N\u00e3o mencionaram o uso de notifica\u00e7\u00f5es como prioridade.
"},{"location":"elicitacao/grupo5/grupo-de-foco/#4-seguranca","title":"4. Seguran\u00e7a","text":"
  • Manoela: Sente-se segura devido \u00e0 sua organiza\u00e7\u00e3o pessoal, pois anota as senhas.
  • Victor: Confia no aplicativo pela intui\u00e7\u00e3o e design, mas buscaria reviews antes de usar para transa\u00e7\u00f5es cr\u00edticas.
  • Marcos: Confia por ser um produto do Tesouro Nacional e da B3, mas tem d\u00favidas sobre o login pelo Gov.br.
"},{"location":"elicitacao/grupo5/grupo-de-foco/#5-melhorias-e-sugestoes","title":"5. Melhorias e Sugest\u00f5es","text":"
  • Manoela: N\u00e3o sugeriu grandes mudan\u00e7as, afirmando que o aplicativo atende \u00e0s suas necessidades.
  • Victor: Apontou falhas na responsividade e sugeriu melhorias no design de login e modo escuro.
  • Marcos: Sugeriu uma interface mais intuitiva para novos usu\u00e1rios e maior conectividade entre funcionalidades.
"},{"location":"elicitacao/grupo5/grupo-de-foco/#conclusao","title":"Conclus\u00e3o","text":"

O grupo de foco revelou que:

  • O simulador de investimentos \u00e9 amplamente valorizado pelos usu\u00e1rios, mas melhorias na interface geral s\u00e3o necess\u00e1rias.
  • A aus\u00eancia de um modo escuro adequado \u00e9 um ponto negativo destacado.
  • Seguran\u00e7a \u00e9 percebida como satisfat\u00f3ria devido \u00e0 confian\u00e7a na marca, embora o login pelo Gov.br tenha gerado d\u00favidas.
  • H\u00e1 sugest\u00f5es para aprimorar a navega\u00e7\u00e3o, conectividade das funcionalidades e inclus\u00e3o de novas telas comparativas.
"},{"location":"elicitacao/grupo5/grupo-de-foco/#recomendacoes","title":"Recomenda\u00e7\u00f5es","text":"
  1. Melhorar a usabilidade e o design do login, incluindo op\u00e7\u00f5es modernas como biometria.
  2. Implementar um modo escuro funcional e melhorias na responsividade para dispositivos m\u00f3veis.
  3. Adicionar funcionalidades de compara\u00e7\u00e3o de investimentos e uma interface mais intuitiva para usu\u00e1rios novos.
"},{"location":"elicitacao/grupo5/grupo-de-foco/#video-do-grupo-de-foco","title":"V\u00eddeo do Grupo de Foco","text":"

V\u00eddeo 1: Elicita\u00e7\u00e3o de Requisitos - Grupo de Foco

Autor: Thales Euflauzino, 2024

"},{"location":"elicitacao/grupo5/grupo-de-foco/#termo-de-consentimento","title":"Termo de Consentimento","text":"

O termo de consentimento utilizado neste grupo de foco permite o uso de imagem, \u00e1udio e dados fornecidos pelos participantes exclusivamente para fins educativos e de pesquisa.

Para abrir o documento completo do termo de consentimento, clique aqui.

"},{"location":"elicitacao/grupo5/grupo-de-foco/#bibliografia","title":"Bibliografia","text":"

Barbosa, S. D. J.; Silva, B. S. da; Silveira, M. S.; Gasparini, I.; Darin, T.; Barbosa, G. D. J. (2021) Intera\u00e7\u00e3o Humano-Computador e Experi\u00eancia do usu\u00e1rio. Cap 7. Autopublica\u00e7\u00e3o. ISBN: 978-65-00-19677-1.

Economia DF - Grupo de Foco. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.2-Economia-DF/elicitacao/tecnicas-perfil-usuario/grupo_de_foco/. Acesso em 19 de novembro de 2024

Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 19/11/2024 Estrutura\u00e7\u00e3o Inicial Thales Euflauzino Victor Rodrigues"},{"location":"elicitacao/grupo5/introspeccao/","title":"Introspec\u00e7\u00e3o da Elicita\u00e7\u00e3o de Requisitos","text":""},{"location":"elicitacao/grupo5/introspeccao/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Este artefato tem como objetivo realizar uma introspec\u00e7\u00e3o para a elicita\u00e7\u00e3o dos requisitos do projeto Tesouro Direto. A t\u00e9cnica de introspec\u00e7\u00e3o consiste em uma an\u00e1lise pessoal e aprofundada que busca identificar elementos essenciais para o software. Nesse m\u00e9todo, o respons\u00e1vel deve imaginar uma situa\u00e7\u00e3o hipot\u00e9tica em que uma tarefa espec\u00edfica do sistema \u00e9 realizada, permitindo a identifica\u00e7\u00e3o de necessidades e funcionalidades indispens\u00e1veis. Dessa forma, os requisitos levantados s\u00e3o apresentados na Tabela 1 e na Tabela 2.

"},{"location":"elicitacao/grupo5/introspeccao/#metodologia","title":"Metodologia","text":"

A t\u00e9cnica de introspec\u00e7\u00e3o foi aplicada individualmente por V\u00edctor Schmidt no per\u00edodo de 09/11/2024 a 16/11/2024. Ap\u00f3s essa etapa, os requisitos identificados foram organizados em duas tabelas: Tabela 1 para Requisitos Funcionais e Tabela 2 para Requisitos N\u00e3o-Funcionais. Conclu\u00eddo o levantamento, revisamos o aplicativo do Tesouro Direto selecionado pelo grupo, verificando a presen\u00e7a ou aus\u00eancia dos requisitos elicitados.

"},{"location":"elicitacao/grupo5/introspeccao/#introspeccao-do-autor","title":"Introspec\u00e7\u00e3o do Autor","text":"

Para aplicar essa metodologia, imaginei-me em uma situa\u00e7\u00e3o onde eu, como usu\u00e1rio, desejasse investir no Tesouro Direto e acessasse o aplicativo para realizar essa tarefa. Sem visualizar o aplicativo, procurei listar todas as fun\u00e7\u00f5es essenciais que ele deveria oferecer para tornar o processo de investimento mais simples e eficiente. Al\u00e9m disso, considerei as dificuldades comuns que um investidor iniciante poderia enfrentar e como o aplicativo deveria abordar esses desafios, proporcionando solu\u00e7\u00f5es intuitivas e funcionais.

Esse processo de introspec\u00e7\u00e3o para elicita\u00e7\u00e3o de requisitos consiste justamente em colocar-se no lugar do usu\u00e1rio sem a refer\u00eancia visual direta do produto, buscando compreender quais funcionalidades (tanto funcionais quanto n\u00e3o funcionais) s\u00e3o fundamentais. No contexto do aplicativo do Tesouro Direto, essa abordagem me permitiu estruturar uma vis\u00e3o clara dos recursos necess\u00e1rios, levando em conta a experi\u00eancia do usu\u00e1rio e o conhecimento pr\u00e9vio de funcionalidades encontradas em aplicativos semelhantes.

"},{"location":"elicitacao/grupo5/introspeccao/#requisitos-elicitados","title":"Requisitos Elicitados","text":""},{"location":"elicitacao/grupo5/introspeccao/#legenda-das-tabelas","title":"Legenda das Tabelas:","text":"
  • RFx: Requisito Funcional n\u00famero x;
  • RNFx: Requisito N\u00e3o Funcional n\u00famero x;
  • ITx: Requisito n\u00famero x;
"},{"location":"elicitacao/grupo5/introspeccao/#requisitos-funcionais","title":"Requisitos Funcionais","text":"

Tabela 1 - Requisitos Funcionais. Tipo Descri\u00e7\u00e3o ID Elaborado (Sim/N\u00e3o) Prioriza\u00e7\u00e3o (MoSCoW) RF1 Permitir a consulta de investimentos por institui\u00e7\u00e3o financeira. IT1 Sim Must Have RF2 Permitir a simula\u00e7\u00e3o, realiza\u00e7\u00e3o e visualiza\u00e7\u00e3o de detalhes de investimentos nos t\u00edtulos SELIC, Prefixado e Infla\u00e7\u00e3o. IT2 Sim Must Have RF3 Permitir o resgate de investimentos, considerando a institui\u00e7\u00e3o financeira associada. IT3 Sim Must Have RF4 Oferecer funcionalidade para salvar metas de investimentos (Sonhos). IT4 Sim Should Have RF5 Permitir simula\u00e7\u00e3o e planejamento de aposentadoria indicando o ano esperado de aposentadoria. IT5 Sim Should Have RF6 Disponibilizar consulta \u00e0 taxa de cust\u00f3dia da B3 e taxa de administra\u00e7\u00e3o da institui\u00e7\u00e3o financeira. IT6 Sim Must Have RF7 Incluir um simulador para ajudar o usu\u00e1rio a encontrar t\u00edtulos adequados ao perfil dele. IT7 Sim Could Have RF8 Permitir a consulta de opera\u00e7\u00f5es realizadas e agendadas. IT8 Sim Must Have RF9 Oferecer a funcionalidade de \u201cFale Conosco\u201d. IT9 Sim Must Have RF10 Permitir a visualiza\u00e7\u00e3o de notifica\u00e7\u00f5es recebidas. IT10 Sim Should Have RF11 Incluir funcionalidades sobre o aplicativo (avaliar, indicar para um amigo ou limpar cache). IT11 Sim Could Have RF12 Permitir a visualiza\u00e7\u00e3o de dados do usu\u00e1rio. IT12 Sim Must Have RF13 Implementar notifica\u00e7\u00f5es personalizadas para lembrar o usu\u00e1rio de metas ou vencimento de t\u00edtulos. IT13 N\u00e3o Should Have RF14 Permitir a transfer\u00eancia autom\u00e1tica entre investimentos com base em metas ou cen\u00e1rios predefinidos. IT14 N\u00e3o Could Have RF15 Incluir relat\u00f3rios personalizados para an\u00e1lise detalhada de rentabilidade e evolu\u00e7\u00e3o de investimentos. IT16 N\u00e3o Should Have RF16 Disponibilizar um recurso educativo com v\u00eddeos e artigos sobre como investir no Tesouro Direto. IT17 N\u00e3o Should Have RF17 Oferecer integra\u00e7\u00e3o com carteiras digitais para pagamento direto de investimentos. IT18 N\u00e3o Could Have RF18 Incorporar alertas de mercado com base em mudan\u00e7as na taxa SELIC ou infla\u00e7\u00e3o. IT19 N\u00e3o Must Have RF19 Adicionar gamifica\u00e7\u00e3o, como conquistas ou recompensas simb\u00f3licas ao atingir metas financeiras. IT20 N\u00e3o Could Have

Autor: V\u00edctor Schmidt, 2024

"},{"location":"elicitacao/grupo5/introspeccao/#requisitos-nao-funcionais","title":"Requisitos N\u00e3o Funcionais","text":"

Tabela 2 - Requisitos N\u00e3o Funcionais. Tipo Descri\u00e7\u00e3o ID Elaborado (Sim/N\u00e3o) Prioriza\u00e7\u00e3o (MoSCoW) RNF1 O sistema deve ter tempo de resposta inferior a 2 segundos para consultas b\u00e1sicas. IT13 N\u00e3o Must Have RNF2 Garantir a seguran\u00e7a dos dados sens\u00edveis do usu\u00e1rio conforme a LGPD. IT21 Sim Must Have RNF3 O aplicativo deve ser responsivo para dispositivos m\u00f3veis e tablets. IT22 Sim Must Have RNF4 A interface deve ser intuitiva e seguir as diretrizes de acessibilidade. IT23 N\u00e3o Should Have RNF5 O sistema deve permitir integra\u00e7\u00f5es seguras com APIs de institui\u00e7\u00f5es financeiras. IT24 Sim Must Have RNF6 Disponibilizar suporte para m\u00faltiplos idiomas (portugu\u00eas como padr\u00e3o). IT25 N\u00e3o Could Have

Autor: V\u00edctor Schmidt, 2024

"},{"location":"elicitacao/grupo5/introspeccao/#bibliografia","title":"Bibliografia","text":"

Bilheteria Digital - Instrospec\u00e7\u00e3o. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/elicitacao/tecnicas/introspeccao/. Acesso em 15 de novembro de 2024

SERRANO, Milene; SERRANO, Maur\u00edcio. Apresenta\u00e7\u00e3o Elicita\u00e7\u00e3o de Requisitos - T\u00e9cnicas - Prioriza\u00e7\u00e3o. Bras\u00edlia: UnB Gama, s.d. 1 apresenta\u00e7\u00e3o em slides.

Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 15/11/2024 Estrutura\u00e7\u00e3o Inicial V\u00edctor Schmidt Thales Euflauzino"},{"location":"elicitacao/grupo5/perfil-usuario/","title":"Perfil de Usu\u00e1rio","text":""},{"location":"elicitacao/grupo5/perfil-usuario/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O perfil de usu\u00e1rio \u00e9 uma descri\u00e7\u00e3o detalhada das caracter\u00edsticas, comportamentos e objetivos de quem utiliza um produto, servi\u00e7o ou sistema. Ele pode incluir aspectos como interesses, habilidades, faixa et\u00e1ria, experi\u00eancia tecnol\u00f3gica, prefer\u00eancias e desafios enfrentados. Essa an\u00e1lise permite \u00e0s equipes de design, desenvolvimento e marketing criem solu\u00e7\u00f5es mais personalizadas e eficientes, alinhadas \u00e0s expectativas do p\u00fablico-alvo.

"},{"location":"elicitacao/grupo5/perfil-usuario/#metodologia","title":"Metodologia","text":"

A defini\u00e7\u00e3o do perfil de usu\u00e1rio foi realizada por meio de uma abordagem combinada que incluiu a aplica\u00e7\u00e3o de um question\u00e1rio online, pode ser verificado em Questionario. Paralelamente, foi utilizado um site especializado em an\u00e1lise de tr\u00e1fego para validar e complementar os dados obtidos, permitindo identificar padr\u00f5es de navega\u00e7\u00e3o e comportamento dos usu\u00e1rios.

"},{"location":"elicitacao/grupo5/perfil-usuario/#ferramenta-de-trafego","title":"Ferramenta de Tr\u00e1fego","text":"

Ao utilizar a ferramenta de tr\u00e1fego Similarweb [adicionar nas ferramentas], foi poss\u00edvel concluir, conforme as Figura 1 e a Figura 2, que o aplicativo \u00e9 predominantemente usado por pessoas do sexo masculino e na faixa et\u00e1ria de 25 a 34 anos.

"},{"location":"elicitacao/grupo5/perfil-usuario/#figura-1","title":"Figura 1","text":"

Fonte: SimilarWeb, 2024

"},{"location":"elicitacao/grupo5/perfil-usuario/#figura-2","title":"Figura 2","text":"

Fonte: SimilarWeb, 2024

"},{"location":"elicitacao/grupo5/perfil-usuario/#definicao-do-perfil","title":"Defini\u00e7\u00e3o do Perfil","text":"

Ap\u00f3s uma an\u00e1lise das respostas, foi tra\u00e7ado um Perfil de Usu\u00e1rio para o aplicativo com as seguintes descri\u00e7\u00f5es:

  • G\u00eanero:
  • Idade:
  • Experi\u00eancia:
  • Atitudes:
  • Tarefas prim\u00e1rias:
"},{"location":"elicitacao/grupo5/perfil-usuario/#bibliografia","title":"Bibliografia","text":"

BARBOSA, S. D. J.; SILVA, B. S. Intera\u00e7\u00e3o Humano-Computador. Rio de Janeiro: Elsevier, 2011.

BARROS, Philipe de Sousa. Perfil do Usu\u00e1rio. Reposit\u00f3rio da disciplina de Requisitos de Software da Universidade de Bras\u00edlia, 2022. Dispon\u00edvel em: https://requisitos-de-software.github.io/2022.2-Grasshopper/elicitacao/perfil-do-usuario/. Acesso em: 19 nov. 2024.

HENRIQUE, M. et al. Perfil do Usu\u00e1rio. Reposit\u00f3rio da disciplina de Requisitos de Software da Universidade de Bras\u00edlia, 2023. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/elicitacao/perfil_de_usuario/. Acesso em: 19 nov. 2024.

"},{"location":"elicitacao/grupo5/perfil-usuario/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 19/11/2024 Estrutura\u00e7\u00e3o Inicial V\u00edctor Rodrigues Thales Euflauzino"},{"location":"elicitacao/grupo5/personas/","title":"Personas","text":""},{"location":"elicitacao/grupo5/personas/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Personas s\u00e3o representa\u00e7\u00f5es fict\u00edcias de usu\u00e1rios criadas para ajudar equipes de design e desenvolvimento a compreender melhor o p\u00fablico-alvo e suas necessidades. Essas representa\u00e7\u00f5es s\u00e3o baseadas em dados reais, combinando informa\u00e7\u00f5es demogr\u00e1ficas, comportamentais e psicogr\u00e1ficas, e t\u00eam como objetivo facilitar a empatia e a tomada de decis\u00f5es centradas no usu\u00e1rio. Ao criar personas, \u00e9 poss\u00edvel personalizar solu\u00e7\u00f5es, melhorar a comunica\u00e7\u00e3o entre equipes e garantir que o produto atenda \u00e0s expectativas dos diferentes tipos de usu\u00e1rios.

"},{"location":"elicitacao/grupo5/personas/#metodologia","title":"Metodologia","text":"

A constru\u00e7\u00e3o das personas seguiu uma metodologia estruturada em tr\u00eas etapas principais:

  1. Coleta e An\u00e1lise de Dados: Utilizamos informa\u00e7\u00f5es obtidas a partir de question\u00e1rios aplicados aos usu\u00e1rios, combinadas com dados de ferramentas de an\u00e1lise de tr\u00e1fego, como Similarweb. Os dados obtivos permitiram identificar padr\u00f5es de comportamento e caracter\u00edsticas demogr\u00e1ficas, como idade, sexo e prefer\u00eancias de uso do aplicativo.

  2. Defini\u00e7\u00e3o das Personas: Com base nas an\u00e1lises realizadas, criamos cinco personas principais: quatro que representam diferentes tipos de usu\u00e1rios (prim\u00e1rios e secund\u00e1rios) e uma antipersona, que simboliza o p\u00fablico que n\u00e3o \u00e9 o foco do sistema. Cada persona recebeu um nome fict\u00edcio, caracter\u00edsticas detalhadas, uma breve hist\u00f3ria e objetivos, tornando-as representa\u00e7\u00f5es completas e f\u00e1ceis de compreender.

  3. Visualiza\u00e7\u00e3o e Valida\u00e7\u00e3o: Para ilustrar as personas, utilizamos a ferramenta This Person Doesn't Exist para gerar imagens fict\u00edcias e represent\u00e1-las visualmente. As personas foram compartilhadas com a equipe para valida\u00e7\u00e3o, garantindo que refletem adequadamente os perfis de usu\u00e1rios identificados e s\u00e3o \u00fateis para o processo de design.

"},{"location":"elicitacao/grupo5/personas/#elenco","title":"Elenco","text":""},{"location":"elicitacao/grupo5/personas/#persona-primaria-1","title":"Persona Prim\u00e1ria 1","text":"

Nome: Idade: G\u00eanero: Profiss\u00e3o: Escolaridade: Habilidades: Afinidade com tecnologia: Relacionamento: Objetivo: Tarefas: Requisitos: Expectativa:

"},{"location":"elicitacao/grupo5/personas/#persona-primaria-2","title":"Persona Prim\u00e1ria 2","text":"

Nome: Idade: G\u00eanero: Profiss\u00e3o: Escolaridade: Habilidades: Afinidade com tecnologia: Relacionamento: Objetivo: Tarefas: Requisitos: Expectativa:

"},{"location":"elicitacao/grupo5/personas/#persona-secundaria-1","title":"Persona Secund\u00e1ria 1","text":"

Nome: Idade: G\u00eanero: Profiss\u00e3o: Escolaridade: Habilidades: Afinidade com tecnologia: Relacionamento: Objetivo: Tarefas: Requisitos: Expectativa:

"},{"location":"elicitacao/grupo5/personas/#persona-secundaria-2","title":"Persona Secund\u00e1ria 2","text":"

Nome: Idade: G\u00eanero: Profiss\u00e3o: Escolaridade: Habilidades: Afinidade com tecnologia: Relacionamento: Objetivo: Tarefas: Requisitos: Expectativa:

"},{"location":"elicitacao/grupo5/personas/#antipersona-1","title":"Antipersona 1","text":"

Nome: Idade: G\u00eanero: Profiss\u00e3o: Escolaridade: Habilidades: Afinidade com tecnologia: Relacionamento: Objetivo: Tarefas: Requisitos: Expectativa:

"},{"location":"elicitacao/grupo5/personas/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"
  1. Imagem gerada atrav\u00e9s da aplica\u00e7\u00e3o This Person Doesn't Exist. Dispon\u00edvel em: https://this-person-does-not-exist.com/. Acesso em: 20 de nov. de 2024.
"},{"location":"elicitacao/grupo5/personas/#bibliografia","title":"Bibliografia","text":"

BARBOSA, S. D. J.; SILVA, B. S. Intera\u00e7\u00e3o Humano-Computador. Rio de Janeiro: Elsevier, 2011.

BARROS, Philipe de Sousa. Personas. Reposit\u00f3rio da disciplina de Requisitos de Software da Universidade de Bras\u00edlia, 2022. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.2-Economia-DF/elicitacao/personas/. Acesso em: 19 nov. 2024.

HENRIQUE, M. et al. Personas. Reposit\u00f3rio da disciplina de Requisitos de Software da Universidade de Bras\u00edlia, 2023. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/elicitacao/personas/. Acesso em: 19 nov. 2024.

"},{"location":"elicitacao/grupo5/personas/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor Revisor 1.0 19/11/2024 Estrutura\u00e7\u00e3o Inicial V\u00edctor Rodrigues Thales Euflauzino"},{"location":"verificacao/lv-geral/","title":"Panorama geral da verifica\u00e7\u00e3o","text":""},{"location":"verificacao/lv-geral/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A verifica\u00e7\u00e3o \u00e9 uma das etapas mais importantes do desenvolvimento de um projeto. Nela os artefatos produzidos s\u00e3o analisados garantindo que cumpram com os seus requisitos especificados.

"},{"location":"verificacao/lv-geral/#objetivos","title":"Objetivos","text":"

O objetivo deste documento \u00e9 verificar se os artefatos produzidos em cada etapa do projeto pelo grupo possuem os itens e o padr\u00e3o exigidos para tais. \u00c9 importante citar que todas as verifica\u00e7\u00f5es s\u00e3o apenas em rela\u00e7\u00e3o ao artefato, nunca entrando na an\u00e1lise pessoal.

"},{"location":"verificacao/lv-geral/#metodologia","title":"Metodologia","text":"

O grupo determinou que todos utilizariam a metodologia de verifica\u00e7\u00e3o por inspe\u00e7\u00e3o, desenvolvida por Michael E. Fagan, na IBM em 1976 1. As entregas e os artefatos foram distribu\u00eddos entre os integrantes do grupo para que todos pudessem participar da verifica\u00e7\u00e3o. Para cada entrega foi produzido um documento de planejamneto de verififca\u00e7\u00e3o com as listas de verifica\u00e7\u00e3o que foram inspecionadas e para cada artefato foi criado um documento com os resultados da verifica\u00e7\u00e3o daquele artefato espec\u00edfico.

"},{"location":"verificacao/lv-geral/#lista-de-verificacao","title":"Lista de Verifica\u00e7\u00e3o","text":"

Para cada entrega, ser\u00e3o elaboradas listas de verifica\u00e7\u00e3o para verficar os padr\u00f5es esperados para cada artefato e as principais tarefas realizadas na elabora\u00e7\u00e3o dos mesmos

"},{"location":"verificacao/lv-geral/#referencias-bibliograficas","title":"Refer\u00eancias bibliogr\u00e1ficas","text":"

1. SOMMERVILLE, Ian. Engenharia de software. 08. ed. S\u00e3o Paulo: Pearson Addison Wesley, 2007

Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 02/11/2024 Cria\u00e7\u00e3o do documento. Thales Euflauzino V\u00edctor Schmidt 1.1 12/11/2024 Corringindo checklist para lista de verifica\u00e7\u00e3o Thales Euflauzino Victor Rodrigues"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/","title":"Planejamento da Verifica\u00e7\u00e3o da Etapa 1 do Grupo","text":""},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O artefato visa apresentar o planejamento para a verifica\u00e7\u00e3o de cada artefato da etapa 1 do projeto do grupo.

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#objetivos","title":"Objetivos","text":"

O objetivo deste documento \u00e9 verificar se os artefatos produzidos para entrega 1 do grupo possuem os itens e o padr\u00e3o exigidos. \u00c9 importante citar que essa verifica\u00e7\u00e3o em momento nenhum busca diminuir os membros respons\u00e1veis seu trabalho, apenas aplicar os conceitos de verifica\u00e7\u00e3o.

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#metodologia","title":"Metodologia","text":"

A metodologia escolhida para esta verifica\u00e7\u00e3o \u00e9 uma adapta\u00e7\u00e3o da inspe\u00e7\u00e3o. Desenvolvida originalmente para c\u00f3digos de software por Fagan na IBM em 1976, essa t\u00e9cnica consiste em uma revis\u00e3o formal dos artefatos produzidos a fim de se encontrar defeitos, a figura 1 exemplifica as etapas que Fagan prop\u00f4s para esse processo.

Figura 1 - Etapas da Inspe\u00e7\u00e3o de acordo com Fagan.

Fonte: SOMMERVILLE (2007).4

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#objetos-da-verificacao","title":"Objetos da Verifica\u00e7\u00e3o","text":"

Os artefatos alvos dessa verifica\u00e7\u00e3o s\u00e3o:

  • Heatmap na vers\u00e3o 1.1 de data 31/10/2024, produzido por Victor Rodrigues e Thales Euflauzino com revis\u00e3o de Thales Euflauzino e V\u00edctor Schmidt.
  • Lista de apps avaliados na vers\u00e3o 1.5 de data 31/10/2024, produzido por e revisado por todos os membros do grupo.
  • App Escolhido na vers\u00e3o 1.3 de data 29/10/2024, produzido por Victor Rodrigues e J\u00falia Takaki com revis\u00e3o de Thales Euflauzino e V\u00edctor Schmidt
  • Rich Picture na vers\u00e3o 1.1 de data 02/11/2024, produzido por Thales Euflauzino e J\u00falia Takaki com a revis\u00e3o de V\u00edctor Schmidt.
  • Cronograma na vers\u00e3o 1.3 de data 02/11/2024, produzido por Maria Helena e V\u00edctor Schmidt com revis\u00e3o de Thales Euflauzino.
"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#resultados-das-verificacoes","title":"Resultados das Verifica\u00e7\u00f5es","text":"

Os resultados das verifica\u00e7\u00f5es podem ser acessados atrav\u00e9s do seguinte link:

  • Relat\u00f3rio da Verifica\u00e7\u00e3o;
"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#cronograma","title":"Cronograma","text":"

A verifica\u00e7\u00e3o ser\u00e1 realizada no per\u00edodo de 06 de novembro de 2024, com os resultados sendo relatados atrav\u00e9s da p\u00e1gina de documenta\u00e7\u00e3o do Grupo 5 no dia 06 de novembro de 2024. A tabela 2 a seguir, apresenta o cronograma das atividades a serem realizadas.

Tabela 2 - Cronograma das Atividades.

Data Descri\u00e7\u00e3o Respons\u00e1vel 30/10/2024 Verifica\u00e7\u00e3o do Rich Picture. Thales Euflauzino e V\u00edctor Schmidt 02/11/2024 Adi\u00e7\u00e3o dos resultados. V\u00edctor Schmidt e Victor Rodrigues

Autor: V\u00edctor Schmidt, 2024

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#lista-de-verificacao","title":"Lista de Verifica\u00e7\u00e3o","text":"

As listas de verifica\u00e7\u00e3o foram constru\u00eddas levando em conta os padr\u00f5es esperados para cada artefato e as principais tarefas realizadas na elabora\u00e7\u00e3o dos mesmos, tudo isso de acordo com os slides da Aula 04 da professora Milene e Maur\u00edcio Serrano3 e a literatura Introducing Rich Picture - Rich Picture Drawing Guidelines2.

Com o intuito de melhor organizar a verifica\u00e7\u00e3o, a lista de verifica\u00e7\u00e3o ser\u00e1 dividida em 2 listas sendo que uma dever\u00e1 estar presente em todas as etapas de verifica\u00e7\u00e3o, no caso a Lista de Verifica\u00e7\u00e3o Geral. Sendo assim, as listas de verifica\u00e7\u00e3o ser\u00e3o as seguintes: Geral e Rich Picture. As tabelas de 3 a 4 apresenta as listas de verifica\u00e7\u00e3o utilizadas na verifica\u00e7\u00e3o.

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#geral","title":"Geral","text":"

Tabela 3 - Lista de Verifica\u00e7\u00e3o dos Itens do Planejamento Geral do projeto .

ID Descri\u00e7\u00e3o Avalia\u00e7\u00e3o 1 Uma p\u00e1gina apresentando os integrantes da equipe (com foto) com nome e sem matr\u00edcula? --- 2 o cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de in\u00edcio e fim das entrega dos artefatos e com o per\u00edodo da revis\u00e3o deles? --- 3 o cronograma do planejamento apresenta um per\u00edodo de grava\u00e7\u00e3o da apresenta\u00e7\u00e3o de cada etapa --- 4 O cronograma prever um per\u00edodo de revis\u00e3o/ajustes nos artefatos devidos as considera\u00e7\u00f5es dos monitores/professor? --- 5 A motiva\u00e7\u00e3o e os crit\u00e9rios para a escolha do App? --- 6 C\u00f3pia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina. --- 7 Possui op\u00e7\u00e3o de contraste de cores? ---

Autores: Equipe do Projeto, 2024.

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#rich-picture","title":"Rich Picture","text":"

O Rich Picture para o Tesouro Direto foi criado pela Julia Takaki e ajudou a equipe a visualizar os processos e os principais pontos do projeto de maneira clara e direta. J\u00e1 a lista de verifica\u00e7\u00e3o foi desenvolvida por todos os membros, reunindo as contribui\u00e7\u00f5es e perspectivas de cada um. Esse trabalho colaborativo garantiu que todas as etapas fossem cuidadosamente planejadas e acompanhadas, facilitando a organiza\u00e7\u00e3o e permitindo que o grupo mantivesse o foco nos objetivos do projeto.

Tabela 4 - Lista para a Verifica\u00e7\u00e3o do Rich Picture.

ID Descri\u00e7\u00e3o Avalia\u00e7\u00e3o 1 O Rich Picture conta uma hist\u00f3ria clara e compreens\u00edvel? Autor: Thales Euflauzino --- 2 O fluxo de dados est\u00e1 claro? quem est\u00e1 processando qual dado e para qual prop\u00f3sito, por exemplo Autor: Victor Guimar\u00e3es --- 3 O Rich Picture tem todas as palavras chaves necess\u00e1rias do projeto? Autor: V\u00edctor Schmidt --- 4 O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usu\u00e1rios? Autor: Julia Takaki --- 5 O Rich Picture cont\u00e9m uma representa\u00e7\u00e3o visual clara da delimita\u00e7\u00e3o do sistema, ou seja, da sua \"\u00e1rea de responsabilidade\"? Autor: Maria Helena ---

Autores: Victor Schmidt e Thales Euflauzino, 2024.

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#bibliografia","title":"Bibliografia","text":"

REQUISTOS DE SOFTWARE. Planejamento da Verifica\u00e7\u00e3o da Etapa 1 do Grupo 2. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo2/entrega1/planejamento-verificacao-e1-grupo2/. Acesso em: 2 nov. 2024.

2. REVADI, Chindy Elsanna. Introducing Rich Pictures - Rich Picture Drawing Guidelines. Dispon\u00edvel em: https://aprender3.unb.br/pluginfile.php/2523045/mod_resource/content/2/1_5145791542719414573.pdf. Acessado em: 02 de novembro de 2024.

3. SERRANO, MAUR\u00cdCIO; SERRANO, Milene. Slides da aula Requisitos \u2013 Aula 04. Dispon\u00edvel em: https://aprender3.unb.br/pluginfile.php/2523041/mod_resource/content/3/Requisitos%20-%20Aula%2004.pdf. Acessado em: 02 de novembro de 2024.

4. SOMMERVILLE, Ian. Engenharia de software. 08. ed. S\u00e3o Paulo: Pearson Addison Wesley, 2007

5

6

7

8

9

"},{"location":"verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 02/11/2024 Cria\u00e7\u00e3o do documento V\u00edctor Schmidt e Victor Rodrigues Thales Euflauzino 1.1 12/11/2024 Corringindo checklist para lista de verifica\u00e7\u00e3o Thales Euflauzino Victor Rodrigues 1.2 12/11/2024 Corringindo fonte para autor Thales Euflauzino Victor Rodrigues"},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/","title":"Verifica\u00e7\u00e3o dos artefatos","text":""},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Ap\u00f3s o planejamento, realiza-se a inspe\u00e7\u00e3o dos artefatos. Este documento apresenta os objetivos da verifica\u00e7\u00e3o, a metodologia utilizada e a lista de verifica\u00e7\u00e3o para a avalia\u00e7\u00e3o. Al\u00e9m disso, os problemas encontrados poder\u00e3o conter observa\u00e7\u00f5es e ser\u00e3o sumarizados e analisados, fornecendo informa\u00e7\u00f5es valiosas para auxiliar na sua corre\u00e7\u00e3o.

"},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/#objetivo","title":"Objetivo","text":"

O objetivo deste documento \u00e9 relatar os resultados das verifica\u00e7\u00f5es realizadas acerca dos artefatos produzidos pelo grupo

"},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/#metodologia","title":"Metodologia","text":"

Os resultados da verifica\u00e7\u00e3o do artefato foram obtidos a partir da lista de verifica\u00e7\u00e3o elaborada na p\u00e1gina de planejamento Para responder \u00e0s perguntas apresentadas na lista de verifica\u00e7\u00e3o, o avaliador usar\u00e1 as op\u00e7\u00f5es Sim, N\u00e3o ou Incompleto. O avaliador poder\u00e1, tamb\u00e9m, escrever observa\u00e7\u00f5es em cada pergunta, detalhando pontos que achar necess\u00e1rios.

"},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/#cronograma-e-participantes","title":"Cronograma e Participantes","text":"

Os participantes da verifica\u00e7\u00e3o s\u00e3o integrantes do grupo. Thales Euflauzino, que ir\u00e1 verificar e corrigir poss\u00edveis problemas. E o integrante do grupo V\u00edctor Schmidt realizar\u00e1 a revis\u00e3o da avalia\u00e7\u00e3o realizada. Em rela\u00e7\u00e3o ao cronograma seguido, ele j\u00e1 foi explicitado na p\u00e1gina de planejamento.

Tabela 1 - Lista de Verifica\u00e7\u00e3o.

ID Descri\u00e7\u00e3o Avalia\u00e7\u00e3o Autor Data e hora Itens do Planejamento Geral do projeto 1 Uma p\u00e1gina apresentando os integrantes da equipe (com foto) com nome e sem matr\u00edcula? Sim Andr\u00e9 Barros 06/11/2024 21:20 2 O cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de in\u00edcio e fim das entrega dos artefatos e com o per\u00edodo da revis\u00e3o deles? Sim Andr\u00e9 Barros 06/11/2024 21:20 3 O cronograma do planejamento apresenta um per\u00edodo de grava\u00e7\u00e3o da apresenta\u00e7\u00e3o de cada etapa Sim Andr\u00e9 Barros 06/11/2024 21:20 4 O cronograma prever um per\u00edodo de revis\u00e3o/ajustes nos artefatos devidos as considera\u00e7\u00f5es dos monitores/professor? Incompleto Andr\u00e9 Barros 06/11/2024 21:20 5 A motiva\u00e7\u00e3o e os crit\u00e9rios para a escolha do App? Sim Andr\u00e9 Barros 06/11/2024 21:20 6 C\u00f3pia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina. Sim Andr\u00e9 Barros 06/11/2024 21:20 7 Possui op\u00e7\u00e3o de contraste de cores? Sim Andr\u00e9 Barros 06/11/2024 21:20 Itens do Desenvolvimento do projeto 1 O hist\u00f3rico de vers\u00e3o padronizado? Sim Andr\u00e9 Barros 06/11/2024 21:20 2 O(s) autor(es) e o(s) revisor(es) para cada artefato? Sim Andr\u00e9 Barros 06/11/2024 21:20 3 Refer\u00eancias bibliogr\u00e1ficas e/ou bibliografia em todos os artefatos? Sim Andr\u00e9 Barros 06/11/2024 21:20 4 As tabelas e imagens possuem legenda e fonte e elas chamadas dentro dos texto? Sim Andr\u00e9 Barros 06/11/2024 21:20 5 Um texto fazendo uma introdu\u00e7\u00e3o dos artefatos? Sim Andr\u00e9 Barros 06/11/2024 21:20 6 O cronograma executado com quem realizou cada artefato/atividade com as datas de in\u00edcio e fim da constru\u00e7\u00e3o/realiza\u00e7\u00e3o do artefato/atividade. Sim Andr\u00e9 Barros 06/11/2024 21:20 7 Ata(s) da(s) reuni\u00f5es (com data, hor\u00e1rio de in\u00edcio e do final, participantes, objetivo, atividades definidas etc). Sim Andr\u00e9 Barros 06/11/2024 21:20 8 A grava\u00e7\u00e3o da reuni\u00e3o do grupo. Sim Andr\u00e9 Barros 06/11/2024 21:20 9 V\u00eddeo de apresenta\u00e7\u00e3o na categoria \u201cn\u00e3o listado\u201d no youtube? Sim Andr\u00e9 Barros 06/11/2024 21:20 Itens do Conte\u00fado da Disciplina (a foto referente ao texto est\u00e1 no ID) 1 O Rich Picture conta uma hist\u00f3ria clara e compreens\u00edvel? Sim Thales Euflauzino 06/11/2024 21:20 2 O fluxo de dados est\u00e1 claro? quem est\u00e1 processando qual dado e para qual prop\u00f3sito, por exemplo Sim Victor Guimar\u00e3es 06/11/2024 21:20 3 O Rich Picture tem todas as palavras chaves necess\u00e1rias do projeto? Sim V\u00edctor Schmidt 06/11/2024 21:20 4 O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usu\u00e1rios? Sim Julia Takaki 06/11/2024 21:20 5 O Rich Picture cont\u00e9m uma representa\u00e7\u00e3o visual clara da delimita\u00e7\u00e3o do sistema, ou seja, da sua \"\u00e1rea de responsabilidade\"? Sim Maria Helena 06/11/2024 21:20

Autor: Thales Euflauzino 2024.

"},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/#video-da-verificacao","title":"V\u00eddeo da Verifica\u00e7\u00e3o","text":"

V\u00eddeo 1: Requisitos - Verifica\u00e7\u00e3o Entrega 1

Autor: V\u00edctor Schmidt

"},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/#bibliografia","title":"Bibliografia","text":"

SALES, Andr\u00e9 Barros. Plano de Ensino. Aprender 3. Distrito Federal, 2024. Dispon\u00edvel em: https://aprender3.unb.br/pluginfile.php/2972367/mod_resource/content/51/Plano_de_Ensino%20RE%20022024%20Turma%2002%20v1.pdf. Acesso em 28 out. 2024.

CTEC2402 - Software Development Project Introducing Rich Pictures - Rich Picture Drawing Guidelines.. Acesso em: 28 out. 2024

Verifica\u00e7\u00e3o - Bilheteria Digital. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo/entrega1/verificacao-rich-picture//. Acesso em 02 de novembro de 2024.

1

2

3

4

5

"},{"location":"verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 02/11/2024 Cria\u00e7\u00e3o do documento Thales Euflauzino V\u00edctor Schmidt 1.1 02/11/2024 Adicionando revis\u00e3o da Rich Picture Thales Euflauzino V\u00edctor Schmidt 1.2 06/11/2024 Mudando avalia\u00e7\u00e3o do cronograma V\u00edctor Rodrigues Julia Takaki 1.3 06/11/2024 Adicionando v\u00eddeo de verifica\u00e7\u00e3o ao relatorio V\u00edctor Schmidt Maria Helena 1.4 12/11/2024 Corringindo checklist para lista de verifica\u00e7\u00e3o Thales Euflauzino Victor Rodrigues 1.5 12/11/2024 Adicionando autor e data na tabela de verifica\u00e7\u00e3o Thales Euflauzino Victor Rodrigues 1.6 12/11/2024 Corringindo fonte para autor Thales Euflauzino Victor Rodrigues"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/","title":"Planejamento da Verifica\u00e7\u00e3o da Etapa 1 do Grupo","text":""},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O artefato a seguir visa apresentar o planejamento para a verifica\u00e7\u00e3o de cada artefato da etapa 1 do projeto do grupo 6.

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#objetivos","title":"Objetivos","text":"

O objetivo deste documento \u00e9 verificar se os artefatos produzidos para entrega 1 do grupo 6 possuem os itens e o padr\u00e3o exigidos. \u00c9 importante citar que essa verifica\u00e7\u00e3o em momento nenhum busca diminuir os membros respons\u00e1veis por esse artefato ou seu trabalho, apenas aplicar os conceitos de verifica\u00e7\u00e3o.

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#metodologia","title":"Metodologia","text":"

A metodologia escolhida para esta verifica\u00e7\u00e3o \u00e9 uma adapta\u00e7\u00e3o da inspe\u00e7\u00e3o. Desenvolvida originalmente para c\u00f3digos de software por Fagan na IBM em 1976, essa t\u00e9cnica consiste em uma revis\u00e3o formal dos artefatos produzidos a fim de encontrar defeitos, a figura 1 exemplifica as etapas que Fagan prop\u00f4s para esse processo.

Figura 1 - Etapas da Inspe\u00e7\u00e3o de acordo com Fagan.

Fonte: SOMMERVILLE (2007).4

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#objetos-da-verificacao","title":"Objetos da Verifica\u00e7\u00e3o","text":"

Os artefatos alvos dessa verifica\u00e7\u00e3o s\u00e3o:

  • Heatmap na vers\u00e3o 1.0 de data 04/11/2024, produzido por Nicolas Bomfim e com revis\u00e3o de Ana Catarina.
  • Lista de apps avaliados na vers\u00e3o 1.4 de data 05/11/2024, produzido e revisado por todos os membros do grupo 6.
  • App Escolhido na vers\u00e3o 1.3 de data 29/10/2024, produzido por Cristiano Morais e com revis\u00e3o de J\u00falia Fortunato
  • Rich Picture na vers\u00e3o 1.0 de data 28/10/2024, produzido por Cristiano Borges, com a revis\u00e3o de J\u00falia Fortunato.
  • Cronograma na vers\u00e3o 1.0 de data 02/11/2024, produzido por Mauricio Araujo e J\u00falia Fortunato com revis\u00e3o de Cristiano Borges.
"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#resultados-das-verificacoes","title":"Resultados das Verifica\u00e7\u00f5es","text":"

Os resultados das verifica\u00e7\u00f5es podem ser acessados atrav\u00e9s do seguinte link:

  • Relat\u00f3rio da Verifica\u00e7\u00e3o;
"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#cronograma","title":"Cronograma","text":"

A verifica\u00e7\u00e3o ser\u00e1 realizada em 07 de novembro de 2024, com os resultados sendo relatados atrav\u00e9s da p\u00e1gina de documenta\u00e7\u00e3o do Grupo 6 no dia 07 de novembro de 2024. A tabela 2 a seguir, apresenta o cronograma das atividades a serem realizadas.

Tabela 2 - Cronograma das Atividades.

Data Descri\u00e7\u00e3o Respons\u00e1vel 07/11/2024 Verifica\u00e7\u00e3o do projeto do grupo 6 Todos do grupo

Autor: Elaborado por V\u00edctor Schmidt, 2024

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#lista-de-verificacao","title":"Lista de Verifica\u00e7\u00e3o","text":"

As listas de verifica\u00e7\u00e3o foram constru\u00eddas levando em conta os padr\u00f5es esperados para cada artefato e as principais tarefas realizadas na elabora\u00e7\u00e3o dos mesmos, tudo isso de acordo com os slides da Aula 04 da professora Milene e Maur\u00edcio Serrano3 e a literatura Introducing Rich Picture - Rich Picture Drawing Guidelines2.

Com o intuito de melhor organizar a verifica\u00e7\u00e3o, a lista de verifica\u00e7\u00e3o ser\u00e1 dividida em 2 listas sendo que uma dever\u00e1 estar presente em todas as etapas de verifica\u00e7\u00e3o, no caso a Lista de Verifica\u00e7\u00e3o Geral. Sendo assim, as listas de verifica\u00e7\u00e3o s\u00e3o as seguintes: Geral e Rich Picture. As tabelas de 3 a 4 apresenta as listas de verifica\u00e7\u00e3o utilizadas na verifica\u00e7\u00e3o.

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#geral","title":"Geral","text":"

Tabela 3 - Lista de Verifica\u00e7\u00e3o dos Itens do Planejamento Geral do projeto .

ID Descri\u00e7\u00e3o Avalia\u00e7\u00e3o 1 Uma p\u00e1gina apresentando os integrantes da equipe (com foto) com nome e sem matr\u00edcula? - 2 o cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de in\u00edcio e fim das entrega dos artefatos e com o per\u00edodo da revis\u00e3o deles? - 3 o cronograma do planejamento apresenta um per\u00edodo de grava\u00e7\u00e3o da apresenta\u00e7\u00e3o de cada etapa - 4 O cronograma prever um per\u00edodo de revis\u00e3o/ajustes nos artefatos devidos as considera\u00e7\u00f5es dos monitores/professor? - 5 A motiva\u00e7\u00e3o e os crit\u00e9rios para a escolha do App? - 6 C\u00f3pia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina. - 7 Possui op\u00e7\u00e3o de contraste de cores? -

Autor: Equipe do Projeto, 2024.

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#rich-picture","title":"Rich Picture","text":"

Tabela 4 - Lista para a Verifica\u00e7\u00e3o do Rich Picture.

ID Descri\u00e7\u00e3o Avalia\u00e7\u00e3o 1 O Rich Picture conta uma hist\u00f3ria clara e compreens\u00edvel? Autor: Thales Euflauzino - 2 O fluxo de dados est\u00e1 claro? quem est\u00e1 processando qual dado e para qual prop\u00f3sito, por exemplo Autor: Victor Guimar\u00e3es - 3 O Rich Picture tem todas as palavras chaves necess\u00e1rias do projeto? Autor: V\u00edctor Schmidt - 4 O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usu\u00e1rios? Autor: Julia Takaki - 5 O Rich Picture cont\u00e9m uma representa\u00e7\u00e3o visual clara da delimita\u00e7\u00e3o do sistema, ou seja, da sua \"\u00e1rea de responsabilidade\"? Autor: Maria Helena -

Autores: Victor Schmidt e Thales Euflauzino, 2024.

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#bibliografia","title":"Bibliografia","text":"

REQUISTOS DE SOFTWARE. Planejamento da Verifica\u00e7\u00e3o da Etapa 1 do Grupo 2. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo2/entrega1/planejamento-verificacao-e1-grupo2/. Acesso em: 2 nov. 2024.

2. REVADI, Chindy Elsanna. Introducing Rich Pictures - Rich Picture Drawing Guidelines. Dispon\u00edvel em: https://aprender3.unb.br/pluginfile.php/2523045/mod_resource/content/2/1_5145791542719414573.pdf. Acessado em: 02 de novembro de 2024.

3. SERRANO, MAUR\u00cdCIO; SERRANO, Milene. Slides da aula Requisitos \u2013 Aula 04. Dispon\u00edvel em: https://aprender3.unb.br/pluginfile.php/2523041/mod_resource/content/3/Requisitos%20-%20Aula%2004.pdf. Acessado em: 02 de novembro de 2024.

4. SOMMERVILLE, Ian. Engenharia de software. 08. ed. S\u00e3o Paulo: Pearson Addison Wesley, 2007

5. Meu INSS. Dispon\u00edvel em: https://requisitos-de-software.github.io/2024.2-MeuINSS/. Acessado em: 07 de novembro de 2024.

"},{"location":"verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 07/11/2024 Cria\u00e7\u00e3o do documento Todos os integrantes do grupo Todos os integrantes do grupo 1.1 12/11/2024 Corringindo checklist para lista de verifica\u00e7\u00e3o Thales Euflauzino Victor Rodrigues"},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/","title":"Verifica\u00e7\u00e3o dos artefatos","text":""},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Ap\u00f3s o planejamento, realiza-se a inspe\u00e7\u00e3o dos artefatos do Grupo 06. Este documento apresenta os objetivos da verifica\u00e7\u00e3o, a metodologia utilizada e a lista de verifica\u00e7\u00e3o para a avalia\u00e7\u00e3o. Al\u00e9m disso, os problemas encontrados poder\u00e3o conter observa\u00e7\u00f5es e ser\u00e3o sumarizados e analisados, fornecendo informa\u00e7\u00f5es valiosas para auxiliar na sua corre\u00e7\u00e3o.

"},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/#objetivo","title":"Objetivo","text":"

O objetivo deste documento \u00e9 relatar os resultados das verifica\u00e7\u00f5es realizadas acerca dos artefatos produzidos pelo Grupo 6

"},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/#metodologia","title":"Metodologia","text":"

Os resultados da verifica\u00e7\u00e3o do artefato foram obtidos a partir das listas de verifica\u00e7\u00e3o elaboradas na p\u00e1gina de planejamento Para responder \u00e0s perguntas apresentadas nas listas o avaliador usar\u00e1 as op\u00e7\u00f5es Sim, N\u00e3o ou Incompleto. O avaliador poder\u00e1 tamb\u00e9m escrever observa\u00e7\u00f5es em cada pergunta detalhando pontos que achar necess\u00e1rios.

"},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/#cronograma-e-participantes","title":"Cronograma e Participantes","text":"

Os participantes da verifica\u00e7\u00e3o s\u00e3o integrantes do grupo. todo o grupo ira verificar os poss\u00edveis problemas no projeto do grupo 6. Em rela\u00e7\u00e3o ao cronograma seguido, ele j\u00e1 foi explicitado na p\u00e1gina de planejamento.

Tabela 1 - Lista de Verifica\u00e7\u00e3o.

ID Descri\u00e7\u00e3o Avalia\u00e7\u00e3o Autor Data e hora Itens do Planejamento Geral do projeto 1 Uma p\u00e1gina apresentando os integrantes da equipe (com foto) com nome e sem matr\u00edcula? Sim Andr\u00e9 Barros 07/11/2024 20:30 2 O cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de in\u00edcio e fim das entrega dos artefatos e com o per\u00edodo da revis\u00e3o deles? Sim Andr\u00e9 Barros 07/11/2024 20:30 3 O cronograma do planejamento apresenta um per\u00edodo de grava\u00e7\u00e3o da apresenta\u00e7\u00e3o de cada etapa Sim Andr\u00e9 Barros 07/11/2024 20:30 4 O cronograma prever um per\u00edodo de revis\u00e3o/ajustes nos artefatos devidos as considera\u00e7\u00f5es dos monitores/professor? Sim Andr\u00e9 Barros 07/11/2024 20:30 5 A motiva\u00e7\u00e3o e os crit\u00e9rios para a escolha do App? Sim Andr\u00e9 Barros 07/11/2024 20:30 6 C\u00f3pia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina. Sim Andr\u00e9 Barros 07/11/2024 20:30 7 Possui op\u00e7\u00e3o de contraste de cores? Sim Andr\u00e9 Barros 07/11/2024 20:30 Itens do Desenvolvimento do projeto 1 O hist\u00f3rico de vers\u00e3o padronizado? Incompleto Andr\u00e9 Barros 07/11/2024 20:30 2 O(s) autor(es) e o(s) revisor(es) para cada artefato? Sim Andr\u00e9 Barros 07/11/2024 20:30 3 Refer\u00eancias bibliogr\u00e1ficas e/ou bibliografia em todos os artefatos? Sim Andr\u00e9 Barros 07/11/2024 20:30 4 As tabelas e imagens possuem legenda e fonte e elas chamadas dentro dos texto? Incompleto Andr\u00e9 Barros 07/11/2024 20:30 5 Um texto fazendo uma introdu\u00e7\u00e3o dos artefatos? Sim Andr\u00e9 Barros 07/11/2024 20:30 6 O cronograma executado com quem realizou cada artefato/atividade com as datas de in\u00edcio e fim da constru\u00e7\u00e3o/realiza\u00e7\u00e3o do artefato/atividade. Sim Andr\u00e9 Barros 07/11/2024 20:30 7 Ata(s) da(s) reuni\u00f5es (com data, hor\u00e1rio de in\u00edcio e do final, participantes, objetivo, atividades definidas etc). Sim Andr\u00e9 Barros 07/11/2024 20:30 8 A grava\u00e7\u00e3o da reuni\u00e3o do grupo. Sim Andr\u00e9 Barros 07/11/2024 20:30 9 V\u00eddeo de apresenta\u00e7\u00e3o na categoria \u201cn\u00e3o listado\u201d no youtube? Sim Andr\u00e9 Barros 07/11/2024 20:30 Itens do Conte\u00fado da Disciplina (a foto referente ao texto est\u00e1 no ID) 1 O Rich Picture conta uma hist\u00f3ria clara e compreens\u00edvel? Sim Thales Euflauzino 07/11/2024 20:30 2 O fluxo de dados est\u00e1 claro? quem est\u00e1 processando qual dado e para qual prop\u00f3sito, por exemplo Incompleto Victor Guimar\u00e3es 07/11/2024 20:30 3 O Rich Picture tem todas as palavras chaves necess\u00e1rias do projeto? Sim V\u00edctor Schmidt 07/11/2024 20:30 4 O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usu\u00e1rios? Incompleto Julia Takaki 07/11/2024 20:30 5 O Rich Picture cont\u00e9m uma representa\u00e7\u00e3o visual clara da delimita\u00e7\u00e3o do sistema, ou seja, da sua \"\u00e1rea de responsabilidade\"? Sim Maria Helena 07/11/2024 20:30

Autor: Elaborada por Thales Euflauzino 2024.

"},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/#video-de-verificacao","title":"Video de Verifica\u00e7\u00e3o","text":"

\u00c9 poss\u00edvel ver o grupo realizando a verifica\u00e7\u00e3o dos artefatos do Grupo 6 no V\u00eddeo 1.

"},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/#referencias-bibliograficas","title":"Refer\u00eancias Bibliogr\u00e1ficas","text":"

SALES, Andr\u00e9 Barros. Plano de Ensino. Aprender 3. Distrito Federal, 2024. Dispon\u00edvel em: https://aprender3.unb.br/pluginfile.php/2972367/mod_resource/content/51/Plano_de_Ensino%20RE%20022024%20Turma%2002%20v1.pdf. Acesso em 28 out. 2024.

CTEC2402 - Software Development Project Introducing Rich Pictures - Rich Picture Drawing Guidelines.. Acesso em: 28 out. 2024

Verifica\u00e7\u00e3o - Bilheteria Digital. Dispon\u00edvel em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo/entrega1/verificacao-rich-picture//. Acesso em 02 de novembro de 2024.

Meu INSS. Dispon\u00edvel em: https://requisitos-de-software.github.io/2024.2-MeuINSS/. Acesso em 07 de novembro de 2024.

1

2

3

4

5

"},{"location":"verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autor(es) Revisor(es) 1.0 07/11/2024 Cria\u00e7\u00e3o do documento Todos os integrantes do grupo Todos os integrantes do grupo 1.1 07/11/2024 Arrumando bibliografia Thales Euflauzino Maria Helena 1.2 12/11/2024 Corringindo checklist para lista de verifica\u00e7\u00e3o Thales Euflauzino Victor Rodrigues 1.3 12/11/2024 Corringindo fonte para autor Thales Euflauzino Victor Rodrigues 1.4 12/11/2024 Adicionando autor e data na tabela de verifica\u00e7\u00e3o Thales Euflauzino Victor Rodrigues"}]} \ 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 00000000..9e000f53 Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/termo_de_consentimento_grupofocal.pdf b/termo_de_consentimento_grupofocal.pdf new file mode 100644 index 00000000..d3a4a607 Binary files /dev/null and b/termo_de_consentimento_grupofocal.pdf differ diff --git a/tutorial/index.html b/tutorial/index.html new file mode 100644 index 00000000..62dc712c --- /dev/null +++ b/tutorial/index.html @@ -0,0 +1,1498 @@ + + + + + + + + + + + + + + + + + + + Instalação e Comandos Básicos do MkDocs - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Instalação e Comandos Básicos do MkDocs

+

1. Instalando o MkDocs e o tema do projeto

+

Primeiro, é necessário ter o Python e o pip instalados. Com eles prontos, instale o MkDocs utilizando o seguinte comando:

+
pip install mkdocs mkdocs-material
+
+

2. Iniciando um Projeto MkDocs

+

Para criar um novo projeto com MkDocs, use:

+
mkdocs new nome_do_projeto
+cd nome_do_projeto
+
+

3. Visualizando o Site Localmente

+

Dentro do diretório do projeto, execute o comando abaixo para iniciar o servidor de desenvolvimento e visualizar seu site localmente:

+
mkdocs serve
+
+

Após isso, acesse http://127.0.0.1:8000 no navegador para ver o site.

+

4. Criando a Documentação

+

Com o site configurado, adicione e organize suas páginas no arquivo mkdocs.yml, conforme o exemplo abaixo.

+

Configuração Simplificada do mkdocs.yml

+

Este é um guia básico e simplificado para configurar o arquivo mkdocs.yml no MkDocs.

+
# Nome do site (exibido no cabeçalho e título da página)
+site_name: "Meu Projeto"
+
+# URL do site (útil para SEO e links)
+site_url: "https://meusite.com"
+
+# Descrição do site (aparece nos metadados, bom para SEO)
+site_description: "Documentação do Meu Projeto"
+
+# Nome do autor (opcional, usado em metadados)
+site_author: "Seu Nome"
+
+# URL do repositório (opcional, aparece no cabeçalho com um link)
+repo_url: "https://github.com/usuario/projeto"
+repo_name: "GitHub"
+
+# Tema do site (pode ser 'material' ou outro tema que preferir)
+theme:
+  name: "material"
+  palette:
+    primary: "indigo"
+    accent: "deep orange"
+
+# Navegação (define a ordem das páginas no menu)
+nav:
+  - Home: index.md
+  - Instalação: instalacao.md
+  - Uso:
+      - Básico: uso_basico.md
+      - Avançado: uso_avancado.md
+
+# Plugins (adiciona funcionalidades extras)
+plugins:
+  - search  # Pesquisa interna do site
+  - minify:  # Otimiza HTML, CSS e JS para menor tamanho
+      minify_html: true
+
+# Extensões Markdown (adiciona funcionalidades extras ao Markdown)
+markdown_extensions:
+  - toc         # Gera automaticamente uma tabela de conteúdos
+  - admonition  # Blocos de alerta (informação, aviso, etc)
+
+# Arquivos CSS e JS extras (personalize a aparência e comportamento)
+extra_css:
+  - "css/estilos_custom.css"
+
+extra_javascript:
+  - "js/scripts_custom.js"
+ ```
+
+# Exemplos de Como Adicionar Itens
+
+### 1. Adicionando uma Página Simples
+
+Para adicionar uma nova página simples à navegação:
+
+```yaml
+nav:
+  - Home: index.md
+  - Sobre: sobre.md  # Adicionando a página "Sobre"
+
+

2. Adicionando Subpáginas

+

Para organizar suas páginas em uma hierarquia, você pode adicionar subpáginas. Aqui está como fazer isso:

+
nav:
+  - Home: index.md
+  - Tutoriais:
+      - Introdução: tutoriais/introducao.md
+      - Avançado: tutoriais/avancado.md  # Adicionando uma subpágina
+
+

3. Modificando um Item Existente

+

Se você deseja alterar o título ou o arquivo de uma página existente, basta modificar o item correspondente. Por exemplo, para mudar "Sobre" para "Quem Somos":

+
nav:
+  - Home: index.md
+  - Quem Somos: sobre.md  # Alterando o título de "Sobre" para "Quem Somos"
+
+

4. Removendo um Item

+

Para remover um item, basta excluí-lo da seção nav. Por exemplo, se você quiser remover a página "Sobre":

+
nav:
+  - Home: index.md
+  # - Sobre: sobre.md  # Comentado ou removido
+
+

5. Agrupando Itens

+

Você pode agrupar várias páginas em um único item para manter a navegação organizada. Aqui está um exemplo:

+
nav:
+  - Home: index.md
+  - Tutoriais:
+      - Introdução: tutoriais/introducao.md
+      - Avançado: tutoriais/avancado.md
+  - Referência:
+      - API: referencia/api.md
+      - FAQ: referencia/faq.md
+
+

Dicas Importantes

+
    +
  • Caminhos Relativos: Os caminhos dos arquivos devem ser relativos à pasta docs. Se o seu arquivo estiver em uma subpasta, inclua o caminho completo.
  • +
  • Ordenação: A ordem dos itens na seção nav reflete a ordem em que eles aparecerão no menu de navegação. Basta reorganizar os itens para mudar a ordem.
  • +
  • Consistência: Certifique-se de que os nomes dos arquivos Markdown estejam corretos e correspondam aos que você criou na pasta docs.
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/index.html b/verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/index.html new file mode 100644 index 00000000..e84d23d9 --- /dev/null +++ b/verificacao/grupo5/entrega1/planej-verificacao-e1-gp5/index.html @@ -0,0 +1,1834 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento da verificação - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + + +

Planejamento da Verificação da Etapa 1 do Grupo

+

Introdução

+

O artefato visa apresentar o planejamento para a verificação de cada artefato da etapa 1 do projeto do grupo.

+

Objetivos

+

O objetivo deste documento é verificar se os artefatos produzidos para entrega 1 do grupo possuem os itens e o padrão exigidos. É importante citar que essa verificação em momento nenhum busca diminuir os membros responsáveis seu trabalho, apenas aplicar os conceitos de verificação.

+

Metodologia

+

A metodologia escolhida para esta verificação é uma adaptação da inspeção. Desenvolvida originalmente para códigos de software por Fagan na IBM em 1976, essa técnica consiste em uma revisão formal dos artefatos produzidos a fim de se encontrar defeitos, a figura 1 exemplifica as etapas que Fagan propôs para esse processo.

+

+

Figura 1 - Etapas da Inspeção de acordo com Fagan.

+ + +

inspecaofagan

+

Fonte: SOMMERVILLE (2007).4

+

+

Objetos da Verificação

+

Os artefatos alvos dessa verificação são:

+ +

Resultados das Verificações

+

Os resultados das verificações podem ser acessados através do seguinte link:

+ +

Cronograma

+

A verificação será realizada no período de 06 de novembro de 2024, com os resultados sendo relatados através da página de documentação do Grupo 5 no dia 06 de novembro de 2024. A tabela 2 a seguir, apresenta o cronograma das atividades a serem realizadas.

+

+

Tabela 2 - Cronograma das Atividades.

+ + + + + + + + + + + + + + + + + + + + +
DataDescriçãoResponsável
30/10/2024Verificação do Rich Picture.Thales Euflauzino e Víctor Schmidt
02/11/2024Adição dos resultados.Víctor Schmidt e Victor Rodrigues
+

Autor: Víctor Schmidt, 2024

+

+

Lista de Verificação

+

As listas de verificação foram construídas levando em conta os padrões esperados para cada artefato e as principais tarefas realizadas na elaboração dos mesmos, tudo isso de acordo com os slides da Aula 04 da professora Milene e Maurício Serrano3 e a literatura Introducing Rich Picture - Rich Picture Drawing Guidelines2.

+

Com o intuito de melhor organizar a verificação, a lista de verificação será dividida em 2 listas sendo que uma deverá estar presente em todas as etapas de verificação, no caso a Lista de Verificação Geral. Sendo assim, as listas de verificação serão as seguintes: Geral e Rich Picture. As tabelas de 3 a 4 apresenta as listas de verificação utilizadas na verificação.

+

Geral

+

+

Tabela 3 - Lista de Verificação dos Itens do Planejamento Geral do projeto .

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDDescriçãoAvaliação
1Uma página apresentando os integrantes da equipe (com foto) com nome e sem matrícula?---
2o cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de início e fim das entrega dos artefatos e com o período da revisão deles?---
3o cronograma do planejamento apresenta um período de gravação da apresentação de cada etapa---
4O cronograma prever um período de revisão/ajustes nos artefatos devidos as considerações dos monitores/professor?---
5A motivação e os critérios para a escolha do App?---
6Cópia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina.---
7Possui opção de contraste de cores?---
+

Autores: Equipe do Projeto, 2024.

+

+

Rich Picture

+

O Rich Picture para o Tesouro Direto foi criado pela Julia Takaki e ajudou a equipe a visualizar os processos e os principais pontos do projeto de maneira clara e direta. Já a lista de verificação foi desenvolvida por todos os membros, reunindo as contribuições e perspectivas de cada um. Esse trabalho colaborativo garantiu que todas as etapas fossem cuidadosamente planejadas e acompanhadas, facilitando a organização e permitindo que o grupo mantivesse o foco nos objetivos do projeto.

+

+

Tabela 4 - Lista para a Verificação do Rich Picture.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDDescriçãoAvaliação
1O Rich Picture conta uma história clara e compreensível?
Autor: Thales Euflauzino
---
2O fluxo de dados está claro? quem está processando qual dado e para qual propósito, por exemplo
Autor: Victor Guimarães
---
3O Rich Picture tem todas as palavras chaves necessárias do projeto?
Autor: Víctor Schmidt
---
4O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usuários?
Autor: Julia Takaki
---
5O Rich Picture contém uma representação visual clara da delimitação do sistema, ou seja, da sua "área de responsabilidade"?
Autor: Maria Helena
---
+

Autores: Victor Schmidt e Thales Euflauzino, 2024.

+

+

Bibliografia

+
+

REQUISTOS DE SOFTWARE. Planejamento da Verificação da Etapa 1 do Grupo 2. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo2/entrega1/planejamento-verificacao-e1-grupo2/. Acesso em: 2 nov. 2024.

+
+

2. REVADI, Chindy Elsanna. Introducing Rich Pictures - Rich Picture Drawing Guidelines. Disponível em: https://aprender3.unb.br/pluginfile.php/2523045/mod_resource/content/2/1_5145791542719414573.pdf. Acessado em: 02 de novembro de 2024.

+
+

3. SERRANO, MAURÍCIO; SERRANO, Milene. Slides da aula Requisitos – Aula 04. Disponível em: https://aprender3.unb.br/pluginfile.php/2523041/mod_resource/content/3/Requisitos%20-%20Aula%2004.pdf. Acessado em: 02 de novembro de 2024.

+
+

4. SOMMERVILLE, Ian. Engenharia de software. 08. ed. São Paulo: Pearson Addison Wesley, 2007

+
+

5
Referência 1

+
+

6
Referência 2

+
+

7
Referência 3

+
+

8
Referência 4

+
+

9
Referência 5

+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.002/11/2024Criação do documentoVíctor Schmidt e Victor RodriguesThales Euflauzino
1.112/11/2024Corringindo checklist para lista de verificaçãoThales EuflauzinoVictor Rodrigues
1.212/11/2024Corringindo fonte para autorThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/index.html b/verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/index.html new file mode 100644 index 00000000..c0caad47 --- /dev/null +++ b/verificacao/grupo5/entrega1/relatorio-verificacao-e1-gp5/index.html @@ -0,0 +1,1818 @@ + + + + + + + + + + + + + + + + + + + + + + + Relatório de verificação - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Verificação dos artefatos

+

Introdução

+

Após o planejamento, realiza-se a inspeção dos artefatos. Este documento apresenta os objetivos da verificação, a metodologia utilizada e a lista de verificação para a avaliação. Além disso, os problemas encontrados poderão conter observações e serão sumarizados e analisados, fornecendo informações valiosas para auxiliar na sua correção.

+

Objetivo

+

O objetivo deste documento é relatar os resultados das verificações realizadas acerca dos artefatos produzidos pelo grupo

+

Metodologia

+

Os resultados da verificação do artefato foram obtidos a partir da lista de verificação elaborada na página de planejamento Para responder às perguntas apresentadas na lista de verificação, o avaliador usará as opções Sim, Não ou Incompleto. O avaliador poderá, também, escrever observações em cada pergunta, detalhando pontos que achar necessários.

+

Cronograma e Participantes

+

Os participantes da verificação são integrantes do grupo. Thales Euflauzino, que irá verificar e corrigir possíveis problemas. E o integrante do grupo Víctor Schmidt realizará a revisão da avaliação realizada. Em relação ao cronograma seguido, ele já foi explicitado na página de planejamento.

+

+

Tabela 1 - Lista de Verificação.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDDescriçãoAvaliaçãoAutorData e hora
Itens do Planejamento Geral do projeto
1Uma página apresentando os integrantes da equipe (com foto) com nome e sem matrícula?SimAndré Barros06/11/2024 21:20
2O cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de início e fim das entrega dos artefatos e com o período da revisão deles?SimAndré Barros06/11/2024 21:20
3O cronograma do planejamento apresenta um período de gravação da apresentação de cada etapaSimAndré Barros06/11/2024 21:20
4O cronograma prever um período de revisão/ajustes nos artefatos devidos as considerações dos monitores/professor?IncompletoAndré Barros06/11/2024 21:20
5A motivação e os critérios para a escolha do App?SimAndré Barros06/11/2024 21:20
6Cópia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina.SimAndré Barros06/11/2024 21:20
7Possui opção de contraste de cores?SimAndré Barros06/11/2024 21:20
Itens do Desenvolvimento do projeto
1O histórico de versão padronizado?SimAndré Barros06/11/2024 21:20
2O(s) autor(es) e o(s) revisor(es) para cada artefato?SimAndré Barros06/11/2024 21:20
3Referências bibliográficas e/ou bibliografia em todos os artefatos?SimAndré Barros06/11/2024 21:20
4As tabelas e imagens possuem legenda e fonte e elas chamadas dentro dos texto?SimAndré Barros06/11/2024 21:20
5Um texto fazendo uma introdução dos artefatos?SimAndré Barros06/11/2024 21:20
6O cronograma executado com quem realizou cada artefato/atividade com as datas de início e fim da construção/realização do artefato/atividade.SimAndré Barros06/11/2024 21:20
7Ata(s) da(s) reuniões (com data, horário de início e do final, participantes, objetivo, atividades definidas etc).SimAndré Barros06/11/2024 21:20
8A gravação da reunião do grupo.SimAndré Barros06/11/2024 21:20
9Vídeo de apresentação na categoria “não listado” no youtube?SimAndré Barros06/11/2024 21:20
Itens do Conteúdo da Disciplina (a foto referente ao texto está no ID)
1O Rich Picture conta uma história clara e compreensível?SimThales Euflauzino06/11/2024 21:20
2O fluxo de dados está claro? quem está processando qual dado e para qual propósito, por exemploSimVictor Guimarães06/11/2024 21:20
3O Rich Picture tem todas as palavras chaves necessárias do projeto?SimVíctor Schmidt06/11/2024 21:20
4O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usuários?SimJulia Takaki06/11/2024 21:20
5O Rich Picture contém uma representação visual clara da delimitação do sistema, ou seja, da sua "área de responsabilidade"?SimMaria Helena06/11/2024 21:20
+

Autor: Thales Euflauzino 2024.

+

+

Vídeo da Verificação

+

+

Vídeo 1: Requisitos - Verificação Entrega 1

+ + +

Autor: Víctor Schmidt

+

+
+

Bibliografia

+
+

SALES, André Barros. Plano de Ensino. Aprender 3. Distrito Federal, 2024. Disponível em: https://aprender3.unb.br/pluginfile.php/2972367/mod_resource/content/51/Plano_de_Ensino%20RE%20022024%20Turma%2002%20v1.pdf. Acesso em 28 out. 2024.

+

CTEC2402 - Software Development Project Introducing Rich Pictures - Rich Picture Drawing Guidelines.. Acesso em: 28 out. 2024

+

Verificação - Bilheteria Digital. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo/entrega1/verificacao-rich-picture//. Acesso em 02 de novembro de 2024.

+

1
Referência 1

+
+

2
Referência 2

+
+

3
Referência 3

+
+

4
Referência 4

+
+

5
Referência 5

+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.002/11/2024Criação do documentoThales EuflauzinoVíctor Schmidt
1.102/11/2024Adicionando revisão da Rich PictureThales EuflauzinoVíctor Schmidt
1.206/11/2024Mudando avaliação do cronogramaVíctor RodriguesJulia Takaki
1.306/11/2024Adicionando vídeo de verificação ao relatorioVíctor SchmidtMaria Helena
1.412/11/2024Corringindo checklist para lista de verificaçãoThales EuflauzinoVictor Rodrigues
1.512/11/2024Adicionando autor e data na tabela de verificaçãoThales EuflauzinoVictor Rodrigues
1.612/11/2024Corringindo fonte para autorThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/verificacao/grupo5/entrega1/rp1.png b/verificacao/grupo5/entrega1/rp1.png new file mode 100644 index 00000000..51ac73e9 Binary files /dev/null and b/verificacao/grupo5/entrega1/rp1.png differ diff --git a/verificacao/grupo5/entrega1/rp2.png b/verificacao/grupo5/entrega1/rp2.png new file mode 100644 index 00000000..3ca891ee Binary files /dev/null and b/verificacao/grupo5/entrega1/rp2.png differ diff --git a/verificacao/grupo5/entrega1/rp3.png b/verificacao/grupo5/entrega1/rp3.png new file mode 100644 index 00000000..8fdb5f09 Binary files /dev/null and b/verificacao/grupo5/entrega1/rp3.png differ diff --git a/verificacao/grupo5/entrega1/rp4.png b/verificacao/grupo5/entrega1/rp4.png new file mode 100644 index 00000000..54a94ef5 Binary files /dev/null and b/verificacao/grupo5/entrega1/rp4.png differ diff --git a/verificacao/grupo5/entrega1/rp5.png b/verificacao/grupo5/entrega1/rp5.png new file mode 100644 index 00000000..f05145e0 Binary files /dev/null and b/verificacao/grupo5/entrega1/rp5.png differ diff --git a/verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/index.html b/verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/index.html new file mode 100644 index 00000000..51b604fc --- /dev/null +++ b/verificacao/grupo6/entrega1/planej-verificacao-e1-gp6/index.html @@ -0,0 +1,1814 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento da verificação - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + + +

Planejamento da Verificação da Etapa 1 do Grupo

+

Introdução

+

O artefato a seguir visa apresentar o planejamento para a verificação de cada artefato da etapa 1 do projeto do grupo 6.

+

Objetivos

+

O objetivo deste documento é verificar se os artefatos produzidos para entrega 1 do grupo 6 possuem os itens e o padrão exigidos. É importante citar que essa verificação em momento nenhum busca diminuir os membros responsáveis por esse artefato ou seu trabalho, apenas aplicar os conceitos de verificação.

+

Metodologia

+

A metodologia escolhida para esta verificação é uma adaptação da inspeção. Desenvolvida originalmente para códigos de software por Fagan na IBM em 1976, essa técnica consiste em uma revisão formal dos artefatos produzidos a fim de encontrar defeitos, a figura 1 exemplifica as etapas que Fagan propôs para esse processo.

+

+

Figura 1 - Etapas da Inspeção de acordo com Fagan.

+ + +

inspecaofagan

+

Fonte: SOMMERVILLE (2007).4

+

+

Objetos da Verificação

+

Os artefatos alvos dessa verificação são:

+ +

Resultados das Verificações

+

Os resultados das verificações podem ser acessados através do seguinte link:

+ +

Cronograma

+

A verificação será realizada em 07 de novembro de 2024, com os resultados sendo relatados através da página de documentação do Grupo 6 no dia 07 de novembro de 2024. A tabela 2 a seguir, apresenta o cronograma das atividades a serem realizadas.

+

+

Tabela 2 - Cronograma das Atividades.

+ + + + + + + + + + + + + + + +
DataDescriçãoResponsável
07/11/2024Verificação do projeto do grupo 6Todos do grupo
+

Autor: Elaborado por Víctor Schmidt, 2024

+

+

Lista de Verificação

+

As listas de verificação foram construídas levando em conta os padrões esperados para cada artefato e as principais tarefas realizadas na elaboração dos mesmos, tudo isso de acordo com os slides da Aula 04 da professora Milene e Maurício Serrano3 e a literatura Introducing Rich Picture - Rich Picture Drawing Guidelines2.

+

Com o intuito de melhor organizar a verificação, a lista de verificação será dividida em 2 listas sendo que uma deverá estar presente em todas as etapas de verificação, no caso a Lista de Verificação Geral. Sendo assim, as listas de verificação são as seguintes: Geral e Rich Picture. As tabelas de 3 a 4 apresenta as listas de verificação utilizadas na verificação.

+

Geral

+

+

Tabela 3 - Lista de Verificação dos Itens do Planejamento Geral do projeto .

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDDescriçãoAvaliação
1Uma página apresentando os integrantes da equipe (com foto) com nome e sem matrícula?-
2o cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de início e fim das entrega dos artefatos e com o período da revisão deles?-
3o cronograma do planejamento apresenta um período de gravação da apresentação de cada etapa-
4O cronograma prever um período de revisão/ajustes nos artefatos devidos as considerações dos monitores/professor?-
5A motivação e os critérios para a escolha do App?-
6Cópia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina.-
7Possui opção de contraste de cores?-
+

Autor: Equipe do Projeto, 2024.

+

+

Rich Picture

+

+

Tabela 4 - Lista para a Verificação do Rich Picture.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDDescriçãoAvaliação
1O Rich Picture conta uma história clara e compreensível?
Autor: Thales Euflauzino
-
2O fluxo de dados está claro? quem está processando qual dado e para qual propósito, por exemplo
Autor: Victor Guimarães
-
3O Rich Picture tem todas as palavras chaves necessárias do projeto?
Autor: Víctor Schmidt
-
4O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usuários?
Autor: Julia Takaki
-
5O Rich Picture contém uma representação visual clara da delimitação do sistema, ou seja, da sua "área de responsabilidade"?
Autor: Maria Helena
-
+

Autores: Victor Schmidt e Thales Euflauzino, 2024.

+

+

Bibliografia

+
+

REQUISTOS DE SOFTWARE. Planejamento da Verificação da Etapa 1 do Grupo 2. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo2/entrega1/planejamento-verificacao-e1-grupo2/. Acesso em: 2 nov. 2024.

+
+

2. REVADI, Chindy Elsanna. Introducing Rich Pictures - Rich Picture Drawing Guidelines. Disponível em: https://aprender3.unb.br/pluginfile.php/2523045/mod_resource/content/2/1_5145791542719414573.pdf. Acessado em: 02 de novembro de 2024.

+
+

3. SERRANO, MAURÍCIO; SERRANO, Milene. Slides da aula Requisitos – Aula 04. Disponível em: https://aprender3.unb.br/pluginfile.php/2523041/mod_resource/content/3/Requisitos%20-%20Aula%2004.pdf. Acessado em: 02 de novembro de 2024.

+
+

4. SOMMERVILLE, Ian. Engenharia de software. 08. ed. São Paulo: Pearson Addison Wesley, 2007

+
+

5. Meu INSS. Disponível em: https://requisitos-de-software.github.io/2024.2-MeuINSS/. Acessado em: 07 de novembro de 2024.

+
+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.007/11/2024Criação do documentoTodos os integrantes do grupoTodos os integrantes do grupo
1.112/11/2024Corringindo checklist para lista de verificaçãoThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/index.html b/verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/index.html new file mode 100644 index 00000000..ac93ad28 --- /dev/null +++ b/verificacao/grupo6/entrega1/relatorio-verificacao-e1-gp6/index.html @@ -0,0 +1,1801 @@ + + + + + + + + + + + + + + + + + + + + + + + Relatório de verificação - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Verificação dos artefatos

+

Introdução

+

Após o planejamento, realiza-se a inspeção dos artefatos do Grupo 06. Este documento apresenta os objetivos da verificação, a metodologia utilizada e a lista de verificação para a avaliação. Além disso, os problemas encontrados poderão conter observações e serão sumarizados e analisados, fornecendo informações valiosas para auxiliar na sua correção.

+

Objetivo

+

O objetivo deste documento é relatar os resultados das verificações realizadas acerca dos artefatos produzidos pelo Grupo 6

+

Metodologia

+

Os resultados da verificação do artefato foram obtidos a partir das listas de verificação elaboradas na página de planejamento Para responder às perguntas apresentadas nas listas o avaliador usará as opções Sim, Não ou Incompleto. O avaliador poderá também escrever observações em cada pergunta detalhando pontos que achar necessários.

+

Cronograma e Participantes

+

Os participantes da verificação são integrantes do grupo. todo o grupo ira verificar os possíveis problemas no projeto do grupo 6. Em relação ao cronograma seguido, ele já foi explicitado na página de planejamento.

+

+

Tabela 1 - Lista de Verificação.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDDescriçãoAvaliaçãoAutorData e hora
Itens do Planejamento Geral do projeto
1Uma página apresentando os integrantes da equipe (com foto) com nome e sem matrícula?SimAndré Barros07/11/2024 20:30
2O cronograma do planejamento apresenta todas as atividades de todas as etapas para cada integrante com as datas de início e fim das entrega dos artefatos e com o período da revisão deles?SimAndré Barros07/11/2024 20:30
3O cronograma do planejamento apresenta um período de gravação da apresentação de cada etapaSimAndré Barros07/11/2024 20:30
4O cronograma prever um período de revisão/ajustes nos artefatos devidos as considerações dos monitores/professor?SimAndré Barros07/11/2024 20:30
5A motivação e os critérios para a escolha do App?SimAndré Barros07/11/2024 20:30
6Cópia do Termo de Uso, Direito de Uso ou Propriedade Intelectual do aplicativo permitindo o estudo na disciplina.SimAndré Barros07/11/2024 20:30
7Possui opção de contraste de cores?SimAndré Barros07/11/2024 20:30
Itens do Desenvolvimento do projeto
1O histórico de versão padronizado?IncompletoAndré Barros07/11/2024 20:30
2O(s) autor(es) e o(s) revisor(es) para cada artefato?SimAndré Barros07/11/2024 20:30
3Referências bibliográficas e/ou bibliografia em todos os artefatos?SimAndré Barros07/11/2024 20:30
4As tabelas e imagens possuem legenda e fonte e elas chamadas dentro dos texto?IncompletoAndré Barros07/11/2024 20:30
5Um texto fazendo uma introdução dos artefatos?SimAndré Barros07/11/2024 20:30
6O cronograma executado com quem realizou cada artefato/atividade com as datas de início e fim da construção/realização do artefato/atividade.SimAndré Barros07/11/2024 20:30
7Ata(s) da(s) reuniões (com data, horário de início e do final, participantes, objetivo, atividades definidas etc).SimAndré Barros07/11/2024 20:30
8A gravação da reunião do grupo.SimAndré Barros07/11/2024 20:30
9Vídeo de apresentação na categoria “não listado” no youtube?SimAndré Barros07/11/2024 20:30
Itens do Conteúdo da Disciplina (a foto referente ao texto está no ID)
1O Rich Picture conta uma história clara e compreensível?SimThales Euflauzino07/11/2024 20:30
2O fluxo de dados está claro? quem está processando qual dado e para qual propósito, por exemploIncompletoVictor Guimarães07/11/2024 20:30
3O Rich Picture tem todas as palavras chaves necessárias do projeto?SimVíctor Schmidt07/11/2024 20:30
4O Rich Picture utiliza um storyboard para descrever o fluxo de, por exemplo, atividades dos usuários?IncompletoJulia Takaki07/11/2024 20:30
5O Rich Picture contém uma representação visual clara da delimitação do sistema, ou seja, da sua "área de responsabilidade"?SimMaria Helena07/11/2024 20:30
+

Autor: Elaborada por Thales Euflauzino 2024.

+

+

Video de Verificação

+

É possível ver o grupo realizando a verificação dos artefatos do Grupo 6 no Vídeo 1.

+ + +

Referências Bibliográficas

+
+

SALES, André Barros. Plano de Ensino. Aprender 3. Distrito Federal, 2024. Disponível em: https://aprender3.unb.br/pluginfile.php/2972367/mod_resource/content/51/Plano_de_Ensino%20RE%20022024%20Turma%2002%20v1.pdf. Acesso em 28 out. 2024.

+

CTEC2402 - Software Development Project Introducing Rich Pictures - Rich Picture Drawing Guidelines.. Acesso em: 28 out. 2024

+

Verificação - Bilheteria Digital. Disponível em: https://requisitos-de-software.github.io/2023.1-BilheteriaDigital/verificacao/grupo/entrega1/verificacao-rich-picture//. Acesso em 02 de novembro de 2024.

+

Meu INSS. Disponível em: https://requisitos-de-software.github.io/2024.2-MeuINSS/. Acesso em 07 de novembro de 2024.

+

1
Referência 1

+
+

2
Referência 2

+
+

3
Referência 3

+
+

4
Referência 4

+
+

5
Referência 5

+
+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.007/11/2024Criação do documentoTodos os integrantes do grupoTodos os integrantes do grupo
1.107/11/2024Arrumando bibliografiaThales EuflauzinoMaria Helena
1.212/11/2024Corringindo checklist para lista de verificaçãoThales EuflauzinoVictor Rodrigues
1.312/11/2024Corringindo fonte para autorThales EuflauzinoVictor Rodrigues
1.412/11/2024Adicionando autor e data na tabela de verificaçãoThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/verificacao/lv-geral/index.html b/verificacao/lv-geral/index.html new file mode 100644 index 00000000..d6ade9a3 --- /dev/null +++ b/verificacao/lv-geral/index.html @@ -0,0 +1,1526 @@ + + + + + + + + + + + + + + + + + + + + + + + Panorama geral - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Panorama geral da verificação

+

Introdução

+

A verificação é uma das etapas mais importantes do desenvolvimento de um projeto. Nela os artefatos produzidos são analisados garantindo que cumpram com os seus requisitos especificados.

+

Objetivos

+

O objetivo deste documento é verificar se os artefatos produzidos em cada etapa do projeto pelo grupo possuem os itens e o padrão exigidos para tais. É importante citar que todas as verificações são apenas em relação ao artefato, nunca entrando na análise pessoal.

+

Metodologia

+

O grupo determinou que todos utilizariam a metodologia de verificação por inspeção, desenvolvida por Michael E. Fagan, na IBM em 1976 1. As entregas e os artefatos foram distribuídos entre os integrantes do grupo para que todos pudessem participar da verificação. Para cada entrega foi produzido um documento de planejamneto de verififcação com as listas de verificação que foram inspecionadas e para cada artefato foi criado um documento com os resultados da verificação daquele artefato específico.

+

Lista de Verificação

+

Para cada entrega, serão elaboradas listas de verificação para verficar os padrões esperados para cada artefato e as principais tarefas realizadas na elaboração dos mesmos

+

Referências bibliográficas

+
+

1. SOMMERVILLE, Ian. Engenharia de software. 08. ed. São Paulo: Pearson Addison Wesley, 2007

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutor(es)Revisor(es)
1.002/11/2024Criação do documento.Thales EuflauzinoVíctor Schmidt
1.112/11/2024Corringindo checklist para lista de verificaçãoThales EuflauzinoVictor Rodrigues
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file

Autor: Thales Euflauzino, 2024