diff --git a/.github/ISSUE_TEMPLATE/01-bug-report.yml b/.github/ISSUE_TEMPLATE/01-bug-report.yml new file mode 100644 index 0000000000..860860e794 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/01-bug-report.yml @@ -0,0 +1,34 @@ +name: Relatar um problema técnico/visual no mapas +description: 'Algo não está funcionando como esperado? Você encontrou uma falha ou bug no mapas?' +labels: [bug] +body: + - type: markdown + attributes: + value: | + Obrigado por relatar um problema encontrado no mapas. + Por favor preencha o modelo abaixo. Se você estiver relatando uma falha visual, será muito mais fácil + para que possamos corrigi-lo quando você anexar uma captura de tela também. + - type: input + attributes: + label: 'Navegador:' + description: Que tipo de navegador você está usando? + placeholder: Chrome + validations: + required: true + - type: input + attributes: + label: 'Navegador versão:' + description: Qual versão do navegador você está usando? + placeholder: '103.0.5060.134' + validations: + required: true + - type: textarea + attributes: + label: 'Como reproduzir o problema:' + placeholder: | + 1. O que eu fiz. + 2. O que eu esperava que acontecesse. + 3. O que eu realmente consegui. + 4. Se possível, imagens ou vídeos são bem-vindos. + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/02-feature-request.yml b/.github/ISSUE_TEMPLATE/02-feature-request.yml new file mode 100644 index 0000000000..9160504f94 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/02-feature-request.yml @@ -0,0 +1,19 @@ +name: Sugira uma nova funcionalidade ou melhoria para o mapas +description: 'Você tem uma ideia ou sugestão e quer compartilhar?' +labels: [Sugira um novo recurso ou melhoria] +body: + - type: markdown + attributes: + value: | + Você tem uma ideia de como melhorar o mapas? Fantástico! + Antes de enviar, dê uma olhada nos problemas existentes, se já houver + algo relacionado à sua sugestão. + - type: textarea + attributes: + label: 'Insira suas sugestões em detalhes:' + placeholder: | + 1. O que eu esperava que acontecesse. + 2. Seu motivo (se possível, imagens ou vídeos são bem-vindos). + 3. O que pretendo fazer (opcional, mas melhor). + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..ec4bb386bc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..90e7dcaa63 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +## Descrição + + + +## Validação + + + +## Issues relacionadas + + \ No newline at end of file diff --git a/.github/workflows/ci-cypress.yml b/.github/workflows/ci-cypress.yml new file mode 100644 index 0000000000..cd21e75dbc --- /dev/null +++ b/.github/workflows/ci-cypress.yml @@ -0,0 +1,25 @@ +name: cypress-ci + +on: + pull_request: + branches: + - 'main' + - 'feature/upgrade-cypress' + +jobs: + cypress-run: + runs-on: ubuntu-latest + steps: + - name: Git Checkout + uses: actions/checkout@v4 + + - name: Instala as dependências, cria configs e executa testes + run: cd src/ && npm install && npx cypress run --spec "cypress/e2e/**/*.js" + + - name: Cypress Screenshots + uses: actions/upload-artifact@v4 + if: failure() + with: + name: cypress-screenshots + path: src/cypress/screenshots + if-no-files-found: ignore \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33d0fccbf7..f742269039 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,66 +1,46 @@ name: ci on: - push: - branches: - - "master" - - "develop" - tags: - - "v*.*.*" pull_request: branches: - - "develop" + - homolog + + workflow_dispatch: jobs: - docker: + BUILD: runs-on: ubuntu-latest steps: - - - name: Checkout - uses: actions/checkout@v3 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 - with: - # list of Docker images to use as base name for tags - images: | - docker.io/hacklab/mapasculturais - # ghcr.io/username/app - # generate Docker tags based on the following events/attributes - tags: | - type=ref,event=branch - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=semver,pattern={{major}} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Docker Hub - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 + + - uses: actions/checkout@v4.1.1 + + - name: Docker Login + uses: docker/login-action@v3.0.0 with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - # - - # name: Login to GHCR - # if: github.event_name != 'pull_request' - # uses: docker/login-action@v2 - # with: - # registry: ghcr.io - # username: ${{ github.repository_owner }} - # password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v4 + username: ${{ secrets.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Checkout submodules + run: git submodule update --init --recursive + + - name: Ajusta branch do MultipleLocalAuth + run: cd src/plugins/MultipleLocalAuth && git checkout v3.0.0 + + - name: Criação da Imagem docker + uses: docker/build-push-action@v5.0.0 with: - file: ./docker/Dockerfile - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + context: ./ + file: ./Dockerfile + push: true + tags: | + secultceara/mapascultural:7.3.7 + secultceara/mapascultural:latest + DEPLOY: + needs: BUILD + runs-on: mapahomolog + steps: + - name: Pull das imagens docker + run: cd /opt/docker/mapa7 && sudo docker-compose pull + - name: Restart do docker-compose para atualizar o container com a nova imagem + run: cd /opt/docker/mapa7 && sudo docker-compose down && sudo docker-compose up -d \ No newline at end of file diff --git a/.github/workflows/cicd-dev.yml b/.github/workflows/cicd-dev.yml new file mode 100644 index 0000000000..4e1cad187b --- /dev/null +++ b/.github/workflows/cicd-dev.yml @@ -0,0 +1,60 @@ +name: ci/cd-dev + +on: + pull_request: + branches: + - develop + types: + - closed + - ready_for_review + - review_requested + + workflow_dispatch: + +jobs: + CODE_STYLE: + name: PHP-CS-Fixer + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Run PHP-CS-Fixer + uses: erkenes/php-cs-fixer-action@main + with: + args: '--dry-run --diff -vvv' + + BUILD: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + + - uses: actions/checkout@v4.1.1 + + - name: Docker Login + uses: docker/login-action@v3.0.0 + with: + username: ${{ secrets.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Checkout submodules + run: git submodule update --init --recursive + + - name: Ajusta branch do MultipleLocalAuth + run: cd src/plugins/MultipleLocalAuth && git checkout v3.0.0 + + - name: Criação da Imagem docker + uses: docker/build-push-action@v5.0.0 + with: + context: ./ + file: ./Dockerfile + push: true + tags: | + secultceara/mapascultural:7.3.7-dev + + DEPLOY: + needs: BUILD + runs-on: mapahomolog + steps: + - name: Pull das imagens docker + run: cd /opt/docker/developv7 && sudo docker-compose pull + - name: Restart do docker-compose para atualizar o container com a nova imagem + run: cd /opt/docker/developv7 && sudo docker-compose down && sudo docker-compose up -d diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000000..a246901aae --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,27 @@ +name: "Deploy to VPS" +on: + push: + branches: + - main + +jobs: + build_deploy: + runs-on: ubuntu-latest + + steps: + - name: "Checkout code" + uses: actions/checkout@v4 + + - name: executing remote ssh commands using password + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: ${{ secrets.SSH_PORT }} + script: | + cd ${{ secrets._PROJECT_PATH }} + git pull origin main + cd ${{ secrets._STACK_PATH }} + docker compose -f ${{ secrets._STACK_FILE }} stop + docker compose -f ${{ secrets._STACK_FILE }} up -d diff --git a/.github/workflows/rc.yml b/.github/workflows/rc.yml deleted file mode 100644 index 42bcffca74..0000000000 --- a/.github/workflows/rc.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Release Candidate - -on: - push: - branches: - - "release/*" - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v3 - - - name: Extract branch tag - id: tag - run: | - BRANCH=${{ github.ref_name }} - TAG="${BRANCH/release\//}" - echo "tag=$TAG-RC" >> $GITHUB_OUTPUT - echo "BRANCH=$BRANCH" >> $GITHUB_OUTPUT - - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 - with: - images: | - docker.io/hacklab/mapasculturais - tags: ${{ steps.tag.outputs.tag }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Docker Hub - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v4 - with: - file: ./docker/Dockerfile - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..6998cdaa11 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,56 @@ +name: Testing + +on: + pull_request: + branches: + - "**" + +jobs: + phpunit: + strategy: + matrix: + operating-system: [ubuntu-20.04] + php-versions: ["8.2"] + runs-on: ${{ matrix.operating-system }} + steps: + - name: Checkout Code + uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Add hosts to /etc/hosts + run: | + sudo echo "127.0.0.1 db" | sudo tee -a /etc/hosts + + - uses: hoverkraft-tech/compose-action@v1.5.1 + with: + compose-file: "dev/docker-compose.yml" + services: "db" + up-flags: "-d" + down-flags: "-v" + + - name: Install composer and dependencies + uses: php-actions/composer@v6 + + - name: Run migrations + run: | + mkdir var/private-files/dbupdate_documento + php src/tools/apply-updates.php + env: + APP_MODE: development + + - name: PHPUnit Tests + uses: php-actions/phpunit@v3 + env: + XDEBUG_MODE: coverage + with: + configuration: phpunit.xml + php_extensions: pdo_pgsql xdebug mbstring curl xml + args: tests --coverage-clover ./coverage.xml + + - name: Upload to Codecov + uses: codecov/codecov-action@v2 + with: + token: ${{ secrets.CODE_COV_TOKEN }} + files: ./coverage.xml + verbose: true diff --git a/.gitignore b/.gitignore index 08a0eb8400..479268e804 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,13 @@ mix-manifest.json dev/docker-data/ src/themes/BaseV1/assets/css/main.css src/themes/BaseV1/assets/css/main.css.map +.idea +.phpunit.result.cache +.php-cs-fixer.cache +docker-data +media-query.js.LICENSE.txt +public/assets/ +src/.phpdoc +.phpunit* +.phpdocs* +.env diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..2286e566f6 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,8 @@ +[submodule "src/plugins/MultipleLocalAuth"] + path = src/plugins/MultipleLocalAuth + url = https://github.com/mapasculturais/plugin-MultipleLocalAuth + branch = master +[submodule "src/themes/MapasCE"] + path = src/themes/MapasCE + url = https://github.com/secultce/theme-MapasCE + branch = main diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000000..998613f550 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,8 @@ +# This configuration file was automatically generated by Gitpod. +# Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml) +# and commit this file to your remote git repository to share the goodness with others. + +# Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart + +tasks: + - init: docker compose -f dev/docker-compose.yml up -d diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 0000000000..4ab46eeb94 --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,30 @@ +ignoreDotFiles(false) + ->ignoreVCSIgnored(true) + ->exclude(['logs', 'var', 'vendor']) + ->in(__DIR__.'/app') +; + +return (new Config()) + ->setRiskyAllowed(true) + ->setRules([ + 'psr_autoloading' => true, + '@PSR12' => true, + '@Symfony' => true, + '@PHP82Migration' => true, + 'array_syntax' => ['syntax' => 'short'], + 'declare_strict_types' => true, + 'void_return' => true, + 'yoda_style' => true, + 'increment_style' => ['style' => 'post'], + 'global_namespace_import' => true, + ]) + ->setFinder($finder) +; diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f06572a78..945d69f498 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,10 +49,6 @@ e este projeto adere ao [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Implementa possibilidade de definir mascaras em inputs do entity-field - Implementa contante global mcTabActive para guadar a aba que o mc-tab está selecionada - Implementa getter lastPhase() para as inscrições, possibilitando recuperar a entidade da inscrição na ultima fase -- Implementa hook no metodo getValidationErrors possibilitando a mainipulação final dos erros -- Melhora fluxo das mensagens de validação de erros da inscrição -- Melhorias na interface e filtro na lista de inscrições da página de avaliação -- Melhora performance do componente home-opportunities ### Correções - Corrige erro no carregamento do formulário de avaliação para o avaliador @@ -60,8 +56,6 @@ e este projeto adere ao [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Corrige db-update que atualiza legado da distribuição de avaliaçações por categoria - Corrige db-update que cria as colunas eligible e score - Corrige remoção de abas do componente mc-tabs -- Corrige link dos botões de acessar inscrição na lista de inscrições da página de avaliação -- Possibilita a configuração de metadados com opções value => label com valores numéricos através da flag `numericKeyValueOptions` ### Melhorias não funcionais - Refatora script start.sh e middleware ExecutionTime para fornecer um log mais limpo para o desenvolvedor diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..074b623339 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,71 @@ +ARG ARCH= +FROM ${ARCH}php:8.2-fpm + +ENV PNPM_HOME=/root/.local/share/pnpm +ENV PATH=$PATH:/root/.local/share/pnpm +ENV COMPOSER_ALLOW_SUPERUSER=1 + +# Copy source +COPY composer.json /var/www/composer.json +COPY composer.lock /var/www/composer.lock +COPY config /var/www/config +COPY public /var/www/html +COPY scripts /var/www/scripts +COPY src /var/www/src +COPY var /var/www/var +COPY app /var/www/app +COPY docker/common/config.d /var/www/config/common.d +COPY docker/production/config.d /var/www/config/prod.d +COPY docker/recreate-pending-pcache-cron.sh /recreate-pending-pcache-cron.sh +COPY docker/jobs-cron.sh /jobs-cron.sh +COPY docker/entrypoint.sh /entrypoint.sh +COPY version.txt /var/www/version.txt + + +RUN apt-get update && apt-get install -y --no-install-recommends \ + imagemagick libmagickcore-dev git libmagickwand-dev \ + libcurl4-gnutls-dev libpq-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev libzip-dev libzstd1 && \ + # Instalação do node + curl -sL https://deb.nodesource.com/setup_18.x | bash - && \ + apt-get install -y nodejs && \ + ## Instalação das extensões do node + npm install -g pnpm terser uglifycss autoprefixer postcss sass && \ + # Install extensions + docker-php-ext-install -j$(nproc) opcache pdo_pgsql zip xml curl opcache && \ + # Install GD + docker-php-ext-install -j$(nproc) iconv && \ + docker-php-ext-configure gd --with-jpeg && \ + docker-php-ext-install -j$(nproc) gd && \ + # Install APCu + no | pecl install apcu && echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apcu.ini && \ + # Install imagick + autodetect | pecl install imagick && echo "extension=imagick.so" > /usr/local/etc/php/conf.d/ext-imagick.ini && \ + # Install igbinary + pecl install igbinary && docker-php-ext-enable igbinary && \ + # Install msgpack + yes | pecl install msgpack && echo "extension=msgpack.so" > /usr/local/etc/php/conf.d/msgpack.ini && \ + # Install redis + no | pecl install -o -f redis && docker-php-ext-enable redis && \ + # Install composer + php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \ + php composer-setup.php --install-dir=/usr/local/bin && \ + rm composer-setup.php && \ + #Execução do composer + cd /var/www && composer.phar install && \ + # Instalação dos pacotes node + cd /var/www/src && pnpm install --recursive && pnpm run build && \ + sass themes/BaseV1/assets/css/sass/main.scss:themes/BaseV1/assets/css/main.css && \ + # alteração das permissões + mkdir -p /var/www/var/DoctrineProxies && \ + cd /var/www && ln -s ./html /var/www/public && \ + chown www-data:www-data -R /var/www && \ + # Limpeza do apt + rm -rf /var/lib/apt/lists + +WORKDIR /var/www + +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 9000 + +CMD ["php-fpm"] \ No newline at end of file diff --git a/README.md b/README.md index b59e24013e..27c4bde3a4 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,66 @@ -[![Join the chat at https://t.me/joinchat/WCYOkiRbAWmxQM2y](https://patrolavia.github.io/telegram-badge/chat.png)](https://t.me/joinchat/WCYOkiRbAWmxQM2y) - -# Mapas Culturais - -Em julho de 2013, agentes culturais de vários países da América Latina e do Brasil se reuniram para discutir a criação de uma ferramenta de mapeamento de iniciativas culturais e gestão cultural. Desse encontro surgiram as bases para a criação de Mapas Culturais, um software livre que permite o aprimoramento da gestão cultural dos municípios e estados. - -Mapas Culturais é uma plataforma colaborativa que reúne informações sobre agentes, espaços, eventos e projetos culturais, fornecendo ao poder público uma radiografia da área de cultura e ao cidadão um mapa de espaços e eventos culturais da região. A plataforma está alinhada ao Sistema Nacional de Informação e Indicadores Culturais do Ministério da Cultura (SNIIC) e contribui para a realização de alguns dos objetivos do Plano Nacional de Cultura. - -A plataforma já está em uso em diversos municipios, estados, no governo federal em diversos projetos do ministério da cultura e até mesmo fora do Brasil no Uruguai. Instalações recentes: - - -### Instalações em nível federal ou internacional -- IberculturaViva - https://mapa.iberculturaviva.org/ -- Mapa Uruguai - http://culturaenlinea.uy/ -- SNIIC - http://mapas.cultura.gov.br/ -- Museus - http://museus.cultura.gov.br/ -- Sistema Nacional de Bibliotecas Públicas - http://bibliotecas.cultura.gov.br/ -- Cultura Viva - http://culturaviva.gov.br/ -- Pontos de Memória - http://pontosdememoria.cultura.gov.br/ - -### Instalações estaduais -- Distrito Federal - http://mapa.cultura.df.gov.br/ -- Ceará - https://mapacultural.secult.ce.gov.br/ -- Espírito Santo - https://mapa.cultura.es.gov.br/ -- Goiás - https://mapagoiano.cultura.go.gov.br/ -- Maranhão - http://ma.mapas.cultura.gov.br/ -- Mato Grosso - https://mapas.mt.gov.br/ -- Mato Grosso do Sul - https://www.mapacultural.ms.gov.br/ -- Pará - https://mapacultural.pa.gov.br/ -- Paraíba - http://pb.mapas.cultura.gov.br/ -- Pernambuco - https://www.mapacultural.pe.gov.br/ -- Sergipe - http://mapas.cultura.se.gov.br/ -- Tocantins - http://mapa.cultura.to.gov.br/ -### Instalações municipais -- Ilheus - http://ilheus.ba.mapas.cultura.gov.br/ -- Camaçari - https://mapacultural.camacari.ba.gov.br/ -- Senhor do Bonfim - http://senhordobonfim.ba.mapas.cultura.gov.br/ -- Chorozinho - https://mapacultural.chorozinho.ce.gov.br/ -- Sobral - https://cultura.sobral.ce.gov.br/ -- Juazeiro do Norte - https://mapacultural.juazeiro.ce.gov.br/ -- Belo Horizonte - http://mapaculturalbh.pbh.gov.br/ -- Santa Luzia - http://mapacultural.santaluzia.mg.gov.br/ -- Ipatinga - http://mapacultural.ipatinga.mg.gov.br/ -- Varzea Grande - http://varzeagrande.mt.mapas.cultura.gov.br/ -- João Pessoa - http://jpcultura.joaopessoa.pb.gov.br/ -- Londrina - https://londrinacultura.londrina.pr.gov.br/ -- Foz do Iguaçu - http://mapadaculturafoz.pmfi.pr.gov.br/ -- Maringa - http://maringacultura.maringa.pr.gov.br:38081/ -- Rio das Ostras - http://mapadacultura.riodasostras.rj.gov.br/ -- Laguna - http://laguna.sc.mapas.cultura.gov.br/ -- Novo Hamburgo - http://mapacultural.novohamburgo.rs.gov.br/ -- Rio Grande - http://mapacultural.riogrande.rs.gov.br/ -- São Paulo - http://spcultura.prefeitura.sp.gov.br/ -- Santo André - http://culturaz.santoandre.sp.gov.br/ -- São Caetano do Sul - http://mapacultural.saocaetanodosul.sp.gov.br/ -- Osasco - http://osasco.sp.mapas.cultura.gov.br/ -- Franco da Rocha - http://francodarocha.sp.mapas.cultura.gov.br/ -- Guaruja - http://mapadacultura.guaruja.sp.gov.br/ -- Varzea Paulista - http://janelacultural.varzeapaulista.sp.gov.br/ -- Itu - http://mapacultural.itu.sp.gov.br/ -- Guarulhos - http://grucultura.guarulhos.sp.gov.br/ -- Itapetininga - http://mapacultural.itapetininga.sp.gov.br/ - -## Sobre a aplicação -Mapas Culturais é uma aplicação web server-side baseada em linguagem PHP e banco de dados Postgres, entre outras tecnologias e componentes, que propicia um ambiente virtual para mapeamento, divulgação e gestão de ativos culturais. - -## Projetos correlatos -* [Mapas Cuturais Base Project](https://github.com/hacklabr/mapasculturais-app) - Repositório de projeto base para novas instalações. -* [Multiple Local Auth](https://github.com/mapasculturais/mapasculturais-MultipleLocalAuth) - Plugin de autenticação local + oauth. -* [Mapas SDK](https://github.com/centroculturalsp/MapasSDK) -* [Mapas Culturais APP](https://github.com/hacklabr/mapasculturais-app) -* [Cultural Magazine Theme](https://github.com/hacklabr/cultural) +# Rede Mapas + +Em julho de 2013, representantes culturais de diversos países da América Latina e do Brasil se uniram em um encontro histórico para debater a criação de uma ferramenta de mapeamento de iniciativas culturais e gestão cultural. Desse encontro, emergiram os alicerces para o desenvolvimento dos Mapas Culturais, um software de código aberto que possibilita o aprimoramento da gestão cultural em âmbito municipal e estadual. + +O projeto originalmente chamado Mapas Culturais é uma plataforma colaborativa que agrega informações detalhadas sobre agentes, espaços, eventos e projetos culturais. Com isso, oferece ao poder público uma visão abrangente da área da cultura, enquanto proporciona ao cidadão um mapa interativo de espaços e eventos culturais da região. Alinhada com o Sistema Nacional de Informação e Indicadores Culturais do Ministério da Cultura (SNIIC), essa plataforma desempenha um papel crucial na realização de diversos objetivos estabelecidos pelo Plano Nacional de Cultura. + +A plataforma já está em uso em diversos municipios, estados, no governo federal em diversos projetos do ministério da cultura e até mesmo fora do Brasil, no Uruguai. + +Mais detalhes sobre a História: [Clique aqui](https://rede.mapas.tec.br/) + +## Projeto Original (Mapas Culturais) +O projeto original atualmente é mantido de forma aberta e colaborativa, gerenciada pelo time de desenvolvimento do @HackLab + +O repositório se encontra aqui: + +> Caso queira saber mais sobre o projeto MapasCulturais, gerenciado pelo HackLab, [Clique aqui](https://github.com/mapasculturais/mapasculturais/README.md) + +## Este Fork + +> Fork de Repositório (Fork de Código): No desenvolvimento de software, especialmente em plataformas de controle de versão como GitHub, um fork é a criação de uma cópia de um repositório de código. Isso permite que o desenvolvedor trabalhe no código de forma independente, podendo fazer modificações e melhorias sem afetar o projeto original. Caso essas modificações sejam benéficas, podem ser integradas ao projeto original por meio de um pull request. + +Optamos por criar um fork do projeto original com o objetivo de evoluir o sistema e oferecer uma plataforma ainda mais eficiente e acessível para a gestão cultural. As melhorias incluem uma nova arquitetura de arquivos e diretórios, uma conexão aprimorada com o banco de dados e um guia detalhado de colaboração, permitindo uma maior participação da comunidade no desenvolvimento e manutenção do projeto. Este fork visa não apenas otimizar o desempenho e a usabilidade do sistema, mas também fortalecer a rede de agentes culturais e facilitar o acesso à informação e à cultura. + +Agradecemos profundamente a todos que contribuíram até a última versão do projeto. A partir dela, realizamos várias mudanças significativas que podem ser detalhadas aqui: + +- [Nova Arquitetura](./app/README.md) de arquivos e diretórios +- [Conexão](./app/README.md) com o Banco de Dados +- [Como colaborar](./help/CREATE-ISSUES.md) criando issues +- [Como implementar](./app/CREATE-PULL-REQUESTS.md) novos códigos através de pull requests + +## Tecnologias + +- PHP7^ + - Symfony packages + - Slim packages + - Doctrine + - PHP DI + - PHPUnit +- PostgreSQL + +--- ## Instalação -A maneira mais simples e segura para instalar o Mapas Culturais é utilizando o [Mapas Culturais Base Project](https://github.com/mapasculturais/mapasculturais-base-project) como base para a criação de um repositório próprio para o seu projeto, que reunirá o tema, os plugins e as configurações da aplicação. O Mapas Culturais Base Project utiliza o Docker e o Docker Composer para rodar a aplicação, facilitando os processos de deploy e de atualizaçao. +A maneira mais simples e segura para instalar o MapaCultural é seguindo [Este tutorial](./help/INSTALL.md) -- [Instalação utilizando o Base Project ](https://github.com/mapasculturais/mapasculturais-base-project#readme) - **RECOMENDADO** -## Documentação +## Documentação do Novo Código -Uma [nova documentação](https://mapasculturais.gitbook.io/bem-vindo-a-a-documentacao-do-mapas/) está sendo escrita no gitbook, organizada em três seções: -- [Documentação para usuários](https://mapasculturais.gitbook.io/documentacao-para-usuarios/) -- [Documentação para desenvolvedores](https://mapasculturais.gitbook.io/documentacao-para-desenvolvedores/formacao-para-desenvolvedores/) -- [Documentação para devops](https://mapasculturais.gitbook.io/documentacao-para-devops/instalacao/) +- [Getting Started](./app/README.md) +- API + - [API V1](https://mapacultural.secult.ce.gov.br/mapas/docs/v1) do projeto original + - [API V2](https://mapacultural.secult.ce.gov.br/mapas/docs/v2) baseada em RestFul, implementada neste fork +- Autenticação + - Web (ainda em desenvolvimento) + - API V2 (ainda em desenvolvimento) ## Documentação Legada A documentação pode ser navegada no endereço (http://docs.mapasculturais.org) -Toda documentação da aplicação está na pasta [documentation](documentation). Principais referências: +
+Saiba mais + +Toda documentação da aplicação está na pasta [documentation](documentation). Principais referências: - [API](http://docs.mapasculturais.org/apidoc/index.html?doctype=api) - [API - exemplos](documentation/docs/mc_config_api.md) - [Guia do desenvolvedor](documentation/docs/mc_developer_guide.md) @@ -95,27 +69,12 @@ Toda documentação da aplicação está na pasta [documentation](documentation) - [Importação de arquivos de dados geoespaciais (Shapefiles)](documentation/docs/mc_deploy_shapefiles.md) - [Deploy diretamente no sistema operacional](https://docs.mapasculturais.org/mc_deploy/) - **NÃO RECOMENDADO** - [Habilitar um novo tema](documentation/docs/mc_deploy_theme.md) +
+ + +## Mais Informações -### [Software] Requisitos para Instalação -Lista dos principais softwares que compõe e aplicação. Maiores detalhes, ver documentação de [instalação](documentation/docs/mc_deploy.md) ou [guia do desenvolvedor](documentation/docs/mc_developer_guide.md). - -- [Ubuntu Server >= 18.04](http://www.ubuntu.com) ou [Debian Server >= 10](https://www.debian.org.) -- [PHP = 7.2](http://php.net) - - [php-gd](http://php.net/manual/pt_BR/book.image.php) - - [php-cli](https://packages.debian.org/pt-br/jessie/php5-cli) - - [php-json](http://php.net/manual/pt_BR/book.json.php) - - [php-curl](http://php.net/manual/pt_BR/book.curl.php) - - [php-pgsql](http://php.net/manual/pt_BR/book.pgsql.php) - - [php-apc](http://php.net/manual/pt_BR/book.apc.php) -- [Composer](https://getcomposer.org/) -- [PostgreSQL >= 10](http://www.postgresql.org/) -- [Postgis >= 2.2](http://postgis.net) -- [Node.JS >= 8.x](https://nodejs.org/en/) - - [NPM](https://www.npmjs.com/) - - [Terser](https://terser.org/) - - [UglifyCSS](https://www.npmjs.com/package/gulp-uglifycss) -- [Ruby](https://www.ruby-lang.org/pt) - - [Sass gem](https://rubygems.org/gems/sass/versions/3.4.22) +Acesse aqui para ver a documentação do projeto original [aqui](./help/README.md) ### [Hardware] Requisitos para instalação diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000000..a725465aee --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +vendor/ \ No newline at end of file diff --git a/app/README.md b/app/README.md new file mode 100644 index 0000000000..ad91a2d668 --- /dev/null +++ b/app/README.md @@ -0,0 +1,483 @@ +# MapaCultural - Nova Arquitetura + +Essa é a nova documentação do MapaCultural, voltada para desenvolvedores e/ou entusiastas do código. + +
+ Acesso Rápido + +[Instalação dos Pacotes](#Instalação)
+[Controller](#API)
+[Repository](#Repository)
+[Command](#Command)
+[Data Fixtures](#Data-Fixtures)
+[Testes](#Testes)
+[Console](#console-commands)
+ +
+ +## Getting Started + +### Instalação dos pacotes + +Para instalar as dependências e atualizar o autoload, entre no container da aplicação e execute: +```shell +composer.phar install +``` + +--- + +## Controller + +Os `Controllers` em conjunto com as `Routes` permitem criar endpoints para diversas finalidades. + +
+Como criar um novo controller + +#### 1 - Controller +Crie uma nova classe em `/app/Controller/Api/`, por exemplo, `EventApiController.php`: + +```php + Para gerar respostas em json, estamos utilizando a implementação da `JsonResponse` fornecida pelo pacote do Symfony: + +```php + 1, 'name' => 'Palestra'], + ['id' => 2, 'name' => 'Curso'], + ]; + + return new JsonResponse($events); + } +} +``` + +#### 3 - Rotas + +Acesse o arquivo `/app/routes/api.php` e adicione sua rota, informando o `path`, o verbo HTTP, e apontando pro seu controller e método + +```php +use App\Controller\Api\EventApiController; +use Symfony\Component\HttpFoundation\Request; + +$routes = [ + //... other routes + '/api/v2/events' => [ + Request::METHOD_GET => [EventApiController::class, 'getList'] + ], +]; +``` + +Se preferir pode criar um arquivo no diretório `/app/routes/api/` e isolar suas novas rotas nesse arquivo, basta fazer isso: + +```php +// /app/routes/api/event.php + +use App\Controller\Api\EventApiController; +use Symfony\Component\HttpFoundation\Request; + +return [ + '/api/v2/events' => [ + Request::METHOD_GET => [EventApiController::class, 'getList'], + Request::METHOD_POST => [EventApiController::class, 'create'], + ], +]; +``` + +Esse seu novo arquivo será reconhecimento automagicamente dentro da aplicação. + +#### 4 - Pronto + +Feito isso, seu endpoint deverá estar disponivel em: + + +E deve estar retornando algo como: +```json +[ + { + "id": 1, + "name": "Palestra" + }, + { + "id": 2, + "name": "Curso" + } +] +``` + +
+ +--- + +## Validation +A camada de validação é responsável por validar as entradas e saídas de dados + +Documentação do Validator: + +Para organizar e validar esses dados nós utilizaremos o componente de validação atrelados a um DTO, cada propriedade terá suas regras e grupos + +
+Como criar um novo DTO + +#### 1 - Data Transfer Object (DTO) +Crie uma nova classe em `/app/DTO/`, por exemplo, `SealDTO.php`: + +```php + [Lista completa](https://symfony.com/doc/current/reference/constraints.html) de regras do componente +```php + Por exemplo, no código acima temos uma regra em especial para o post, a propriedade _name_ é requerida. + +Agora como esse DTO será usado para validar algo?! + +Após a requisição ser enviada, o corpo será transformado de array para SealDTO, então iremos passar o objeto e o grupo para o validator, caso tenha alguma violação ela será retornada + +```php +[...] + +$seal = $this->serializer->denormalize($data, SealDto::class); + +$validation = Validation::createValidatorBuilder()->enableAttributeMapping()->getValidator(); + +$violations = $validation->validate($seal, groups: ['patch']); + +if (0 < count($violations)) { + throw new ValidatorException(violations: $violations); +} + +[...] +``` +> O código acima normalmente estará no _Controller_ ou _Request_ + +O objeto dessa validação é validar dados e não regra de négocio + +
+ +--- + +## Repository + +A camada responsável pela comunicação entre nosso código e o banco de dados. + +
+Como criar um novo repository + +Siga o passo a passo a seguir: + +#### Passo 1 - Crie sua classe no `/app/src/Repository` e extenda a classe abstrata `AbstractRepository` + +```php +repository = $this->entityManager->getRepository(MyEntity::class); +} +``` + +caso a sua entidade não esteja mapeada nessa parte da aplicação (V8), você precisará de um `entityManager` diferente, observer a seguir: + +```php +use Doctrine\Persistence\ObjectRepository; +use MapasCulturais\Entities\MyEntity; +... + +private ObjectRepository $repository; + +public function __construct() +{ + parent::__construct(); + + $this->repository = $this->mapaCulturalEntityManager->getRepository(MyEntity::class); +} +``` +
+ +--- + +## Command +Comandos são entradas via CLI (linha de comando) que permitem automatizar alguns processos, como rodar testes, veririfcar estilo de código, e debugar rotas + +
+Como criar um novo console command + +#### Passo 1 - Criar uma nova classe em `app/src/Command/`: + +```php +writeln('Hello World!'); + + return Command::SUCCESS; + } +} +``` + +#### Passo 2 - Testar seu comando no CLI + +Entre no container da aplicação PHP e execute isso + +```shell +php app/bin/console app:my-command +``` + +Você deverá ver na tela o texto `Hello World!` + +#### Passo 3 - Documentação do pacote +Para criar e gerenciar os nosso commands estamos utilizando o pacote `symfony/console`, para ver sua documentação acesse: + +> Saiba mais em + +Para ver outros console commands da aplicação acesse a seção [Console Commands](#console-commands) + +
+ +--- + +## Data Fixtures +Data Fixtures são dados falsos, normalmente criados para testar a aplicação, algumas vezes são chamados de "Seeders". + +
+Como criar uma DataFixture para uma Entidade + +#### Passo 1 - Criar uma nova classe em `app/src/DataFixtures/`: + +```php +name = 'Agente Teste da Silva'; + + $manager->persist($agent); + $manager->flush(); + } +} +``` + +#### Passo 2 - Executar sua fixture no CLI + +Entre no container da aplicação PHP e execute isso + +```shell +php app/bin/console app:fixtures +``` + +Pronto, você deverá ter um novo Agente criado de acordo com a sua Fixture. + +> Saiba mais sobre DataFixtures em + +
+ +--- + +## Testes +Estamos utilizando o PHPUnit para criar e gerenciar os testes automatizados, focando principalmente nos testes funcionais, ao invés dos testes unitários. + +Documentação do PHPUnit: + +
+Como criar um novo teste + +### Criar um novo teste +Para criar um no cenário de teste funcional, basta adicionar sua nova classe no diretório `/app/tests/functional/`, com o seguinte código: + +```php +dump($list); // equivalente ao print_r + + $this->assertEquals( + 'MarMinino', + implode('', $list) + ); +} +``` + +Para executar os testes veja a seção Console Commands +
+ +--- + +## Console Commands + + +
+TESTS + +### Testes Automatizados +Para executar os testes, entre no container da aplicação e execute o seguinte comando: + +```shell +php app/bin/console tests:backend {path} +``` + +O `path` é opcional, o padrão é "app/tests" +
+ +
+STYLE CODE + +### Style Code +Para executar o PHP-CS-FIXER basta entrar no container da aplicação e executar + +```shwll +php app/bin/console app:code-style +``` +
+ +
+DATA FIXTURES + +### Fixtures + +:memo: Fixtures são dados falsos com a finalidade de testes. + + +Para executar o conjunto de fixtures basta entrar no container da aplicação e executar +``` +php app/bin/console app:fixtures +``` +
+ +
+DEBUG ROUTES + +### Debug router +Para listas as routas basta entrar no container da aplicação e executar +``` +php app/bin/console debug:router +``` + +> Podemos usar as flags --show-actions e --show-controllers +
+ +
+DOCTRINE + +### Doctrine +Para listas todos os comandos disponiveis para gerenciamento do banco de dados através do doctrine basta entrar no container da aplicação e executar +``` +php app/bin/doctrine +``` + +
+ diff --git a/app/bin/console b/app/bin/console new file mode 100644 index 0000000000..d05eae7193 --- /dev/null +++ b/app/bin/console @@ -0,0 +1,25 @@ +#!/usr/bin/env php +em ?? null; + +$application->addCommands([ + new WelcomeCommand(), + new TestsCommand(), + new CodeStyleCommand(), + new FixturesCommand($entityManager), + new DebugRouterCommand(), +]); + +$application->run(); diff --git a/app/bin/doctrine b/app/bin/doctrine new file mode 100644 index 0000000000..0d26b7e51d --- /dev/null +++ b/app/bin/doctrine @@ -0,0 +1,17 @@ +#!/usr/bin/env php +em ?? null; + +$commands = []; + +ConsoleRunner::run( + new SingleManagerProvider($entityManager), + $commands +); diff --git a/app/routes/api.php b/app/routes/api.php new file mode 100644 index 0000000000..63cf1d1e46 --- /dev/null +++ b/app/routes/api.php @@ -0,0 +1,25 @@ + [ + Request::METHOD_GET => [WelcomeApiController::class, 'index'], + ], + '/api/v2' => [ + Request::METHOD_GET => [WelcomeApiController::class, 'index'], + Request::METHOD_POST => [WelcomeApiController::class, 'create'], + Request::METHOD_DELETE => [WelcomeApiController::class, 'delete'], + ], +]; + +$files = glob(__DIR__.'/api/*.php'); + +foreach ($files as $file) { + $routes = [...$routes, ...require $file]; +} + +return $routes; diff --git a/app/routes/api/agent.php b/app/routes/api/agent.php new file mode 100644 index 0000000000..746f8414a5 --- /dev/null +++ b/app/routes/api/agent.php @@ -0,0 +1,25 @@ + [ + Request::METHOD_GET => [AgentApiController::class, 'getList'], + Request::METHOD_POST => [AgentApiController::class, 'post'], + ], + '/api/v2/agents/types' => [ + Request::METHOD_GET => [AgentApiController::class, 'getTypes'], + ], + '/api/v2/agents/{id}' => [ + Request::METHOD_GET => [AgentApiController::class, 'getOne'], + Request::METHOD_PATCH => [AgentApiController::class, 'patch'], + Request::METHOD_DELETE => [AgentApiController::class, 'delete'], + ], + '/api/v2/agents/{id}/opportunities' => [ + Request::METHOD_GET => [OpportunityApiController::class, 'getOpportunitiesByAgent'], + ], +]; diff --git a/app/routes/api/event.php b/app/routes/api/event.php new file mode 100644 index 0000000000..b898c66ebb --- /dev/null +++ b/app/routes/api/event.php @@ -0,0 +1,21 @@ + [ + Request::METHOD_GET => [EventApiController::class, 'getList'], + Request::METHOD_POST => [EventApiController::class, 'post'], + ], + '/api/v2/events/types' => [ + Request::METHOD_GET => [EventApiController::class, 'getTypes'], + ], + '/api/v2/events/{id}' => [ + Request::METHOD_GET => [EventApiController::class, 'getOne'], + Request::METHOD_PATCH => [EventApiController::class, 'patch'], + Request::METHOD_DELETE => [EventApiController::class, 'delete'], + ], +]; diff --git a/app/routes/api/opportunity.php b/app/routes/api/opportunity.php new file mode 100644 index 0000000000..792474eddd --- /dev/null +++ b/app/routes/api/opportunity.php @@ -0,0 +1,18 @@ + [ + Request::METHOD_GET => [OpportunityApiController::class, 'getList'], + Request::METHOD_POST => [OpportunityApiController::class, 'post'], + ], + '/api/v2/opportunities/{id}' => [ + Request::METHOD_GET => [OpportunityApiController::class, 'getOne'], + Request::METHOD_PATCH => [OpportunityApiController::class, 'patch'], + Request::METHOD_DELETE => [OpportunityApiController::class, 'delete'], + ], +]; diff --git a/app/routes/api/project.php b/app/routes/api/project.php new file mode 100644 index 0000000000..4b6a364e22 --- /dev/null +++ b/app/routes/api/project.php @@ -0,0 +1,18 @@ + [ + Request::METHOD_GET => [ProjectApiController::class, 'getList'], + Request::METHOD_POST => [ProjectApiController::class, 'post'], + ], + '/api/v2/projects/{id}' => [ + Request::METHOD_GET => [ProjectApiController::class, 'getOne'], + Request::METHOD_PATCH => [ProjectApiController::class, 'patch'], + Request::METHOD_DELETE => [ProjectApiController::class, 'delete'], + ], +]; diff --git a/app/routes/api/seal.php b/app/routes/api/seal.php new file mode 100644 index 0000000000..e26ea1230e --- /dev/null +++ b/app/routes/api/seal.php @@ -0,0 +1,18 @@ + [ + Request::METHOD_GET => [SealApiController::class, 'getList'], + Request::METHOD_POST => [SealApiController::class, 'post'], + ], + '/api/v2/seals/{id}' => [ + Request::METHOD_GET => [SealApiController::class, 'getOne'], + Request::METHOD_PATCH => [SealApiController::class, 'patch'], + Request::METHOD_DELETE => [SealApiController::class, 'delete'], + ], +]; diff --git a/app/routes/api/space.php b/app/routes/api/space.php new file mode 100644 index 0000000000..1da6f78424 --- /dev/null +++ b/app/routes/api/space.php @@ -0,0 +1,22 @@ + [ + Request::METHOD_GET => [SpaceApiController::class, 'getList'], + Request::METHOD_POST => [SpaceApiController::class, 'post'], + ], + '/api/v2/spaces/{id}' => [ + Request::METHOD_GET => [SpaceApiController::class, 'getOne'], + Request::METHOD_DELETE => [SpaceApiController::class, 'delete'], + Request::METHOD_PATCH => [SpaceApiController::class, 'patch'], + ], + '/api/v2/spaces/{id}/events' => [ + Request::METHOD_GET => [EventApiController::class, 'getEventsBySpace'], + ], +]; diff --git a/app/routes/api/term.php b/app/routes/api/term.php new file mode 100644 index 0000000000..eaff38fd31 --- /dev/null +++ b/app/routes/api/term.php @@ -0,0 +1,15 @@ + [ + Request::METHOD_GET => [TermApiController::class, 'getList'], + ], + '/api/v2/terms/{id}' => [ + Request::METHOD_GET => [TermApiController::class, 'getOne'], + ], +]; diff --git a/app/routes/routes.php b/app/routes/routes.php new file mode 100644 index 0000000000..2945436142 --- /dev/null +++ b/app/routes/routes.php @@ -0,0 +1,40 @@ + $routeData) { + foreach ($routeData as $method => $params) { + $controller = $params[0]; + $action = $params[1]; + + $route = new Route( + path: $key, + defaults: [ + '_controller' => $controller, + '_action' => $action, + ], + methods: [$method] + ); + + $routesCollection->add("$key-$method", $route); + } +} + +return $routesCollection; diff --git a/app/routes/web.php b/app/routes/web.php new file mode 100644 index 0000000000..ae4958424f --- /dev/null +++ b/app/routes/web.php @@ -0,0 +1,15 @@ + [ + Request::METHOD_GET => [DocumentationController::class, 'v1'], + ], + '/mapas/docs/v2' => [ + Request::METHOD_GET => [DocumentationController::class, 'v2'], + ], +]; diff --git a/app/src/Command/CodeStyleCommand.php b/app/src/Command/CodeStyleCommand.php new file mode 100644 index 0000000000..3ca837ad4c --- /dev/null +++ b/app/src/Command/CodeStyleCommand.php @@ -0,0 +1,30 @@ +writeln('-------------------------------------------------------'); + passthru("php vendor/bin/php-cs-fixer fix --dry-run --diff -vvv {$input->getArgument('path')}"); + $output->writeln('-------------------------------------------------------'); + + return Command::SUCCESS; + } + + protected function configure(): void + { + $this->addArgument('path', InputArgument::OPTIONAL, default: 'app'); + $this->setDescription('Run code style rules.'); + } +} diff --git a/app/src/Command/DebugRouterCommand.php b/app/src/Command/DebugRouterCommand.php new file mode 100644 index 0000000000..49572945d8 --- /dev/null +++ b/app/src/Command/DebugRouterCommand.php @@ -0,0 +1,95 @@ +router = require_once dirname(__DIR__, 2).'/routes/routes.php'; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $output->writeLn([ + PHP_EOL, + '==============================', + '== Route List ==', + '==============================', + PHP_EOL, + ]); + + $this->printTable($io, [ + '_action' => $input->getOption('show-actions'), + '_controller' => $input->getOption('show-controllers'), + ]); + + return Command::SUCCESS; + } + + protected function configure(): void + { + $this->setDescription('Display current routes for an application.') + ->setDefinition([ + new InputOption('show-actions', null, InputOption::VALUE_NONE, 'Show assigned actions in overview'), + new InputOption('show-controllers', null, InputOption::VALUE_NONE, 'Show assigned controllers in overview'), + ]); + } + + private function printTable(SymfonyStyle $io, array $options): void + { + $headers = $this->getHeaders(array_keys(array_filter($options, fn ($option) => true === $option))); + $rows = $this->getRows($options); + + $io->table($headers, $rows); + } + + private function getHeaders(array $options): array + { + $headers = ['Path', 'Method']; + + foreach ($options as $option) { + $formatted = ltrim($option, '_'); + $formatted = ucfirst($formatted); + $headers[] = $formatted; + } + + return $headers; + } + + private function getRows(array $options): array + { + $rows = []; + + foreach ($this->router->all() as $key => $route) { + $rows[$key]['path'] = $route->getPath(); + $rows[$key]['methods'] = $route->getMethods()[0]; + + if ($options['_action']) { + $rows[$key]['_action'] = $route->getDefault('_action'); + } + + if (true === $options['_controller']) { + $rows[$key]['_controller'] = $route->getDefault('_controller'); + } + } + + return $rows; + } +} diff --git a/app/src/Command/FixturesCommand.php b/app/src/Command/FixturesCommand.php new file mode 100644 index 0000000000..1b2a4ca3d6 --- /dev/null +++ b/app/src/Command/FixturesCommand.php @@ -0,0 +1,47 @@ +writeLn([ + PHP_EOL, + '==============================', + '== RUN DATA FIXTURES ==', + '==============================', + PHP_EOL, + ]); + + $loader = new Loader(); + $loader->loadFromDirectory('app/src/DataFixtures'); + + $executor = new ORMExecutor($this->entityManager, new ORMPurger()); + $executor->execute($loader->getFixtures(), true); + + return Command::SUCCESS; + } + + protected function configure(): void + { + $this->setDescription('Run data fixtures to MapaCultural.'); + } +} diff --git a/app/src/Command/TestsCommand.php b/app/src/Command/TestsCommand.php new file mode 100644 index 0000000000..6f81d48d2b --- /dev/null +++ b/app/src/Command/TestsCommand.php @@ -0,0 +1,30 @@ +writeln('-------------------------------------------------------'); + passthru("php vendor/bin/phpunit {$input->getArgument('path')}"); + $output->writeln('-------------------------------------------------------'); + + return Command::SUCCESS; + } + + protected function configure(): void + { + $this->addArgument('path', InputArgument::OPTIONAL, default: 'app/tests'); + $this->setDescription('Run Automated tests for backend.'); + } +} diff --git a/app/src/Command/WelcomeCommand.php b/app/src/Command/WelcomeCommand.php new file mode 100644 index 0000000000..f00ce2b9bb --- /dev/null +++ b/app/src/Command/WelcomeCommand.php @@ -0,0 +1,32 @@ +writeLn([ + PHP_EOL, + '==============================', + '== WELCOME TO MAPA CULTURAL ==', + '==============================', + PHP_EOL, + ]); + + return Command::SUCCESS; + } + + protected function configure(): void + { + $this->setDescription('Welcome to MapaCultural Console.'); + } +} diff --git a/app/src/Connection/EntityManager.php b/app/src/Connection/EntityManager.php new file mode 100644 index 0000000000..984f039f8c --- /dev/null +++ b/app/src/Connection/EntityManager.php @@ -0,0 +1,50 @@ +configParams = require dirname(__DIR__, 3).'/src/conf/config.php'; + $this->configuration = $this->makeConfiguration(); + + $connection = $this->makeConnection(); + + parent::__construct($connection, $this->configuration); + } + + private function makeConfiguration(): Configuration + { + $cache = new Cache($this->configParams['app.cache']); + + return ORMSetup::createAttributeMetadataConfiguration( + paths: [dirname(__DIR__).'/Entity/'], + isDevMode: (bool) $this->configParams['doctrine.isDev'], + cache: $cache->adapter + ); + } + + private function makeConnection(): Connection + { + return DriverManager::getConnection([ + 'driver' => 'pdo_pgsql', + 'dbname' => $this->configParams['db.dbname'], + 'user' => $this->configParams['db.user'], + 'password' => $this->configParams['db.password'], + 'host' => $this->configParams['db.host'], + ], $this->configuration); + } +} diff --git a/app/src/Controller/AbstractController.php b/app/src/Controller/AbstractController.php new file mode 100644 index 0000000000..0d9bfd3e6b --- /dev/null +++ b/app/src/Controller/AbstractController.php @@ -0,0 +1,13 @@ +repository = new AgentRepository(); + + $this->agentService = new AgentService(); + $this->agentRequest = new AgentRequest(); + } + + public function getList(): JsonResponse + { + $agents = $this->repository->findAll(); + + return new JsonResponse($agents); + } + + public function getOne(array $params): JsonResponse + { + $agent = $this->repository->find((int) $params['id']); + + return new JsonResponse($agent); + } + + public function getTypes(): JsonResponse + { + $types = $this->agentService->getTypes(); + + return new JsonResponse($types); + } + + public function post(): JsonResponse + { + try { + $agentData = $this->agentRequest->validatePost(); + + $agent = $this->agentService->create((object) $agentData); + + $responseData = [ + 'id' => $agent->getId(), + 'name' => $agent->getName(), + 'shortDescription' => $agent->getShortDescription(), + 'terms' => $agent->getTerms(), + 'type' => $agent->getType(), + ]; + + return new JsonResponse($responseData, Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function patch(array $params): JsonResponse + { + try { + $agentData = $this->agentRequest->validateUpdate(); + $agent = $this->agentService->update((int) $params['id'], (object) $agentData); + + return new JsonResponse($agent, Response::HTTP_CREATED); + } catch (ResourceNotFoundException $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_NOT_FOUND); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function delete(array $params): JsonResponse + { + try { + $this->agentService->discard((int) $params['id']); + + return new JsonResponse(status: Response::HTTP_NO_CONTENT); + } catch (ResourceNotFoundException $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_NOT_FOUND); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } +} diff --git a/app/src/Controller/Api/EventApiController.php b/app/src/Controller/Api/EventApiController.php new file mode 100644 index 0000000000..da193e9403 --- /dev/null +++ b/app/src/Controller/Api/EventApiController.php @@ -0,0 +1,101 @@ +eventService = new EventService(); + + $this->repository = new EventRepository(); + + $this->eventRequest = new EventRequest(); + } + + public function getList(): JsonResponse + { + $events = $this->repository->findAll(); + + return new JsonResponse($events); + } + + public function getOne(array $params): JsonResponse + { + $event = $this->repository->find((int) $params['id']); + + return new JsonResponse($event); + } + + public function getTypes(): JsonResponse + { + $types = $this->eventService->getTypes(); + + return new JsonResponse($types); + } + + public function getEventsBySpace(array $params): JsonResponse + { + $events = $this->repository->findEventsBySpaceId((int) $params['id']); + + return new JsonResponse($events); + } + + public function post(): JsonResponse + { + try { + $eventData = $this->eventRequest->validatePost(); + + $event = $this->eventService->create((object) $eventData); + + $responseData = [ + 'id' => $event->getId(), + 'name' => $event->getName(), + 'shortDescription' => $event->getShortDescription(), + 'classificacaoEtaria' => $event->getMetadata('classificacaoEtaria'), + 'terms' => $event->getTerms(), + ]; + + return new JsonResponse($responseData, Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function patch(array $params): JsonResponse + { + try { + $eventData = $this->eventRequest->validateUpdate(); + $event = $this->eventService->update((int) $params['id'], (object) $eventData); + + return new JsonResponse($event, Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function delete($params): JsonResponse + { + try { + $event = $this->eventRequest->validateEventExistent($params); + $this->repository->softDelete($event); + + return new JsonResponse([], Response::HTTP_OK); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } +} diff --git a/app/src/Controller/Api/OpportunityApiController.php b/app/src/Controller/Api/OpportunityApiController.php new file mode 100644 index 0000000000..e7c82399df --- /dev/null +++ b/app/src/Controller/Api/OpportunityApiController.php @@ -0,0 +1,91 @@ +repository = new OpportunityRepository(); + $this->opportunityRequest = new OpportunityRequest(); + $this->opportunityService = new OpportunityService(); + } + + public function getList(): JsonResponse + { + $opportunities = $this->repository->findAll(); + + return new JsonResponse($opportunities); + } + + public function getOne(array $params): JsonResponse + { + $opportunity = $this->repository->find((int) $params['id']); + + return new JsonResponse($opportunity); + } + + public function post(): JsonResponse + { + try { + $opportunityData = $this->opportunityRequest->validatePost(); + $opportunity = $this->opportunityService->create((object) $opportunityData); + + $responseData = [ + 'id' => $opportunity->getId(), + 'name' => $opportunity->getName(), + 'terms' => $opportunity->getTerms(), + '_type' => $opportunity->getType(), + ]; + + return new JsonResponse($responseData, Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function getOpportunitiesByAgent(array $params): JsonResponse + { + $agentId = (int) $params['id']; + $opportunities = $this->repository->findOpportunitiesByAgentId($agentId); + + return new JsonResponse($opportunities); + } + + public function patch(array $params): JsonResponse + { + try { + $opportunityData = $this->opportunityRequest->validateUpdate(); + $opportunity = $this->opportunityService->update((int) $params['id'], (object) $opportunityData); + + return new JsonResponse($opportunity, Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function delete(array $params): JsonResponse + { + try { + $opportunity = $this->opportunityRequest->validateDelete($params); + $this->repository->softDelete($opportunity); + + return new JsonResponse([], Response::HTTP_NO_CONTENT); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } +} diff --git a/app/src/Controller/Api/ProjectApiController.php b/app/src/Controller/Api/ProjectApiController.php new file mode 100644 index 0000000000..b77f9b7cc2 --- /dev/null +++ b/app/src/Controller/Api/ProjectApiController.php @@ -0,0 +1,89 @@ +repository = new ProjectRepository(); + + $this->projectService = new ProjectService(); + $this->projectRequest = new ProjectRequest(); + } + + public function getList(): JsonResponse + { + $projects = $this->repository->findAll(); + + return new JsonResponse($projects); + } + + public function getOne(array $params): JsonResponse + { + $project = $this->repository->find((int) $params['id']); + + return new JsonResponse($project); + } + + public function post(): JsonResponse + { + try { + $projectData = $this->projectRequest->validatePost(); + + $project = $this->projectService->create((object) $projectData); + + $responseData = [ + 'id' => $project->getId(), + 'name' => $project->getName(), + 'shortDescription' => $project->getShortDescription(), + 'type' => $project->getType(), + ]; + + return new JsonResponse($responseData, status: Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], status: Response::HTTP_BAD_REQUEST); + } + } + + public function patch(array $params): JsonResponse + { + try { + $projectData = $this->projectRequest->validateUpdate(); + + $project = $this->projectService->update((int) $params['id'], (object) $projectData); + + return new JsonResponse($project, Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function delete(array $params): JsonResponse + { + try { + $this->projectService->discard((int) $params['id']); + + return new JsonResponse(status: Response::HTTP_NO_CONTENT); + } catch (ResourceNotFoundException $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_NOT_FOUND); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } +} diff --git a/app/src/Controller/Api/SealApiController.php b/app/src/Controller/Api/SealApiController.php new file mode 100644 index 0000000000..7cf6adbee4 --- /dev/null +++ b/app/src/Controller/Api/SealApiController.php @@ -0,0 +1,90 @@ +repository = new SealRepository(); + $this->sealService = new SealService(); + $this->sealRequest = new SealRequest(); + } + + public function getList(): JsonResponse + { + $seals = $this->repository->findAll(); + + return new JsonResponse($seals); + } + + public function getOne(array $params): JsonResponse + { + $seal = $this->repository->find((int) $params['id']); + + return new JsonResponse($seal); + } + + public function post(): JsonResponse + { + try { + $sealData = $this->sealRequest->validatePost(); + $seal = $this->sealService->create($sealData); + + return new JsonResponse($seal, Response::HTTP_CREATED); + } catch (ValidatorException $exception) { + return new JsonResponse([ + 'error' => $exception->getMessage(), + 'fields' => $exception->getFields(), + ], Response::HTTP_BAD_REQUEST); + } catch (InvalidArgumentException $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function patch(array $params): JsonResponse + { + try { + $sealData = $this->sealRequest->validatePatch(); + $seal = $this->sealService->update((int) $params['id'], (object) $sealData); + + return new JsonResponse($seal, Response::HTTP_CREATED); + } catch (ResourceNotFoundException $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_NOT_FOUND); + } catch (ValidatorException $exception) { + return new JsonResponse([ + 'error' => $exception->getMessage(), + 'fields' => $exception->getFields(), + ], Response::HTTP_BAD_REQUEST); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function delete(array $params): JsonResponse + { + try { + $this->sealService->delete((int) $params['id']); + + return new JsonResponse(null, Response::HTTP_NO_CONTENT); + } catch (ResourceNotFoundException $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_NOT_FOUND); + } + } +} diff --git a/app/src/Controller/Api/SpaceApiController.php b/app/src/Controller/Api/SpaceApiController.php new file mode 100644 index 0000000000..fb4a6b6f4b --- /dev/null +++ b/app/src/Controller/Api/SpaceApiController.php @@ -0,0 +1,89 @@ +repository = new SpaceRepository(); + $this->spaceRequest = new SpaceRequest(); + $this->spaceService = new SpaceService(); + } + + public function getList(): JsonResponse + { + $spaces = $this->repository->findAll(); + + return new JsonResponse($spaces); + } + + public function getOne(array $params): JsonResponse + { + $space = $this->repository->find((int) $params['id']); + + return new JsonResponse($space); + } + + public function post(): JsonResponse + { + try { + $spaceData = $this->spaceRequest->validatePost(); + $space = $this->spaceService->create((object) $spaceData); + + $responseData = [ + 'id' => $space->getId(), + 'name' => $space->getName(), + 'shortDescription' => $space->getShortDescription(), + 'terms' => $space->getTerms(), + 'type' => $space->getType(), + ]; + + return new JsonResponse($responseData, Response::HTTP_CREATED); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function patch(array $params): JsonResponse + { + try { + $spaceData = $this->spaceRequest->validateUpdate(); + $space = $this->spaceService->update((int) $params['id'], (object) $spaceData); + + return new JsonResponse($space, Response::HTTP_CREATED); + } catch (ResourceNotFoundException $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_NOT_FOUND); + } catch (Exception $exception) { + return new JsonResponse(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST); + } + } + + public function delete(array $params): JsonResponse + { + $space = $this->repository->find((int) $params['id']); + + if (EntityStatusEnum::TRASH->getValue() === $space->status) { + return new JsonResponse(['error' => 'Espaço não encontrado'], Response::HTTP_NOT_FOUND); + } + + $this->repository->softDelete($space); + + return new JsonResponse(null, Response::HTTP_NO_CONTENT); + } +} diff --git a/app/src/Controller/Api/TermApiController.php b/app/src/Controller/Api/TermApiController.php new file mode 100644 index 0000000000..004ca40def --- /dev/null +++ b/app/src/Controller/Api/TermApiController.php @@ -0,0 +1,32 @@ +repository = new TermRepository(); + } + + public function getList(): JsonResponse + { + $terms = $this->repository->findAll(); + + return new JsonResponse($terms); + } + + public function getOne(array $params): JsonResponse + { + $term = $this->repository->find((int) $params['id']); + + return new JsonResponse($term); + } +} diff --git a/app/src/Controller/Api/WelcomeApiController.php b/app/src/Controller/Api/WelcomeApiController.php new file mode 100644 index 0000000000..8d52a4dc54 --- /dev/null +++ b/app/src/Controller/Api/WelcomeApiController.php @@ -0,0 +1,31 @@ + 'MapaCultural', + ]); + } + + public function create(): JsonResponse + { + return new JsonResponse([ + 'API' => 'MapaCultural - Test POST', + ]); + } + + public function delete(): JsonResponse + { + return new JsonResponse([ + 'API' => 'MapaCultural - Test DELETE', + ]); + } +} diff --git a/app/src/Controller/DocumentationController.php b/app/src/Controller/DocumentationController.php new file mode 100644 index 0000000000..e9f6df45ba --- /dev/null +++ b/app/src/Controller/DocumentationController.php @@ -0,0 +1,18 @@ +render($_SERVER['DOCUMENT_ROOT'].'/docs/v1/index.html'); + } + + public function v2(): void + { + $this->render($_SERVER['DOCUMENT_ROOT'].'/docs/v2/index.html'); + } +} diff --git a/app/src/DTO/SealDto.php b/app/src/DTO/SealDto.php new file mode 100644 index 0000000000..f23b6b32a2 --- /dev/null +++ b/app/src/DTO/SealDto.php @@ -0,0 +1,28 @@ + self::AGENT_ID_1, + 'name' => 'Admin@local', + 'type' => AgentTypeEnum::ADMIN, + 'shortDescription' => 'Admin@local', + 'longDescription' => '', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::AGENT_ID_2, + 'name' => 'Alessandro Feitoza', + 'type' => AgentTypeEnum::DEFAULT, + 'shortDescription' => 'Agente Feitoza', + 'longDescription' => '', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::AGENT_ID_3, + 'name' => 'Henrique Lima', + 'type' => AgentTypeEnum::DEFAULT, + 'shortDescription' => 'Agente Lima', + 'longDescription' => '', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::AGENT_ID_4, + 'name' => 'Anna Kelly Moura', + 'type' => AgentTypeEnum::DEFAULT, + 'shortDescription' => 'Agente Moura', + 'longDescription' => '', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::AGENT_ID_5, + 'name' => 'Sara Camilo', + 'type' => AgentTypeEnum::DEFAULT, + 'shortDescription' => 'Agente Camilo', + 'longDescription' => '', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::AGENT_ID_6, + 'name' => 'Talyson Soares', + 'type' => AgentTypeEnum::DEFAULT, + 'shortDescription' => 'Agente Soares', + 'longDescription' => 'talyson soares', + 'status' => EntityStatusEnum::ENABLED, + ], + ]; + + public function getDependencies(): array + { + return [ + UserFixtures::class, + ]; + } + + public function load(ObjectManager $manager): void + { + $this->deleteAllDataFromTable(Agent::class); + + foreach (self::AGENTS as $agentData) { + $user = $this->getReference(UserFixtures::USER_ID_PREFIX.'-'.$agentData['id']); + + $agent = new Agent($user); + $agent->name = $agentData['name']; + $agent->shortDescription = $agentData['shortDescription']; + $agent->longDescription = $agentData['longDescription']; + $agent->setType($agentData['type']->getValue()); + $agent->setStatus($agentData['status']->getValue()); + + $this->setReference(sprintf('%s-%s', self::AGENT_ID_PREFIX, $agentData['id']), $agent); + $manager->persist($agent); + } + + $manager->flush(); + } +} diff --git a/app/src/DataFixtures/EventFixtures.php b/app/src/DataFixtures/EventFixtures.php new file mode 100644 index 0000000000..cc0aab3833 --- /dev/null +++ b/app/src/DataFixtures/EventFixtures.php @@ -0,0 +1,127 @@ + self::EVENT_ID_1, + 'name' => 'Evento de Cultura', + 'shortDescription' => 'Este é um evento incrível organizado por todos.', + 'longDescription' => 'Junte-se a nós para uma experiência única e emocionante! O evento de Cultura oferece uma variedade de atividades e entretenimento para todos os gostos.', + 'rules' => 'Por favor, siga todas as regras e regulamentos do local.', + 'subTitle' => 'subtitulo do evento', + 'registrationInfo' => 'informações do evento', + 'classificacaoEtaria' => '18 anos', + 'telefonePublico' => '(85) 98991-8135', + 'traducaoLibras' => 'Sim', + 'descricaoSonora' => 'Não', + 'site' => 'https://www.google.com.br/?hl=pt-BR', + 'facebook' => 'teste', + 'twitter' => 'cultura', + 'instagram' => 'teste', + 'linkedin' => 'teste', + 'vimeo' => 'teste', + 'spotify' => 'teste', + 'youtube' => 'cultura', + 'pinterest' => 'teste', + 'event_attendance' => 50, + 'terms' => [ + 'tag' => ['teste'], + 'linguagem' => ['Dança'], + ], + ], + [ + 'id' => self::EVENT_ID_2, + 'name' => 'Evento de Cultura', + 'shortDescription' => 'Este é um evento incrível organizado por todos.', + 'longDescription' => 'Junte-se a nós para uma experiência única e emocionante! O evento de Cultura oferece uma variedade de atividades e entretenimento para todos os gostos.', + 'rules' => 'Por favor, siga todas as regras e regulamentos do local.', + 'subTitle' => 'subtitulo do evento', + 'registrationInfo' => 'informações do evento', + 'classificacaoEtaria' => '18 anos', + 'telefonePublico' => '(85) 98991-8135', + 'traducaoLibras' => 'Sim', + 'descricaoSonora' => 'Não', + 'site' => 'https://www.google.com.br/?hl=pt-BR', + 'facebook' => 'teste', + 'twitter' => 'cultura', + 'instagram' => 'teste', + 'linkedin' => 'teste', + 'vimeo' => 'teste', + 'spotify' => 'teste', + 'youtube' => 'cultura', + 'pinterest' => 'teste', + 'event_attendance' => 50, + 'terms' => [ + 'tag' => ['teste'], + 'linguagem' => ['Dança'], + ], + ], + [ + 'id' => self::EVENT_ID_3, + 'name' => 'Evento de Cultura', + 'shortDescription' => 'Este é um evento incrível organizado por todos.', + 'longDescription' => 'Junte-se a nós para uma experiência única e emocionante! O evento de Cultura oferece uma variedade de atividades e entretenimento para todos os gostos.', + 'rules' => 'Por favor, siga todas as regras e regulamentos do local.', + 'subTitle' => 'subtitulo do evento', + 'registrationInfo' => 'informações do evento', + 'classificacaoEtaria' => '18 anos', + 'telefonePublico' => '(85) 98991-8135', + 'traducaoLibras' => 'Sim', + 'descricaoSonora' => 'Não', + 'site' => 'https://www.google.com.br/?hl=pt-BR', + 'facebook' => 'teste', + 'twitter' => 'cultura', + 'instagram' => 'teste', + 'linkedin' => 'teste', + 'vimeo' => 'teste', + 'spotify' => 'teste', + 'youtube' => 'cultura', + 'pinterest' => 'teste', + 'event_attendance' => 50, + 'terms' => [ + 'tag' => ['teste'], + 'linguagem' => ['Dança'], + ], + ], + ]; + + public function getDependencies(): array + { + return [ + TermFixtures::class, + AgentFixtures::class, + ]; + } + + public function load(ObjectManager $manager): void + { + $this->deleteAllDataFromTable(Event::class); + + $user = $this->getReference(AgentFixtures::AGENT_ID_PREFIX.'-'.AgentFixtures::AGENT_ID_1); + + foreach (self::EVENTS as $eventData) { + $event = $this->getSerializer()->denormalize($eventData, Event::class); + $event->setTerms($eventData['terms']); + $this->setProperty($event, 'owner', $user); + + $this->setReference(sprintf('%s-%s', self::EVENT_ID_PREFIX, $eventData['id']), $event); + $manager->persist($event); + } + + $manager->flush(); + } +} diff --git a/app/src/DataFixtures/Fixture.php b/app/src/DataFixtures/Fixture.php new file mode 100644 index 0000000000..6e94e559dd --- /dev/null +++ b/app/src/DataFixtures/Fixture.php @@ -0,0 +1,50 @@ +serializer = new Serializer([new ObjectNormalizer()]); + } + + public function getSerializer(): Serializer + { + return $this->serializer; + } + + public function setProperty($obj, string $property, $value): void + { + $reflection = new ReflectionClass($obj); + $owner = $reflection->getProperty($property); + $owner->setValue($obj, $value); + } + + public function deleteAllDataFromTable(string $entityName, bool $resetSequence = true): void + { + $entityManager = $this->referenceRepository->getManager(); + $connection = $entityManager->getConnection(); + $tableName = $entityManager->getClassMetadata($entityName)->getTableName(); + + if (true === $resetSequence) { + $statement = $connection->prepare(" + ALTER SEQUENCE {$tableName}_id_seq RESTART WITH 1; + "); + $statement->execute(); + } + + $statement = $connection->prepare("DELETE FROM {$tableName}"); + $statement->execute(); + } +} diff --git a/app/src/DataFixtures/OpportunityFixtures.php b/app/src/DataFixtures/OpportunityFixtures.php new file mode 100644 index 0000000000..2668afb05c --- /dev/null +++ b/app/src/DataFixtures/OpportunityFixtures.php @@ -0,0 +1,129 @@ + self::OPPORTUNITY_ID_1, + 'name' => 'Concurso Teste', + 'shortDescription' => 'Desperte sua criatividade e mostre seu talento no Concurso de Artes! Inscreva suas obras originais e concorra a prêmios incríveis.', + 'publishedRegistrations' => false, + 'area' => ['Arquitetura-Urbanismo'], + 'twitter' => 'admin', + 'instagram' => 'admin', + 'tag' => [ + 'Concurso', + 'Artes', + 'Teste', + ], + ], + [ + 'id' => self::OPPORTUNITY_ID_2, + 'name' => 'Concurso Teste 2', + 'shortDescription' => 'Desperte sua criatividade e mostre seu talento no Concurso de Artes! Inscreva suas obras originais e concorra a prêmios incríveis.', + 'publishedRegistrations' => false, + 'area' => ['Arquitetura-Urbanismo'], + 'twitter' => 'admin', + 'instagram' => 'admin', + 'tag' => [ + 'Concurso', + 'Artes', + 'Teste', + ], + ], + ]; + + public const PROJECT_OPPORTUNITTIES = [ + [ + 'id' => self::OPPORTUNITY_ID_3, + 'name' => 'Projeto de Verão', + 'shortDescription' => 'Desperte sua criatividade e mostre seu talento no Concurso de Artes! Inscreva suas obras originais e concorra a prêmios incríveis.', + 'publishedRegistrations' => false, + 'area' => ['Arquitetura-Urbanismo'], + 'twitter' => 'admin', + 'instagram' => 'admin', + 'tag' => [ + 'Concurso', + 'Artes', + 'Teste', + ], + ], + [ + 'id' => self::OPPORTUNITY_ID_4, + 'name' => 'O Projeto de verão falhou', + 'shortDescription' => 'Desperte sua criatividade e mostre seu talento no Concurso de Artes! Inscreva suas obras originais e concorra a prêmios incríveis.', + 'publishedRegistrations' => false, + 'area' => ['Arquitetura-Urbanismo'], + 'twitter' => 'admin', + 'instagram' => 'admin', + 'tag' => [ + 'Concurso', + 'Artes', + 'Teste', + ], + ], + ]; + + public function getDependencies(): array + { + return [ + AgentFixtures::class, + EventFixtures::class, + ProjectFixtures::class, + ]; + } + + public function load(ObjectManager $manager): void + { + $this->deleteAllDataFromTable(Opportunity::class); + + $agent = $this->getReference(AgentFixtures::AGENT_ID_PREFIX.'-'.AgentFixtures::AGENT_ID_1); + $event = $this->getReference(EventFixtures::EVENT_ID_PREFIX.'-'.EventFixtures::EVENT_ID_1); + $project = $this->getReference(ProjectFixtures::PROJECT_ID_PREFIX.'-'.ProjectFixtures::PROJECT_ID_3); + + foreach (self::EVENT_OPPORTUNITTIES as $opportunityData) { + /** @var EventOpportunity $opportunity */ + $opportunity = $this->getSerializer()->denormalize($opportunityData, EventOpportunity::class); + $opportunity->setRegistrationTo(new DateTime()); + $opportunity->setRegistrationFrom(new DateTime()); + $opportunity->setOwnerEntity($event); + + $this->setProperty($opportunity, 'owner', $agent); + $this->setReference(sprintf('%s-%s', self::OPPORTUNITY_ID_PREFIX, $opportunityData['id']), $opportunity); + + $manager->persist($opportunity); + } + + foreach (self::PROJECT_OPPORTUNITTIES as $opportunityData) { + /** @var ProjectOpportunity $opportunity */ + $opportunity = $this->getSerializer()->denormalize($opportunityData, ProjectOpportunity::class); + $opportunity->setRegistrationTo(new DateTime()); + $opportunity->setRegistrationFrom(new DateTime()); + $opportunity->setOwnerEntity($project); + + $this->setProperty($opportunity, 'owner', $agent); + $this->setReference(sprintf('%s-%s', self::OPPORTUNITY_ID_PREFIX, $opportunityData['id']), $opportunity); + + $manager->persist($opportunity); + } + + $manager->flush(); + } +} diff --git a/app/src/DataFixtures/ProjectFixtures.php b/app/src/DataFixtures/ProjectFixtures.php new file mode 100644 index 0000000000..c0c4ec3e56 --- /dev/null +++ b/app/src/DataFixtures/ProjectFixtures.php @@ -0,0 +1,125 @@ + self::PROJECT_ID_1, + 'name' => 'Projeto de Cultura', + 'shortDescription' => 'descrição curta', + 'longDescription' => 'Uma descrição mais detalhada sobre o projeto...', + 'startsOn' => '2024-05-01 00:00:00.000000', + 'endsOn' => '2024-05-31 15:39:00.000000', + 'site' => 'https://www.google.com.br/?hl=pt-BR', + 'facebook' => 'facebook', + 'twitter' => 'twitter', + 'instagram' => 'instagram', + 'linkedin' => 'linkedin', + 'vimeo' => 'vimeo', + 'spotify' => 'spotify', + 'youtube' => 'youtube', + 'pinterest' => 'pinterest', + 'emailPublico' => 'email.publico@email.com', + 'emailPrivado' => 'email.privado@email.com', + 'telefonePublico' => '(85) 99999-9999', + 'telefone1' => '(85) 99999-9999', + 'telefone2' => '(85) 99999-9999', + 'terms' => [ + 'tag' => ['teste'], + ], + ], + [ + 'id' => self::PROJECT_ID_2, + 'name' => 'Projeto de Mais Cultura', + 'shortDescription' => 'descrição curta', + 'longDescription' => 'Uma descrição mais detalhada sobre o projeto...', + 'startsOn' => '2024-05-01 00:00:00.000000', + 'endsOn' => '2024-05-31 15:39:00.000000', + 'site' => 'https://www.google.com.br/?hl=pt-BR', + 'facebook' => 'Facebook', + 'twitter' => 'twitter', + 'instagram' => 'instagram', + 'linkedin' => 'linkindln', + 'vimeo' => 'vimeo', + 'spotify' => 'spotfy', + 'youtube' => 'youtube', + 'pinterest' => 'pinterest', + 'emailPublico' => 'email.publico@email.com', + 'emailPrivado' => 'email.privado@email.com', + 'telefonePublico' => '(85) 99999-9999', + 'telefone1' => '(85) 99999-9999', + 'telefone2' => '(85) 99999-9999', + 'terms' => [ + 'tag' => ['teste'], + ], + ], + [ + 'id' => self::PROJECT_ID_3, + 'name' => 'Projeto de Mais Cultura ainda', + 'shortDescription' => 'descrição curta', + 'longDescription' => 'Uma descrição mais detalhada sobre o projeto...', + 'startsOn' => '2024-05-01 00:00:00.000000', + 'endsOn' => '2024-05-31 15:39:00.000000', + 'site' => 'https://www.google.com.br/?hl=pt-BR', + 'facebook' => 'Facebook', + 'twitter' => 'twitter', + 'instagram' => 'instagram', + 'linkedin' => 'linkedin', + 'vimeo' => 'vimeo', + 'spotify' => 'spotify', + 'youtube' => 'youtube', + 'pinterest' => 'pinterest', + 'emailPublico' => 'email.publico@email.com', + 'emailPrivado' => 'email.privado@email.com', + 'telefonePublico' => '(85) 99999-9999', + 'telefone1' => '(85) 99999-9999', + 'telefone2' => '(85) 99999-9999', + 'terms' => [ + 'tag' => ['teste'], + ], + ], + ]; + + public function getDependencies(): array + { + return [ + UserFixtures::class, + TermFixtures::class, + ]; + } + + public function load(ObjectManager $manager): void + { + $this->deleteAllDataFromTable(Project::class); + + $user = $this->getReference(UserFixtures::USER_ID_PREFIX.'-'.UserFixtures::USER_ID_1); + + foreach (self::PROJECTS as $projectData) { + $projectData['type'] = new EntityType(Project::class, 1, 'test'); + + $project = $this->getSerializer()->denormalize($projectData, Project::class); + $project->setTerms($projectData['terms']); + $this->setProperty($project, 'owner', $user); + + $this->setReference(sprintf('%s-%s', self::PROJECT_ID_PREFIX, $projectData['id']), $project); + + $manager->persist($project); + } + + $manager->flush(); + } +} diff --git a/app/src/DataFixtures/SealFixtures.php b/app/src/DataFixtures/SealFixtures.php new file mode 100644 index 0000000000..bc2314e11e --- /dev/null +++ b/app/src/DataFixtures/SealFixtures.php @@ -0,0 +1,96 @@ + self::SEAL_ID_1, + 'name' => 'Selo Mapas', + 'shortDescription' => '', + 'longDescription' => '', + 'validPeriod' => 9000, + 'status' => EntityStatusEnum::DISABLED, + ], + [ + 'id' => self::SEAL_ID_2, + 'name' => 'Selo Feitoza', + 'shortDescription' => 'descrição curta do selo feitoza', + 'longDescription' => 'descrição longa do selo feitoza', + 'validPeriod' => 24, + 'status' => EntityStatusEnum::DISABLED, + ], + [ + 'id' => self::SEAL_ID_3, + 'name' => 'Selo Lima', + 'shortDescription' => 'descrição curta do selo lima', + 'longDescription' => 'descrição longa do selo lima', + 'validPeriod' => 12, + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::SEAL_ID_4, + 'name' => 'Selo Moura', + 'shortDescription' => 'descrição curta do selo moura', + 'longDescription' => 'descrição longa do selo moura', + 'validPeriod' => 18, + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::SEAL_ID_5, + 'name' => 'Selo Camilo', + 'shortDescription' => 'descrição curta do selo camilo', + 'longDescription' => 'descrição longa do selo camilo', + 'validPeriod' => 12, + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::SEAL_ID_6, + 'name' => 'Selo Soares', + 'shortDescription' => 'descrição curta do selo soares', + 'longDescription' => 'descrição longa do selo soares', + 'validPeriod' => 6, + 'status' => EntityStatusEnum::ENABLED, + ], + ]; + + public function getDependencies(): array + { + return [ + AgentFixtures::class, + ]; + } + + public function load(ObjectManager $manager): void + { + $this->deleteAllDataFromTable(Seal::class); + + $owner = $this->getReference(AgentFixtures::AGENT_ID_PREFIX.'-'.AgentFixtures::AGENT_ID_1); + + foreach (self::SEALS as $sealData) { + $sealData['status'] = $sealData['status']->getValue(); + $seal = $this->getSerializer()->denormalize($sealData, Seal::class); + $this->setProperty($seal, 'owner', $owner); + $this->setReference(sprintf('%s-%s', self::SEAL_ID_PREFIX, $sealData['id']), $seal); + $manager->persist($seal); + } + + $manager->flush(); + } +} diff --git a/app/src/DataFixtures/SpaceFixtures.php b/app/src/DataFixtures/SpaceFixtures.php new file mode 100644 index 0000000000..5af6767593 --- /dev/null +++ b/app/src/DataFixtures/SpaceFixtures.php @@ -0,0 +1,138 @@ + self::SPACE_ID_1, + 'name' => 'Secretaria da Cultura do Estado do Ceará - SECULT', + 'shortDescription' => 'A Secretaria da Cultura do Estado do Ceará (Secult) foi criada pela Lei nº 8.541, de 9 de agosto de 1966, durante o governo de Virgílio Távora. A Secult tem como missão executar, superintender e coordenar as atividades de proteção do patrimônio cultural do Ceará, difusão da cultura e aprimoramento cultural do povo cearense.', + 'longDescription' => 'A Secretaria da Cultura do Estado do Ceará (Secult) foi criada pela Lei nº 8.541, de 9 de agosto de 1966, durante o governo de Virgílio Távora, sendo a primeira secretaria da Cultura criada no Brasil. Localizada atualmente no prédio do Cineteatro São Luiz, no Centro de Fortaleza (Rua Major Facundo, nº500), a Secult nasceu com o objetivo atender aos anseios culturais do povo cearense, propiciando maior desenvolvimento a todas as manifestações de cultura e valorizando a tradição de seu povo. Este pioneirismo na área cultural representa, em si, mais uma comprovação da tenacidade do cearense. Logo após sua criação, as realizações foram tantas que conseguiram ultrapassar as fronteiras do Ceará e ressonaram em todos os meios culturais do País. A Secult tem como missão executar, superintender e coordenar as atividades de proteção do patrimônio cultural do Ceará, difusão da cultura e aprimoramento cultural do povo cearense.', + 'status' => 1, + 'type' => '40', + '_ownerId' => 1, + 'terms' => [ + 'area' => ['Gestão Cultural'], + ], + 'emailPublico' => 'pub@secult.br', + 'emailPrivado' => 'piv@secult.br', + 'cnpj' => '07.954.555/0001-11', + 'razaoSocial' => 'Secretaria da Cultura do Estado do Ceará - SECULT', + 'telefonePublico' => '0000-0000', + 'telefone1' => '0000-0000', + 'telefone2' => '0000-0000', + 'acessibilidade' => 'Sim', + 'acessibilidade_fisica' => ['Rampa de acesso'], + 'capacidade' => 100, + 'endereco' => 'R. Major Facundo, 500, Ao lado da praça - Centro - Fortaleza/CE - CEP: 60025100', + 'En_CEP' => '60025100', + 'En_Nome_Logradouro' => 'R. Major Facundo', + 'En_Num' => '500', + 'En_Complemento' => 'Ao lado da praça', + 'En_Bairro' => 'Centro', + 'En_Municipio' => 'Fortaleza', + 'En_Estado' => 'CE', + 'horario' => 'De segunda a sexta-feira, de 8h às 17h.', + ], + [ + 'id' => self::SPACE_ID_2, + 'name' => 'Biblioteca Municipal Pedro Maia Rocha', + 'shortDescription' => 'Espaço público destinado à leitura no município de Russas.', + 'longDescription' => 'Espaço público destinado à leitura em geral, bem como aos aspectos históricos e culturais do município de Russas.', + 'status' => 1, + 'type' => '20', + '_ownerId' => 1, + 'terms' => [ + 'area' => ['Leitura', 'Livro'], + ], + 'emailPublico' => 'biblioteca.pub.pedro.maia.rocha@russas.br', + 'emailPrivado' => 'biblioteca.piv.pedro.maia.rocha@russas.br', + 'cnpj' => '07.535.446/0001-60', + 'razaoSocial' => 'Biblioteca Municipal Pedro Maia Rocha', + 'telefonePublico' => '0000-0000', + 'telefone1' => '0000-0000', + 'telefone2' => '0000-0000', + 'acessibilidade' => 'Sim', + 'acessibilidade_fisica' => ['Rampa de acesso'], + 'capacidade' => 50, + 'endereco' => 'Av. Dom Lino, 1320, Na avenida principal - Centro - Russas/CE - CEP: 62900000', + 'En_CEP' => '62900000', + 'En_Nome_Logradouro' => 'Av. Dom Lino', + 'En_Num' => '1320', + 'En_Complemento' => 'Na avenida principal', + 'En_Bairro' => 'Centro', + 'En_Municipio' => 'Russas', + 'En_Estado' => 'CE', + 'horario' => '7:00 - 19:00', + ], + [ + 'id' => self::SPACE_ID_3, + 'name' => 'Centro Cultural Carnaubeira', + 'shortDescription' => 'Espaço com 960m², tem teatro multiuso com palco em tablado, com capacidade para 170 pessoas, onde pode ser realizados eventos de teatro, cinema, musica etc. conta ainda com 02 salas de aulas para oficina de artes, alem de espaço administrativo. O CCC é um espaço da Associação Carnaubeira de Arte-educação e está em funcionamento desde 2010 mesmo não estando completamente acabado.', + 'longDescription' => 'Espaço com 960m², tem teatro multiuso com palco em tablado, com capacidade para 170 pessoas, onde pode ser realizados eventos de teatro, cinema, musica etc. conta ainda com 02 salas de aulas para oficina de artes, alem de espaço administrativo. O CCC é um espaço da Associação Carnaubeira de Arte-educação e está em funcionamento desde 2010 mesmo não estando completamente acabado.', + 'status' => 1, + 'type' => '41', + '_ownerId' => 1, + 'terms' => [ + 'area' => ['Artes Visuais', 'Audiovisual', 'Cinema', 'Música', 'Produção Cultural', 'Teatro'], + ], + 'emailPublico' => 'pub.somdascarnaubeiras@gmail.com', + 'emailPrivado' => 'piv.somdascarnaubeiras@gmail.com', + 'cnpj' => '05.728.440/0001-83', + 'razaoSocial' => 'Centro Cultural Carnaubeira', + 'telefonePublico' => '0000-0000', + 'telefone1' => '0000-0000', + 'telefone2' => '0000-0000', + 'acessibilidade' => 'Sim', + 'acessibilidade_fisica' => ['Banheiros adaptados', 'Bebedouro adaptado', 'Circuito de visitação adaptado', 'Rampa de acesso', 'Sanitário adaptado'], + 'capacidade' => 20, + 'endereco' => 'Rua José Alves, 1719, Flores - Russas/CE - CEP: 62903000', + 'En_CEP' => '62903000', + 'En_Nome_Logradouro' => 'Rua José Alves', + 'En_Num' => '1719', + 'En_Complemento' => 'Flores', + 'En_Bairro' => 'Flores', + 'En_Municipio' => 'Russas', + 'En_Estado' => 'CE', + 'horario' => '7:00 - 22:00', + ], + ]; + + public function getDependencies(): array + { + return [ + TermFixtures::class, + UserFixtures::class, + ]; + } + + public function load(ObjectManager $manager): void + { + $this->deleteAllDataFromTable(Space::class); + + $user = $this->getReference(UserFixtures::USER_ID_PREFIX.'-'.UserFixtures::USER_ID_1); + + foreach (self::SPACES as $spaceData) { + $space = $this->getSerializer()->denormalize($spaceData, Space::class); + $this->setProperty($space, 'owner', $user); + $this->setReference(sprintf('%s-%s', self::SPACE_ID_PREFIX, $spaceData['id']), $space); + + $manager->persist($space); + } + + $manager->flush(); + } +} diff --git a/app/src/DataFixtures/TermFixtures.php b/app/src/DataFixtures/TermFixtures.php new file mode 100644 index 0000000000..b748bf3dbc --- /dev/null +++ b/app/src/DataFixtures/TermFixtures.php @@ -0,0 +1,50 @@ +deleteAllDataFromTable(Term::class); + + $termsCollections = (require dirname(__DIR__, 3).self::TERMS) ?? []; + $terms = $this->mountTerms($termsCollections); + + foreach ($terms as $termData) { + $term = $this->getSerializer()->denormalize($termData, Term::class); + $this->setReference(sprintf('%s-%s', self::TERM_ID_PREFIX, $term->id), $term); + $manager->persist($term); + } + + $manager->flush(); + } + + public function mountTerms(array $termsCollections): array + { + $id = 1; + $terms = []; + + foreach ($termsCollections as $termCollection) { + foreach ($termCollection['restricted_terms'] ?? [] as $term) { + $terms[] = [ + 'id' => $id, + 'taxonomy' => $termCollection['slug'], + 'term' => $term, + 'description' => $termCollection['description'], + ]; + $id++; + } + } + + return $terms; + } +} diff --git a/app/src/DataFixtures/UserFixtures.php b/app/src/DataFixtures/UserFixtures.php new file mode 100644 index 0000000000..642829bcce --- /dev/null +++ b/app/src/DataFixtures/UserFixtures.php @@ -0,0 +1,84 @@ + self::USER_ID_1, + 'email' => 'Admin@local', + 'auth_provider' => AuthProviderEnum::OPEN_ID, + 'auth_uid' => '1', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::USER_ID_2, + 'email' => 'user2@email.com', + 'auth_provider' => AuthProviderEnum::OPEN_ID, + 'auth_uid' => '1', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::USER_ID_3, + 'email' => 'user3@email.com', + 'auth_provider' => AuthProviderEnum::OPEN_ID, + 'auth_uid' => '1', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::USER_ID_4, + 'email' => 'user4@email.com', + 'auth_provider' => AuthProviderEnum::OPEN_ID, + 'auth_uid' => '1', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::USER_ID_5, + 'email' => 'user5@email.com', + 'auth_provider' => AuthProviderEnum::OPEN_ID, + 'auth_uid' => '1', + 'status' => EntityStatusEnum::ENABLED, + ], + [ + 'id' => self::USER_ID_6, + 'email' => 'user6@email.com', + 'auth_provider' => AuthProviderEnum::OPEN_ID, + 'auth_uid' => '1', + 'status' => EntityStatusEnum::ENABLED, + ], + ]; + + public function load(ObjectManager $manager): void + { + $this->deleteAllDataFromTable(User::class); + + foreach (self::USERS as $userData) { + $user = new User(); + $user->email = $userData['email']; + $user->setStatus($userData['status']->getValue()); + $user->setAuthProvider($userData['auth_provider']->getValue()); + $user->setAuthUid((string) $userData['auth_uid']); + + $this->setReference(sprintf('%s-%s', self::USER_ID_PREFIX, $userData['id']), $user); + $manager->persist($user); + } + + $manager->flush(); + } +} diff --git a/app/src/Entity/Agent.php b/app/src/Entity/Agent.php new file mode 100644 index 0000000000..e63b5f83f4 --- /dev/null +++ b/app/src/Entity/Agent.php @@ -0,0 +1,354 @@ +status = EntityStatusEnum::ENABLED->getValue(); + } + + public function getId(): int + { + return $this->id; + } + + public function getType(): int + { + return $this->type; + } + + public function setType(int $type): void + { + $this->type = $type; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getPublicLocation(): ?bool + { + return $this->publicLocation; + } + + public function setPublicLocation(?bool $publicLocation): void + { + $this->publicLocation = $publicLocation; + } + + public function getLocation(): GeoPoint + { + return $this->location; + } + + public function setLocation(GeoPoint $location): void + { + $this->location = $location; + } + + public function getGeoLocation(): string + { + return $this->geoLocation; + } + + public function setGeoLocation(string $geoLocation): void + { + $this->geoLocation = $geoLocation; + } + + public function getShortDescription(): ?string + { + return $this->shortDescription; + } + + public function setShortDescription(?string $shortDescription): void + { + $this->shortDescription = $shortDescription; + } + + public function getLongDescription(): ?string + { + return $this->longDescription; + } + + public function setLongDescription(?string $longDescription): void + { + $this->longDescription = $longDescription; + } + + public function getStatus(): int + { + return $this->status; + } + + public function setStatus(int $status): void + { + $this->status = $status; + } + + public function getParent(): ?Agent + { + return $this->parent; + } + + public function setParent(?Agent $parent): void + { + $this->parent = $parent; + } + + public function getChildren(): array + { + return $this->children; + } + + public function setChildren(array $children): void + { + $this->children = $children; + } + + public function getUser(): User + { + return $this->user; + } + + public function setUser(User $user): void + { + $this->user = $user; + } + + public function getSpaces(): iterable + { + return $this->spaces; + } + + public function setSpaces(iterable $spaces): void + { + $this->spaces = $spaces; + } + + public function getProject(): iterable + { + return $this->project; + } + + public function setProject(iterable $project): void + { + $this->project = $project; + } + + public function getOwnedOpportunities(): iterable + { + return $this->ownedOpportunities; + } + + public function setOwnedOpportunities(iterable $ownedOpportunities): void + { + $this->ownedOpportunities = $ownedOpportunities; + } + + public function getEvents(): iterable + { + return $this->events; + } + + public function setEvents(iterable $events): void + { + $this->events = $events; + } + + public function getRelatedOpportunities(): array + { + return $this->relatedOpportunities; + } + + public function setRelatedOpportunities(array $relatedOpportunities): void + { + $this->relatedOpportunities = $relatedOpportunities; + } + + public function getMetadata(): iterable + { + return $this->metadata; + } + + public function setMetadata(iterable $metadata): void + { + $this->metadata = $metadata; + } + + public function getFiles(): array + { + return $this->files; + } + + public function setFiles(array $files): void + { + $this->files = $files; + } + + public function getAgentRelations(): array + { + return $this->agentRelations; + } + + public function setAgentRelations(array $agentRelations): void + { + $this->agentRelations = $agentRelations; + } + + public function getTermRelations(): array + { + return $this->termRelations; + } + + public function setTermRelations(array $termRelations): void + { + $this->termRelations = $termRelations; + } + + public function getSealRelations(): array + { + return $this->sealRelations; + } + + public function setSealRelations(array $sealRelations): void + { + $this->sealRelations = $sealRelations; + } + + public function getPermissionsCache(): iterable + { + return $this->permissionsCache; + } + + public function setPermissionsCache(iterable $permissionsCache): void + { + $this->permissionsCache = $permissionsCache; + } + + public function getSubsite(): ?Subsite + { + return $this->subsite; + } + + public function setSubsite(?Subsite $subsite): void + { + $this->subsite = $subsite; + } +} diff --git a/app/src/Entity/Event.php b/app/src/Entity/Event.php new file mode 100644 index 0000000000..b035e32e64 --- /dev/null +++ b/app/src/Entity/Event.php @@ -0,0 +1,168 @@ +status = EntityStatusEnum::ENABLED->getValue(); + } + + public function getId(): int + { + return $this->id; + } + + public function getProject(): ?Project + { + return $this->project; + } + + public function setProject(?Project $project): void + { + $this->project = $project; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getShortDescription(): string + { + return $this->shortDescription; + } + + public function setShortDescription(string $shortDescription): void + { + $this->shortDescription = $shortDescription; + } + + public function getLongDescription(): ?string + { + return $this->longDescription; + } + + public function setLongDescription(?string $longDescription): void + { + $this->longDescription = $longDescription; + } + + public function getRules(): string + { + return $this->rules; + } + + public function setRules(string $rules): void + { + $this->rules = $rules; + } + + public function getStatus(): int + { + return $this->status; + } + + public function setStatus(int $status): void + { + $this->status = $status; + } + + public function getAgentId(): int + { + return $this->agentId; + } + + public function setAgentId(int $agentId): void + { + $this->agentId = $agentId; + } + + public function isVerified(): bool + { + return $this->isVerified; + } + + public function setIsVerified(bool $isVerified): void + { + $this->isVerified = $isVerified; + } + + public function getType(): int + { + return $this->type; + } + + public function setType(int $type): void + { + $this->type = $type; + } + + public function getSubsite(): ?Subsite + { + return $this->subsite; + } + + public function setSubsite(?Subsite $subsite): void + { + $this->subsite = $subsite; + } +} diff --git a/app/src/Entity/Opportunity.php b/app/src/Entity/Opportunity.php new file mode 100644 index 0000000000..978aa3034b --- /dev/null +++ b/app/src/Entity/Opportunity.php @@ -0,0 +1,344 @@ + 'false'])] + private bool $autoPublish; + + #[ORM\Column(name: 'status', type: 'smallint')] + private int $status; + + #[ORM\ManyToOne(targetEntity: Opportunity::class)] + #[ORM\JoinColumn(name: 'parent_id', referencedColumnName: 'id', onDelete: 'CASCADE')] + private Opportunity $parent; + + #[ORM\OneToMany(mappedBy: 'parent', targetEntity: Opportunity::class, cascade: ['remove'], fetch: 'LAZY')] + private array $children = []; + + #[ORM\ManyToOne(targetEntity: Agent::class, fetch: 'LAZY')] + #[ORM\JoinColumn(name: 'agent_id', referencedColumnName: 'id', onDelete: 'CASCADE')] + private Agent $owner; + + #[ORM\OneToOne(mappedBy: 'opportunity', targetEntity: EvaluationMethodConfiguration::class)] + private EvaluationMethodConfiguration $evaluationMethodConfiguration; + + #[ORM\OneToMany(mappedBy: 'owner', targetEntity: OpportunityMeta::class, cascade: ['persist', 'remove'], orphanRemoval: true)] + private iterable $metadata; + + #[ORM\OneToMany(mappedBy: 'owner', targetEntity: OpportunityFile::class, cascade: ['persist', 'remove'], orphanRemoval: true)] + #[ORM\JoinColumn(name: 'id', referencedColumnName: 'object_id', onDelete: 'CASCADE')] + private iterable $files; + + #[ORM\OneToMany(mappedBy: 'owner', targetEntity: OpportunityAgentRelation::class, cascade: ['remove'], orphanRemoval: true)] + #[ORM\JoinColumn(name: 'id', referencedColumnName: 'object_id', onDelete: 'CASCADE')] + private iterable $agentRelations; + + #[ORM\OneToMany(mappedBy: 'owner', targetEntity: OpportunityTermRelation::class, cascade: ['remove'], fetch: 'LAZY', orphanRemoval: true)] + #[ORM\JoinColumn(name: 'id', referencedColumnName: 'object_id', onDelete: 'CASCADE')] + private iterable $termRelation; + + #[ORM\OneToMany(mappedBy: 'owner', targetEntity: OpportunitySealRelation::class, cascade: ['remove'], fetch: 'LAZY', orphanRemoval: true)] + #[ORM\JoinColumn(name: 'id', referencedColumnName: 'object_id', onDelete: 'CASCADE')] + private iterable $sealRelations; + + #[ORM\OneToMany(mappedBy: 'owner', targetEntity: OpportunityPermissionCache::class, cascade: ['remove'], fetch: 'EXTRA_LAZY', orphanRemoval: true)] + private iterable $permissionsCache; + + #[ORM\Column(name: 'subsite_id', type: 'integer', nullable: true)] + private int $subsite; + + public function __construct() + { + $this->status = EntityStatusEnum::ENABLED->getValue(); + } + + public function getId(): int + { + return $this->id; + } + + public function getType(): int + { + return $this->type; + } + + public function setType(int $type): void + { + $this->type = $type; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getShortDescription(): string + { + return $this->shortDescription; + } + + public function setShortDescription(string $shortDescription): void + { + $this->shortDescription = $shortDescription; + } + + public function getLongDescription(): string + { + return $this->longDescription; + } + + public function setLongDescription(string $longDescription): void + { + $this->longDescription = $longDescription; + } + + public function getRegistrationFrom(): DateTime + { + return $this->registrationFrom; + } + + public function setRegistrationFrom(DateTime $registrationFrom): void + { + $this->registrationFrom = $registrationFrom; + } + + public function getRegistrationTo(): DateTime + { + return $this->registrationTo; + } + + public function setRegistrationTo(DateTime $registrationTo): void + { + $this->registrationTo = $registrationTo; + } + + public function isPublishedRegistrations(): bool + { + return $this->publishedRegistrations; + } + + public function setPublishedRegistrations(bool $publishedRegistrations): void + { + $this->publishedRegistrations = $publishedRegistrations; + } + + public function getRegistrationCategories(): ?array + { + return $this->registrationCategories; + } + + public function setRegistrationCategories(?array $registrationCategories): void + { + $this->registrationCategories = $registrationCategories; + } + + public function getUpdateTimestamp(): ?DateTime + { + return $this->updateTimestamp; + } + + public function setUpdateTimestamp(?DateTime $updateTimestamp): void + { + $this->updateTimestamp = $updateTimestamp; + } + + public function getPublishTimestamp(): ?DateTime + { + return $this->publishTimestamp; + } + + public function setPublishTimestamp(?DateTime $publishTimestamp): void + { + $this->publishTimestamp = $publishTimestamp; + } + + public function isAutoPublish(): bool + { + return $this->autoPublish; + } + + public function setAutoPublish(bool $autoPublish): void + { + $this->autoPublish = $autoPublish; + } + + public function getStatus(): int + { + return $this->status; + } + + public function setStatus(int $status): void + { + $this->status = $status; + } + + public function getParent(): Opportunity + { + return $this->parent; + } + + public function setParent(Opportunity $parent): void + { + $this->parent = $parent; + } + + public function getChildren(): array + { + return $this->children; + } + + public function setChildren(array $children): void + { + $this->children = $children; + } + + public function getOwner(): Agent + { + return $this->owner; + } + + public function setOwner(Agent $owner): void + { + $this->owner = $owner; + } + + public function getEvaluationMethodConfiguration(): EvaluationMethodConfiguration + { + return $this->evaluationMethodConfiguration; + } + + public function setEvaluationMethodConfiguration(EvaluationMethodConfiguration $evaluationMethodConfiguration): void + { + $this->evaluationMethodConfiguration = $evaluationMethodConfiguration; + } + + public function getMetadata(): iterable + { + return $this->metadata; + } + + public function setMetadata(iterable $metadata): void + { + $this->metadata = $metadata; + } + + public function getFiles(): iterable + { + return $this->files; + } + + public function setFiles(iterable $files): void + { + $this->files = $files; + } + + public function getAgentRelations(): iterable + { + return $this->agentRelations; + } + + public function setAgentRelations(iterable $agentRelations): void + { + $this->agentRelations = $agentRelations; + } + + public function getTermRelation(): iterable + { + return $this->termRelation; + } + + public function setTermRelation(iterable $termRelation): void + { + $this->termRelation = $termRelation; + } + + public function getSealRelations(): iterable + { + return $this->sealRelations; + } + + public function setSealRelations(iterable $sealRelations): void + { + $this->sealRelations = $sealRelations; + } + + public function getPermissionsCache(): iterable + { + return $this->permissionsCache; + } + + public function setPermissionsCache(iterable $permissionsCache): void + { + $this->permissionsCache = $permissionsCache; + } + + public function getSubsite(): int + { + return $this->subsite; + } + + public function setSubsite(int $subsite): void + { + $this->subsite = $subsite; + } +} diff --git a/app/src/Entity/Project.php b/app/src/Entity/Project.php new file mode 100644 index 0000000000..e78364734d --- /dev/null +++ b/app/src/Entity/Project.php @@ -0,0 +1,278 @@ +status = EntityStatusEnum::ENABLED->getValue(); + } + + public function getId(): int + { + return $this->id; + } + + public function getType(): int + { + return $this->type; + } + + public function setType(int $type): void + { + $this->type = $type; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getShortDescription(): ?string + { + return $this->shortDescription; + } + + public function setShortDescription(?string $shortDescription): void + { + $this->shortDescription = $shortDescription; + } + + public function getLongDescription(): ?string + { + return $this->longDescription; + } + + public function setLongDescription(?string $longDescription): void + { + $this->longDescription = $longDescription; + } + + public function getUpdateTimestamp(): ?DateTimeInterface + { + return $this->updateTimestamp; + } + + public function setUpdateTimestamp(?DateTimeInterface $updateTimestamp): void + { + $this->updateTimestamp = $updateTimestamp; + } + + public function getStartsOn(): ?DateTimeInterface + { + return $this->startsOn; + } + + public function setStartsOn(?DateTimeInterface $startsOn): void + { + $this->startsOn = $startsOn; + } + + public function getEndsOn(): ?DateTimeInterface + { + return $this->endsOn; + } + + public function setEndsOn(?DateTimeInterface $endsOn): void + { + $this->endsOn = $endsOn; + } + + public function getCreateTimestamp(): DateTimeInterface + { + return $this->createTimestamp; + } + + public function setCreateTimestamp(DateTimeInterface $createTimestamp): void + { + $this->createTimestamp = $createTimestamp; + } + + public function getStatus(): int + { + return $this->status; + } + + public function setStatus(int $status): void + { + $this->status = $status; + } + + public function getParent(): ?self + { + return $this->parent; + } + + public function setParent(?self $parent): void + { + $this->parent = $parent; + } + + public function getChildren(): iterable + { + return $this->children; + } + + public function getOwner(): ?Agent + { + return $this->owner; + } + + public function setOwner(?Agent $owner): void + { + $this->owner = $owner; + } + + public function getEvents(): iterable + { + return $this->events; + } + + public function getRelatedOpportunities(): iterable + { + return $this->relatedOpportunities; + } + + public function getMetadata(): iterable + { + return $this->metadata; + } + + public function getFiles(): iterable + { + return $this->files; + } + + public function getAgentRelations(): iterable + { + return $this->agentRelations; + } + + public function getTermRelations(): iterable + { + return $this->termRelations; + } + + public function getSealRelations(): iterable + { + return $this->sealRelations; + } + + public function getPermissionsCache(): iterable + { + return $this->permissionsCache; + } + + public function getSubsiteId(): ?int + { + return $this->subsiteId; + } + + public function getSubsite(): ?Subsite + { + return $this->subsite; + } + + public function setSubsite(?Subsite $subsite): void + { + $this->subsite = $subsite; + } +} diff --git a/app/src/Entity/Seal.php b/app/src/Entity/Seal.php new file mode 100644 index 0000000000..0264dd6342 --- /dev/null +++ b/app/src/Entity/Seal.php @@ -0,0 +1,48 @@ + '[]'])] + private iterable $lockedFields; + + public function __construct() + { + $this->status = EntityStatusEnum::ENABLED->getValue(); + } +} diff --git a/app/src/Entity/Space.php b/app/src/Entity/Space.php new file mode 100644 index 0000000000..7ccbbc2fe4 --- /dev/null +++ b/app/src/Entity/Space.php @@ -0,0 +1,193 @@ +status = EntityStatusEnum::ENABLED->getValue(); + } + + public function getId(): int + { + return $this->id; + } + + public function getParent(): ?Space + { + return $this->parent; + } + + public function setParent(?Space $parent): void + { + $this->parent = $parent; + } + + public function getLocation(): GeoPoint + { + return $this->location; + } + + public function setLocation(GeoPoint $location): void + { + $this->location = $location; + } + + public function getGeoLocation() + { + return $this->geoLocation; + } + + public function setGeoLocation($geoLocation): void + { + $this->geoLocation = $geoLocation; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getShortDescription(): ?string + { + return $this->shortDescription; + } + + public function setShortDescription(?string $shortDescription): void + { + $this->shortDescription = $shortDescription; + } + + public function getLongDescription(): ?string + { + return $this->longDescription; + } + + public function setLongDescription(?string $longDescription): void + { + $this->longDescription = $longDescription; + } + + public function getStatus(): int + { + return $this->status; + } + + public function setStatus(int $status): void + { + $this->status = $status; + } + + public function getType(): int + { + return $this->type; + } + + public function setType(int $type): void + { + $this->type = $type; + } + + public function getOwner(): ?Agent + { + return $this->owner; + } + + public function setOwner(?Agent $owner): void + { + $this->owner = $owner; + } + + public function isVerified(): bool + { + return $this->isVerified; + } + + public function setIsVerified(bool $isVerified): void + { + $this->isVerified = $isVerified; + } + + public function isPublic(): bool + { + return $this->public; + } + + public function setPublic(bool $public): void + { + $this->public = $public; + } + + public function getSubsiteId(): ?int + { + return $this->subsiteId; + } + + public function setSubsiteId(?int $subsiteId): void + { + $this->subsiteId = $subsiteId; + } +} diff --git a/app/src/Enum/AgentTypeEnum.php b/app/src/Enum/AgentTypeEnum.php new file mode 100644 index 0000000000..a57a167800 --- /dev/null +++ b/app/src/Enum/AgentTypeEnum.php @@ -0,0 +1,21 @@ +value; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/app/src/Enum/AuthProviderEnum.php b/app/src/Enum/AuthProviderEnum.php new file mode 100644 index 0000000000..caced6eb91 --- /dev/null +++ b/app/src/Enum/AuthProviderEnum.php @@ -0,0 +1,22 @@ +value; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/app/src/Enum/EntityStatusEnum.php b/app/src/Enum/EntityStatusEnum.php new file mode 100644 index 0000000000..54a12b233f --- /dev/null +++ b/app/src/Enum/EntityStatusEnum.php @@ -0,0 +1,25 @@ +value; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/app/src/Exception/FieldInvalidException.php b/app/src/Exception/FieldInvalidException.php new file mode 100644 index 0000000000..5a4f22f0ff --- /dev/null +++ b/app/src/Exception/FieldInvalidException.php @@ -0,0 +1,17 @@ +constraintViolationList = $violations ?? new ConstraintViolationList(); + + parent::__construct($message); + } + + public function getFields(): array + { + $fields = []; + + foreach ($this->constraintViolationList as $error) { + $fields[] = [ + 'field' => $error->getPropertyPath(), + 'message' => $error->getMessage(), + ]; + } + + return $fields; + } +} diff --git a/app/src/Kernel.php b/app/src/Kernel.php new file mode 100644 index 0000000000..eac2115e02 --- /dev/null +++ b/app/src/Kernel.php @@ -0,0 +1,69 @@ +url = $this->getPathRequest(); + $this->routes = require_once dirname(__DIR__).'/routes/routes.php'; + } + + public function execute(): void + { + try { + $context = new RequestContext( + method: $_SERVER['REQUEST_METHOD'] + ); + + $matcher = new UrlMatcher($this->routes, $context); + + $this->dispatchAction($matcher); + } catch (MethodNotAllowedException $exception) { + (new JsonResponse([ + 'error' => 'Method not allowed: '.$_SERVER['REQUEST_METHOD'], + ], status: Response::HTTP_METHOD_NOT_ALLOWED))->send(); + + exit; + } catch (ResourceNotFoundException $exception) { + return; + } + } + + private function getPathRequest(): string + { + return explode('?', $_SERVER['REQUEST_URI'])[0]; + } + + private function dispatchAction(UrlMatcher $matcher): void + { + $parameters = $matcher->match($this->url); + + $controller = array_shift($parameters); + $method = array_shift($parameters); + + unset($parameters['_route']); + + $response = (new $controller())->$method($parameters); + + if ($response instanceof Response) { + $response->send(); + } + + exit; + } +} diff --git a/app/src/Repository/AbstractRepository.php b/app/src/Repository/AbstractRepository.php new file mode 100644 index 0000000000..d1e4d65388 --- /dev/null +++ b/app/src/Repository/AbstractRepository.php @@ -0,0 +1,22 @@ +mapaCulturalEntityManager = $app->em; + $this->entityManager = new EntityManager(); + } +} diff --git a/app/src/Repository/AgentRepository.php b/app/src/Repository/AgentRepository.php new file mode 100644 index 0000000000..ab53c0a1ea --- /dev/null +++ b/app/src/Repository/AgentRepository.php @@ -0,0 +1,46 @@ +repository = $this->mapaCulturalEntityManager->getRepository(Agent::class); + } + + public function findAll(): array + { + return $this->repository + ->createQueryBuilder('agent') + ->getQuery() + ->getArrayResult(); + } + + public function find(int $id): ?Agent + { + return $this->repository->find($id); + } + + public function save(Agent $agent): void + { + $this->mapaCulturalEntityManager->persist($agent); + $this->mapaCulturalEntityManager->flush(); + } + + public function softDelete(Agent $agent): void + { + $agent->setStatus(EntityStatusEnum::TRASH->getValue()); + $this->mapaCulturalEntityManager->persist($agent); + $this->mapaCulturalEntityManager->flush(); + } +} diff --git a/app/src/Repository/EventRepository.php b/app/src/Repository/EventRepository.php new file mode 100644 index 0000000000..7da1da0838 --- /dev/null +++ b/app/src/Repository/EventRepository.php @@ -0,0 +1,75 @@ +repository = $this->mapaCulturalEntityManager->getRepository(Event::class); + } + + public function findAll(): array + { + return $this->repository + ->createQueryBuilder('events') + ->getQuery() + ->getArrayResult(); + } + + public function find(int $id): ?Event + { + return $this->repository->find($id); + } + + public function findEventsBySpaceId(int $spaceId): array + { + $queryBuilder = $this->getEntityManager() + ->createQueryBuilder() + ->select([ + 'e.id', + 'e.name', + 'e.shortDescription', + 'eo.startsOn', + 'eo.endsOn', + 'eo.startsAt', + 'eo.endsAt', + 'eo.price', + 'eo.priceInfo', + 'eo.frequency', + ]) + ->from(EventOccurrence::class, 'eo') + ->join(Event::class, 'e', 'WITH', 'eo.event = e.id') + ->where('eo.space = :spaceId') + ->setParameter(':spaceId', $spaceId); + + return $queryBuilder->getQuery()->getResult(); + } + + public function save($event): void + { + $event->save(); + } + + public function softDelete(Event $event): void + { + $event->setStatus(EntityStatusEnum::TRASH->getValue()); + $this->save($event); + } + + public function update(Event $event): void + { + $this->mapaCulturalEntityManager->persist($event); + $this->mapaCulturalEntityManager->flush(); + } +} diff --git a/app/src/Repository/OpportunityRepository.php b/app/src/Repository/OpportunityRepository.php new file mode 100644 index 0000000000..004b99a73d --- /dev/null +++ b/app/src/Repository/OpportunityRepository.php @@ -0,0 +1,59 @@ +repository = $this->mapaCulturalEntityManager->getRepository(Opportunity::class); + } + + public function findAll(): array + { + return $this->repository + ->createQueryBuilder('opportunity') + ->getQuery() + ->getArrayResult(); + } + + public function find(int $id): ?Opportunity + { + return $this->repository->find($id); + } + + public function save(Opportunity $opportunity): void + { + $this->mapaCulturalEntityManager->persist($opportunity); + $this->mapaCulturalEntityManager->flush(); + } + + public function findOpportunitiesByAgentId(int $agentId): array + { + $queryBuilder = $this->getEntityManager() + ->createQueryBuilder() + ->select('ao') + ->from(AgentOpportunity::class, 'ao') + ->where('ao.ownerEntity = :agentId') + ->andWhere('ao.parent is null') + ->setParameter('agentId', $agentId); + + return $queryBuilder->getQuery()->getArrayResult(); + } + + public function softDelete(Opportunity $opportunity): void + { + $opportunity->setStatus(EntityStatusEnum::TRASH->getValue()); + $this->save($opportunity); + } +} diff --git a/app/src/Repository/ProjectRepository.php b/app/src/Repository/ProjectRepository.php new file mode 100644 index 0000000000..5564604477 --- /dev/null +++ b/app/src/Repository/ProjectRepository.php @@ -0,0 +1,46 @@ +repository = $this->mapaCulturalEntityManager->getRepository(Project::class); + } + + public function findAll(): array + { + return $this->repository + ->createQueryBuilder('project') + ->getQuery() + ->getArrayResult(); + } + + public function find(int $id): ?Project + { + return $this->repository->find($id); + } + + public function save(Project $project): void + { + $this->mapaCulturalEntityManager->persist($project); + $this->mapaCulturalEntityManager->flush(); + } + + public function softDelete(Project $project): void + { + $project->setStatus(EntityStatusEnum::TRASH->getValue()); + $this->mapaCulturalEntityManager->persist($project); + $this->mapaCulturalEntityManager->flush(); + } +} diff --git a/app/src/Repository/SealRepository.php b/app/src/Repository/SealRepository.php new file mode 100644 index 0000000000..6c45495905 --- /dev/null +++ b/app/src/Repository/SealRepository.php @@ -0,0 +1,47 @@ +repository = $this->mapaCulturalEntityManager->getRepository(Seal::class); + } + + public function findAll(): array + { + return $this->repository + ->createQueryBuilder('seal') + ->getQuery() + ->getArrayResult(); + } + + public function find(int $id): ?Seal + { + return $this->repository->find($id); + } + + public function save(Seal $seal): void + { + $this->mapaCulturalEntityManager->persist($seal); + $this->mapaCulturalEntityManager->flush(); + } + + public function softDelete(Seal $space): void + { + $space->setStatus(EntityStatusEnum::TRASH->getValue()); + $this->mapaCulturalEntityManager->persist($space); + $this->mapaCulturalEntityManager->flush(); + } +} diff --git a/app/src/Repository/SpaceRepository.php b/app/src/Repository/SpaceRepository.php new file mode 100644 index 0000000000..618682db4a --- /dev/null +++ b/app/src/Repository/SpaceRepository.php @@ -0,0 +1,48 @@ +repository = $this->mapaCulturalEntityManager->getRepository(Space::class); + } + + public function save(Space $space): void + { + $space->saveMetadata(); + $space->saveTerms(); + $this->mapaCulturalEntityManager->persist($space); + $this->mapaCulturalEntityManager->flush(); + } + + public function findAll(): array + { + return $this->repository + ->createQueryBuilder('space') + ->getQuery() + ->getArrayResult(); + } + + public function find(int $id): ?Space + { + return $this->repository->find($id); + } + + public function softDelete(Space $space): void + { + $space->setStatus(EntityStatusEnum::TRASH->getValue()); + $this->mapaCulturalEntityManager->persist($space); + $this->mapaCulturalEntityManager->flush(); + } +} diff --git a/app/src/Repository/TermRepository.php b/app/src/Repository/TermRepository.php new file mode 100644 index 0000000000..de211d6c63 --- /dev/null +++ b/app/src/Repository/TermRepository.php @@ -0,0 +1,39 @@ +repository = $this->mapaCulturalEntityManager->getRepository(Term::class); + } + + public function findAll(): array + { + return $this->repository + ->createQueryBuilder('term') + ->getQuery() + ->getArrayResult(); + } + + public function find(int $id): ?Term + { + return $this->repository->find($id); + } + + public function save(Term $term): void + { + $this->mapaCulturalEntityManager->persist($term); + $this->mapaCulturalEntityManager->flush(); + } +} diff --git a/app/src/Request/AgentRequest.php b/app/src/Request/AgentRequest.php new file mode 100644 index 0000000000..e0ec1ae7ed --- /dev/null +++ b/app/src/Request/AgentRequest.php @@ -0,0 +1,46 @@ +request = new Request(); + } + + public function validatePost(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + $requiredFields = ['type', 'name', 'shortDescription', 'terms']; + + foreach ($requiredFields as $field) { + if (!isset($data[$field])) { + throw new Exception(ucfirst($field).' is required'); + } + } + + if (!isset($data['type']) || !is_array($data['terms']) || !is_array($data['terms']['area'])) { + throw new Exception('The "terms" field must be an object with a property "area" which is an array.'); + } + + return $data; + } + + public function validateUpdate(): array + { + return json_decode( + json: $this->request->getContent(), + associative: true + ); + } +} diff --git a/app/src/Request/EventRequest.php b/app/src/Request/EventRequest.php new file mode 100644 index 0000000000..820e0d7039 --- /dev/null +++ b/app/src/Request/EventRequest.php @@ -0,0 +1,61 @@ +request = new Request(); + $this->repository = new EventRepository(); + } + + public function validatePost(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + $requiredFields = ['name', 'shortDescription', 'classificacaoEtaria', 'terms']; + foreach ($requiredFields as $field) { + if (!isset($data[$field])) { + throw new Exception(ucfirst($field).' is required.'); + } + } + + if (!isset($data['terms']['linguagem']) || !is_array($data['terms']) || !$data['terms']['linguagem']) { + throw new Exception('The "terms" field must be an object with a property "linguagem" which is an array.'); + } + + return $data; + } + + public function validateEventExistent(array $params): Event + { + $event = $this->repository->find((int) $params['id']); + + if (!$event || EntityStatusEnum::TRASH->getValue() === $event->status) { + throw new Exception('Event not found or already deleted.'); + } + + return $event; + } + + public function validateUpdate(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + return $data; + } +} diff --git a/app/src/Request/OpportunityRequest.php b/app/src/Request/OpportunityRequest.php new file mode 100644 index 0000000000..193c841dad --- /dev/null +++ b/app/src/Request/OpportunityRequest.php @@ -0,0 +1,65 @@ +request = new Request(); + } + + public function validatePost(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + $requiredFields = ['objectType', 'name', 'terms', 'type']; + + foreach ($requiredFields as $field) { + if (!isset($data[$field]) || empty($data[$field])) { + throw new Exception(ucfirst($field).' is required.'); + } + } + + $linkFields = ['project', 'event', 'space', 'agent']; + foreach ($linkFields as $field) { + if (isset($data[$field]) && !is_array($data[$field])) { + throw new Exception(ucfirst($field).' must be an array if provided.'); + } + } + + return $data; + } + + public function validateUpdate(): array + { + return json_decode( + json: $this->request->getContent(), + associative: true + ); + } + + public function validateDelete(array $params): Opportunity + { + if (!isset($params['id'])) { + throw new Exception('ID is required.'); + } + + $opportunity = $this->repository->find((int) $params['id']); + + if (!$opportunity || EntityStatusEnum::TRASH->getValue() === $opportunity->status) { + throw new Exception('Opportunity not found or already deleted.'); + } + + return $opportunity; + } +} diff --git a/app/src/Request/ProjectRequest.php b/app/src/Request/ProjectRequest.php new file mode 100644 index 0000000000..ae9b7d8ba1 --- /dev/null +++ b/app/src/Request/ProjectRequest.php @@ -0,0 +1,42 @@ +request = new Request(); + } + + public function validatePost(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + $requiredFields = ['name', 'shortDescription', 'type']; + + foreach ($requiredFields as $field) { + if (!isset($data[$field])) { + throw new Exception(ucfirst($field).' is required'); + } + } + + return $data; + } + + public function validateUpdate(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + return $data; + } +} diff --git a/app/src/Request/SealRequest.php b/app/src/Request/SealRequest.php new file mode 100644 index 0000000000..2c87eb25a3 --- /dev/null +++ b/app/src/Request/SealRequest.php @@ -0,0 +1,65 @@ +request = new Request(); + $this->serializer = new Serializer([new ObjectNormalizer()]); + } + + public function validatePost(): array + { + $data = json_decode( + json: $this->request->getContent(), + associative: true + ); + + $seal = $this->serializer->denormalize($data, SealDto::class); + + $validation = Validation::createValidatorBuilder()->enableAttributeMapping()->getValidator(); + + $violations = $validation->validate($seal, groups: ['post']); + + if (0 < count($violations)) { + throw new ValidatorException(violations: $violations); + } + + return $data; + } + + public function validatePatch(): array + { + $data = json_decode( + json: $this->request->getContent(), + associative: true + ); + + $seal = $this->serializer->denormalize($data, SealDto::class); + + $validation = Validation::createValidatorBuilder()->enableAttributeMapping()->getValidator(); + + $violations = $validation->validate($seal, groups: ['patch']); + + if (0 < count($violations)) { + throw new ValidatorException(violations: $violations); + } + + return $data; + } +} diff --git a/app/src/Request/SpaceRequest.php b/app/src/Request/SpaceRequest.php new file mode 100644 index 0000000000..c99fdecc8c --- /dev/null +++ b/app/src/Request/SpaceRequest.php @@ -0,0 +1,46 @@ +request = new Request(); + } + + public function validatePost(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + $requiredFields = ['name', 'terms', 'type', 'shortDescription']; + + foreach ($requiredFields as $field) { + if (!isset($data[$field])) { + throw new Exception(ucfirst($field).' is required'); + } + } + + if (!is_array($data['terms']) || !is_array($data['terms']['area'])) { + throw new Exception('the terms field must be an object with a property "area" which is an array'); + } + + return $data; + } + + public function validateUpdate(): array + { + $jsonData = $this->request->getContent(); + $data = json_decode($jsonData, true); + + return $data; + } +} diff --git a/app/src/Service/AbstractService.php b/app/src/Service/AbstractService.php new file mode 100644 index 0000000000..3d2ede20c8 --- /dev/null +++ b/app/src/Service/AbstractService.php @@ -0,0 +1,21 @@ +getProperty($property); + $owner->setValue($obj, $value); + } +} diff --git a/app/src/Service/AgentService.php b/app/src/Service/AgentService.php new file mode 100644 index 0000000000..a0e34dd5fd --- /dev/null +++ b/app/src/Service/AgentService.php @@ -0,0 +1,88 @@ +repository = new AgentRepository(); + $this->serializer = new Serializer([new ObjectNormalizer()]); + } + + public function getTypes(): array + { + $typesFromConf = (require dirname(__DIR__, 3).self::FILE_TYPES)['items'] ?? []; + + return array_map( + fn ($key, $item) => ['id' => $key, 'name' => $item['name']], + array_keys($typesFromConf), + $typesFromConf + ); + } + + /** + * @throws ResourceNotFoundException + */ + public function update(int $id, object $data): Agent + { + $agentFromDB = $this->repository->find($id); + + if (null === $agentFromDB || EntityStatusEnum::TRASH->getValue() === $agentFromDB->status) { + throw new ResourceNotFoundException('Agent not found'); + } + + $agentUpdated = $this->serializer->denormalize( + data: $data, + type: Agent::class, + context: ['object_to_populate' => $agentFromDB] + ); + + $agentUpdated->saveTerms(); + $this->repository->save($agentUpdated); + + return $agentUpdated; + } + + public function create($data): Agent + { + $agent = new Agent(); + $agent->setName($data->name); + $agent->setShortDescription($data->shortDescription); + $agent->setType($data->type); + $agent->terms['area'] = $data->terms['area']; + $agent->saveTerms(); + + $this->repository->save($agent); + + return $agent; + } + + /** + * @throws ResourceNotFoundException + */ + public function discard(int $id): void + { + $agent = $this->repository->find($id); + + if (null === $agent || EntityStatusEnum::TRASH->getValue() === $agent->status) { + throw new ResourceNotFoundException('Agent not found'); + } + + $this->repository->softDelete($agent); + } +} diff --git a/app/src/Service/EventService.php b/app/src/Service/EventService.php new file mode 100644 index 0000000000..4c8500a9ee --- /dev/null +++ b/app/src/Service/EventService.php @@ -0,0 +1,71 @@ +repository = new EventRepository(); + $this->eventRequest = new EventRequest(); + $this->serializer = new Serializer([new ObjectNormalizer()]); + } + + public function getTypes(): array + { + $typesFromConf = (require dirname(__DIR__, 3).self::FILE_TYPES)['items'] ?? []; + + return array_map(fn ($key, $item) => ['id' => $key, 'name' => $item['name']], array_keys($typesFromConf), $typesFromConf); + } + + public function create($data): Event + { + $event = new Event(); + + $event->setName($data->name); + $event->setShortDescription($data->shortDescription); + $event->setMetadata('classificacaoEtaria', $data->classificacaoEtaria); + $event->terms['linguagem'] = $data->terms['linguagem']; + + $this->repository->save($event); + + return $event; + } + + public function update(int $id, object $data): Event + { + $eventFromDB = $this->repository->find($id); + + if (null === $eventFromDB || EntityStatusEnum::TRASH->getValue() === $eventFromDB->status) { + throw new ResourceNotFoundException('Event not found or already deleted.'); + } + + $eventUpdated = $this->serializer->denormalize( + data: $data, + type: Event::class, + context: ['object_to_populate' => $eventFromDB] + ); + $eventUpdated->saveTerms(); + + $this->repository->update($eventUpdated); + + return $eventUpdated; + } +} diff --git a/app/src/Service/OpportunityService.php b/app/src/Service/OpportunityService.php new file mode 100644 index 0000000000..e36a594307 --- /dev/null +++ b/app/src/Service/OpportunityService.php @@ -0,0 +1,89 @@ +repository = new OpportunityRepository(); + $this->serializer = new Serializer([new ObjectNormalizer()]); + } + + public function getTypes(): array + { + $typesFromConf = (require dirname(__DIR__, 3).'/src/conf/opportunity-types.php')['items'] ?? []; + + return array_map( + fn ($key, $item) => ['id' => $key, 'name' => $item['name']], + array_keys($typesFromConf), + $typesFromConf + ); + } + + public function update(int $id, object $data): Opportunity + { + $opportunityFromDB = $this->repository->find($id); + + if (null === $opportunityFromDB || EntityStatusEnum::TRASH->getValue() === $opportunityFromDB->status) { + throw new ResourceNotFoundException('Opportunity not found'); + } + + $opportunityUpdated = $this->serializer->denormalize( + data: $data, + type: Opportunity::class, + context: ['object_to_populate' => $opportunityFromDB] + ); + + $opportunityUpdated->saveTerms(); + $this->repository->save($opportunityUpdated); + + return $opportunityUpdated; + } + + public function create($data): Opportunity + { + $opportunity = new Opportunity(); + + $opportunity->setType($data['opportunityType']); + $opportunity->setName($data['name']); + $opportunity->terms['area'] = $data['terms']['area']; + + if (isset($data['project'])) { + $opportunity->setObjectType("MapasCulturais\Entities\Project"); + $opportunity->setProject($data['project']); + } + if (isset($data['event'])) { + $opportunity->setObjectType("MapasCulturais\Entities\Event"); + $opportunity->setEvent($data['event']); + } + if (isset($data['space'])) { + $opportunity->setObjectType("MapasCulturais\Entities\Space"); + $opportunity->setSpace($data['space']); + } + if (isset($data['agent'])) { + $opportunity->setObjectType("MapasCulturais\Entities\Agent"); + $opportunity->setAgent($data['agent']); + } + + $this->repository->save($opportunity); + + return $opportunity; + } +} diff --git a/app/src/Service/ProjectService.php b/app/src/Service/ProjectService.php new file mode 100644 index 0000000000..1c38077f04 --- /dev/null +++ b/app/src/Service/ProjectService.php @@ -0,0 +1,72 @@ +projectRepository = new ProjectRepository(); + $this->serializer = new Serializer([new ObjectNormalizer()]); + } + + public function create($data): Project + { + $project = new Project(); + $project->setName($data->name); + $project->setShortDescription($data->shortDescription); + $project->setType($data->type); + + $this->projectRepository->save($project); + + return $project; + } + + public function update(int $id, object $data): Project + { + $projectFromDB = $this->projectRepository->find($id); + + if (null === $projectFromDB || EntityStatusEnum::TRASH->getValue() === $projectFromDB->status) { + throw new ResourceNotFoundException('Project not found or already deleted.'); + } + + $projectUpdated = $this->serializer->denormalize( + data: $data, + type: Project::class, + context: ['object_to_populate' => $projectFromDB] + ); + $projectUpdated->saveTerms(); + $projectUpdated->saveMetadata(); + + $this->projectRepository->save($projectUpdated); + + return $projectUpdated; + } + + /** + * @throws ResourceNotFoundException + */ + public function discard(int $id): void + { + $project = $this->projectRepository->find($id); + + if (null === $project || EntityStatusEnum::TRASH->getValue() === $project->status) { + throw new ResourceNotFoundException('Project not found or already deleted.'); + } + + $this->$project->softDelete($project); + } +} diff --git a/app/src/Service/SealService.php b/app/src/Service/SealService.php new file mode 100644 index 0000000000..2cf1ff2583 --- /dev/null +++ b/app/src/Service/SealService.php @@ -0,0 +1,78 @@ +projectRepository = new ProjectRepository(); + $this->serializer = new Serializer([new ObjectNormalizer()]); + $this->sealRepository = new SealRepository(); + $this->agentRepository = new AgentRepository(); + } + + public function create(array $data): mixed + { + $seal = $this->serializer->denormalize($data, Seal::class); + $this->setProperty($seal, 'owner', $this->agentRepository->find(1)); + $this->sealRepository->save($seal); + + return $seal; + } + + /** + * @throws ResourceNotFoundException + */ + public function delete(int $id): true + { + $seal = $this->sealRepository->find($id); + + if (null === $seal || EntityStatusEnum::TRASH->getValue() === $seal->status) { + throw new ResourceNotFoundException('Seal not found'); + } + + $this->sealRepository->softDelete($seal); + + return true; + } + + /** + * @throws ResourceNotFoundException + */ + public function update(int $id, object $data): Seal + { + $sealFromDB = $this->sealRepository->find($id); + + if (null === $sealFromDB || EntityStatusEnum::TRASH->getValue() === $sealFromDB->status) { + throw new ResourceNotFoundException('Seal not found'); + } + + $sealUpdated = $this->serializer->denormalize( + data: $data, + type: Seal::class, + context: ['object_to_populate' => $sealFromDB] + ); + + $this->sealRepository->save($sealUpdated); + + return $sealUpdated; + } +} diff --git a/app/src/Service/SpaceService.php b/app/src/Service/SpaceService.php new file mode 100644 index 0000000000..216d107107 --- /dev/null +++ b/app/src/Service/SpaceService.php @@ -0,0 +1,71 @@ +repository = new SpaceRepository(); + $this->serializer = new Serializer([new ObjectNormalizer()]); + } + + public function getTypes(): array + { + $typesFromConf = (require dirname(__DIR__, 3).self::FILE_TYPES)['items'] ?? []; + + return array_map( + fn ($key, $item) => ['id' => $key, 'name' => $item['name']], + array_keys($typesFromConf), + $typesFromConf + ); + } + + public function create($data): Space + { + $space = new Space(); + + $space->setName($data->name); + $space->setShortDescription($data->shortDescription); + $space->setType($data->type); + $space->terms['area'] = $data->terms['area']; + $space->saveTerms(); + + $this->repository->save($space); + + return $space; + } + + /** + * @throws ResourceNotFoundException + */ + public function update($id, $data): Space + { + $spaceFromDB = $this->repository->find($id); + + if (null === $spaceFromDB || EntityStatusEnum::TRASH->getValue() === $spaceFromDB->status) { + throw new ResourceNotFoundException('Space not found'); + } + + $spaceUpdated = $this->serializer->denormalize($data, Space::class, null, ['object_to_populate' => $spaceFromDB]); + + $this->repository->save($spaceUpdated); + + return $spaceUpdated; + } +} diff --git a/app/tests/AbstractTestCase.php b/app/tests/AbstractTestCase.php new file mode 100644 index 0000000000..a8859c5bc4 --- /dev/null +++ b/app/tests/AbstractTestCase.php @@ -0,0 +1,31 @@ +client = HttpClient::create()->withOptions([ + 'base_uri' => 'http://localhost', + 'headers' => [ + 'Content-Type' => 'application/json', + ], + ]); + + parent::setUp(); + } + + public function dump(mixed $content): void + { + fwrite(STDERR, print_r($content, return: true)); + } +} diff --git a/app/tests/fixtures/AbstractTestFixtures.php b/app/tests/fixtures/AbstractTestFixtures.php new file mode 100644 index 0000000000..a52ba413b9 --- /dev/null +++ b/app/tests/fixtures/AbstractTestFixtures.php @@ -0,0 +1,23 @@ +data); + } + + public function toArray(): array + { + return $this->data; + } +} diff --git a/app/tests/fixtures/AgentTestFixtures.php b/app/tests/fixtures/AgentTestFixtures.php new file mode 100644 index 0000000000..9aae3ce735 --- /dev/null +++ b/app/tests/fixtures/AgentTestFixtures.php @@ -0,0 +1,34 @@ + 'Agent Test', + 'shortDescription' => 'A test agent.', + 'longDescription' => 'A test agent for the Mapas Culturais platform.', + 'site' => 'https://mapasculturais.org', + 'telefonePublico' => '(85) 99999-9999', + 'emailPublico' => 'agent@gmail.com', + 'type' => 2, + 'escolaridade' => 'Superior Completo', + 'instagram' => 'agent', + 'linkedin' => 'agent', + 'twitter' => 'agent', + 'vimeo' => 'agent', + 'youtube' => 'agent', + 'spotify' => 'agent', + 'pinterest' => 'agent', + ]); + } + + public static function complete(): array + { + return []; + } +} diff --git a/app/tests/fixtures/EventTestFixtures.php b/app/tests/fixtures/EventTestFixtures.php new file mode 100644 index 0000000000..532bb6b1a3 --- /dev/null +++ b/app/tests/fixtures/EventTestFixtures.php @@ -0,0 +1,26 @@ + 'Event Test', + 'shortDescription' => 'Event Test Description', + 'classificacaoEtaria' => 'livre', + 'terms' => [ + 'tag' => ['teste'], + 'linguagem' => ['Artes Circenses'], + ], + ]); + } + + public static function complete(): array + { + return []; + } +} diff --git a/app/tests/fixtures/OpportunityTestFixtures.php b/app/tests/fixtures/OpportunityTestFixtures.php new file mode 100644 index 0000000000..4eaab2391e --- /dev/null +++ b/app/tests/fixtures/OpportunityTestFixtures.php @@ -0,0 +1,26 @@ + 1, + '_type' => 10, + 'name' => 'Opportunity Test', + 'terms' => [ + 'tag' => ['teste'], + 'linguagem' => ['Artes Visuais'], + ], + ]); + } + + public static function complete(): array + { + return []; + } +} diff --git a/app/tests/fixtures/ProjectTestFixtures.php b/app/tests/fixtures/ProjectTestFixtures.php new file mode 100644 index 0000000000..752b2819f3 --- /dev/null +++ b/app/tests/fixtures/ProjectTestFixtures.php @@ -0,0 +1,22 @@ + 'Project Test', + 'shortDescription' => 'Project Test Description', + 'type' => 16, + ]); + } + + public static function complete(): array + { + return []; + } +} diff --git a/app/tests/fixtures/SealTestFixtures.php b/app/tests/fixtures/SealTestFixtures.php new file mode 100644 index 0000000000..6fb51c6776 --- /dev/null +++ b/app/tests/fixtures/SealTestFixtures.php @@ -0,0 +1,23 @@ + 'Seal Test', + 'shortDescription' => 'Descrição curta do selo soares', + 'longDescription' => 'Descrição longa do selo soares', + 'validPeriod' => 12, + ]); + } + + public static function complete(): array + { + return []; + } +} diff --git a/app/tests/fixtures/SpaceTestFixtures.php b/app/tests/fixtures/SpaceTestFixtures.php new file mode 100644 index 0000000000..97d86583a3 --- /dev/null +++ b/app/tests/fixtures/SpaceTestFixtures.php @@ -0,0 +1,46 @@ + [ + 'latitude' => '10', + 'longitude' => '10', + ], + 'name' => 'Espaço da Cultura', + 'public' => true, + 'shortDescription' => 'Um ponto de encontro para compartilhar cultura.', + 'longDescription' => 'Portal que nos transporta para o coração pulsante da rica cultura do brasileiro.', + 'emailPublico' => 'test@test.com', + 'emailPrivado' => 'test@test.com', + 'cnpj' => '00.000.000/0000-00', + 'razaoSocial' => 'Centro Cultural Test', + 'telefonePublico' => '0000-0000', + 'telefone1' => '0000-0000', + 'telefone2' => '0000-0000', + 'acessibilidade' => 'Sim', + 'acessibilidade_fisica' => ['Banheiros adaptados', 'Bebedouro adaptado', 'Circuito de visitação adaptado', 'Rampa de acesso', 'Sanitário adaptado'], + 'capacidade' => 20, + 'endereco' => 'Test', + 'En_CEP' => '80000', + 'En_Nome_Logradouro' => 'Rua test', + 'En_Num' => '1234', + 'En_Complemento' => 'Test', + 'En_Bairro' => 'Test', + 'En_Municipio' => 'Test', + 'En_Estado' => 'CE', + 'horario' => '7:00 - 22:00', + ]); + } + + public static function complete(): array + { + return []; + } +} diff --git a/app/tests/fixtures/TestFixtures.php b/app/tests/fixtures/TestFixtures.php new file mode 100644 index 0000000000..542b55dd3b --- /dev/null +++ b/app/tests/fixtures/TestFixtures.php @@ -0,0 +1,12 @@ +client->request(Request::METHOD_GET, self::BASE_URL); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetOneAgentShouldRetrieveAObject(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsObject($content); + } + + public function testGetAgentTypesShouldRetrieveAList(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/types'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetAgentOpportunitiesShouldRetrieveAList(): void + { + $this->markTestSkipped(); + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1/opportunities'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testCreateAgentShouldCreateAnAgent(): void + { + $this->markTestSkipped(); + $agentTestFixtures = AgentTestFixtures::partial(); + + $response = $this->client->request(Request::METHOD_POST, self::BASE_URL, [ + 'body' => $agentTestFixtures->json(), + ]); + + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + + $content = json_decode($response->getContent(), true); + + foreach ($agentTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testDeleteAgentShouldReturnSuccess(): void + { + $this->markTestSkipped(); + $response = $this->client->request(Request::METHOD_DELETE, self::BASE_URL.'/2'); + + $this->assertEquals(Response::HTTP_NO_CONTENT, $response->getStatusCode()); + + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/2'); + $this->assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + } + + public function testUpdate(): void + { + $agentTestFixtures = AgentTestFixtures::partial(); + + $url = sprintf(self::BASE_URL.'/%s', AgentFixtures::AGENT_ID_4); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $agentTestFixtures->json(), + ]); + + $content = json_decode($response->getContent(), true); + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsArray($content); + foreach ($agentTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testUpdateNotFoundedResource(): void + { + $agentTestFixtures = AgentTestFixtures::partial(); + + $url = sprintf(self::BASE_URL.'/%s', 1969); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $agentTestFixtures->json(), + ]); + + $error = [ + 'error' => 'Agent not found', + ]; + + $content = json_decode($response->getContent(false), true); + $this->assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + $this->assertIsArray($content); + $this->assertEquals($error, $content); + } +} diff --git a/app/tests/functional/EventApiControllerTest.php b/app/tests/functional/EventApiControllerTest.php new file mode 100644 index 0000000000..2e39839a45 --- /dev/null +++ b/app/tests/functional/EventApiControllerTest.php @@ -0,0 +1,104 @@ +client->request(Request::METHOD_GET, self::BASE_URL.'/types'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetOneAgentShouldRetrieveAObject(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsObject($content); + } + + public function testGetEventsBySpacesShouldRetrieveAList(): void + { + $this->markTestSkipped(); + $response = $this->client->request(Request::METHOD_GET, '/api/v2/spaces/4/events'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testPostEventShouldCreateANewEvent(): void + { + $this->markTestSkipped(); + $eventTestFixtures = EventTestFixtures::partial(); + + $response = $this->client->request(Request::METHOD_POST, self::BASE_URL, [ + 'body' => $eventTestFixtures->json(), + ]); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsObject($content); + } + + public function testDeleteEventShouldRemoveAnEvent(): void + { + $this->markTestSkipped(); + $response = $this->client->request(Request::METHOD_DELETE, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testUpdateEventShouldUpdateAnEvent(): void + { + $eventTestFixtures = EventTestFixtures::partial(); + + $url = sprintf(self::BASE_URL.'/%s', EventFixtures::EVENT_ID_2); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $eventTestFixtures->json(), + ]); + + $content = json_decode($response->getContent(), true); + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsArray($content); + foreach ($eventTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testUpdateNotFoundedEventResource(): void + { + $eventTestFixtures = EventTestFixtures::partial(); + $url = sprintf(self::BASE_URL.'/%s', 1024); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $eventTestFixtures->json(), + ]); + + $error = [ + 'error' => 'Event not found or already deleted.', + ]; + + $content = json_decode($response->getContent(false), true); + $this->assertEquals(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + $this->assertIsArray($content); + $this->assertEquals($error, $content); + } +} diff --git a/app/tests/functional/OpportunityApiControllerTest.php b/app/tests/functional/OpportunityApiControllerTest.php new file mode 100644 index 0000000000..42a3be0da6 --- /dev/null +++ b/app/tests/functional/OpportunityApiControllerTest.php @@ -0,0 +1,31 @@ +client->request(Request::METHOD_GET, self::BASE_URL); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetOneOpportunityShouldRetrieveAObject(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsObject($content); + } +} diff --git a/app/tests/functional/ProjectApiControllerTest.php b/app/tests/functional/ProjectApiControllerTest.php new file mode 100644 index 0000000000..d62be07c48 --- /dev/null +++ b/app/tests/functional/ProjectApiControllerTest.php @@ -0,0 +1,97 @@ +client->request(Request::METHOD_GET, self::BASE_URL); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetOneProjectShouldRetrieveAObject(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsObject($content); + } + + public function testCreateProjectShouldCreateAProject(): void + { + $projectTestFixtures = ProjectTestFixtures::partial(); + + $response = $this->client->request(Request::METHOD_POST, self::BASE_URL, [ + 'body' => $projectTestFixtures->json(), + ]); + + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + + $content = json_decode($response->getContent(), true); + + foreach ($projectTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testDeleteProjectShouldReturnSuccess(): void + { + $this->markTestSkipped(); + $response = $this->client->request(Request::METHOD_DELETE, self::BASE_URL.'/1'); + + $this->assertEquals(Response::HTTP_NO_CONTENT, $response->getStatusCode()); + + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $this->assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + } + + public function testUpdateProjectShouldUpdateAProject(): void + { + $projectTestFixtures = ProjectTestFixtures::partial(); + $url = sprintf(self::BASE_URL.'/%s', ProjectFixtures::PROJECT_ID_2); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $projectTestFixtures->json(), + ]); + + $content = json_decode($response->getContent(), true); + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsArray($content); + foreach ($projectTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testUpdateNotFoundedProjectResource(): void + { + $projectTestFixtures = ProjectTestFixtures::partial(); + $url = sprintf(self::BASE_URL.'/%s', 1024); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $projectTestFixtures->json(), + ]); + + $error = [ + 'error' => 'Project not found or already deleted.', + ]; + + $content = json_decode($response->getContent(false), true); + $this->assertEquals(Response::HTTP_BAD_REQUEST, $response->getStatusCode()); + $this->assertIsArray($content); + $this->assertEquals($error, $content); + } +} diff --git a/app/tests/functional/SealApiControllerTest.php b/app/tests/functional/SealApiControllerTest.php new file mode 100644 index 0000000000..96bbd1c12d --- /dev/null +++ b/app/tests/functional/SealApiControllerTest.php @@ -0,0 +1,99 @@ +client->request(Request::METHOD_GET, self::BASE_URL); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetOneSealShouldRetrieveAObject(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsObject($content); + } + + public function testCreateSealShouldReturnCreatedSeal(): void + { + $this->markTestSkipped(); + $sealTestFixtures = SealTestFixtures::partial(); + + $response = $this->client->request(Request::METHOD_POST, self::BASE_URL, [ + 'body' => $sealTestFixtures->json(), + ]); + + $content = json_decode($response->getContent(), true); + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsArray($content); + foreach ($sealTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testDeleteSealShouldReturnSuccess(): void + { + $this->markTestSkipped(); + $sealId = SealFixtures::SEAL_ID_6; + + $response = $this->client->request(Request::METHOD_DELETE, sprintf(self::BASE_URL.'/%s', $sealId)); + $this->assertEquals(Response::HTTP_NO_CONTENT, $response->getStatusCode()); + + $response = $this->client->request(Request::METHOD_GET, sprintf(self::BASE_URL.'/%s', $sealId)); + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } + + public function testUpdate(): void + { + $this->markTestSkipped(); + $sealTestFixtures = SealTestFixtures::partial(); + $url = sprintf(self::BASE_URL.'/%s', SealFixtures::SEAL_ID_3); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $sealTestFixtures->json(), + ]); + + $content = json_decode($response->getContent(), true); + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsArray($content); + foreach ($sealTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testUpdateNotFoundedResource(): void + { + $sealTestFixtures = SealTestFixtures::partial(); + $url = sprintf(self::BASE_URL.'/%s', 80); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $sealTestFixtures->json(), + ]); + + $error = [ + 'error' => 'Seal not found', + ]; + + $content = json_decode($response->getContent(false), true); + $this->assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + $this->assertIsArray($content); + $this->assertEquals($error, $content); + } +} diff --git a/app/tests/functional/SpaceApiControllerTest.php b/app/tests/functional/SpaceApiControllerTest.php new file mode 100644 index 0000000000..cf221d9f2f --- /dev/null +++ b/app/tests/functional/SpaceApiControllerTest.php @@ -0,0 +1,97 @@ +client->request(Request::METHOD_GET, self::BASE_URL); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetOneSpaceShouldRetrieveAObject(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsObject($content); + } + + public function testCreateSpaceShouldReturnCreatedSpace(): void + { + $this->markTestSkipped(); + $spaceTestFixtures = SpaceTestFixtures::partial(); + + $response = $this->client->request(Request::METHOD_POST, self::BASE_URL, [ + 'body' => $spaceTestFixtures->json(), + ]); + + $content = json_decode($response->getContent(), true); + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsArray($content); + foreach ($spaceTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testDeleteSpaceShouldReturnSuccess(): void + { + $this->markTestSkipped(); + $response = $this->client->request(Request::METHOD_DELETE, self::BASE_URL.'/1'); + + $this->assertEquals(Response::HTTP_NO_CONTENT, $response->getStatusCode()); + + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $this->assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + } + + public function testUpdate(): void + { + $spaceTestFixtures = SpaceTestFixtures::partial(); + $url = sprintf(self::BASE_URL.'/%s', SpaceFixtures::SPACE_ID_3); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $spaceTestFixtures->json(), + ]); + + $content = json_decode($response->getContent(), true); + $this->assertEquals(Response::HTTP_CREATED, $response->getStatusCode()); + $this->assertIsArray($content); + foreach ($spaceTestFixtures->toArray() as $key => $value) { + $this->assertEquals($value, $content[$key]); + } + } + + public function testUpdateNotFoundedResource(): void + { + $spaceTestFixtures = SpaceTestFixtures::partial(); + $url = sprintf(self::BASE_URL.'/%s', 1024); + + $response = $this->client->request(Request::METHOD_PATCH, $url, [ + 'body' => $spaceTestFixtures->json(), + ]); + + $error = [ + 'error' => 'Space not found', + ]; + + $content = json_decode($response->getContent(false), true); + $this->assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + $this->assertIsArray($content); + $this->assertEquals($error, $content); + } +} diff --git a/app/tests/functional/TermApiControllerTest.php b/app/tests/functional/TermApiControllerTest.php new file mode 100644 index 0000000000..7721424574 --- /dev/null +++ b/app/tests/functional/TermApiControllerTest.php @@ -0,0 +1,31 @@ +client->request(Request::METHOD_GET, self::BASE_URL); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsArray($content); + } + + public function testGetOneTermShouldRetrieveAObject(): void + { + $response = $this->client->request(Request::METHOD_GET, self::BASE_URL.'/1'); + $content = json_decode($response->getContent()); + + $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); + $this->assertIsObject($content); + } +} diff --git a/app/tests/functional/WelcomeApiControllerTest.php b/app/tests/functional/WelcomeApiControllerTest.php new file mode 100644 index 0000000000..9cc0f7cef5 --- /dev/null +++ b/app/tests/functional/WelcomeApiControllerTest.php @@ -0,0 +1,42 @@ +client->request('GET', '/api'); + $content = json_decode($response->getContent()); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals('MapaCultural', $content->API); + } + + public function testMethodDELETEFromAPI(): void + { + $response = $this->client->request('DELETE', '/api/v2'); + $content = json_decode($response->getContent()); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals('MapaCultural - Test DELETE', $content->API); + } + + public function testmethodPOSTFromAPI(): void + { + $response = $this->client->request('POST', '/api/v2'); + $content = json_decode($response->getContent()); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals('MapaCultural - Test POST', $content->API); + } + + public function testErrorResponseWhenMethodIsNotAllowed(): void + { + $response = $this->client->request('POST', '/api'); + + $this->assertEquals(405, $response->getStatusCode()); + } +} diff --git a/composer.json b/composer.json index ba878abc7d..96b483ece9 100644 --- a/composer.json +++ b/composer.json @@ -1,23 +1,40 @@ { + "name": "mapasculturais/mapasculturais", + "version": "7.3.45", + "description": " Mapas Culturais é uma plataforma colaborativa que reúne informações sobre agentes, espaços, eventos e projetos culturais, fornecendo ao poder público uma radiografia da área de cultura e ao cidadão um mapa de espaços e eventos culturais da região", + "keywords": ["php", "docker", "gis", "postgres"], + "type": "project", + "license": "AGPL", + "require-dev": { + "phpunit/phpunit": "^10.5", + "squizlabs/php_codesniffer": "3.*", + "vimeo/psalm": "^5.17", + "zircote/swagger-php": "^4.8" + }, "require": { - "acelaya/doctrine-enum-type": "^2.3", + "php": "^7.3 || ^8", + "acelaya/doctrine-enum-type": "^2.5", "akrabat/ip-address-middleware": "^2.1", + "creof/doctrine2-spatial": "^1", "doctrine/annotations": "^2.0", "doctrine/dbal": "^3.6", "doctrine/orm": "2.16.*", "firebase/php-jwt": "^6.4", + "league/csv": "^9.6.2", "michelf/php-markdown": "1.*", "monolog/monolog": "^3.4", "mustache/mustache": "^2.11", + "nyholm/psr7": "^1.4", + "opauth/authentik": "*", + "opauth/logincidadao": "*", "opauth/openid": "*", - "opauth/logincidadao" : "*", - "opauth/authentik" : "*", + "php-curl-class/php-curl-class": "^9.18", "pomo/pomo": "^1.5", "psy/psysh": "^0.11.12", "respect/validation": "^2.2", "sinergi/browser-detector": "^6.1", "slim/psr7": "^1.6", - "slim/slim": "4.*", + "slim/slim": "^4.0", "smottt/wideimage": "*", "symfony/amazon-mailer": "^6.3", "symfony/cache": "^6.2", @@ -26,15 +43,31 @@ "symfony/mailgun-mailer": "^6.3", "symfony/mime": "^6.3", "symfony/sendgrid-mailer": "^6.3", + "league/csv": "^9.6.2", + "symfony/http-foundation": "^7.0", + "symfony/routing": "^7.0", + "symfony/console": "^6.4.6", + "symfony/serializer": "^7.0", + "symfony/property-access": "^7.0", + "symfony/validator": "^7.0", + "symfony/console": "^6.4.6", "league/csv": "^9.6.2" }, "autoload": { "psr-4": { + "App\\": "app/src", + "App\\Tests\\": "app/tests", + "MapasCulturaisTests\\": "tests/unit/classes", "MapasCulturais\\": "src/core", "MapasCulturais\\Modules\\": "src/modules", "MapasCulturais\\Themes\\": "src/themes" } }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true + }, "repositories": [ { "type": "git", @@ -48,5 +81,11 @@ "type": "git", "url": "https://github.com/mapasculturais/opauth.git" } - ] + ], + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.51", + "phpunit/phpunit": "^10", + "symfony/http-client": "^7", + "doctrine/data-fixtures": "^1.7" + } } diff --git a/composer.lock b/composer.lock index dfe1df1ee3..c5d434ea57 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f1f4770770a39c2905b2f1d1d7f87ca1", + "content-hash": "7febe59ff68e42b1f5c10d67356bbf4d", "packages": [ { "name": "acelaya/doctrine-enum-type", @@ -74,28 +74,28 @@ }, { "name": "akrabat/ip-address-middleware", - "version": "2.1.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/akrabat/ip-address-middleware.git", - "reference": "00e090afb08274320b86108130a23f59da9cd3f6" + "reference": "5e3b94b9c29c8e0cde80941bb87d6a68a6532b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/akrabat/ip-address-middleware/zipball/00e090afb08274320b86108130a23f59da9cd3f6", - "reference": "00e090afb08274320b86108130a23f59da9cd3f6", + "url": "https://api.github.com/repos/akrabat/ip-address-middleware/zipball/5e3b94b9c29c8e0cde80941bb87d6a68a6532b9d", + "reference": "5e3b94b9c29c8e0cde80941bb87d6a68a6532b9d", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/http-server-middleware": "^1.0" }, "replace": { "akrabat/rka-ip-address-middleware": "*" }, "require-dev": { - "laminas/laminas-diactoros": "^2.4", + "laminas/laminas-diactoros": "^2.4 || ^3.0", "phpunit/phpunit": "^8.5.8 || ^9.4", "squizlabs/php_codesniffer": "^3.2" }, @@ -125,9 +125,9 @@ ], "support": { "issues": "https://github.com/akrabat/ip-address-middleware/issues", - "source": "https://github.com/akrabat/ip-address-middleware/tree/2.1.0" + "source": "https://github.com/akrabat/ip-address-middleware/tree/2.2.0" }, - "time": "2021-11-11T21:19:34+00:00" + "time": "2024-06-09T13:39:46+00:00" }, { "name": "async-aws/core", @@ -254,6 +254,237 @@ ], "time": "2024-05-14T07:34:42+00:00" }, + { + "name": "creof/doctrine2-spatial", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/creof/doctrine2-spatial.git", + "reference": "58ea5fae1c1b450ee08d7dac25cd9e8f5e6fdebd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/creof/doctrine2-spatial/zipball/58ea5fae1c1b450ee08d7dac25cd9e8f5e6fdebd", + "reference": "58ea5fae1c1b450ee08d7dac25cd9e8f5e6fdebd", + "shasum": "" + }, + "require": { + "creof/geo-parser": "~2.0", + "creof/wkb-parser": "~2.0", + "creof/wkt-parser": "~2.0", + "doctrine/orm": ">=2.3" + }, + "require-dev": { + "phpunit/phpcov": "*", + "phpunit/phpunit": "<5.0", + "satooshi/php-coveralls": "~1.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "CrEOF\\Spatial": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Derek Lambert", + "email": "dlambert@dereklambert.com" + } + ], + "description": "Doctrine2 multi-platform support for spatial types and functions", + "keywords": [ + "database", + "dbal", + "geography", + "geometry", + "gis", + "mysql", + "opengis", + "orm", + "postgis", + "postgresql", + "spatial" + ], + "support": { + "issues": "https://github.com/creof/doctrine2-spatial/issues", + "source": "https://github.com/creof/doctrine2-spatial/tree/master" + }, + "time": "2017-07-13T16:48:25+00:00" + }, + { + "name": "creof/geo-parser", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/creof/geo-parser.git", + "reference": "b55553a54c7775576c9ee629847973d0b6d7cbed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/creof/geo-parser/zipball/b55553a54c7775576c9ee629847973d0b6d7cbed", + "reference": "b55553a54c7775576c9ee629847973d0b6d7cbed", + "shasum": "" + }, + "require": { + "doctrine/lexer": ">=1.0", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "phpunit/phpunit": "~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "CrEOF\\Geo\\String": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Derek J. Lambert", + "email": "dlambert@dereklambert.com" + } + ], + "description": "Parser for geography coordinate strings", + "keywords": [ + "coordinate", + "geo", + "geography", + "geometry", + "lexer", + "parser", + "spatial", + "string", + "text" + ], + "support": { + "issues": "https://github.com/creof/geo-parser/issues", + "source": "https://github.com/creof/geo-parser/tree/master" + }, + "time": "2019-08-07T17:45:01+00:00" + }, + { + "name": "creof/wkb-parser", + "version": "v2.4", + "source": { + "type": "git", + "url": "https://github.com/creof/wkb-parser.git", + "reference": "97ac770f241adce3c46e3feb96e0e092531c833d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/creof/wkb-parser/zipball/97ac770f241adce3c46e3feb96e0e092531c833d", + "reference": "97ac770f241adce3c46e3feb96e0e092531c833d", + "shasum": "" + }, + "require": { + "ext-spl": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "phpunit/phpunit": ">=4.8", + "satooshi/php-coveralls": "~1.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "CrEOF\\Geo\\WKB": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Derek J. Lambert", + "email": "dlambert@dereklambert.com" + } + ], + "description": "Parser for well-known binary (WKB/EWKB) object data", + "keywords": [ + "ewkb", + "geography", + "geometry", + "parser", + "spatial", + "string", + "text", + "wkb" + ], + "support": { + "issues": "https://github.com/creof/wkb-parser/issues", + "source": "https://github.com/creof/wkb-parser/tree/v2.4" + }, + "time": "2022-02-15T22:46:31+00:00" + }, + { + "name": "creof/wkt-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/creof/wkt-parser.git", + "reference": "307a3fdc0b705c7b59b47751a7f7e8e45f98d11e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/creof/wkt-parser/zipball/307a3fdc0b705c7b59b47751a7f7e8e45f98d11e", + "reference": "307a3fdc0b705c7b59b47751a7f7e8e45f98d11e", + "shasum": "" + }, + "require": { + "doctrine/lexer": ">=1.0", + "ext-spl": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "phpunit/phpunit": ">=4.8" + }, + "type": "library", + "autoload": { + "psr-0": { + "CrEOF\\Geo\\WKT": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Derek J. Lambert", + "email": "dlambert@dereklambert.com" + } + ], + "description": "Parser for well-known text (WKT) object strings", + "keywords": [ + "ewkt", + "geography", + "geometry", + "lexer", + "parser", + "spatial", + "string", + "text", + "wkt" + ], + "support": { + "issues": "https://github.com/creof/wkt-parser/issues", + "source": "https://github.com/creof/wkt-parser/tree/master" + }, + "time": "2015-11-18T21:20:29+00:00" + }, { "name": "doctrine/annotations", "version": "2.0.1", @@ -602,16 +833,16 @@ }, { "name": "doctrine/dbal", - "version": "3.8.4", + "version": "3.8.6", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd" + "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b05e48a745f722801f55408d0dbd8003b403dbbd", - "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/b7411825cf7efb7e51f9791dea19d86e43b399a1", + "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1", "shasum": "" }, "require": { @@ -627,12 +858,12 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.58", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.16", + "phpstan/phpstan": "1.11.5", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.19", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.9.0", + "squizlabs/php_codesniffer": "3.10.1", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/console": "^4.4|^5.4|^6.0|^7.0", "vimeo/psalm": "4.30.0" @@ -695,7 +926,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.4" + "source": "https://github.com/doctrine/dbal/tree/3.8.6" }, "funding": [ { @@ -711,7 +942,7 @@ "type": "tidelift" } ], - "time": "2024-04-25T07:04:44+00:00" + "time": "2024-06-19T10:38:17+00:00" }, { "name": "doctrine/deprecations", @@ -1193,16 +1424,16 @@ }, { "name": "doctrine/persistence", - "version": "3.3.2", + "version": "3.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "477da35bd0255e032826f440b94b3e37f2d56f42" + "reference": "b337726451f5d530df338fc7f68dee8781b49779" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/477da35bd0255e032826f440b94b3e37f2d56f42", - "reference": "477da35bd0255e032826f440b94b3e37f2d56f42", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", + "reference": "b337726451f5d530df338fc7f68dee8781b49779", "shasum": "" }, "require": { @@ -1214,15 +1445,14 @@ "doctrine/common": "<2.10" }, "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^11", + "doctrine/coding-standard": "^12", "doctrine/common": "^3.0", - "phpstan/phpstan": "1.9.4", + "phpstan/phpstan": "1.11.1", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "^8.5 || ^9.5", "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.3.0" + "vimeo/psalm": "4.30.0 || 5.24.0" }, "type": "library", "autoload": { @@ -1271,7 +1501,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.3.2" + "source": "https://github.com/doctrine/persistence/tree/3.3.3" }, "funding": [ { @@ -1287,7 +1517,7 @@ "type": "tidelift" } ], - "time": "2024-03-12T14:54:36+00:00" + "time": "2024-06-20T10:14:30+00:00" }, { "name": "egulias/email-validator", @@ -1618,16 +1848,16 @@ }, { "name": "monolog/monolog", - "version": "3.6.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -1703,7 +1933,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -1715,7 +1945,7 @@ "type": "tidelift" } ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mustache/mustache", @@ -1936,6 +2166,84 @@ }, "time": "2024-03-17T08:10:35+00:00" }, + { + "name": "nyholm/psr7", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.1" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2023-11-13T09:31:12+00:00" + }, { "name": "opauth/authentik", "version": "v1.0.0", @@ -2106,6 +2414,86 @@ }, "time": "2012-06-08T07:00:03+00:00" }, + { + "name": "php-curl-class/php-curl-class", + "version": "9.19.2", + "source": { + "type": "git", + "url": "https://github.com/php-curl-class/php-curl-class.git", + "reference": "c41efeb4ea2dc3cf8f90f8f967b0fcf45a41e294" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-curl-class/php-curl-class/zipball/c41efeb4ea2dc3cf8f90f8f967b0fcf45a41e294", + "reference": "c41efeb4ea2dc3cf8f90f8f967b0fcf45a41e294", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=7.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "*", + "ext-gd": "*", + "friendsofphp/php-cs-fixer": "*", + "phpcompatibility/php-compatibility": "dev-develop", + "phpcsstandards/phpcsutils": "@alpha", + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "*", + "vimeo/psalm": ">=0.3.63" + }, + "suggest": { + "ext-mbstring": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Curl\\": "src/Curl/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Unlicense" + ], + "authors": [ + { + "name": "Zach Borboa" + }, + { + "name": "Contributors", + "homepage": "https://github.com/php-curl-class/php-curl-class/graphs/contributors" + } + ], + "description": "PHP Curl Class makes it easy to send HTTP requests and integrate with web APIs.", + "homepage": "https://github.com/php-curl-class/php-curl-class", + "keywords": [ + "API-Client", + "api", + "class", + "client", + "curl", + "framework", + "http", + "http-client", + "http-proxy", + "json", + "php", + "php-curl", + "php-curl-library", + "proxy", + "requests", + "restful", + "web-scraper", + "web-scraping ", + "web-service", + "xml" + ], + "support": { + "issues": "https://github.com/php-curl-class/php-curl-class/issues", + "source": "https://github.com/php-curl-class/php-curl-class/tree/9.19.2" + }, + "time": "2024-04-09T18:03:13+00:00" + }, { "name": "pomo/pomo", "version": "v1.5.0", @@ -2383,16 +2771,16 @@ }, { "name": "psr/http-message", - "version": "1.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { @@ -2401,7 +2789,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2416,7 +2804,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -2430,9 +2818,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2023-04-04T09:50:52+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/http-server-handler", @@ -2899,40 +3287,40 @@ }, { "name": "slim/psr7", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/slimphp/Slim-Psr7.git", - "reference": "72d2b2bac94ab4575d369f605dbfafbe168d3163" + "reference": "753e9646def5ff4db1a06e5cf4ef539bfd30f467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim-Psr7/zipball/72d2b2bac94ab4575d369f605dbfafbe168d3163", - "reference": "72d2b2bac94ab4575d369f605dbfafbe168d3163", + "url": "https://api.github.com/repos/slimphp/Slim-Psr7/zipball/753e9646def5ff4db1a06e5cf4ef539bfd30f467", + "reference": "753e9646def5ff4db1a06e5cf4ef539bfd30f467", "shasum": "" }, "require": { "fig/http-message-util": "^1.1.5", - "php": "^7.4 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "php": "^8.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^1.0 || ^2.0", "ralouphie/getallheaders": "^3.0", - "symfony/polyfill-php80": "^1.26" + "symfony/polyfill-php80": "^1.29" }, "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "psr/http-factory-implementation": "^1.0", + "psr/http-message-implementation": "^1.0 || ^2.0" }, "require-dev": { - "adriansuter/php-autoload-override": "^1.3", + "adriansuter/php-autoload-override": "^1.4", "ext-json": "*", - "http-interop/http-factory-tests": "^0.9.0", - "php-http/psr7-integration-tests": "1.1", - "phpspec/prophecy": "^1.15", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/phpstan": "^1.8", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.7" + "http-interop/http-factory-tests": "^1.1.0", + "php-http/psr7-integration-tests": "1.3.0", + "phpspec/prophecy": "^1.19", + "phpspec/prophecy-phpunit": "^2.2", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "^3.10" }, "type": "library", "autoload": { @@ -2975,22 +3363,22 @@ ], "support": { "issues": "https://github.com/slimphp/Slim-Psr7/issues", - "source": "https://github.com/slimphp/Slim-Psr7/tree/1.6.1" + "source": "https://github.com/slimphp/Slim-Psr7/tree/1.7.0" }, - "time": "2023-04-17T16:02:20+00:00" + "time": "2024-06-08T14:48:17+00:00" }, { "name": "slim/slim", - "version": "4.13.0", + "version": "4.14.0", "source": { "type": "git", "url": "https://github.com/slimphp/Slim.git", - "reference": "038fd5713d5a41636fdff0e8dcceedecdd17fc17" + "reference": "5943393b88716eb9e82c4161caa956af63423913" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/038fd5713d5a41636fdff0e8dcceedecdd17fc17", - "reference": "038fd5713d5a41636fdff0e8dcceedecdd17fc17", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/5943393b88716eb9e82c4161caa956af63423913", + "reference": "5943393b88716eb9e82c4161caa956af63423913", "shasum": "" }, "require": { @@ -2998,7 +3386,7 @@ "nikic/fast-route": "^1.3", "php": "^7.4 || ^8.0", "psr/container": "^1.0 || ^2.0", - "psr/http-factory": "^1.0", + "psr/http-factory": "^1.1", "psr/http-message": "^1.1 || ^2.0", "psr/http-server-handler": "^1.0", "psr/http-server-middleware": "^1.0", @@ -3015,11 +3403,12 @@ "nyholm/psr7-server": "^1.1", "phpspec/prophecy": "^1.19", "phpspec/prophecy-phpunit": "^2.1", - "phpstan/phpstan": "^1.10", + "phpstan/phpstan": "^1.11", "phpunit/phpunit": "^9.6", "slim/http": "^1.3", "slim/psr7": "^1.6", - "squizlabs/php_codesniffer": "^3.9" + "squizlabs/php_codesniffer": "^3.10", + "vimeo/psalm": "^5.24" }, "suggest": { "ext-simplexml": "Needed to support XML format in BodyParsingMiddleware", @@ -3092,7 +3481,7 @@ "type": "tidelift" } ], - "time": "2024-03-03T21:25:30+00:00" + "time": "2024-06-13T08:54:48+00:00" }, { "name": "smottt/wideimage", @@ -3135,16 +3524,16 @@ }, { "name": "symfony/amazon-mailer", - "version": "v6.4.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/amazon-mailer.git", - "reference": "e750b42f6c08e5b9e9264ad6d65225a59bb0c6c7" + "reference": "284c11f18d252f13f22ae10f4e13e6f9e129e532" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/amazon-mailer/zipball/e750b42f6c08e5b9e9264ad6d65225a59bb0c6c7", - "reference": "e750b42f6c08e5b9e9264ad6d65225a59bb0c6c7", + "url": "https://api.github.com/repos/symfony/amazon-mailer/zipball/284c11f18d252f13f22ae10f4e13e6f9e129e532", + "reference": "284c11f18d252f13f22ae10f4e13e6f9e129e532", "shasum": "" }, "require": { @@ -3181,7 +3570,7 @@ "description": "Symfony Amazon Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/amazon-mailer/tree/v6.4.7" + "source": "https://github.com/symfony/amazon-mailer/tree/v6.4.8" }, "funding": [ { @@ -3197,20 +3586,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/cache", - "version": "v6.4.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a" + "reference": "287142df5579ce223c485b3872df3efae8390984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/b9e9b93c9817ec6c789c7943f5e54b57a041c16a", - "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a", + "url": "https://api.github.com/repos/symfony/cache/zipball/287142df5579ce223c485b3872df3efae8390984", + "reference": "287142df5579ce223c485b3872df3efae8390984", "shasum": "" }, "require": { @@ -3277,7 +3666,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.7" + "source": "https://github.com/symfony/cache/tree/v6.4.8" }, "funding": [ { @@ -3293,7 +3682,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/cache-contracts", @@ -3373,16 +3762,16 @@ }, { "name": "symfony/console", - "version": "v6.4.7", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f" + "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", - "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "url": "https://api.github.com/repos/symfony/console/zipball/6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", + "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", "shasum": "" }, "require": { @@ -3447,7 +3836,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.7" + "source": "https://github.com/symfony/console/tree/v6.4.9" }, "funding": [ { @@ -3463,7 +3852,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3534,16 +3923,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v7.0.7", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9" + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9", - "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", "shasum": "" }, "require": { @@ -3594,7 +3983,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" }, "funding": [ { @@ -3610,7 +3999,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3690,21 +4079,22 @@ }, { "name": "symfony/http-client", - "version": "v7.0.7", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "6ce3c4c899051b3d7326ea1a1dda3729e29ae6d7" + "reference": "90ace27d17ccc9afc6f7ec0081e8529fb0e29425" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/6ce3c4c899051b3d7326ea1a1dda3729e29ae6d7", - "reference": "6ce3c4c899051b3d7326ea1a1dda3729e29ae6d7", + "url": "https://api.github.com/repos/symfony/http-client/zipball/90ace27d17ccc9afc6f7ec0081e8529fb0e29425", + "reference": "90ace27d17ccc9afc6f7ec0081e8529fb0e29425", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "^3.4.1", "symfony/service-contracts": "^2.5|^3" }, @@ -3731,6 +4121,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", @@ -3762,7 +4153,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.0.7" + "source": "https://github.com/symfony/http-client/tree/v7.1.2" }, "funding": [ { @@ -3778,7 +4169,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-06-28T08:00:31+00:00" }, { "name": "symfony/http-client-contracts", @@ -3859,22 +4250,99 @@ "time": "2024-04-18T09:32:20+00:00" }, { - "name": "symfony/mailchimp-mailer", - "version": "v6.4.7", + "name": "symfony/http-foundation", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/mailchimp-mailer.git", - "reference": "e59de564673708ee9b029d714ec37f93fefb125e" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailchimp-mailer/zipball/e59de564673708ee9b029d714ec37f93fefb125e", - "reference": "e59de564673708ee9b029d714ec37f93fefb125e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/74d171d5b6a1d9e4bfee09a41937c17a7536acfa", + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/mailer": "^5.4.21|^6.2.7|^7.0" + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/mailchimp-mailer", + "version": "v6.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailchimp-mailer.git", + "reference": "1e8e353bfa6ca7ce3f8a700b9ba5112094f65b89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailchimp-mailer/zipball/1e8e353bfa6ca7ce3f8a700b9ba5112094f65b89", + "reference": "1e8e353bfa6ca7ce3f8a700b9ba5112094f65b89", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/mailer": "^5.4.21|^6.2.7|^7.0" }, "require-dev": { "symfony/http-client": "^6.3|^7.0" @@ -3905,7 +4373,7 @@ "description": "Symfony Mailchimp Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailchimp-mailer/tree/v6.4.7" + "source": "https://github.com/symfony/mailchimp-mailer/tree/v6.4.8" }, "funding": [ { @@ -3921,20 +4389,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.7", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd" + "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/2c446d4e446995bed983c0b5bb9ff837e8de7dbd", - "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", + "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", "shasum": "" }, "require": { @@ -3985,7 +4453,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.7" + "source": "https://github.com/symfony/mailer/tree/v6.4.9" }, "funding": [ { @@ -4001,20 +4469,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-28T07:59:05+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v6.4.7", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "044eede71c3eb5fbe7192042b8c0d04987b5653d" + "reference": "c4917eb14f31fb5c21442375c6baf7f51bd924e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/044eede71c3eb5fbe7192042b8c0d04987b5653d", - "reference": "044eede71c3eb5fbe7192042b8c0d04987b5653d", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/c4917eb14f31fb5c21442375c6baf7f51bd924e8", + "reference": "c4917eb14f31fb5c21442375c6baf7f51bd924e8", "shasum": "" }, "require": { @@ -4054,7 +4522,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.7" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.9" }, "funding": [ { @@ -4070,20 +4538,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-28T07:59:05+00:00" }, { "name": "symfony/mime", - "version": "v6.4.7", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "decadcf3865918ecfcbfa90968553994ce935a5e" + "reference": "7d048964877324debdcb4e0549becfa064a20d43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/decadcf3865918ecfcbfa90968553994ce935a5e", - "reference": "decadcf3865918ecfcbfa90968553994ce935a5e", + "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", + "reference": "7d048964877324debdcb4e0549becfa064a20d43", "shasum": "" }, "require": { @@ -4097,7 +4565,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.3.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -4107,7 +4575,7 @@ "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3.2|^7.0" + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -4139,7 +4607,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.7" + "source": "https://github.com/symfony/mime/tree/v6.4.9" }, "funding": [ { @@ -4155,20 +4623,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -4218,7 +4686,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -4234,20 +4702,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -4296,7 +4764,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -4312,20 +4780,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "shasum": "" }, "require": { @@ -4380,7 +4848,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" }, "funding": [ { @@ -4396,20 +4864,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -4461,7 +4929,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -4477,20 +4945,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -4541,7 +5009,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -4557,20 +5025,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "10112722600777e02d2745716b70c5db4ca70442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", "shasum": "" }, "require": { @@ -4614,7 +5082,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" }, "funding": [ { @@ -4630,20 +5098,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -4694,7 +5162,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -4710,41 +5178,41 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { - "name": "symfony/sendgrid-mailer", - "version": "v6.4.7", + "name": "symfony/polyfill-php83", + "version": "v1.30.0", "source": { "type": "git", - "url": "https://github.com/symfony/sendgrid-mailer.git", - "reference": "deea5b186e31719d212ccc265d05459d4eb8d374" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/sendgrid-mailer/zipball/deea5b186e31719d212ccc265d05459d4eb8d374", - "reference": "deea5b186e31719d212ccc265d05459d4eb8d374", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/mailer": "^5.4.21|^6.2.7|^7.0" - }, - "conflict": { - "symfony/http-foundation": "<6.2", - "symfony/mime": "<6.2" + "php": ">=7.1" }, - "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/webhook": "^6.3|^7.0" + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } }, - "type": "symfony-mailer-bridge", "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Mailer\\Bridge\\Sendgrid\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4753,18 +5221,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Sendgrid Mailer Bridge", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/sendgrid-mailer/tree/v6.4.7" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" }, "funding": [ { @@ -4780,46 +5254,36 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-19T12:35:24+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.5.0", + "name": "symfony/property-access", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "url": "https://github.com/symfony/property-access.git", + "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/property-access/zipball/74e39e6a6276b8e384f34c6ddbc10a6c9a60193a", + "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "require-dev": { + "symfony/cache": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" + "Symfony\\Component\\PropertyAccess\\": "" }, "exclude-from-classmap": [ - "/Test/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4828,26 +5292,29 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Provides functions to read and write from/to an object or array using a simple string notation", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/property-access/tree/v7.1.1" }, "funding": [ { @@ -4863,46 +5330,44 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { - "name": "symfony/string", - "version": "v7.0.7", + "name": "symfony/property-info", + "version": "v7.1.2", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63" + "url": "https://github.com/symfony/property-info.git", + "reference": "d7b91e4aa07e822a9b935fc29a7254c12d502f16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63", - "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d7b91e4aa07e822a9b935fc29a7254c12d502f16", + "reference": "d7b91e4aa07e822a9b935fc29a7254c12d502f16", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "^7.1" }, "conflict": { - "symfony/translation-contracts": "<2.5" + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" + "Symfony\\Component\\PropertyInfo\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4914,26 +5379,26 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "description": "Extracts information about PHP class' properties using metadata of popular sources", "homepage": "https://symfony.com", "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.7" + "source": "https://github.com/symfony/property-info/tree/v7.1.2" }, "funding": [ { @@ -4949,49 +5414,43 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-06-26T07:21:35+00:00" }, { - "name": "symfony/var-dumper", - "version": "v6.4.7", + "name": "symfony/routing", + "version": "v7.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7" + "url": "https://github.com/symfony/routing.git", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7", - "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7", + "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<5.4" + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", "autoload": { - "files": [ - "Resources/functions/dump.php" - ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" + "Symfony\\Component\\Routing\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5003,22 +5462,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ - "debug", - "dump" + "router", + "routing", + "uri", + "url" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.7" + "source": "https://github.com/symfony/routing/tree/v7.1.1" }, "funding": [ { @@ -5034,34 +5495,38 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { - "name": "symfony/var-exporter", - "version": "v7.0.7", + "name": "symfony/sendgrid-mailer", + "version": "v6.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "cdecc0022e40e90340ba1a59a3d5ccf069777078" + "url": "https://github.com/symfony/sendgrid-mailer.git", + "reference": "de781810f7fbcef2d21a7e5b24cf4d85bac4bceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/cdecc0022e40e90340ba1a59a3d5ccf069777078", - "reference": "cdecc0022e40e90340ba1a59a3d5ccf069777078", + "url": "https://api.github.com/repos/symfony/sendgrid-mailer/zipball/de781810f7fbcef2d21a7e5b24cf4d85bac4bceb", + "reference": "de781810f7fbcef2d21a7e5b24cf4d85bac4bceb", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.1", + "symfony/mailer": "^5.4.21|^6.2.7|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<6.2", + "symfony/mime": "<6.2" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/webhook": "^6.3|^7.0" }, - "type": "library", + "type": "symfony-mailer-bridge", "autoload": { "psr-4": { - "Symfony\\Component\\VarExporter\\": "" + "Symfony\\Component\\Mailer\\Bridge\\Sendgrid\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5073,28 +5538,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "description": "Symfony Sendgrid Mailer Bridge", "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.0.7" + "source": "https://github.com/symfony/sendgrid-mailer/tree/v6.4.8" }, "funding": [ { @@ -5110,16 +5565,3773 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:29:19+00:00" + "time": "2024-05-31T14:49:08+00:00" + }, + { + "name": "symfony/serializer", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "d2077674aaaff02a95f290de512aa358947e6bbe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/d2077674aaaff02a95f290de512aa358947e6bbe", + "reference": "d2077674aaaff02a95f290de512aa358947e6bbe", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/uid": "<6.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T07:42:43+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/14221089ac66cf82e3cf3d1c1da65de305587ff8", + "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T09:27:18+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/type-info", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "60b28eb733f1453287f1263ed305b96091e0d1dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/60b28eb733f1453287f1263ed305b96091e0d1dc", + "reference": "60b28eb733f1453287f1263ed305b96091e0d1dc", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-info": "<6.4" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:59:31+00:00" + }, + { + "name": "symfony/validator", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "bed12b7d5bd4dac452db5fa6203331c876b489e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/bed12b7d5bd4dac452db5fa6203331c876b489e7", + "reference": "bed12b7d5bd4dac452db5fa6203331c876b489e7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation": "^6.4.3|^7.0.3", + "symfony/type-info": "^7.1", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-25T19:55:06+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c31566e4ca944271cc8d8ac6887cbf31b8c6a172", + "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-27T13:23:14+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b80a669a2264609f07f1667f891dbfca25eba44c", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T08:00:31+00:00" + } + ], + "packages-dev": [ + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.4", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "04229f163664973f68f38f6f73d917799168ef24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", + "reference": "04229f163664973f68f38f6f73d917799168ef24", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-27T13:40:54+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "doctrine/data-fixtures", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", + "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1.0", + "doctrine/persistence": "^2.0|^3.0", + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.5 || >=5", + "doctrine/orm": "<2.14 || >=4", + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "doctrine/annotations": "^1.12 || ^2", + "doctrine/coding-standard": "^12", + "doctrine/dbal": "^3.5 || ^4", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", + "doctrine/orm": "^2.14 || ^3", + "ext-sqlite3": "*", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6.13 || ^10.4.2", + "symfony/cache": "^5.4 || ^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6.3 || ^7", + "vimeo/psalm": "^5.9" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database" + ], + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/1.7.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2023-11-24T11:18:31+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-02-07T09:43:46+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.59.3", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/30ba9ecc2b0e5205e578fe29973c15653d9bfd29", + "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.0", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.3", + "infection/infection": "^0.29.5", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.59.3" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-06-16T14:17:03+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.15", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-06-29T08:25:15+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.24", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f124e3e3e561006047b532fd0431bf5bb6b9015", + "reference": "5f124e3e3e561006047b532fd0431bf5bb6b9015", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.24" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-06-20T13:09:54+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.5", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/socket": "^1.8", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + }, + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-09-16T13:41:56+00:00" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, + { + "name": "react/socket", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.11", + "react/event-loop": "^1.2", + "react/promise": "^3 || ^2.6 || ^1.2.1", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.15.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-12-15T11:02:10+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "92a91985250c251de9b947a14bb2c9390b1a562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/92a91985250c251de9b947a14bb2c9390b1a562c", + "reference": "92a91985250c251de9b947a14bb2c9390b1a562c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-28T10:03:55+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:30:46+00:00" + }, + { + "name": "symfony/process", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/febf90124323a093c7ee06fdb30e765ca3c20028", + "reference": "febf90124323a093c7ee06fdb30e765ca3c20028", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" } ], - "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, - "platform": [], + "platform": { + "php": "^7.3 || ^8" + }, "platform-dev": [], "plugin-api-version": "2.6.0" } diff --git a/composer.phar b/composer.phar new file mode 100755 index 0000000000..53f8b81265 Binary files /dev/null and b/composer.phar differ diff --git a/config/Metabase.php b/config/Metabase.php new file mode 100644 index 0000000000..484f5288e6 --- /dev/null +++ b/config/Metabase.php @@ -0,0 +1,281 @@ + [ + 'config' => [ + 'links' => [ + 'painel-agentes' => [ + 'link' => 'https://metabase.mapas.tec.br/public/dashboard/898173be-47ae-4987-894c-b7e54914539c', + 'text' => 'Saiba os números de agentes individuais cadastrados, quantos são criados mensalmente, por onde estão distribuídos no território e outras informações.', + 'title' => 'Painel sobre agentes individuais', + 'entity' => 'Agent' + ], + 'painel-espacos' => [ + 'link' => 'https://metabase.mapas.tec.br/public/dashboard/ea36c1b3-c3f3-4435-afc6-9faeea4c7c8f', + 'text' => 'Saiba os números de espaços cadastrados, quantos são criados mensalmente, por onde estão distribuídos no território e outras informações.', + 'title' => 'Painel sobre espaços', + 'entity' => 'Space' + ], + 'painel-oportunidades' => [ + 'link' => 'https://metabase.mapas.tec.br/public/dashboard/496d0b03-0476-4497-9a3d-719198cfe083', + 'text' => 'Tenha acesso ao número de oportunidades e editais cadastrados, a quantidade de pessoas participantes inscritas, o perfil demográfico e mais informações.', + 'title' => 'Painel sobre oportunidades', + 'entity' => 'Opportunity' + ], + ], + 'cards' => [ + 'home' => [ + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'icon'=> 'space', + 'label' => 'Espaços cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Space', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'icon'=> 'space', + 'label'=> 'Espaços certificados', + 'entity'=> 'MapasCulturais\\Entities\\Space', + 'query'=> [ + '@verified'=> 1 + ], + 'value'=> null + ] + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'icon'=> 'agent', + 'label' => 'Agentes cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'icon'=> 'agent', + 'label' => 'Agentes individuais', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(1)'], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'icon'=> 'agent', + 'label' => 'Agentes coletivos', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(2)'], + 'value' => null + ], + ] + ], + // opportunity + [ + 'type' => 'opportunity', + 'label' => 'Oportunidades', + 'icon'=> 'opportunity', + 'iconClass'=> 'opportunity__color', + 'panelLink'=> 'painel-oportunidades', + 'data'=> [ + [ + 'label' => 'Oportunidades criadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query' => [], + 'value' => null + ], + [ + 'label' => 'Oportunidades certificadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query'=> [ + '@verified'=> 1 + ], + 'value' => null + ], + ] + ] + + ], + 'entities' => [ + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'id' => 'espacos-cadastrados', + 'icon'=> 'space', + 'label' => 'Espaços cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Space', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'id' => 'espacos-certificados', + 'icon'=> 'space', + 'label'=> 'Espaços certificados', + 'entity'=> 'MapasCulturais\\Entities\\Space', + 'query'=> [ + '@verified'=> 1 + ], + 'value'=> null + ] + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-cadastrados', + 'icon'=> 'agent', + 'label' => 'Agentes cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-individuais', + 'icon'=> 'agent', + 'label' => 'Agentes individuais', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(1)'], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-coletivos', + 'icon'=> 'agent', + 'label' => 'Agentes coletivos', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(2)'], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-cadastrados-7-dias', + 'icon'=> 'agent', + 'label' => 'Cadastrados nos últimos 7 dias', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query'=> [ + '@select' => 'createTimestamp' + ], + 'value' => null + ], + ] + ], + [ + 'type' => 'opportunity', + 'label' => 'Oportunidades', + 'icon'=> 'opportunity', + 'iconClass'=> 'opportunity__color', + 'panelLink'=> 'painel-oportunidades', + 'data'=> [ + [ + 'icon'=> 'opportunity', + 'label' => 'Oportunidades criadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'opportunity', + 'label' => 'Oportunidades certificadas', + 'icon'=> 'opportunity', + 'iconClass'=> 'opportunity__color', + 'panelLink'=> 'painel-oportunidades', + 'data'=> [ + [ + 'icon'=> 'opportunity', + 'label' => 'Oportunidades certificadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query'=> [ + '@verified'=> 1 + ], + 'value' => null + ], + ] + ] + ] + ] + ] + ] +]; diff --git a/config/authentication.php b/config/authentication.php index 22e3fdaeb8..9d540bbc90 100644 --- a/config/authentication.php +++ b/config/authentication.php @@ -1,52 +1,47 @@ 'Fake', - 'auth.config' => [], - /* + // 'auth.provider' => 'Fake', + // 'auth.config' => [], + // https://github.com/kterva/MultipleLocalAuth 'auth.provider' => '\MultipleLocalAuth\Provider', - 'auth.config' => [ - 'salt' => env('AUTH_SALT', 'SECURITY_SALT'), + 'salt' => env('AUTH_SALT', null), 'timeout' => '24 hours', 'strategies' => [ - 'Facebook' => [ - 'app_id' => env('AUTH_FACEBOOK_APP_ID', null), - 'app_secret' => env('AUTH_FACEBOOK_APP_SECRET', null), - 'scope' => env('AUTH_FACEBOOK_SCOPE', 'email'), + 'Facebook' => [ + 'app_id' => env('AUTH_FACEBOOK_APP_ID', null), + 'app_secret' => env('AUTH_FACEBOOK_APP_SECRET', null), + 'scope' => env('AUTH_FACEBOOK_SCOPE', 'email'), ], - - 'Google' => [ - 'client_id' => env('AUTH_GOOGLE_CLIENT_ID', null), - 'client_secret' => env('AUTH_GOOGLE_CLIENT_SECRET', null), - 'redirect_uri' => APP_BASE_URL . 'autenticacao/google/oauth2callback', - 'scope' => env('AUTH_GOOGLE_SCOPE', 'email'), - ], - 'LinkedIn' => [ 'api_key' => env('AUTH_LINKEDIN_API_KEY', null), 'secret_key' => env('AUTH_LINKEDIN_SECRET_KEY', null), - 'redirect_uri' => APP_BASE_URL . 'autenticacao/linkedin/oauth2callback', + 'redirect_uri' => '/autenticacao/linkedin/oauth2callback', 'scope' => env('AUTH_LINKEDIN_SCOPE', 'r_emailaddress') ], - + 'Google' => [ + 'client_id' => env('AUTH_GOOGLE_CLIENT_ID', null), + 'client_secret' => env('AUTH_GOOGLE_CLIENT_SECRET', null), + 'redirect_uri' => '/autenticacao/google/oauth2callback', + 'scope' => env('AUTH_GOOGLE_SCOPE', 'email'), + ], 'Twitter' => [ 'app_id' => env('AUTH_TWITTER_APP_ID', null), 'app_secret' => env('AUTH_TWITTER_APP_SECRET', null), - ] + ], ] ] - //Example Authentik - auth.provider' => 'MapasCulturais\AuthProviders\OpauthAuthentik', - 'auth.config' => [ - 'salt' => env('AUTH_SALT', 'SECURITY_SALT'), - 'timeout' => '24 hours', - 'client_id' => env('AUTH_AUTHENTIK_APP_ID', ''), - 'client_secret' => env('AUTH_AUTHENTIK_APP_SECRET', ''), - 'scope' => env('AUTH_AUTHENTIK_SCOPE', 'openid profile email'), - 'login_url' => env('AUTH_AUTHENTIK_LOGIN_URL', ''), - 'login_url' => env('AUTH_AUTHENTIK_LOGOUT_URL', ''), - ] - */ + // //Example Authentik + // auth.provider' => 'MapasCulturais\AuthProviders\OpauthAuthentik', + // 'auth.config' => [ + // 'salt' => env('AUTH_SALT', 'SECURITY_SALT'), + // 'timeout' => '24 hours', + // 'client_id' => env('AUTH_AUTHENTIK_APP_ID', ''), + // 'client_secret' => env('AUTH_AUTHENTIK_APP_SECRET', ''), + // 'scope' => env('AUTH_AUTHENTIK_SCOPE', 'openid profile email'), + // 'login_url' => env('AUTH_AUTHENTIK_LOGIN_URL', ''), + // 'login_url' => env('AUTH_AUTHENTIK_LOGOUT_URL', ''), + // ] ]; diff --git a/config/module.home.php b/config/module.home.php index 0bee18d07c..bcf259cc3f 100644 --- a/config/module.home.php +++ b/config/module.home.php @@ -7,6 +7,7 @@ 'home-opportunities' => env('MODULE_HOME_IMAGE_OPPORTUNITIES','img/home/home-entities/opportunities.jpg'), 'home-projects' => env('MODULE_HOME_IMAGE_PROJECTS','img/home/home-entities/projects.jpg'), 'home-spaces' => env('MODULE_HOME_IMAGE_SPACES','img/home/home-entities/spaces.jpg'), - 'home-register' => env('MODULE_HOME_IMAGE_REGISTER','img/home/home-register/background.jpg'), + 'home-register' => env('MODULE_HOME_IMAGE_REGISTER','img/home/home-register/background.jpg'), + 'report-bug-url' => 'https://forms.gle/jatbpe4ygHmmtsBs5', ] ]; \ No newline at end of file diff --git a/config/plugins.php b/config/plugins.php index c2ace1cc1d..2f0c7568d2 100644 --- a/config/plugins.php +++ b/config/plugins.php @@ -2,5 +2,7 @@ return [ 'plugins' => [ + "MultipleLocalAuth", + "Metabase" ] ]; \ No newline at end of file diff --git a/dev/config.d/0.main.php b/dev/config.d/0.main.php old mode 100644 new mode 100755 index f31999ac0f..cf49c44559 --- a/dev/config.d/0.main.php +++ b/dev/config.d/0.main.php @@ -5,9 +5,9 @@ return [ /* MAIN */ 'themes.active' => 'MapasCulturais\Themes\BaseV2', - 'app.mode' => $_ENV['APP_MODE'], + 'app.mode' => env('APP_MODE'), 'doctrine.isDev' => false, // deixe true somente se estiver trabalhando nos mapeamentos das entidades - + /* SELOS */ 'app.verifiedSealsIds' => [1], @@ -19,13 +19,13 @@ 'mergeStyles' => $__process_assets, 'process.js' => !$__process_assets ? - 'cp {IN} {OUT}': - 'terser {IN} --source-map --output {OUT} ', + 'cp {IN} {OUT}' : + 'terser {IN} --source-map --output {OUT} ', 'process.css' => !$__process_assets ? - 'cp {IN} {OUT}': - 'uglifycss {IN} > {OUT}', + 'cp {IN} {OUT}' : + 'uglifycss {IN} > {OUT}', 'publishFolderCommand' => 'cp -R {IN} {PUBLISH_PATH}{FILENAME}' ]), -]; \ No newline at end of file +]; diff --git a/dev/config.d/Metabase.php b/dev/config.d/Metabase.php new file mode 100644 index 0000000000..484f5288e6 --- /dev/null +++ b/dev/config.d/Metabase.php @@ -0,0 +1,281 @@ + [ + 'config' => [ + 'links' => [ + 'painel-agentes' => [ + 'link' => 'https://metabase.mapas.tec.br/public/dashboard/898173be-47ae-4987-894c-b7e54914539c', + 'text' => 'Saiba os números de agentes individuais cadastrados, quantos são criados mensalmente, por onde estão distribuídos no território e outras informações.', + 'title' => 'Painel sobre agentes individuais', + 'entity' => 'Agent' + ], + 'painel-espacos' => [ + 'link' => 'https://metabase.mapas.tec.br/public/dashboard/ea36c1b3-c3f3-4435-afc6-9faeea4c7c8f', + 'text' => 'Saiba os números de espaços cadastrados, quantos são criados mensalmente, por onde estão distribuídos no território e outras informações.', + 'title' => 'Painel sobre espaços', + 'entity' => 'Space' + ], + 'painel-oportunidades' => [ + 'link' => 'https://metabase.mapas.tec.br/public/dashboard/496d0b03-0476-4497-9a3d-719198cfe083', + 'text' => 'Tenha acesso ao número de oportunidades e editais cadastrados, a quantidade de pessoas participantes inscritas, o perfil demográfico e mais informações.', + 'title' => 'Painel sobre oportunidades', + 'entity' => 'Opportunity' + ], + ], + 'cards' => [ + 'home' => [ + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'icon'=> 'space', + 'label' => 'Espaços cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Space', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'icon'=> 'space', + 'label'=> 'Espaços certificados', + 'entity'=> 'MapasCulturais\\Entities\\Space', + 'query'=> [ + '@verified'=> 1 + ], + 'value'=> null + ] + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'icon'=> 'agent', + 'label' => 'Agentes cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'icon'=> 'agent', + 'label' => 'Agentes individuais', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(1)'], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'icon'=> 'agent', + 'label' => 'Agentes coletivos', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(2)'], + 'value' => null + ], + ] + ], + // opportunity + [ + 'type' => 'opportunity', + 'label' => 'Oportunidades', + 'icon'=> 'opportunity', + 'iconClass'=> 'opportunity__color', + 'panelLink'=> 'painel-oportunidades', + 'data'=> [ + [ + 'label' => 'Oportunidades criadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query' => [], + 'value' => null + ], + [ + 'label' => 'Oportunidades certificadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query'=> [ + '@verified'=> 1 + ], + 'value' => null + ], + ] + ] + + ], + 'entities' => [ + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'id' => 'espacos-cadastrados', + 'icon'=> 'space', + 'label' => 'Espaços cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Space', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'space', + 'label' => '', + 'icon'=> 'space', + 'iconClass'=> 'space__color', + 'panelLink'=> 'painel-espacos', + 'data'=> [ + [ + 'id' => 'espacos-certificados', + 'icon'=> 'space', + 'label'=> 'Espaços certificados', + 'entity'=> 'MapasCulturais\\Entities\\Space', + 'query'=> [ + '@verified'=> 1 + ], + 'value'=> null + ] + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-cadastrados', + 'icon'=> 'agent', + 'label' => 'Agentes cadastrados', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-individuais', + 'icon'=> 'agent', + 'label' => 'Agentes individuais', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(1)'], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-coletivos', + 'icon'=> 'agent', + 'label' => 'Agentes coletivos', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query' => ['type' => 'EQ(2)'], + 'value' => null + ], + ] + ], + [ + 'type' => 'agent', + 'label' => '', + 'icon'=> 'agent', + 'iconClass'=> 'agent__color', + 'panelLink'=> 'painel-agentes', + 'data'=> [ + [ + 'id' => 'agentes-cadastrados-7-dias', + 'icon'=> 'agent', + 'label' => 'Cadastrados nos últimos 7 dias', + 'entity' => 'MapasCulturais\\Entities\\Agent', + 'query'=> [ + '@select' => 'createTimestamp' + ], + 'value' => null + ], + ] + ], + [ + 'type' => 'opportunity', + 'label' => 'Oportunidades', + 'icon'=> 'opportunity', + 'iconClass'=> 'opportunity__color', + 'panelLink'=> 'painel-oportunidades', + 'data'=> [ + [ + 'icon'=> 'opportunity', + 'label' => 'Oportunidades criadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query' => [], + 'value' => null + ], + ] + ], + [ + 'type' => 'opportunity', + 'label' => 'Oportunidades certificadas', + 'icon'=> 'opportunity', + 'iconClass'=> 'opportunity__color', + 'panelLink'=> 'painel-oportunidades', + 'data'=> [ + [ + 'icon'=> 'opportunity', + 'label' => 'Oportunidades certificadas', + 'entity' => 'MapasCulturais\\Entities\\Opportunity', + 'query'=> [ + '@verified'=> 1 + ], + 'value' => null + ], + ] + ] + ] + ] + ] + ] +]; diff --git a/dev/config.d/logo.php b/dev/config.d/logo.php new file mode 100644 index 0000000000..c6236af47b --- /dev/null +++ b/dev/config.d/logo.php @@ -0,0 +1,18 @@ + 'Mapa Cultural', + + /* Segunda linha do logo configurável */ + 'logo.subtitle' => 'do Ceará', + + /* + Define a url da imagem da logo do site - Substituirá a logo padrão + */ + 'logo.image' => 'img/logo-Mapa-CE.png', + + /* Esconde o título e subtitulo */ + 'logo.hideLabel' => true, +]; diff --git a/dev/config.d/plugins.php b/dev/config.d/plugins.php index 895c9a8946..b7bd245cc8 100644 --- a/dev/config.d/plugins.php +++ b/dev/config.d/plugins.php @@ -2,6 +2,7 @@ return [ 'plugins' => [ - "MultipleLocalAuth" + "MultipleLocalAuth", + 'Metabase' ] ]; \ No newline at end of file diff --git a/dev/config.d/sharing.php b/dev/config.d/sharing.php new file mode 100755 index 0000000000..29f80b20ba --- /dev/null +++ b/dev/config.d/sharing.php @@ -0,0 +1,6 @@ + env('SHARE_IMAGE', 'img/share.png'), + 'share.image_twitter' => env('SHARE_IMAGE_TWITTER', 'img/share.png'), +]; diff --git a/dev/docker-compose.yml b/dev/docker-compose.yml index a071424185..1a8fe3eceb 100644 --- a/dev/docker-compose.yml +++ b/dev/docker-compose.yml @@ -1,4 +1,3 @@ -version: '2' services: mapas: build: @@ -22,7 +21,9 @@ services: - ../public:/var/www/html - ../scripts:/var/www/scripts - ../src:/var/www/src + - ../app:/var/www/app - ../var:/var/www/var + - ../vendor:/var/www/vendor - ../docker/development/router.php:/var/www/router.php @@ -31,13 +32,14 @@ services: - ./docker-data/assets:/var/www/html/assets - ./docker-data/public-files:/var/www/html/files - ./docker-data/private-files:/var/www/private-files - + + - ../.php-cs-fixer.php:/var/www/.php-cs-fixer.php links: - db - redis - sessions - + environment: - BUILD_ASSETS=0 - PENDING_PCACHE_RECREATION_INTERVAL=5 @@ -47,7 +49,7 @@ services: - MAILER_FROM=sysadmin@localhost - NUM_PROCESSES=2 - MC_UPDATES_PROCESSES=4 - + # chaves de teste do google recaptcha - GOOGLE_RECAPTCHA_SITEKEY=6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI - GOOGLE_RECAPTCHA_SECRET=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe @@ -61,15 +63,15 @@ services: - mailhog stdin_open: true tty: true - - mailhog: + + mailhog: image: mailhog/mailhog ports: - "8025:8025" redis: image: redis:6 - command: --maxmemory 256Mb --maxmemory-policy allkeys-lru + command: --maxmemory 256Mb --maxmemory-policy allkeys-lru sessions: image: redis:6 @@ -84,7 +86,6 @@ services: - POSTGRES_PASSWORD=mapas - POSTGRES_USER=mapas - POSTGRES_DB=mapas - ports: - "5432:5432" diff --git a/dev/watch.sh b/dev/watch.sh index 538d88d82f..7e0bc690a8 100755 --- a/dev/watch.sh +++ b/dev/watch.sh @@ -4,6 +4,6 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" CDIR=$( pwd ) cd $DIR -docker compose exec -w /var/www/src mapas bash -c "pnpm install --recursive && pnpm run watch" +docker-compose exec -w /var/www/src mapas bash -c "pnpm install --no-lockfile --recursive && pnpm run watch" cd $CDIR diff --git a/docker/Dockerfile b/docker/Dockerfile index a77add38bd..a4c00050e4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -74,6 +74,7 @@ COPY config /var/www/config COPY public /var/www/html COPY scripts /var/www/scripts COPY src /var/www/src +COPY app /var/www/app COPY var /var/www/var WORKDIR /var/www/src/ diff --git a/docker/common/config.d/0.main.php b/docker/common/config.d/0.main.php new file mode 100644 index 0000000000..85f91a4b35 --- /dev/null +++ b/docker/common/config.d/0.main.php @@ -0,0 +1,16 @@ + 'Mapas Culturais do Ceará', + 'app.siteDescription' => 'O Mapas Culturais é uma plataforma colaborativa que reúne informações sobre agentes, espaços, eventos, projetos culturais e oportunidades', + + + // Define o tema ativo no site principal. Deve ser informado o namespace do tema e neste deve existir uma classe Theme. + 'themes.active' => 'MapasCE', + + // Ids dos selos verificadores. Para utilizar múltiplos selos informe os ids separados por vírgula. + 'app.verifiedSealsIds' => '1', + +]; \ No newline at end of file diff --git a/docker/common/config.d/logo.php b/docker/common/config.d/logo.php new file mode 100644 index 0000000000..c6236af47b --- /dev/null +++ b/docker/common/config.d/logo.php @@ -0,0 +1,18 @@ + 'Mapa Cultural', + + /* Segunda linha do logo configurável */ + 'logo.subtitle' => 'do Ceará', + + /* + Define a url da imagem da logo do site - Substituirá a logo padrão + */ + 'logo.image' => 'img/logo-Mapa-CE.png', + + /* Esconde o título e subtitulo */ + 'logo.hideLabel' => true, +]; diff --git a/docker/common/config.d/maps.php b/docker/common/config.d/maps.php new file mode 100644 index 0000000000..145a6f4e49 --- /dev/null +++ b/docker/common/config.d/maps.php @@ -0,0 +1,16 @@ + [ + -14.2400732, //latitude + -53.1805018 // longitude + ], + + 'maps.zoom.default' => 5, + 'maps.zoom.approximate' => 14, + 'maps.zoom.precise' => 16, + 'maps.zoom.max' => 18, + 'maps.zoom.min' => 5, + + 'maps.tileServer' => '//{s}.tile.osm.org/{z}/{x}/{y}.png', +]; \ No newline at end of file diff --git a/docker/common/config.d/plugins.php b/docker/common/config.d/plugins.php new file mode 100644 index 0000000000..5af51696bd --- /dev/null +++ b/docker/common/config.d/plugins.php @@ -0,0 +1,8 @@ + [ + 'MultipleLocalAuth' => [ 'namespace' => 'MultipleLocalAuth' ], + 'SamplePlugin' => ['namespace' => 'SamplePlugin'], + ] +]; \ No newline at end of file diff --git a/docker/common/config.d/sharing.php b/docker/common/config.d/sharing.php new file mode 100644 index 0000000000..b65b6d3bf4 --- /dev/null +++ b/docker/common/config.d/sharing.php @@ -0,0 +1,6 @@ + env('SHARE_IMAGE', 'img/share-square.png'), + 'share.image_twitter' => env('SHARE_IMAGE_TWITTER', 'img/share-square.png'), +]; \ No newline at end of file diff --git a/docker/common/config.php b/docker/common/config.php new file mode 100644 index 0000000000..bd85d94ec6 --- /dev/null +++ b/docker/common/config.php @@ -0,0 +1,15 @@ + '\MultipleLocalAuth\Provider', + 'auth.config' => array( + 'salt' => env('AUTH_SALT', null), + 'timeout' => '24 hours', + 'strategies' => [ + 'Facebook' => array( + 'app_id' => env('AUTH_FACEBOOK_APP_ID', null), + 'app_secret' => env('AUTH_FACEBOOK_APP_SECRET', null), + 'scope' => env('AUTH_FACEBOOK_SCOPE', 'email'), + ), + + 'LinkedIn' => array( + 'api_key' => env('AUTH_LINKEDIN_API_KEY', null), + 'secret_key' => env('AUTH_LINKEDIN_SECRET_KEY', null), + 'redirect_uri' => $_APP_BASE_URL . 'autenticacao/linkedin/oauth2callback', + 'scope' => env('AUTH_LINKEDIN_SCOPE', 'r_emailaddress') + ), + 'Google' => array( + 'client_id' => env('AUTH_GOOGLE_CLIENT_ID', null), + 'client_secret' => env('AUTH_GOOGLE_CLIENT_SECRET', null), + 'redirect_uri' => $_APP_BASE_URL . 'autenticacao/google/oauth2callback', + 'scope' => env('AUTH_GOOGLE_SCOPE', 'email'), + ), + 'Twitter' => array( + 'app_id' => env('AUTH_TWITTER_APP_ID', null), + 'app_secret' => env('AUTH_TWITTER_APP_SECRET', null), + ), + + ] + ), +]; diff --git a/help/CREATE-ISSUES.md b/help/CREATE-ISSUES.md new file mode 100644 index 0000000000..3d5efc44ba --- /dev/null +++ b/help/CREATE-ISSUES.md @@ -0,0 +1,21 @@ +# Mapa Cultural do Ceará + +## Instruções para criar uma nova issue + +1 - Navegue até a aba de issues: + +Você pode acessar diretamente por aqui https://github.com/secultce/mapacultural/issues + +2 - Escolha o tipo de issue + +Clique em `New Issue` e logo após escolha o tipo de issue: +- Feature Request +- Bug Report + +3 - Preencha a descrição + +Adicione o máximo de informações possíveis, seguindo o template que foi carregado no formulário de criação. + +> Lembre-se que provavelmente outra pessoa é quem implementará a mudança, então, tal pessoa precisará do máximo de informações possíveis. +> +> Mesmo que seja você quem for implementar, ainda assim o máximo de detalhes é importante para fins de documentação e auditoria. diff --git a/help/CREATE-PULL-REQUESTS.md b/help/CREATE-PULL-REQUESTS.md new file mode 100644 index 0000000000..0a92a5651e --- /dev/null +++ b/help/CREATE-PULL-REQUESTS.md @@ -0,0 +1,47 @@ +# Mapa Cultural do Ceará + +## Instruções para Criação de Pull Requests + +1 - Escolha uma issue + +Acesse e escolha em qual issue quer trabalhar + +2 - Atualize o seu branch principal (develop) + +Para isso você já deve ter uma instalação local desse repositório. + +Caso não possua uma instalação, [veja aqui como instalar](./INSTALL.md) + +Agora, dentro do diretório atualize seu branch: +````shell +git pull origin develop +```` + +3 - Crie um branch para a resolução da issue + +```shell +git checkout -b feat/resolve-tal-coisa +``` + +4 - Faça os códigos da implementação + +Siga as regras da [PSR-12](https://www.php-fig.org/psr/psr-12/), bem como, boas práticas de programação PHP: +- Kiss +- Dry +- Clean Code +- Design Patterns +- etc + +5 - Execute os testes e o CS-FIXER + +Para garantir que você não quebrou nada, e que o código está de acordo com as regras da aplicação, execute os comandos de STYLE CODE e TESTS que se encontra [nessa seção da documentação](../app/README.md#console-commands) + +6 - Faça o commit + +A regra, para melhor organização do repositório, é apenas 1 (um) commit por Pull Request + +7 - Abra o pull request + +Abra o pull request para o projeto `secultce/mapacultural` e na descrição do PR informe se há algo a ser levado em consideração, bem como, especifique qual issue aquele pull request está atrelado. + +> Pronto, agora é só esperar o seu PR ter 2 approves \ No newline at end of file diff --git a/help/INSTALL.md b/help/INSTALL.md new file mode 100644 index 0000000000..b5e0b5b48a --- /dev/null +++ b/help/INSTALL.md @@ -0,0 +1,43 @@ +# Mapa Cultural do Ceará + +## Instruções para instalação + +1 - clone o repositório: + +```shell +git clone https://github.com/secultce/mapacultural.git +``` + +ou + +```shell +git clone git@github.com:secultce/mapacultural.git +``` + +2 - Configure a variável BASE_URL do arquivo .env + +``` +BASE_URL=http://ip-da-sua-máquina/ +``` +3 - Suba os Containers + +``` +docker compose up -d +``` +4 - Verifique os logs + +``` +docker compose logs -f +``` + +5 - Abra o navegador com o endereço usado no BASE_URL que foi utilizado no passo 2. + +Login: +``` +Admin@local +``` + +Senha: +``` +mapas123 +``` \ No newline at end of file diff --git a/help/README.md b/help/README.md new file mode 100644 index 0000000000..34a7888b61 --- /dev/null +++ b/help/README.md @@ -0,0 +1,194 @@ +[![Join the chat at https://t.me/joinchat/WCYOkiRbAWmxQM2y](https://patrolavia.github.io/telegram-badge/chat.png)](https://t.me/joinchat/WCYOkiRbAWmxQM2y) + +# Mapas Culturais do Ceara + +Em julho de 2013, agentes culturais de vários países da América Latina e do Brasil se reuniram para discutir a criação de uma ferramenta de mapeamento de iniciativas culturais e gestão cultural. Desse encontro surgiram as bases para a criação de Mapas Culturais, um software livre que permite o aprimoramento da gestão cultural dos municípios e estados. + +Mapas Culturais é uma plataforma colaborativa que reúne informações sobre agentes, espaços, eventos e projetos culturais, fornecendo ao poder público uma radiografia da área de cultura e ao cidadão um mapa de espaços e eventos culturais da região. A plataforma está alinhada ao Sistema Nacional de Informação e Indicadores Culturais do Ministério da Cultura (SNIIC) e contribui para a realização de alguns dos objetivos do Plano Nacional de Cultura. + +A plataforma já está em uso em diversos municipios, estados, no governo federal em diversos projetos do ministério da cultura e até mesmo fora do Brasil no Uruguai. Instalações recentes: + + +### Instalações em nível federal ou internacional +- IberculturaViva - https://mapa.iberculturaviva.org/ +- Mapa Uruguai - http://culturaenlinea.uy/ +- SNIIC - http://mapas.cultura.gov.br/ +- Museus - http://museus.cultura.gov.br/ +- Sistema Nacional de Bibliotecas Públicas - http://bibliotecas.cultura.gov.br/ +- Cultura Viva - http://culturaviva.gov.br/ +- Pontos de Memória - http://pontosdememoria.cultura.gov.br/ + +### Instalações estaduais +- Distrito Federal - http://mapa.cultura.df.gov.br/ +- Ceará - https://mapacultural.secult.ce.gov.br/ +- Espírito Santo - https://mapa.cultura.es.gov.br/ +- Goiás - https://mapagoiano.cultura.go.gov.br/ +- Maranhão - http://ma.mapas.cultura.gov.br/ +- Mato Grosso - https://mapas.mt.gov.br/ +- Mato Grosso do Sul - https://www.mapacultural.ms.gov.br/ +- Pará - https://mapacultural.pa.gov.br/ +- Paraíba - http://pb.mapas.cultura.gov.br/ +- Pernambuco - https://www.mapacultural.pe.gov.br/ +- Sergipe - http://mapas.cultura.se.gov.br/ +- Tocantins - http://mapa.cultura.to.gov.br/ +### Instalações municipais +- Ilheus - http://ilheus.ba.mapas.cultura.gov.br/ +- Camaçari - https://mapacultural.camacari.ba.gov.br/ +- Senhor do Bonfim - http://senhordobonfim.ba.mapas.cultura.gov.br/ +- Chorozinho - https://mapacultural.chorozinho.ce.gov.br/ +- Sobral - https://cultura.sobral.ce.gov.br/ +- Juazeiro do Norte - https://mapacultural.juazeiro.ce.gov.br/ +- Belo Horizonte - http://mapaculturalbh.pbh.gov.br/ +- Santa Luzia - http://mapacultural.santaluzia.mg.gov.br/ +- Ipatinga - http://mapacultural.ipatinga.mg.gov.br/ +- Varzea Grande - http://varzeagrande.mt.mapas.cultura.gov.br/ +- João Pessoa - http://jpcultura.joaopessoa.pb.gov.br/ +- Londrina - https://londrinacultura.londrina.pr.gov.br/ +- Foz do Iguaçu - http://mapadaculturafoz.pmfi.pr.gov.br/ +- Maringa - http://maringacultura.maringa.pr.gov.br:38081/ +- Rio das Ostras - http://mapadacultura.riodasostras.rj.gov.br/ +- Laguna - http://laguna.sc.mapas.cultura.gov.br/ +- Novo Hamburgo - http://mapacultural.novohamburgo.rs.gov.br/ +- Rio Grande - http://mapacultural.riogrande.rs.gov.br/ +- São Paulo - http://spcultura.prefeitura.sp.gov.br/ +- Santo André - http://culturaz.santoandre.sp.gov.br/ +- São Caetano do Sul - http://mapacultural.saocaetanodosul.sp.gov.br/ +- Osasco - http://osasco.sp.mapas.cultura.gov.br/ +- Franco da Rocha - http://francodarocha.sp.mapas.cultura.gov.br/ +- Guaruja - http://mapadacultura.guaruja.sp.gov.br/ +- Varzea Paulista - http://janelacultural.varzeapaulista.sp.gov.br/ +- Itu - http://mapacultural.itu.sp.gov.br/ +- Guarulhos - http://grucultura.guarulhos.sp.gov.br/ +- Itapetininga - http://mapacultural.itapetininga.sp.gov.br/ + +## Sobre a aplicação +Mapas Culturais é uma aplicação web server-side baseada em linguagem PHP e banco de dados Postgres, entre outras tecnologias e componentes, que propicia um ambiente virtual para mapeamento, divulgação e gestão de ativos culturais. + +## Projetos correlatos +* [Mapas Cuturais Base Project](https://github.com/hacklabr/mapasculturais-app) - Repositório de projeto base para novas instalações. +* [Multiple Local Auth](https://github.com/mapasculturais/mapasculturais-MultipleLocalAuth) - Plugin de autenticação local + oauth. +* [Mapas SDK](https://github.com/centroculturalsp/MapasSDK) +* [Mapas Culturais APP](https://github.com/hacklabr/mapasculturais-app) +* [Cultural Magazine Theme](https://github.com/hacklabr/cultural) + +## Instalação +A maneira mais simples e segura para instalar o Mapas Culturais é utilizando o [Mapas Culturais Base Project](https://github.com/mapasculturais/mapasculturais-base-project) como base para a criação de um repositório próprio para o seu projeto, que reunirá o tema, os plugins e as configurações da aplicação. O Mapas Culturais Base Project utiliza o Docker e o Docker Composer para rodar a aplicação, facilitando os processos de deploy e de atualizaçao. + +- [Instalação utilizando o Base Project ](https://github.com/mapasculturais/mapasculturais-base-project#readme) - **RECOMENDADO** +## Documentação + +Uma [nova documentação](https://mapasculturais.gitbook.io/bem-vindo-a-a-documentacao-do-mapas/) está sendo escrita no gitbook, organizada em três seções: +- [Documentação para usuários](https://mapasculturais.gitbook.io/documentacao-para-usuarios/) +- [Documentação para desenvolvedores](https://mapasculturais.gitbook.io/documentacao-para-desenvolvedores/formacao-para-desenvolvedores/) +- [Documentação para devops](https://mapasculturais.gitbook.io/documentacao-para-devops/instalacao/) + +## Documentação Legada + +A documentação pode ser navegada no endereço (http://docs.mapasculturais.org) + +Toda documentação da aplicação está na pasta [documentation](documentation). Principais referências: +- [API](http://docs.mapasculturais.org/apidoc/index.html?doctype=api) +- [API - exemplos](documentation/docs/mc_config_api.md) +- [Guia do desenvolvedor](documentation/docs/mc_developer_guide.md) +- [Como contribuir](documentation/docs/mc_developer_contribute.md) +- [Desenvolver um novo tema](documentation/docs/mc_developer_theme.md) +- [Importação de arquivos de dados geoespaciais (Shapefiles)](documentation/docs/mc_deploy_shapefiles.md) +- [Deploy diretamente no sistema operacional](https://docs.mapasculturais.org/mc_deploy/) - **NÃO RECOMENDADO** +- [Habilitar um novo tema](documentation/docs/mc_deploy_theme.md) + +### [Software] Requisitos para Instalação +Lista dos principais softwares que compõe e aplicação. Maiores detalhes, ver documentação de [instalação](documentation/docs/mc_deploy.md) ou [guia do desenvolvedor](documentation/docs/mc_developer_guide.md). + +- [Ubuntu Server >= 18.04](http://www.ubuntu.com) ou [Debian Server >= 10](https://www.debian.org.) +- [PHP = 7.2](http://php.net) + - [php-gd](http://php.net/manual/pt_BR/book.image.php) + - [php-cli](https://packages.debian.org/pt-br/jessie/php5-cli) + - [php-json](http://php.net/manual/pt_BR/book.json.php) + - [php-curl](http://php.net/manual/pt_BR/book.curl.php) + - [php-pgsql](http://php.net/manual/pt_BR/book.pgsql.php) + - [php-apc](http://php.net/manual/pt_BR/book.apc.php) +- [Composer](https://getcomposer.org/) +- [PostgreSQL >= 10](http://www.postgresql.org/) +- [Postgis >= 2.2](http://postgis.net) +- [Node.JS >= 8.x](https://nodejs.org/en/) + - [NPM](https://www.npmjs.com/) + - [Terser](https://terser.org/) + - [UglifyCSS](https://www.npmjs.com/package/gulp-uglifycss) +- [Ruby](https://www.ruby-lang.org/pt) + - [Sass gem](https://rubygems.org/gems/sass/versions/3.4.22) + +### [Hardware] Requisitos para instalação + +Para instalações de pequeno/medio porte nas quais o número de entidades, isto é, número de agentes, espaços, projetos e evento,giram em torno de 2000 ativos, recomenda-se o mínimo de recursos para um servidor (aplicação + base de dados): + +* 2 cores de CPU; +* 2gb de RAM; +* 50mbit de rede; + +Desejável: + +* 4 cores de CPU; +* 4gb de RAM; +* 100mbit de rede; + +Para instalações em cidades de grande porte onde o número de entidades, isto é, número de agentes, espaços, projetos e evento, giram em torno de dezenas de milhares de ativos de cada, recomenda-se o mínimo de recursos para um servidor: + +* 4 cores de CPU +* 4gb de RAM +* 100mbit de rede + +Recomendado: +* 8 cores de CPU +* 8gb de RAM +* 500mbit de rede + +Vale lembrar que os requisitos de hardware podem variar de acordo com a latência da rede, velocidade dos cores dos cpus, uso de proxies, entre outros fatores. Recomendamos aos sysadmin da rede em que a aplicação será instalada um monitoramento de tráfego e uso durante o período de 6 meses a 1 ano para avaliação de cenário de uso. + +### Canais de comunicação + +* [Lista de discussão](https://groups.google.com/forum/?hl=en#!forum/mapas-culturais) +* Telegram: [![Join the chat at https://t.me/joinchat/WCYOkiRbAWmxQM2y](https://patrolavia.github.io/telegram-badge/chat.png)](https://t.me/joinchat/WCYOkiRbAWmxQM2y) + +### Git Hook +Crie um arquivo chamado `pre-commit` no diretório `.git/hooks` e conceda permissão de execução com `sudo chmod +x .git/hooks/pre-commit`. Este hook garante a conformidade do código com o padrão estabelecido para o projeto. +```bash +#!/bin/bash + +echo "Before to commit" + +GREEN='\033[0;32m' +RED='\033[0;31m' +NC='\033[0m' + +PHP_CS_FIXER='docker compose -f dev/docker-compose.yml exec -T mapas vendor/bin/php-cs-fixer' + +check_php_cs_fixer() { + if ! $PHP_CS_FIXER --version &> /dev/null; then + echo -e "${RED}Não foi encontrado o php-cs-fixer.${NC}" + exit 1 + fi +} + +run_php_cs_fixer() { + echo -e "${GREEN}Executando php-cs-fixer no dirétorio app...${NC}" + $PHP_CS_FIXER --dry-run -vvv --diff fix --config=.php-cs-fixer.php "app" +} + +check_php_cs_fixer +run_php_cs_fixer + +exit_code=$? + +if [ $exit_code -eq 0 ]; then + echo -e "${GREEN}php-cs-fixer concluído sem erros.${NC}" +else + echo -e "${RED}ERROR: Abortando o commit.\nO php-cs-fixer encontrou problemas nos arquivos modificados.${NC}" +fi + +exit $exit_code +``` + +### Licença de uso e desenvolvimento + +Mapas Culturais é um software livre licenciado com [GPLv3](http://gplv3.fsf.org). + diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000000..b8b2cef1c1 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,17 @@ + + + + + tests/unit + + + + tests/integration + + + + + + diff --git a/tests/src/files/.gitignore b/public/docs/v1/assets/css/styles.css similarity index 100% rename from tests/src/files/.gitignore rename to public/docs/v1/assets/css/styles.css diff --git a/public/docs/v1/assets/js/events.js b/public/docs/v1/assets/js/events.js new file mode 100644 index 0000000000..e8c10229d6 --- /dev/null +++ b/public/docs/v1/assets/js/events.js @@ -0,0 +1,24 @@ +const mountSwagger = new Promise((resolve, reject) => { + resolve(SwaggerUIBundle({ + url: '/docs/v1/openapi.yaml', + dom_id: '#swagger-ui', + deepLinking: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl, + ], + layout: "StandaloneLayout", + })); +}) + +window.onload = function () { + document.querySelector('.topbar').style.display = 'none'; + + mountSwagger + .then((res) => { + window.ui = res; + }); +}; \ No newline at end of file diff --git a/public/docs/v1/components/common-types/date.yaml b/public/docs/v1/components/common-types/date.yaml new file mode 100644 index 0000000000..f6d05dc165 --- /dev/null +++ b/public/docs/v1/components/common-types/date.yaml @@ -0,0 +1,12 @@ +type: object +properties: + date: + type: string + example: '2023-12-31 23:59:59.00000' + timezone_type: + type: integer + example: 3 + timezone: + type: string + example: America/Fortaleza +description: Um objeto data \ No newline at end of file diff --git a/public/docs/v1/components/parameters/count.yaml b/public/docs/v1/components/parameters/count.yaml new file mode 100644 index 0000000000..864a8e603a --- /dev/null +++ b/public/docs/v1/components/parameters/count.yaml @@ -0,0 +1,7 @@ +name: 'count' +in: query +schema: + example: +required: false +description: Faz com que seja retornado a quantidade de registros encontrados na consulta. +example: '' \ No newline at end of file diff --git a/public/docs/v1/components/parameters/from.yaml b/public/docs/v1/components/parameters/from.yaml new file mode 100644 index 0000000000..9d71d22391 --- /dev/null +++ b/public/docs/v1/components/parameters/from.yaml @@ -0,0 +1,7 @@ +name: '@from' +in: query +schema: + type: string + format: date +description: Data inicial do período. +example: '2021-01-01' \ No newline at end of file diff --git a/public/docs/v1/components/parameters/id.yaml b/public/docs/v1/components/parameters/id.yaml new file mode 100644 index 0000000000..fe0639d331 --- /dev/null +++ b/public/docs/v1/components/parameters/id.yaml @@ -0,0 +1,8 @@ +name: 'id' +in: query +schema: + type: string + example: EQ(2) +required: true +description: Um campo que permite personalizar o filtro da consulta, mas precisa passar EQ(numero) para buscar uma entity em que o ID seja igual aquele numero passado como parametro +example: 'EQ(123)' \ No newline at end of file diff --git a/public/docs/v1/components/parameters/limit.yaml b/public/docs/v1/components/parameters/limit.yaml new file mode 100644 index 0000000000..529326bf76 --- /dev/null +++ b/public/docs/v1/components/parameters/limit.yaml @@ -0,0 +1,7 @@ +name: '@limit' +in: query +schema: + type: integer +required: false +description: Um inteiro que limita a quantidade de registro retornadas +example: 20 \ No newline at end of file diff --git a/public/docs/v1/components/parameters/offset.yaml b/public/docs/v1/components/parameters/offset.yaml new file mode 100644 index 0000000000..0e3971b90b --- /dev/null +++ b/public/docs/v1/components/parameters/offset.yaml @@ -0,0 +1,6 @@ +name: '@offset' +in: query +schema: + type: integer +required: false +description: Offset para deslocamento da quantidade de registros \ No newline at end of file diff --git a/public/docs/v1/components/parameters/order.yaml b/public/docs/v1/components/parameters/order.yaml new file mode 100644 index 0000000000..1feb516ff9 --- /dev/null +++ b/public/docs/v1/components/parameters/order.yaml @@ -0,0 +1,7 @@ +name: '@order' +in: query +schema: + type: string +required: false +description: Um campo que permite personalizar a ordem do itens retornados +example: 'createTimestamp+DESC' \ No newline at end of file diff --git a/public/docs/v1/components/parameters/page.yaml b/public/docs/v1/components/parameters/page.yaml new file mode 100644 index 0000000000..a7bddf4c41 --- /dev/null +++ b/public/docs/v1/components/parameters/page.yaml @@ -0,0 +1,7 @@ +name: '@page' +in: query +schema: + type: integer +required: false +description: Um inteiro que identifica a página retornada +example: 1 \ No newline at end of file diff --git a/public/docs/v1/components/parameters/select.yaml b/public/docs/v1/components/parameters/select.yaml new file mode 100644 index 0000000000..feb3a8e415 --- /dev/null +++ b/public/docs/v1/components/parameters/select.yaml @@ -0,0 +1,13 @@ +name: '@select' +in: query +schema: + type: string +required: false +description: Um campo que permite personalizar os dados que vão retornar na resposta +examples: + example1: + value: 'id,name,status' + summary: Primeiro exemplo + example2: + value: '*' + summary: Segundo exemplo \ No newline at end of file diff --git a/public/docs/v1/components/parameters/space-id.yaml b/public/docs/v1/components/parameters/space-id.yaml new file mode 100644 index 0000000000..9e2f0393d9 --- /dev/null +++ b/public/docs/v1/components/parameters/space-id.yaml @@ -0,0 +1,8 @@ +name: 'spaceId' +in: query +schema: + type: string + example: 1 +required: true +description: Este é um campo de filtro personalizável para a consulta. Ele requer a entrada de um número, que será usado para buscar um espaço cujo ID corresponda ao número fornecido. +example: '1' \ No newline at end of file diff --git a/public/docs/v1/components/parameters/space.yaml b/public/docs/v1/components/parameters/space.yaml new file mode 100644 index 0000000000..73e9a73d0d --- /dev/null +++ b/public/docs/v1/components/parameters/space.yaml @@ -0,0 +1,7 @@ +name: 'space:id' +in: query +schema: + type: string + example: EQ(2) +required: false +description: Realizar a pesquisa das ocorrências de eventos por espaço. \ No newline at end of file diff --git a/public/docs/v1/components/parameters/to.yaml b/public/docs/v1/components/parameters/to.yaml new file mode 100644 index 0000000000..ec928d3485 --- /dev/null +++ b/public/docs/v1/components/parameters/to.yaml @@ -0,0 +1,8 @@ +name: '@to' +in: query +schema: + type: string + format: date +required: false +description: "Data final do período." +example: '2021-02-01' diff --git a/public/docs/v1/components/paths/agent/add-role.yaml b/public/docs/v1/components/paths/agent/add-role.yaml new file mode 100644 index 0000000000..9102769bb8 --- /dev/null +++ b/public/docs/v1/components/paths/agent/add-role.yaml @@ -0,0 +1,37 @@ +post: + tags: + - Agentes + summary: Define uma função para um agente + description: Define uma função para um agente + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente + requestBody: + content: + application/json: + schema: + type: object + properties: + role: + type: string + example: "saasSuperAdmin" + description: "Nome da função" + id: + type: integer + example: 1 + description: "ID da função" + responses: + '200': + description: Success + content: + application/json: + schema: + type: boolean + example: true + description: "Função definida com sucesso" + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/agent/archive.yaml b/public/docs/v1/components/paths/agent/archive.yaml new file mode 100644 index 0000000000..301b9e5d40 --- /dev/null +++ b/public/docs/v1/components/paths/agent/archive.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Agentes + summary: Arquiva um agente + description: Arquiva um agente que foi criado + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente + responses: + '200': + $ref: '../../responses/agent/archive.yaml' + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/agent/create.yaml b/public/docs/v1/components/paths/agent/create.yaml new file mode 100644 index 0000000000..2117e6a88b --- /dev/null +++ b/public/docs/v1/components/paths/agent/create.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Agentes + summary: Cria um agente + description: Cria um agente + requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/agent/post-minimal.yaml' + responses: + '200': + description: O agente criado + content: + application/json: + schema: + $ref: '../../schemas/agent.yaml' diff --git a/public/docs/v1/components/paths/agent/delete.yaml b/public/docs/v1/components/paths/agent/delete.yaml new file mode 100644 index 0000000000..ef5d267250 --- /dev/null +++ b/public/docs/v1/components/paths/agent/delete.yaml @@ -0,0 +1,48 @@ +tags: + - Agentes +summary: Apaga um agente +description: Apaga um agente +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente +responses: + '200': + description: Informações sobre o agente apagado + content: + application/json: + schema: + type: object + properties: + '@entityType': + type: string + example: agent + description: Tipo de entidade + id: + type: integer + example: 5 + description: Um id numérico que representa o agente + name: + type: string + example: "Nome do agente" + description: Um texto que representa o nome do agente + type: + type: object + properties: + id: + type: integer + example: 1 + description: ID do tipo de agente (1 - Individual, 2 - Coletivo) + name: + type: string + example: "Individual" + description: Nome do tipo de agente + status: + type: integer + example: -10 + description: Status do agente + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/agent/describe.yaml b/public/docs/v1/components/paths/agent/describe.yaml new file mode 100644 index 0000000000..4ec77f74c3 --- /dev/null +++ b/public/docs/v1/components/paths/agent/describe.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Agentes + summary: Recupera os detalhes de mapeamento da entity Agente + description: Recupera os detalhes de mapeamento da entity Agente + responses: + '200': + description: Success + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/describe-item.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/agent/find-one.yaml b/public/docs/v1/components/paths/agent/find-one.yaml new file mode 100644 index 0000000000..622efaf5e9 --- /dev/null +++ b/public/docs/v1/components/paths/agent/find-one.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Agentes + summary: Recupera um único agente + description: Recuperar um único agente + parameters: + - $ref: '../../parameters/id.yaml' + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '../../schemas/agent.yaml' diff --git a/public/docs/v1/components/paths/agent/find.yaml b/public/docs/v1/components/paths/agent/find.yaml new file mode 100644 index 0000000000..564978de70 --- /dev/null +++ b/public/docs/v1/components/paths/agent/find.yaml @@ -0,0 +1,23 @@ +get: + tags: + - Agentes + summary: Recupera a lista de agentes + description: Recupera a lista de agentes + parameters: + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Um array com todas os agentes, caso não tenha o parametro @select na busca, ele trará apenas id e @entityType + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '../../schemas/agent.yaml' + - type: object + properties: + '@entityType': + type: string + example: agent + description: Um texto que representa qual a entity é retornada diff --git a/public/docs/v1/components/paths/agent/get-type-groups.yaml b/public/docs/v1/components/paths/agent/get-type-groups.yaml new file mode 100644 index 0000000000..d75fd35de0 --- /dev/null +++ b/public/docs/v1/components/paths/agent/get-type-groups.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Agentes + summary: Recupera uma lista de tipos de agentes de forma agrupada + description: Recupera uma lista de tipos de agentes de forma agrupada + responses: + '200': + description: Sucesso + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/agent-type-groups.yaml' diff --git a/public/docs/v1/components/paths/agent/get-types.yaml b/public/docs/v1/components/paths/agent/get-types.yaml new file mode 100644 index 0000000000..23c76e6e13 --- /dev/null +++ b/public/docs/v1/components/paths/agent/get-types.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Agentes + summary: Recupera a lista de tipos de agentes + description: Recupera a lista de tipos de agentes + responses: + '200': + description: Um array com os vários de tipos que um agente pode ter + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/agent-type.yaml' diff --git a/public/docs/v1/components/paths/agent/patch.yaml b/public/docs/v1/components/paths/agent/patch.yaml new file mode 100644 index 0000000000..ba79db5011 --- /dev/null +++ b/public/docs/v1/components/paths/agent/patch.yaml @@ -0,0 +1,25 @@ +tags: + - Agentes +summary: Atualiza um agente +description: Atualiza parcialmente um agente +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/agent/patch.yaml' +responses: + '200': + description: O agente atualizado + content: + application/json: + schema: + $ref: '../../schemas/agent.yaml' + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/agent/publish.yaml b/public/docs/v1/components/paths/agent/publish.yaml new file mode 100644 index 0000000000..53461642e5 --- /dev/null +++ b/public/docs/v1/components/paths/agent/publish.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Agentes + summary: Publica um agente + description: Publica um agente que foi criado + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente + responses: + '200': + $ref: '../../responses/agent/publish.yaml' + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/agent/put.yaml b/public/docs/v1/components/paths/agent/put.yaml new file mode 100644 index 0000000000..68d86e1935 --- /dev/null +++ b/public/docs/v1/components/paths/agent/put.yaml @@ -0,0 +1,25 @@ +tags: + - Agentes +summary: Atualiza um agente +description: Atualiza completamente um agente +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/agent/patch.yaml' +responses: + '200': + description: O agente atualizado + content: + application/json: + schema: + $ref: '../../schemas/agent.yaml' + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/agent/remove-role.yaml b/public/docs/v1/components/paths/agent/remove-role.yaml new file mode 100644 index 0000000000..2531be5fca --- /dev/null +++ b/public/docs/v1/components/paths/agent/remove-role.yaml @@ -0,0 +1,37 @@ +delete: + tags: + - Agentes + summary: Remover função de um agente + description: Remove uma função de um agente + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente + requestBody: + content: + application/json: + schema: + type: object + properties: + role: + type: string + example: "saasSuperAdmin" + description: "Nome da função" + id: + type: integer + example: 1 + description: "ID da função" + responses: + '200': + description: Success + content: + application/json: + schema: + type: boolean + example: true + description: "Retorna true se a função foi removida com sucesso" + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/agent/route-single-id.yaml b/public/docs/v1/components/paths/agent/route-single-id.yaml new file mode 100644 index 0000000000..4fd0ab1884 --- /dev/null +++ b/public/docs/v1/components/paths/agent/route-single-id.yaml @@ -0,0 +1,8 @@ +tags: + - Agentes +patch: + $ref: './patch.yaml' +put: + $ref: './put.yaml' +delete: + $ref: './delete.yaml' diff --git a/public/docs/v1/components/paths/agent/set-as-user-profile.yaml b/public/docs/v1/components/paths/agent/set-as-user-profile.yaml new file mode 100644 index 0000000000..633fded528 --- /dev/null +++ b/public/docs/v1/components/paths/agent/set-as-user-profile.yaml @@ -0,0 +1,16 @@ +post: + tags: + - Agentes + summary: Atualiza o profile do usuário logado para o profile atual + description: Atualiza o profile do usuário logado para o profile atual + responses: + '200': + description: Success + content: + application/json: + schema: + type: boolean + example: true + description: "Profile atualizado com sucesso" + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/agent/undelete.yaml b/public/docs/v1/components/paths/agent/undelete.yaml new file mode 100644 index 0000000000..65fa8d970d --- /dev/null +++ b/public/docs/v1/components/paths/agent/undelete.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Agentes + summary: Restaura um agente + description: Restaura um agente após ser deletado + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do agente + responses: + '200': + $ref: '../../responses/agent/undelete.yaml' + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/event/create.yaml b/public/docs/v1/components/paths/event/create.yaml new file mode 100644 index 0000000000..cc18e5b069 --- /dev/null +++ b/public/docs/v1/components/paths/event/create.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Eventos + summary: Cria um evento + description: Cria um novo evento com as informações fornecidas + requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/event/post-minimal.yaml' + responses: + '201': + description: Evento criado com sucesso + content: + application/json: + schema: + $ref: '../../schemas/event.yaml' diff --git a/public/docs/v1/components/paths/event/delete.yaml b/public/docs/v1/components/paths/event/delete.yaml new file mode 100644 index 0000000000..306f056513 --- /dev/null +++ b/public/docs/v1/components/paths/event/delete.yaml @@ -0,0 +1,37 @@ +tags: + - Eventos +summary: Apaga um evento +description: Apaga um evento baseado no ID fornecido. +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador único do evento. +responses: + '200': + description: Informações sobre o evento apagado. + content: + application/json: + schema: + type: object + properties: + '@entityType': + type: string + example: event + description: Tipo de entidade. + id: + type: integer + example: 10 + description: Um id numérico que representa o evento. + name: + type: string + example: "Festival de Verão" + description: Nome do evento. + status: + type: integer + example: -10 + description: Status do evento após ser apagado. + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/event/describe.yaml b/public/docs/v1/components/paths/event/describe.yaml new file mode 100644 index 0000000000..acd7418706 --- /dev/null +++ b/public/docs/v1/components/paths/event/describe.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Eventos + summary: Recupera os detalhes de mapeamento da entity Eventos + description: Recupera os detalhes de mapeamento, incluindo os campos disponíveis e os tipos de dados, da entity Eventos. + responses: + '200': + description: Sucess + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/event-describe.yaml' diff --git a/public/docs/v1/components/paths/event/find-by-location.yaml b/public/docs/v1/components/paths/event/find-by-location.yaml new file mode 100644 index 0000000000..71d8399568 --- /dev/null +++ b/public/docs/v1/components/paths/event/find-by-location.yaml @@ -0,0 +1,32 @@ +get: + tags: + - Eventos + summary: Recupera a lista de eventos por localização + description: Busca os eventos por localizção. + parameters: + - $ref: '../../parameters/space-id.yaml' + - name: space:atributo + in: query + description: Realizar a pesquisa das ocorrências de eventos por espaço. + required: false + schema: + type: string + - $ref: '../../parameters/from.yaml' + - $ref: '../../parameters/to.yaml' + - name: _geoLocation + in: query + description: Localização geográfica do evento. + required: false + schema: + type: string + - $ref: '../../parameters/count.yaml' + responses: + '200': + description: Lista de eventos do local. + content: + application/json: + schema: + type: array + example: [] + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/event/find-by-space.yaml b/public/docs/v1/components/paths/event/find-by-space.yaml new file mode 100644 index 0000000000..bf317061f8 --- /dev/null +++ b/public/docs/v1/components/paths/event/find-by-space.yaml @@ -0,0 +1,20 @@ +get: + tags: + - Eventos + summary: Recupera a lista de eventos de um espaço + description: Busca os eventos de um espaço. + parameters: + - $ref: '../../parameters/space-id.yaml' + - $ref: '../../parameters/from.yaml' + - $ref: '../../parameters/to.yaml' + - $ref: '../../parameters/count.yaml' + responses: + '200': + description: Lista de eventos do espaço. + content: + application/json: + schema: + type: array + example: [] + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/event/find-occurrences.yaml b/public/docs/v1/components/paths/event/find-occurrences.yaml new file mode 100644 index 0000000000..f5ee3cc6a6 --- /dev/null +++ b/public/docs/v1/components/paths/event/find-occurrences.yaml @@ -0,0 +1,23 @@ +get: + tags: + - Eventos + summary: Ocorrências de um evento + description: Retorna as ocorrências de um evento. + parameters: + - $ref: '../../parameters/from.yaml' + - $ref: '../../parameters/to.yaml' + - $ref: '../../parameters/limit.yaml' + - $ref: '../../parameters/offset.yaml' + - $ref: '../../parameters/page.yaml' + - $ref: '../../parameters/space.yaml' + responses: + '200': + description: Ocorrências do evento. + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/event-find-occurrences.yaml' + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/event/find-one.yaml b/public/docs/v1/components/paths/event/find-one.yaml new file mode 100644 index 0000000000..e29f27244b --- /dev/null +++ b/public/docs/v1/components/paths/event/find-one.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Eventos + summary: Recupera um único evento + description: Recupera um único evento. + parameters: + - $ref: '../../parameters/id.yaml' + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Sucess + content: + application/json: + schema: + $ref: '../../schemas/event.yaml' diff --git a/public/docs/v1/components/paths/event/find.yaml b/public/docs/v1/components/paths/event/find.yaml new file mode 100644 index 0000000000..68cfd6a0c4 --- /dev/null +++ b/public/docs/v1/components/paths/event/find.yaml @@ -0,0 +1,23 @@ +get: + tags: + - Eventos + summary: Recupera a lista de eventos + description: Recupera a lista de eventos + parameters: + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Um array com todos os eventos, caso não tenha o parametro @select na busca, ele trará apenas id e @entityType + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '../../schemas/event.yaml' + - type: object + properties: + '@entityType': + type: string + example: seal + description: Um texto que representa qual a entity é retornada \ No newline at end of file diff --git a/public/docs/v1/components/paths/event/get-type-groups.yaml b/public/docs/v1/components/paths/event/get-type-groups.yaml new file mode 100644 index 0000000000..60e5161d4e --- /dev/null +++ b/public/docs/v1/components/paths/event/get-type-groups.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Eventos + summary: Recupera uma lista de tipos de eventos de forma agrupada + description: Recupera uma lista de tipos de eventos de forma agrupada + responses: + '200': + description: Sucess + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/event-type-groups.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/event/get-types.yaml b/public/docs/v1/components/paths/event/get-types.yaml new file mode 100644 index 0000000000..fcf1ab8fff --- /dev/null +++ b/public/docs/v1/components/paths/event/get-types.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Eventos + summary: Recupera a lista de tipos de eventos + description: Recupera a lista de tipos de eventos + responses: + '200': + description: Um array com os vários tipos que um evento pode ter + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/event-type.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/event/patch.yaml b/public/docs/v1/components/paths/event/patch.yaml new file mode 100644 index 0000000000..2e27d0fd8d --- /dev/null +++ b/public/docs/v1/components/paths/event/patch.yaml @@ -0,0 +1,29 @@ +patch: +tags: + - Eventos +summary: Atualiza um evento +description: Atualiza os detalhes de um evento existente. +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador único do evento. +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/event/post-minimal.yaml' +responses: + '200': + description: Evento atualizado com sucesso. + content: + application/json: + schema: + $ref: '../../schemas/event.yaml' + '400': + description: Requisição inválida, por exemplo, campos não preenchidos corretamente. + '404': + description: Evento não encontrado. + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/event/route-single-id.yaml b/public/docs/v1/components/paths/event/route-single-id.yaml new file mode 100644 index 0000000000..441f729025 --- /dev/null +++ b/public/docs/v1/components/paths/event/route-single-id.yaml @@ -0,0 +1,6 @@ +tags: + - Eventos +patch: + $ref: './patch.yaml' +delete: + $ref: './delete.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/opportunity/describe.yaml b/public/docs/v1/components/paths/opportunity/describe.yaml new file mode 100644 index 0000000000..7dfcc90edc --- /dev/null +++ b/public/docs/v1/components/paths/opportunity/describe.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Oportunidades + summary: Recupera os detalhes de mapeamento da entity Oportunidade + description: Recupera os detalhes de mapeamento da entity Oportunidade + responses: + '200': + description: Success + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/describe-item.yaml' diff --git a/public/docs/v1/components/paths/opportunity/find-one.yaml b/public/docs/v1/components/paths/opportunity/find-one.yaml new file mode 100644 index 0000000000..2005cb8c17 --- /dev/null +++ b/public/docs/v1/components/paths/opportunity/find-one.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Oportunidades + summary: Recupera uma única oportunidade + description: Recuperar um única oportunidade + parameters: + - $ref: '../../parameters/id.yaml' + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '../../schemas/opportunity.yaml' diff --git a/public/docs/v1/components/paths/opportunity/find-registrations.yaml b/public/docs/v1/components/paths/opportunity/find-registrations.yaml new file mode 100644 index 0000000000..2349d3ca3c --- /dev/null +++ b/public/docs/v1/components/paths/opportunity/find-registrations.yaml @@ -0,0 +1,11 @@ +get: + tags: + - Oportunidades + summary: Recupera uma lista de registros das oportunidades + description: Recuperar uma lista de registros das oportunidades + responses: + '200': + description: Success + content: + application/json: + example: ok diff --git a/public/docs/v1/components/paths/opportunity/find.yaml b/public/docs/v1/components/paths/opportunity/find.yaml new file mode 100644 index 0000000000..75e74892db --- /dev/null +++ b/public/docs/v1/components/paths/opportunity/find.yaml @@ -0,0 +1,23 @@ +get: + tags: + - Oportunidades + summary: Recupera a lista de oportunidades + description: Recupera a lista de oportunidades + parameters: + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Um array com todas as oportunidades, caso não tenha o parametro @select na busca, ele trará apenas id e @entityType + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '../../schemas/opportunity.yaml' + - type: object + properties: + '@entityType': + type: string + example: opportunity + description: Um texto que representa qual a entity é retornada diff --git a/public/docs/v1/components/paths/opportunity/get-types.yaml b/public/docs/v1/components/paths/opportunity/get-types.yaml new file mode 100644 index 0000000000..d9b7745aa5 --- /dev/null +++ b/public/docs/v1/components/paths/opportunity/get-types.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Oportunidades + summary: Recupera a lista de tipos de oportunidades + description: Recupera a lista de tipos de oportunidades + responses: + '200': + description: Um array com os vários de tipos que uma oportunidade pode ter + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/opportunity-type.yaml' diff --git a/public/docs/v1/components/paths/opportunity/select-fields.yaml b/public/docs/v1/components/paths/opportunity/select-fields.yaml new file mode 100644 index 0000000000..7d70470a40 --- /dev/null +++ b/public/docs/v1/components/paths/opportunity/select-fields.yaml @@ -0,0 +1,11 @@ +get: + tags: + - Oportunidades + summary: Recupera uma lista de campos da entity Oportunidades + description: Recuperar uma lista de campos da entity Oportunidades + responses: + '200': + description: Success + content: + application/json: + example: ok diff --git a/public/docs/v1/components/paths/project/create.yaml b/public/docs/v1/components/paths/project/create.yaml new file mode 100644 index 0000000000..e6befc7a96 --- /dev/null +++ b/public/docs/v1/components/paths/project/create.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Projetos + summary: Cria um projeto + description: Cria um projeto + requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/project/post-minimal.yaml' + responses: + '200': + description: O projeto criado + content: + application/json: + schema: + $ref: '../../schemas/project.yaml' diff --git a/public/docs/v1/components/paths/project/delete.yaml b/public/docs/v1/components/paths/project/delete.yaml new file mode 100644 index 0000000000..7d20c63ab6 --- /dev/null +++ b/public/docs/v1/components/paths/project/delete.yaml @@ -0,0 +1,48 @@ +tags: + - Projetos +summary: Apaga um projeto +description: Apaga um projeto +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do projeto +responses: + '200': + description: Informações sobre o objeto apagado + content: + application/json: + schema: + type: object + properties: + '@entityType': + type: string + example: project + description: Tipo de entidade + id: + type: integer + example: 4 + description: Um id numérico que representa o projeto + name: + type: string + example: projeto teste + description: Um texto que representa o nome do projeto + type: + type: object + properties: + id: + type: integer + example: 1 + description: ID do tipo de projeto + name: + type: string + example: Festival + description: Nome do tipo de projeto + status: + type: integer + example: -10 + description: Status do projeto + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/project/describe.yaml b/public/docs/v1/components/paths/project/describe.yaml new file mode 100644 index 0000000000..8fc137ba5f --- /dev/null +++ b/public/docs/v1/components/paths/project/describe.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Projetos + summary: Recupera os detalhes de mapeamento da entity Projetos + description: Recupera os detalhes de mapeamento da entity Projetos + responses: + '200': + description: Success + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/project-describe.yaml' diff --git a/public/docs/v1/components/paths/project/find-one.yaml b/public/docs/v1/components/paths/project/find-one.yaml new file mode 100644 index 0000000000..f976d63685 --- /dev/null +++ b/public/docs/v1/components/paths/project/find-one.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Projetos + summary: Recupera um único projeto + description: Recuperar um único projeto + parameters: + - $ref: '../../parameters/id.yaml' + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '../../schemas/project.yaml' diff --git a/public/docs/v1/components/paths/project/find.yaml b/public/docs/v1/components/paths/project/find.yaml new file mode 100644 index 0000000000..cd8ea699ab --- /dev/null +++ b/public/docs/v1/components/paths/project/find.yaml @@ -0,0 +1,23 @@ +get: + tags: + - Projetos + summary: Recupera a lista de projetos + description: Recupera a lista de projetos + parameters: + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Um array com todos os projetos, caso não tenha o parametro @select na busca, ele trará apenas id e @entityType + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '../../schemas/project.yaml' + - type: object + properties: + '@entityType': + type: string + example: seal + description: Um texto que representa qual a entity é retornada diff --git a/public/docs/v1/components/paths/project/get-type-groups.yaml b/public/docs/v1/components/paths/project/get-type-groups.yaml new file mode 100644 index 0000000000..451fc044c8 --- /dev/null +++ b/public/docs/v1/components/paths/project/get-type-groups.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Projetos + summary: Recupera uma lista de tipos de projeto de forma agrupada + description: Recupera uma lista de tipos de projeto de forma agrupada + responses: + '200': + description: Sucesso + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/project-type-groups.yaml' diff --git a/public/docs/v1/components/paths/project/get-types.yaml b/public/docs/v1/components/paths/project/get-types.yaml new file mode 100644 index 0000000000..805354160b --- /dev/null +++ b/public/docs/v1/components/paths/project/get-types.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Projetos + summary: Recupera a lista de tipos de projetos + description: Recupera a lista de tipos de projetos + responses: + '200': + description: Um array com os vários de tipos que um projeto pode ter + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/project-type.yaml' diff --git a/public/docs/v1/components/paths/project/patch.yaml b/public/docs/v1/components/paths/project/patch.yaml new file mode 100644 index 0000000000..964aecc059 --- /dev/null +++ b/public/docs/v1/components/paths/project/patch.yaml @@ -0,0 +1,25 @@ +tags: + - Projetos +summary: Atualiza um projeto +description: Atualiza um projeto +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do projeto +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/project/post-minimal.yaml' +responses: + '200': + description: O projeto atualizado + content: + application/json: + schema: + $ref: '../../schemas/project.yaml' + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/project/put.yaml b/public/docs/v1/components/paths/project/put.yaml new file mode 100644 index 0000000000..964aecc059 --- /dev/null +++ b/public/docs/v1/components/paths/project/put.yaml @@ -0,0 +1,25 @@ +tags: + - Projetos +summary: Atualiza um projeto +description: Atualiza um projeto +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do projeto +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/project/post-minimal.yaml' +responses: + '200': + description: O projeto atualizado + content: + application/json: + schema: + $ref: '../../schemas/project.yaml' + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/project/route-single-id.yaml b/public/docs/v1/components/paths/project/route-single-id.yaml new file mode 100644 index 0000000000..d2df858389 --- /dev/null +++ b/public/docs/v1/components/paths/project/route-single-id.yaml @@ -0,0 +1,9 @@ +tags: + - Projetos +delete: + $ref: './delete.yaml' +patch: + $ref: './patch.yaml' +put: + $ref: './put.yaml' + diff --git a/public/docs/v1/components/paths/seal/create.yaml b/public/docs/v1/components/paths/seal/create.yaml new file mode 100644 index 0000000000..28b98a4a54 --- /dev/null +++ b/public/docs/v1/components/paths/seal/create.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Selos + summary: Cria um selo + description: Cria um selo + requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/seal/post-minimal.yaml' + responses: + '200': + description: O selo criado + content: + application/json: + schema: + $ref: '../../schemas/seal.yaml' diff --git a/public/docs/v1/components/paths/seal/delete.yaml b/public/docs/v1/components/paths/seal/delete.yaml new file mode 100644 index 0000000000..4a988bdfd0 --- /dev/null +++ b/public/docs/v1/components/paths/seal/delete.yaml @@ -0,0 +1,41 @@ +tags: + - Selos +summary: Apaga um selo +description: Apaga um selo +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do selo +responses: + '200': + description: Informações sobre o objeto apagado + content: + application/json: + schema: + type: object + properties: + '@entityType': + type: string + example: seal + description: Tipo de entidade + id: + type: integer + example: 3 + description: Um id numérico que representa o selo + name: + type: string + example: selo teste + description: Um texto que representa o nome do selo + type: + type: integer + example: null + description: Tipo do selo + status: + type: integer + example: -10 + description: Status do selo + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/seal/describe.yaml b/public/docs/v1/components/paths/seal/describe.yaml new file mode 100644 index 0000000000..c2b84f6b63 --- /dev/null +++ b/public/docs/v1/components/paths/seal/describe.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Selos + summary: Recupera os detalhes de mapeamento da entity Selos + description: Recupera os detalhes de mapeamento da entity Selos + responses: + '200': + description: Success + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/seal-describe.yaml' diff --git a/public/docs/v1/components/paths/seal/find-one.yaml b/public/docs/v1/components/paths/seal/find-one.yaml new file mode 100644 index 0000000000..d86fadd02c --- /dev/null +++ b/public/docs/v1/components/paths/seal/find-one.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Selos + summary: Recupera um único selo + description: Recuperar um único selo + parameters: + - $ref: '../../parameters/id.yaml' + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '../../schemas/seal.yaml' diff --git a/public/docs/v1/components/paths/seal/find.yaml b/public/docs/v1/components/paths/seal/find.yaml new file mode 100644 index 0000000000..4c482e4ed8 --- /dev/null +++ b/public/docs/v1/components/paths/seal/find.yaml @@ -0,0 +1,23 @@ +get: + tags: + - Selos + summary: Recupera a lista de selos + description: Recupera a lista de selos + parameters: + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Um array com todos os selos, caso não tenha o parametro @select na busca, ele trará apenas id e @entityType + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '../../schemas/seal.yaml' + - type: object + properties: + '@entityType': + type: string + example: seal + description: Um texto que representa qual a entity é retornada \ No newline at end of file diff --git a/public/docs/v1/components/paths/seal/get-type-groups.yaml b/public/docs/v1/components/paths/seal/get-type-groups.yaml new file mode 100644 index 0000000000..ae2cd4f610 --- /dev/null +++ b/public/docs/v1/components/paths/seal/get-type-groups.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Selos + summary: Recupera uma lista de tipos de selos de forma agrupada + description: Recupera uma lista de tipos de selos de forma agrupada + responses: + '200': + description: Sucesso + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/seal-type-groups.yaml' diff --git a/public/docs/v1/components/paths/seal/get-types.yaml b/public/docs/v1/components/paths/seal/get-types.yaml new file mode 100644 index 0000000000..9b76e29481 --- /dev/null +++ b/public/docs/v1/components/paths/seal/get-types.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Selos + summary: Recupera a lista de tipos de selos + description: Recupera a lista de tipos de selos + responses: + '200': + description: Um array com os vários de tipos que um selo pode ter + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/seal-type.yaml' diff --git a/public/docs/v1/components/paths/seal/patch.yaml b/public/docs/v1/components/paths/seal/patch.yaml new file mode 100644 index 0000000000..55055027bc --- /dev/null +++ b/public/docs/v1/components/paths/seal/patch.yaml @@ -0,0 +1,25 @@ +tags: + - Selos +summary: Atualiza um selo +description: Atualiza um selo +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do selo +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/seal/post-minimal.yaml' +responses: + '200': + description: O selo atualizado + content: + application/json: + schema: + $ref: '../../schemas/seal.yaml' + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/seal/put.yaml b/public/docs/v1/components/paths/seal/put.yaml new file mode 100644 index 0000000000..e4f46041a4 --- /dev/null +++ b/public/docs/v1/components/paths/seal/put.yaml @@ -0,0 +1,30 @@ +tags: + - Selos +summary: Atualiza um selo +description: Atualiza um selo +parameters: + - in: put + name: id + schema: + type: integer + required: true + description: Identificador do selo +requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + example: Selo teste + description: Nome do selo +responses: + '200': + description: O selo atualizado + content: + application/json: + schema: + $ref: '../../schemas/seal.yaml' + '404': + $ref: '../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/seal/route-single-id.yaml b/public/docs/v1/components/paths/seal/route-single-id.yaml new file mode 100644 index 0000000000..b934a6529c --- /dev/null +++ b/public/docs/v1/components/paths/seal/route-single-id.yaml @@ -0,0 +1,8 @@ +tags: + - Selos +patch: + $ref: './patch.yaml' +put: + $ref: './put.yaml' +delete: + $ref: './delete.yaml' diff --git a/public/docs/v1/components/paths/site/info.yaml b/public/docs/v1/components/paths/site/info.yaml new file mode 100644 index 0000000000..67ce261061 --- /dev/null +++ b/public/docs/v1/components/paths/site/info.yaml @@ -0,0 +1,16 @@ +/info: + git-info: + type: object + properties: + tag: + type: string + example: 4.0.2 + commit hash: + type: string + example: 733d63962e0737823b3d5f7b730b5278abd4a2fa + commit date: + type: string + example: "2024-04-01 11:21:04" + branch: + type: string + example: master \ No newline at end of file diff --git a/public/docs/v1/components/paths/site/version.yaml b/public/docs/v1/components/paths/site/version.yaml new file mode 100644 index 0000000000..7cffa50c40 --- /dev/null +++ b/public/docs/v1/components/paths/site/version.yaml @@ -0,0 +1,18 @@ +get: + tags: + - Site + summary: Retorna a versão atual do site + responses: + 200: + description: Sucess + content: + application/json: + schema: + type: object + properties: + name: + type: string + example: Mapa Cultural + version: + type: string + example: DEVELOP \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/create.yaml b/public/docs/v1/components/paths/space/create.yaml new file mode 100644 index 0000000000..252926eb6e --- /dev/null +++ b/public/docs/v1/components/paths/space/create.yaml @@ -0,0 +1,17 @@ +post: + tags: + - Espaços + summary: Cria um espaço + description: Cria um espaço + requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/space/post-minimal.yaml' + responses: + '200': + description: O espaço criado + content: + application/json: + schema: + $ref: '../../schemas/space.yaml' diff --git a/public/docs/v1/components/paths/space/delete-and-update.yaml b/public/docs/v1/components/paths/space/delete-and-update.yaml new file mode 100644 index 0000000000..d490286fda --- /dev/null +++ b/public/docs/v1/components/paths/space/delete-and-update.yaml @@ -0,0 +1,103 @@ +delete: + tags: + - Espaços + summary: Apaga um espaço + description: Apaga um espaço + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do espaço + responses: + '200': + description: Informações sobre o objeto apagado + content: + application/json: + schema: + type: object + properties: + '@entityType': + type: string + example: space + description: Tipo de entidade + id: + type: integer + example: 5 + description: Um id numérico que representa o espaço + name: + type: string + example: Secult + description: Um texto que representa o nome do espaço + type: + type: object + properties: + id: + type: integer + example: 50 + description: ID do tipo de espaço + name: + type: string + example: Arquivo Público + description: Nome do tipo de espaço + status: + type: integer + example: -10 + description: Status do espaço + '404': + $ref: '../../responses/error/404.yaml' + +patch: + tags: + - Espaços + summary: Atualiza um espaço + description: Atualiza um espaço + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do espaço + requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/space/patch.yaml' + responses: + '200': + description: O espaço atualizado + content: + application/json: + schema: + $ref: '../../schemas/space.yaml' + '404': + $ref: '../../responses/error/404.yaml' + +put: + tags: + - Espaços + summary: Atualiza um espaço + description: Atualiza um espaço + parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do espaço + requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/space/patch.yaml' + responses: + '200': + description: O espaço atualizado + content: + application/json: + schema: + $ref: '../../schemas/space.yaml' + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/delete.yaml b/public/docs/v1/components/paths/space/delete.yaml new file mode 100644 index 0000000000..b535b5b142 --- /dev/null +++ b/public/docs/v1/components/paths/space/delete.yaml @@ -0,0 +1,48 @@ +tags: + - Espaços +summary: Apaga um espaço +description: Apaga um espaço +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do espaço +responses: + '200': + description: Informações sobre o objeto apagado + content: + application/json: + schema: + type: object + properties: + '@entityType': + type: string + example: space + description: Tipo de entidade + id: + type: integer + example: 5 + description: Um id numérico que representa o espaço + name: + type: string + example: Secult + description: Um texto que representa o nome do espaço + type: + type: object + properties: + id: + type: integer + example: 50 + description: ID do tipo de espaço + name: + type: string + example: Arquivo Público + description: Nome do tipo de espaço + status: + type: integer + example: -10 + description: Status do espaço + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/describe.yaml b/public/docs/v1/components/paths/space/describe.yaml new file mode 100644 index 0000000000..797ccc0a9a --- /dev/null +++ b/public/docs/v1/components/paths/space/describe.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Espaços + summary: Recupera os detalhes de mapeamento da entity Espaço + description: Recupera os detalhes de mapeamento da entity Espaço + responses: + '200': + description: Sucesso + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/describe-item.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/find-by-events.yaml b/public/docs/v1/components/paths/space/find-by-events.yaml new file mode 100644 index 0000000000..9dd30046b0 --- /dev/null +++ b/public/docs/v1/components/paths/space/find-by-events.yaml @@ -0,0 +1,11 @@ +get: + tags: + - Espaços + summary: Recupera uma lista de espaços filtrados por evento + description: Recuperar uma lista de espaços filtrados por evento + responses: + '200': + description: Sucesso + content: + application/json: + example: ok \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/find-one.yaml b/public/docs/v1/components/paths/space/find-one.yaml new file mode 100644 index 0000000000..47966cdd29 --- /dev/null +++ b/public/docs/v1/components/paths/space/find-one.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Espaços + summary: Recupera um único espaço + description: Recuperar um único espaço + parameters: + - $ref: '../../parameters/id.yaml' + - $ref: '../../parameters/select.yaml' + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '../../schemas/space.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/find.yaml b/public/docs/v1/components/paths/space/find.yaml new file mode 100644 index 0000000000..d66e5562ef --- /dev/null +++ b/public/docs/v1/components/paths/space/find.yaml @@ -0,0 +1,26 @@ +get: + tags: + - Espaços + summary: Recupera a lista de espaços + description: Recupera a lista de espaços + parameters: + - $ref: '../../parameters/select.yaml' + - $ref: '../../parameters/order.yaml' + - $ref: '../../parameters/limit.yaml' + - $ref: '../../parameters/page.yaml' + responses: + '200': + description: Um array com todos as espaços, caso não tenha o parâmetro @select na busca, ele trará apenas id e @entityType + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '../../schemas/space.yaml' + - type: object + properties: + '@entityType': + type: string + example: space + description: Um texto que representa qual a entity é retornada diff --git a/public/docs/v1/components/paths/space/get-type-groups.yaml b/public/docs/v1/components/paths/space/get-type-groups.yaml new file mode 100644 index 0000000000..a98a359ce8 --- /dev/null +++ b/public/docs/v1/components/paths/space/get-type-groups.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Espaços + summary: Recupera uma lista de tipos de espaço de forma agrupada + description: Recupera uma lista de tipos de espaço de forma agrupada + responses: + '200': + description: Sucesso + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/space-type-group.yaml' diff --git a/public/docs/v1/components/paths/space/get-types.yaml b/public/docs/v1/components/paths/space/get-types.yaml new file mode 100644 index 0000000000..3c880e2126 --- /dev/null +++ b/public/docs/v1/components/paths/space/get-types.yaml @@ -0,0 +1,14 @@ +get: + tags: + - Espaços + summary: Recupera uma lista de tipos de espaço + description: Recupera uma lista de tipos de espaço + responses: + '200': + description: Sucesso + content: + application/json: + schema: + type: array + items: + $ref: '../../schemas/space-type.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/patch.yaml b/public/docs/v1/components/paths/space/patch.yaml new file mode 100644 index 0000000000..0d28c809e6 --- /dev/null +++ b/public/docs/v1/components/paths/space/patch.yaml @@ -0,0 +1,25 @@ +tags: + - Espaços +summary: Atualiza um espaço +description: Atualiza um espaço +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do espaço +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/space/patch.yaml' +responses: + '200': + description: O espaço atualizado + content: + application/json: + schema: + $ref: '../../schemas/space.yaml' + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/put.yaml b/public/docs/v1/components/paths/space/put.yaml new file mode 100644 index 0000000000..0d28c809e6 --- /dev/null +++ b/public/docs/v1/components/paths/space/put.yaml @@ -0,0 +1,25 @@ +tags: + - Espaços +summary: Atualiza um espaço +description: Atualiza um espaço +parameters: + - in: path + name: id + schema: + type: integer + required: true + description: Identificador do espaço +requestBody: + content: + application/json: + schema: + $ref: '../../requestBodies/space/patch.yaml' +responses: + '200': + description: O espaço atualizado + content: + application/json: + schema: + $ref: '../../schemas/space.yaml' + '404': + $ref: '../../responses/error/404.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/paths/space/route-single-id.yaml b/public/docs/v1/components/paths/space/route-single-id.yaml new file mode 100644 index 0000000000..de20865a7b --- /dev/null +++ b/public/docs/v1/components/paths/space/route-single-id.yaml @@ -0,0 +1,8 @@ +tags: + - Espaços +patch: + $ref: './patch.yaml' +put: + $ref: './put.yaml' +delete: + $ref: './delete.yaml' diff --git a/public/docs/v1/components/paths/term/slugs/area.yaml b/public/docs/v1/components/paths/term/slugs/area.yaml new file mode 100644 index 0000000000..9d2026e063 --- /dev/null +++ b/public/docs/v1/components/paths/term/slugs/area.yaml @@ -0,0 +1,10 @@ +get: + tags: + - Termos + summary: Lista os slugs de areas + description: Lista os slugs de areas de interesse + responses: + '200': + $ref: '../../../responses/term/slugs/area.yaml' + '404': + $ref: '../../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/term/slugs/funcao.yaml b/public/docs/v1/components/paths/term/slugs/funcao.yaml new file mode 100644 index 0000000000..3ddd346007 --- /dev/null +++ b/public/docs/v1/components/paths/term/slugs/funcao.yaml @@ -0,0 +1,10 @@ +get: + tags: + - Termos + summary: Lista os slugs de função + description: Lista os slugs de função + responses: + '200': + $ref: '../../../responses/term/slugs/funcao.yaml' + '404': + $ref: '../../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/term/slugs/linguagem.yaml b/public/docs/v1/components/paths/term/slugs/linguagem.yaml new file mode 100644 index 0000000000..afbf31d624 --- /dev/null +++ b/public/docs/v1/components/paths/term/slugs/linguagem.yaml @@ -0,0 +1,10 @@ +get: + tags: + - Termos + summary: Lista os slugs de linguagem + description: Lista os slugs de linguagem cultural + responses: + '200': + $ref: '../../../responses/term/slugs/linguagem.yaml' + '404': + $ref: '../../../responses/error/404.yaml' diff --git a/public/docs/v1/components/paths/term/slugs/tag.yaml b/public/docs/v1/components/paths/term/slugs/tag.yaml new file mode 100644 index 0000000000..4a22ed6bc6 --- /dev/null +++ b/public/docs/v1/components/paths/term/slugs/tag.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Termos + summary: Lista os slugs de tags + description: Lista os slugs de tags + responses: + '200': + description: Lista os slugs de tags + content: + application/json: + schema: + type: array + example: [] + '404': + $ref: '../../../responses/error/404.yaml' diff --git a/public/docs/v1/components/requestBodies/agent/patch.yaml b/public/docs/v1/components/requestBodies/agent/patch.yaml new file mode 100644 index 0000000000..b285b2820b --- /dev/null +++ b/public/docs/v1/components/requestBodies/agent/patch.yaml @@ -0,0 +1,27 @@ +type: object +properties: + name: + type: string + example: "Novo nome" + description: Um texto que representa o novo nome do agente + shortDescription: + type: string + example: "Uma breve descrição do agente" + description: Uma breve descrição do agente + status: + type: integer + example: 1 + description: Status do agente + type: + type: integer + example: 2 + description: ID do tipo de agente (1 - Individual, 2 - Coletivo) + terms: + type: object + properties: + area: + type: array + items: + type: string + example: [ "Antropologia" ] + description: Áreas relacionadas ao agente \ No newline at end of file diff --git a/public/docs/v1/components/requestBodies/agent/post-minimal.yaml b/public/docs/v1/components/requestBodies/agent/post-minimal.yaml new file mode 100644 index 0000000000..3f37aa3786 --- /dev/null +++ b/public/docs/v1/components/requestBodies/agent/post-minimal.yaml @@ -0,0 +1,27 @@ +type: object +properties: + name: + type: string + example: "Nome do agente" + description: Nome do agente + shortDescription: + type: string + example: "Uma breve descrição do agente" + description: Uma breve descrição do agente + status: + type: integer + example: 1 + description: Status do agente + terms: + type: object + properties: + area: + type: array + items: + type: string + example: [ "Música" ] + description: Áreas relacionadas ao agente + type: + type: integer + example: 1 + description: Tipo do agente (1 - Individual, 2 - Coletivo) \ No newline at end of file diff --git a/public/docs/v1/components/requestBodies/event/post-minimal.yaml b/public/docs/v1/components/requestBodies/event/post-minimal.yaml new file mode 100644 index 0000000000..f58ff23f71 --- /dev/null +++ b/public/docs/v1/components/requestBodies/event/post-minimal.yaml @@ -0,0 +1,45 @@ +post: + tags: + - Eventos + summary: Cria um evento + description: Cria um novo evento com as informações fornecidas + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - name + - shortDescription + - classificacaoEtaria + properties: + name: + type: string + description: "Nome do evento" + shortDescription: + type: string + description: "Descrição curta do evento" + classificacaoEtaria: + type: object + properties: + options: + type: array + items: + type: string + description: "Classificação etária do evento" + term-linguagem: + type: array + items: + type: string + description: "Linguagens do evento" + responses: + '201': + description: Evento criado com sucesso + content: + application/json: + schema: + $ref: '../../schemas/event.yaml' + '400': + description: Dados inválidos fornecidos + diff --git a/public/docs/v1/components/requestBodies/project/post-minimal.yaml b/public/docs/v1/components/requestBodies/project/post-minimal.yaml new file mode 100644 index 0000000000..88a9cd34a2 --- /dev/null +++ b/public/docs/v1/components/requestBodies/project/post-minimal.yaml @@ -0,0 +1,14 @@ +type: object +properties: + name: + type: string + example: Projeto teste + description: Nome do Projeto + shortDescription: + type: string + example: apenas um projeto teste + description: Uma breve descrição do Projeto + type: + type: integer + example: 1 + description: Tipo do projeto diff --git a/public/docs/v1/components/requestBodies/seal/post-minimal.yaml b/public/docs/v1/components/requestBodies/seal/post-minimal.yaml new file mode 100644 index 0000000000..1d36de9825 --- /dev/null +++ b/public/docs/v1/components/requestBodies/seal/post-minimal.yaml @@ -0,0 +1,18 @@ +type: object +properties: + name: + type: string + example: Selo teste + description: Nome do Selo + shortDescription: + type: string + example: apenas um Selo teste + description: Uma breve descrição do Selo + validPeriod: + type: integer + example: 1 + description: Período de validade do selo + owner: + type: integer + example: 1 + description: Usuario proprietário do selo diff --git a/public/docs/v1/components/requestBodies/space/patch.yaml b/public/docs/v1/components/requestBodies/space/patch.yaml new file mode 100644 index 0000000000..92fe85ce94 --- /dev/null +++ b/public/docs/v1/components/requestBodies/space/patch.yaml @@ -0,0 +1,39 @@ +type: object +properties: + name: + type: string + example: Novo nome + shortDescription: + type: string + example: Secult + description: Uma breve descrição do espaço + status: + type: integer + example: 1 + description: Status do espaço + type: + type: object + properties: + id: + type: integer + example: 50 + description: ID do tipo de espaço + name: + type: string + example: Arquivo Público + description: Nome do tipo de espaço + terms: + type: object + properties: + tag: + type: array + items: + type: string + example: [ ] + description: Tags associadas ao espaço + area: + type: array + items: + type: string + example: [ "Outros", "Patrimônio Cultural" ] + description: Áreas relacionadas ao espaço \ No newline at end of file diff --git a/public/docs/v1/components/requestBodies/space/post-minimal.yaml b/public/docs/v1/components/requestBodies/space/post-minimal.yaml new file mode 100644 index 0000000000..92fe85ce94 --- /dev/null +++ b/public/docs/v1/components/requestBodies/space/post-minimal.yaml @@ -0,0 +1,39 @@ +type: object +properties: + name: + type: string + example: Novo nome + shortDescription: + type: string + example: Secult + description: Uma breve descrição do espaço + status: + type: integer + example: 1 + description: Status do espaço + type: + type: object + properties: + id: + type: integer + example: 50 + description: ID do tipo de espaço + name: + type: string + example: Arquivo Público + description: Nome do tipo de espaço + terms: + type: object + properties: + tag: + type: array + items: + type: string + example: [ ] + description: Tags associadas ao espaço + area: + type: array + items: + type: string + example: [ "Outros", "Patrimônio Cultural" ] + description: Áreas relacionadas ao espaço \ No newline at end of file diff --git a/public/docs/v1/components/responses/agent/archive.yaml b/public/docs/v1/components/responses/agent/archive.yaml new file mode 100644 index 0000000000..11544f05c2 --- /dev/null +++ b/public/docs/v1/components/responses/agent/archive.yaml @@ -0,0 +1,221 @@ +description: Sucesso +content: + application/json: + schema: + type: object + properties: + "@entityType": + type: string + example: "agent" + id: + type: integer + example: 3 + name: + type: string + example: "teste" + publicLocation: + type: boolean + example: false + location: + type: object + properties: + latitude: + type: number + example: 0 + longitude: + type: number + example: 0 + shortDescription: + type: string + example: "teste" + longDescription: + type: string + example: null + createTimestamp: + type: object + properties: + date: + type: string + example: "2024-03-04 14:01:32.000000" + timezone_type: + type: integer + example: 3 + timezone: + type: string + example: "Etc/GMT+3" + status: + type: integer + example: -2 + parent: + type: string + example: null + userId: + type: integer + example: 3 + updateTimestamp: + type: object + properties: + date: + type: string + example: "2024-04-01 16:28:58.000000" + timezone_type: + type: integer + example: 3 + timezone: + type: string + example: "Etc/GMT+3" + subsite: + type: string + example: null + escolaridade: + type: string + example: null + pessoaDeficiente: + type: string + example: null + localizacao: + type: string + example: null + emailPublico: + type: string + example: null + telefonePublico: + type: string + example: null + En_Pais: + type: string + example: "BR" + site: + type: string + example: null + facebook: + type: string + example: null + twitter: + type: string + example: null + instagram: + type: string + example: null + linkedin: + type: string + example: null + vimeo: + type: string + example: null + spotify: + type: string + example: null + youtube: + type: string + example: null + pinterest: + type: string + example: null + sentNotification: + type: string + example: null + type: + type: integer + example: 1 + terms: + type: object + properties: + tag: + type: array + items: + type: string + example: [] + area: + type: array + items: + type: string + example: ["Música"] + funcao: + type: array + items: + type: string + example: [] + controllerId: + type: string + example: "agent" + deleteUrl: + type: string + example: "http://localhost/agent/apaga/3/" + editUrl: + type: string + example: "http://localhost/edicao-de-agente/3/" + singleUrl: + type: string + example: "http://localhost/agente/3/" + lockedFields: + type: array + items: + type: string + example: [] + currentUserPermissions: + type: object + properties: + "@control": + type: boolean + example: false + create: + type: boolean + example: true + changeUserProfile: + type: boolean + example: false + changeType: + type: boolean + example: false + remove: + type: boolean + example: false + destroy: + type: boolean + example: false + changeOwner: + type: boolean + example: false + archive: + type: boolean + example: false + view: + type: boolean + example: false + modify: + type: boolean + example: false + _control: + type: boolean + example: false + viewPrivateFiles: + type: boolean + example: false + viewPrivateData: + type: boolean + example: false + createAgentRelation: + type: boolean + example: false + createAgentRelationWithControl: + type: boolean + example: false + removeAgentRelation: + type: boolean + example: false + removeAgentRelationWithControl: + type: boolean + example: false + createSealRelation: + type: boolean + example: false + removeSealRelation: + type: boolean + example: false + publish: + type: boolean + example: false + unarchive: + type: boolean + example: false diff --git a/public/docs/v1/components/responses/agent/publish.yaml b/public/docs/v1/components/responses/agent/publish.yaml new file mode 100644 index 0000000000..e5f0d01ee4 --- /dev/null +++ b/public/docs/v1/components/responses/agent/publish.yaml @@ -0,0 +1,221 @@ +description: Sucesso +content: + application/json: + schema: + type: object + properties: + "@entityType": + type: string + example: "agent" + id: + type: integer + example: 3 + name: + type: string + example: "teste" + publicLocation: + type: boolean + example: false + location: + type: object + properties: + latitude: + type: number + example: 0 + longitude: + type: number + example: 0 + shortDescription: + type: string + example: "teste" + longDescription: + type: string + example: null + createTimestamp: + type: object + properties: + date: + type: string + example: "2024-03-04 14:01:32.000000" + timezone_type: + type: integer + example: 3 + timezone: + type: string + example: "Etc/GMT+3" + status: + type: integer + example: 1 + parent: + type: string + example: null + userId: + type: integer + example: 3 + updateTimestamp: + type: object + properties: + date: + type: string + example: "2024-04-01 16:29:06.000000" + timezone_type: + type: integer + example: 3 + timezone: + type: string + example: "Etc/GMT+3" + subsite: + type: string + example: null + escolaridade: + type: string + example: null + pessoaDeficiente: + type: string + example: null + localizacao: + type: string + example: null + emailPublico: + type: string + example: null + telefonePublico: + type: string + example: null + En_Pais: + type: string + example: "BR" + site: + type: string + example: null + facebook: + type: string + example: null + twitter: + type: string + example: null + instagram: + type: string + example: null + linkedin: + type: string + example: null + vimeo: + type: string + example: null + spotify: + type: string + example: null + youtube: + type: string + example: null + pinterest: + type: string + example: null + sentNotification: + type: string + example: null + type: + type: integer + example: 1 + terms: + type: object + properties: + tag: + type: array + items: + type: string + example: [] + area: + type: array + items: + type: string + example: ["Música"] + funcao: + type: array + items: + type: string + example: [] + controllerId: + type: string + example: "agent" + deleteUrl: + type: string + example: "http://localhost/agent/apaga/3/" + editUrl: + type: string + example: "http://localhost/edicao-de-agente/3/" + singleUrl: + type: string + example: "http://localhost/agente/3/" + lockedFields: + type: array + items: + type: string + example: [] + currentUserPermissions: + type: object + properties: + "@control": + type: boolean + example: false + create: + type: boolean + example: true + changeUserProfile: + type: boolean + example: false + changeType: + type: boolean + example: false + remove: + type: boolean + example: false + destroy: + type: boolean + example: false + changeOwner: + type: boolean + example: false + archive: + type: boolean + example: false + view: + type: boolean + example: true + modify: + type: boolean + example: false + _control: + type: boolean + example: false + viewPrivateFiles: + type: boolean + example: false + viewPrivateData: + type: boolean + example: false + createAgentRelation: + type: boolean + example: false + createAgentRelationWithControl: + type: boolean + example: false + removeAgentRelation: + type: boolean + example: false + removeAgentRelationWithControl: + type: boolean + example: false + createSealRelation: + type: boolean + example: false + removeSealRelation: + type: boolean + example: false + publish: + type: boolean + example: false + unarchive: + type: boolean + example: false diff --git a/public/docs/v1/components/responses/agent/undelete.yaml b/public/docs/v1/components/responses/agent/undelete.yaml new file mode 100644 index 0000000000..036e9b65a7 --- /dev/null +++ b/public/docs/v1/components/responses/agent/undelete.yaml @@ -0,0 +1,221 @@ +description: Sucesso +content: + application/json: + schema: + type: object + properties: + "@entityType": + type: string + example: "agent" + id: + type: integer + example: 3 + name: + type: string + example: "teste" + publicLocation: + type: boolean + example: false + location: + type: object + properties: + latitude: + type: number + example: 0 + longitude: + type: number + example: 0 + shortDescription: + type: string + example: null + longDescription: + type: string + example: null + createTimestamp: + type: object + properties: + date: + type: string + example: "2024-03-04 14:01:32.000000" + timezone_type: + type: integer + example: 3 + timezone: + type: string + example: "Etc/GMT+3" + status: + type: integer + example: 0 + parent: + type: string + example: null + userId: + type: integer + example: 3 + updateTimestamp: + type: object + properties: + date: + type: string + example: "2024-04-01 15:35:57.000000" + timezone_type: + type: integer + example: 3 + timezone: + type: string + example: "Etc/GMT+3" + subsite: + type: string + example: null + escolaridade: + type: string + example: null + pessoaDeficiente: + type: string + example: null + localizacao: + type: string + example: null + emailPublico: + type: string + example: null + telefonePublico: + type: string + example: null + En_Pais: + type: string + example: "BR" + site: + type: string + example: null + facebook: + type: string + example: null + twitter: + type: string + example: null + instagram: + type: string + example: null + linkedin: + type: string + example: null + vimeo: + type: string + example: null + spotify: + type: string + example: null + youtube: + type: string + example: null + pinterest: + type: string + example: null + sentNotification: + type: string + example: null + type: + type: integer + example: 1 + terms: + type: object + properties: + tag: + type: array + items: + type: string + example: [] + area: + type: array + items: + type: string + example: [] + funcao: + type: array + items: + type: string + example: [] + controllerId: + type: string + example: "agent" + deleteUrl: + type: string + example: "http://localhost/agent/apaga/3/" + editUrl: + type: string + example: "http://localhost/edicao-de-agente/3/" + singleUrl: + type: string + example: "http://localhost/agente/3/" + lockedFields: + type: array + items: + type: string + example: [] + currentUserPermissions: + type: object + properties: + "@control": + type: boolean + example: false + create: + type: boolean + example: true + changeUserProfile: + type: boolean + example: false + changeType: + type: boolean + example: false + remove: + type: boolean + example: false + destroy: + type: boolean + example: false + changeOwner: + type: boolean + example: false + archive: + type: boolean + example: false + view: + type: boolean + example: false + modify: + type: boolean + example: false + _control: + type: boolean + example: false + viewPrivateFiles: + type: boolean + example: false + viewPrivateData: + type: boolean + example: false + createAgentRelation: + type: boolean + example: false + createAgentRelationWithControl: + type: boolean + example: false + removeAgentRelation: + type: boolean + example: false + removeAgentRelationWithControl: + type: boolean + example: false + createSealRelation: + type: boolean + example: false + removeSealRelation: + type: boolean + example: false + publish: + type: boolean + example: false + unarchive: + type: boolean + example: false diff --git a/public/docs/v1/components/responses/error/404.yaml b/public/docs/v1/components/responses/error/404.yaml new file mode 100644 index 0000000000..e5de06ce59 --- /dev/null +++ b/public/docs/v1/components/responses/error/404.yaml @@ -0,0 +1,12 @@ +description: Não encontrado +content: + application/json: + schema: + type: object + properties: + error: + type: bool + example: true + data: + type: string + example: "" \ No newline at end of file diff --git a/public/docs/v1/components/responses/term/slugs/area.yaml b/public/docs/v1/components/responses/term/slugs/area.yaml new file mode 100644 index 0000000000..85398d86c6 --- /dev/null +++ b/public/docs/v1/components/responses/term/slugs/area.yaml @@ -0,0 +1,63 @@ +description: Sucesso +content: + application/json: + schema: + type: array + items: + type: string + example: + - "Antropologia" + - "Arqueologia" + - "Arquitetura-Urbanismo" + - "Arquivo" + - "Arte Digital" + - "Arte de Rua" + - "Artes Circenses" + - "Artes Visuais" + - "Artesanato" + - "Audiovisual" + - "Cinema" + - "Circo" + - "Comunicação" + - "Cultura Cigana" + - "Cultura Digital" + - "Cultura Estrangeira (imigrantes)" + - "Cultura Indígena" + - "Cultura LGBT" + - "Cultura Negra" + - "Cultura Popular" + - "Dança" + - "Design" + - "Direito Autoral" + - "Economia Criativa" + - "Educação" + - "Esporte" + - "Filosofia" + - "Fotografia" + - "Gastronomia" + - "Gestão Cultural" + - "História" + - "Jogos Eletrônicos" + - "Jornalismo" + - "Leitura" + - "Literatura" + - "Livro" + - "Meio Ambiente" + - "Moda" + - "Museu" + - "Mídias Sociais" + - "Música" + - "Novas Mídias" + - "Outros" + - "Patrimônio Cultural" + - "Patrimônio Imaterial" + - "Patrimônio Material" + - "Pesquisa" + - "Produção Cultural" + - "Rádio" + - "Saúde" + - "Sociologia" + - "Teatro" + - "Televisão" + - "Turismo" + - "Ópera" diff --git a/public/docs/v1/components/responses/term/slugs/funcao.yaml b/public/docs/v1/components/responses/term/slugs/funcao.yaml new file mode 100644 index 0000000000..3082f03deb --- /dev/null +++ b/public/docs/v1/components/responses/term/slugs/funcao.yaml @@ -0,0 +1,135 @@ +description: Sucesso +content: + application/json: + schema: + type: array + items: + type: string + example: + - "Aderecista" + - "Adestrador(a) para Artes Cênicas" + - "Afinador de Instrumentos" + - "Ajudante de Câmera" + - "Ajudante de Locação" + - "Ajudante de Objetos" + - "Ajudante de Produção" + - "Amestrador(a)" + - "Aplicador(a) de sign" + - "Armeiro(a)" + - "Assessor(a) de Comunicação" + - "Assistente Administrativo" + - "Assistente Mixador(a)" + - "Assistente de Arte" + - "Assistente de Artista Gráfico" + - "Assistente de Backstage" + - "Assistente de Camarim" + - "Assistente de Cenotécnica" + - "Assistente de Continuidade" + - "Assistente de Controller" + - "Assistente de Criação Artística" + - "Assistente de Câmera" + - "Assistente de Edição" + - "Assistente de Edição de Som" + - "Assistente de Eletricista" + - "Assistente de Figurino" + - "Assistente de Ilha de Edição" + - "Assistente de Maquiagem" + - "Assistente de Maquinaria" + - "Assistente de Montagem" + - "Assistente de Objetos" + - "Assistente de Produção (Base ou Set" + - "Assistente de Produção Musical" + - "Assistente de Produção de Arte" + - "Assistente de Produção de Elenco" + - "Assistente de Produção de Locação" + - "Assistente de Produção em geral" + - "Assistente de Pós Produção" + - "Assistente de Roteiro" + - "Assistente de Som" + - "Assistente de Transporte" + - "Audiodescritor(a)" + - "Barreira" + - "Bilheteiro(a)" + - "Bordadeiro(a)" + - "Cabeleireiro" + - "Cabeleireiro(a)" + - "Camareiro(a)" + - "Capataz(a) - Montador(a)" + - "Carpinteiro(a)" + - "Cenotécnico(a)" + - "Cenógrafo(a)" + - "Chefe de Maquinária" + - "Cinegrafista" + - "Colorista" + - "Colorista Assistente" + - "Consultor de Imagem" + - "Consultor em Legendagem" + - "Consultor(a) em Audiodescrição" + - "Consultor(a) em Braille" + - "Consultor(a) em Libras" + - "Continuista" + - "Contrarregra" + - "Coolhunter" + - "Coordenador(a) de Palco" + - "Cortineiro(a)" + - "Costureiro(a)" + - "Design de Montagem" + - "Diagramador(a)" + - "Digitalizador(a)" + - "Diretor(a) de Palco" + - "Editor de Partituras" + - "Editor(a)" + - "Editor(a) de Som" + - "Eletricista" + - "Eletricista Chefe" + - "Engenheiro(a) de Som" + - "Ensaiador(a)" + - "Estampador" + - "Figurinista" + - "Foley" + - "Guia-intérprete de língua de sinais" + - "Iluminador" + - "Iluminador(a)" + - "Legendista ou Tradutor(a)" + - "Logger" + - "Luthier" + - "Maquiador" + - "Maquiador(a)" + - "Maquinista" + - "Marcador(a) de Cena" + - "Mediador(a)" + - "Mestre(a) de Pista" + - "Montador(a)" + - "Montador(a) de Palco" + - "Motorista de Audiovisual" + - "Músico-Musicista" + - "Operador(a) de Luz" + - "Operador(a) de Som" + - "Outra função técnica" + - "Passador (a)" + - "Peruqueiro" + - "Peruqueiro(a)" + - "Pilotista" + - "Produtor de Casting" + - "Produtor(a) Fonográfico" + - "Produtor(a) de Casting/Booker" + - "Radialista" + - "Roadie" + - "Sapateiro" + - "Secretario(a) de Frente" + - "Secretário(a) Teatral" + - "Serigrafista" + - "Sonoplasta" + - "Tatuador" + - "Tradutor(a) ou Intérprete de Libras" + - "Transcritor ou Revisor em Braille" + - "Técnico de Luz" + - "Técnico(a) Contábil" + - "Técnico(a) de Estúdio" + - "Técnico(a) de Luz" + - "Técnico(a) de Palco" + - "Técnico(a) de Som" + - "Técnico(a) de Som Direto" + - "Visagista" + - "Visual Merchandiser" + - "Vitrinista" diff --git a/public/docs/v1/components/responses/term/slugs/linguagem.yaml b/public/docs/v1/components/responses/term/slugs/linguagem.yaml new file mode 100644 index 0000000000..8da79d7462 --- /dev/null +++ b/public/docs/v1/components/responses/term/slugs/linguagem.yaml @@ -0,0 +1,27 @@ +description: Sucesso +content: + application/json: + schema: + type: array + items: + type: string + example: + - "Artes Circenses" + - "Artes Integradas" + - "Artes Visuais" + - "Audiovisual" + - "Cinema" + - "Cultura Digital" + - "Cultura Indígena" + - "Cultura Tradicional" + - "Curso ou Oficina" + - "Dança" + - "Exposição" + - "Hip Hop" + - "Livro e Literatura" + - "Música Erudita" + - "Música Popular" + - "Outros" + - "Palestra, Debate ou Encontro" + - "Rádio" + - "Teatro" diff --git a/public/docs/v1/components/schemas/agent-type-groups.yaml b/public/docs/v1/components/schemas/agent-type-groups.yaml new file mode 100644 index 0000000000..23bb08e5d1 --- /dev/null +++ b/public/docs/v1/components/schemas/agent-type-groups.yaml @@ -0,0 +1,12 @@ +type: object +properties: + id: + type: integer + description: Identificador do grupo de tipos de agente. + name: + type: string + description: Nome do grupo. + types: + type: array + items: + $ref: './agent-type.yaml' diff --git a/public/docs/v1/components/schemas/agent-type.yaml b/public/docs/v1/components/schemas/agent-type.yaml new file mode 100644 index 0000000000..ca77164373 --- /dev/null +++ b/public/docs/v1/components/schemas/agent-type.yaml @@ -0,0 +1,13 @@ +type: object +properties: + id: + type: integer + example: 1 + description: O identificador único do Agente + name: + type: string + example: "Coletivo" + description: O nome do tipo do Agente +required: + - id + - name diff --git a/public/docs/v1/components/schemas/agent.yaml b/public/docs/v1/components/schemas/agent.yaml new file mode 100644 index 0000000000..737e057129 --- /dev/null +++ b/public/docs/v1/components/schemas/agent.yaml @@ -0,0 +1,526 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id númerico que representa o Agente + name: + type: string + example: "Agente 1" + description: O nome do Agente + publicLocation: + type: boolean + exemple: false + description: Se o Agente possui localização pública + location: + type: object + properties: + latitude: + type: integer + example: -3.7201423995413423 + description: A latitude da localização do Agente + longitude: + type: integer + example: -38.51312727564898 + description: A longitude da localização do Agente + shortDescription: + type: string + example: "Descrição curta Agente 1" + description: Uma breve descrição do Agente + longDescription: + type: string + example: "Descrição longa Agente 1" + description: Uma descrição detalhada do Agente + createTimestamp: + $ref: '../common-types/date.yaml' + status: + type: integer + exemple: 1 + description: Um número que representa o status do Agente + userId: + type: integer + example: 1 + description: O id do usuário associado ao Agente + updateTimestamp: + $ref: '../common-types/date.yaml' + parent: + type: integer + exemple: 1 + description: O agente pai (se houver) + user: + type: integer + exemple: 1 + description: O usuário associado ao Agente + subsite: + type: integer + description: Subsite do agente (se houver) + currentUserPermissions: + type: object + properties: + '@control': + type: boolean + example: false + description: Controle do usuário atual + create: + type: boolean + example: true + description: Permissão de criação + changeUserProfile: + type: boolean + example: true + description: Permissão de alteração do perfil do usuário + changeType: + type: boolean + example: true + description: Permissão de alteração do tipo + remove: + type: boolean + example: true + description: Permissão de remoção + destroy: + type: boolean + example: true + description: Permissão de destruição + changeOwner: + type: boolean + example: true + description: Permissão de alteração do proprietário + archive: + type: boolean + example: true + description: Permissão de arquivamento + view: + type: boolean + example: true + description: Permissão de visualização + modify: + type: boolean + example: true + description: Permissão de modificação + _control: + type: boolean + example: true + description: Controle especial + viewPrivateFiles: + type: boolean + example: true + description: Visualizar arquivos privados + viewPrivateData: + type: boolean + example: true + description: Visualizar dados privados + createAgentRelation: + type: boolean + example: true + description: Criar relação de agente + createAgentRelationWithControl: + type: boolean + example: true + description: Criar relação de agente com controle + removeAgentRelation: + type: boolean + example: true + description: Remover relação de agente + removeAgentRelationWithControl: + type: boolean + example: true + description: Remover relação de agente com controle + createSealRelation: + type: boolean + example: true + description: Criar relação de selo + removeSealRelation: + type: boolean + example: true + description: Remover relação de selo + publish: + type: boolean + example: true + description: Permissão de publicação + unarchive: + type: boolean + example: true + description: Permissão de desarquivamento + sentNotification: + type: boolean + example: false + description: Se o Agente enviou notificação + children: + type: array + description: Uma lista de agentes filhos + spaces: + type: array + example: [1, 2, 3] + description: Uma lista de id dos espaços associados ao Agente + projects: + type: array + example: [8599, 2219, 238] + description: Uma lista de id dos projetos associados ao Agente + ownedOpportunities: + type: array + example: [433234, 2312, 3123] + description: Uma lista de id das oportunidades associadas ao Agente + events: + type: array + example: [4234, 2312, 23423] + description: Uma lista de id dos eventos associados ao Agente + relatedOpportunities: + type: array + example: [3333, 212, 23] + description: Uma lista de id das oportunidades relacionadas ao Agente + terms: + type: object + properties: + tag: + type: array + example: [] + description: Tags associadas ao agente + area: + type: array + example: ["Música"] + description: Áreas de atuação relacionadas ao agente + funcao: + type: array + example: ["Músico-Musicista"] + description: Funções relacionadas ao agente na cultura + metalists: + type: array + example: [] + description: Metalistas associadas ao Agente + files: + type: object + properties: + downloads: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: O id do download + name: + type: string + example: "schema.png" + description: O nome do arquivo + mimeType: + type: string + example: "image/png" + description: O tipo de mídia do arquivo + url: + type: string + example: "http://localhost/files/agent/2/schema.png" + description: A URL do arquivo + createTimestamp: + type: object + properties: + date: + type: string + example: "2024-03-18 23:21:50.000000" + description: A data de criação do arquivo + timezone_type: + type: integer + example: 3 + description: O tipo de fuso horário + timezone: + type: string + example: "Etc/GMT+3" + description: O fuso horário + description: + type: string + description: A descrição do arquivo + nullable: true + transformations: + type: string + description: As transformações do arquivo + nullable: true + seals: + type: array + items: + type: object + properties: + sealRelationId: + type: integer + example: 1 + description: O id da relação do selo + sealId: + type: integer + example: 1 + description: O id do selo + name: + type: string + example: "Selo Mapas" + description: O nome do selo + files: + type: array + example: [] + description: Arquivos associados ao selo + singleUrl: + type: string + example: "https://www.mapas.com.br/selo/1" + description: URL do selo + createTimestamp: + $ref: '../common-types/date.yaml' + isVerificationSeal: + type: boolean + example: true + description: Se o selo é de verificação + type: + type: object + properties: + id: + type: integer + exemple: 1 + description: O id do tipo do Agente + name: + type: integer + example: "Individual" + description: O nome do tipo do Agente + subsiteId: + type: integer + description: O id do subsite associado ao Agente + nomeCompleto: + type: string + example: "Pedro Paulo Soares Pereira" + description: O nome completo do Agente + nomeSocial: + type: string + example: "" + description: O nome social do Agente + escolaridade: + type: string + example: "Ensino Superior" + description: A escolaridade do Agente + pessoaDeficiente: + type: array + example: [""] + description: Lista de deficiências do Agente (se houver) + comunidadesTradicional: + type: string + example: "Povos Indígenas" + description: Comunidades tradicionais associadas ao Agente + comunidadesTradicionalOutros: + type: string + example: "" + description: Outras comunidades tradicionais associadas ao Agente + documento: + type: string + example: "123456789" + description: Documento do Agente + cnpj: + type: string + example: "123456789" + description: CNPJ do Agente + cpf: + type: string + example: "123456789" + description: CPF do Agente + raca: + type: string + example: "Parda" + description: Raça do Agente + dataDeNascimento: + type: string + example: "31-01-2002" + description: Data de nascimento do Agente + idoso: + type: boolean + example: false + description: Se o Agente é idoso + localizacao: + type: string + example: "Brasil" + description: Localização do Agente + genero: + type: string + example: "Masculino" + description: Gênero do Agente + orientacaoSexual: + type: string + example: "Heterossexual" + description: Orientação sexual do Agente + agenteItinerante: + type: boolean + example: false + description: Se o Agente é itinerante + emailPublico: + type: string + example: "teste@teste.com" + description: Email público do Agente + emailPrivado: + type: string + example: "teste@teste.com" + telefonePublico: + type: string + example: "123456789" + description: Telefone público do Agente + telefone1: + type: string + example: "123456789" + description: Telefone 1 do Agente + telefone2: + type: string + example: "123456789" + description: Telefone 2 do Agente + endereco: + type: string + example: "Rua 1" + description: Endereço do Agente + En_CEP: + type: string + example: "12345678" + description: CEP do Agente + En_Nome_Logradouro: + type: string + example: "Rua 1" + description: Nome do logradouro do Agente + En_Num: + type: integer + example: 1 + description: Número do endereço do Agente + En_Complemento: + type: string + example: "Casa 1" + description: Complemento do endereço do Agente + En_Bairro: + type: string + example: "Bairro 1" + description: Bairro do Agente + En_Municipio: + type: string + example: "Município 1" + description: Município do Agente + En_Estado: + type: string + example: "Estado 1" + description: Estado do Agente + En_Pais: + type: string + example: "País 1" + description: País do Agente + site: + type: string + example: "www.teste.com" + description: Site do Agente + facebook: + type: string + example: "teste" + description: Facebook do Agente + twitter: + type: string + example: "teste" + description: Twitter do Agente + linkedin: + type: string + example: "teste" + description: Linkedin do Agente + vimeo: + type: string + example: "teste" + description: Vimeo do Agente + spotify: + type: string + example: "teste" + description: Spotify do Agente + youtube: + type: string + example: "teste" + description: Youtube do Agente + pinterest: + type: string + example: "teste" + description: Pinterest do Agente + payment_bank_account_type: + type: string + example: "Conta Corrente" + description: Tipo de conta bancária do Agente + payment_bank_account_number: + type: string + example: "123456789" + description: Número da conta bancária do Agente + payment_bank_branch: + type: string + example: "123456789" + description: Agência bancária do Agente + payment_bank_number: + type: string + example: "123456789" + description: Número do banco do Agente + payment_bank_dv_branch: + type: string + example: "123456789" + description: Dígito verificador da agência bancária do Agente + payment_bank_dv_account_number: + type: string + example: "123456789" + description: Dígito verificador da conta bancária do Agente + event_importer_processed_file: + type: string + example: "teste" + description: Arquivo processado do importador de eventos do Agente + event_importer_files_processed: + type: integer + example: 1 + description: Arquivos processados do importador de eventos do Agente + relatedAgents: + type: object + properties: + group-admins: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: O id do grupo de administradores + name: + type: string + example: "Admin@local" + description: O nome do grupo de administradores + shortDescription: + type: string + example: "Descrição curta" + description: Uma breve descrição do grupo de administradores + terms: + type: object + properties: + tag: + type: array + example: [] + description: Tags associadas ao grupo de administradores + area: + type: array + example: ["Outros"] + description: Áreas relacionadas ao grupo de administradores + funcao: + type: array + example: ["Administrador"] + description: Funções relacionadas ao grupo de administradores + files: + type: array + example: [] + description: Arquivos associados ao grupo de administradores + single: + type: string + example: "http://localhost/agent/1" + description: URL do grupo de administradores + type: + type: object + properties: + id: + type: integer + example: 1 + description: O id do tipo do grupo de administradores + name: + type: string + example: "Individual" + description: O nome do tipo do grupo de administradores + '@entityType': + type: string + example: "agent" + description: Tipo de entidade do grupo de administradores + relationStatus: + type: integer + example: 1 + description: Status da relação do grupo de administradores \ No newline at end of file diff --git a/public/docs/v1/components/schemas/describe-item.yaml b/public/docs/v1/components/schemas/describe-item.yaml new file mode 100644 index 0000000000..4d98dcaf8c --- /dev/null +++ b/public/docs/v1/components/schemas/describe-item.yaml @@ -0,0 +1,26 @@ +type: object +properties: + field: + type: object + properties: + isMetadata: + type: string + description: Identifica se o campo é um metadado. + isEntityRelation: + type: string + description: Identifica se o campo é uma relação com outra entity. + required: + type: boolean + description: Identifica se o campo é requerido. + type: + type: string + description: O tipo de dado. + length: + type: integer + description: O tamanho. + label: + type: boolean + description: O nome do campo. + isPK: + type: boolean + description: Identifica se o campo é uma primary key. diff --git a/public/docs/v1/components/schemas/event-describe.yaml b/public/docs/v1/components/schemas/event-describe.yaml new file mode 100644 index 0000000000..3b875aa208 --- /dev/null +++ b/public/docs/v1/components/schemas/event-describe.yaml @@ -0,0 +1,195 @@ +type: object +properties: + id: + type: integer + example: 1 + description: "Um id numérico que representa o Evento" + required: true + location: + type: point + example: { "type": "Point", "coordinates": [ -46.633309, -23.550520 ] } + description: "Localização geográfica do Evento" + required: true + name: + type: string + example: "Nome do Evento" + maxLength: 255 + description: "Um texto que representa o nome do Evento" + required: true + shortDescription: + type: string + example: "Descrição curta do Evento" + description: "Uma breve descrição do Evento" + required: false + longDescription: + type: string + example: "Descrição longa do Evento" + description: "Uma descrição detalhada do Evento" + required: false + certificateText: + type: string + example: "Texto do certificado do Evento" + description: "Texto do certificado do Evento" + required: false + createTimestamp: + type: string + format: date-time + example: "2024-03-11 14:52:35.000000" + description: "Data e hora de criação do Evento" + required: true + status: + type: integer + example: 1 + description: "Um número que representa o status do Evento" + required: true + _type: + type: integer + example: 1 + description: "Um número que representa o tipo do Evento" + required: true + isVerified: + type: boolean + example: true + description: "Indica se o Evento foi verificado" + required: true + parent: + type: object + properties: + id: + type: integer + example: 1 + description: "ID do Evento pai" + required: false + children: + type: array + items: + type: object + properties: + id: + type: integer + example: 2 + description: "ID do Evento filho" + description: "Filhos do Evento" + required: false + owner: + type: object + properties: + id: + type: integer + example: 1 + description: "ID do Agente que criou o Evento" + required: true + emailPublico: + type: string + example: "public@example.com" + description: "Email público do Evento" + required: false + emailPrivado: + type: string + example: "private@example.com" + description: "Email privado do Evento" + required: false + telefonePublico: + type: string + example: "+5511987654321" + description: "Telefone público do Evento" + required: false + telefone1: + type: string + example: "+5511987654321" + description: "Telefone 1 do Evento" + required: false + telefone2: + type: string + example: "+5511987654321" + description: "Telefone 2 do Evento" + required: false + acessibilidade: + type: string + example: "Sim" + description: "Acessibilidade do Evento" + required: false + capacidade: + type: string + example: "100 pessoas" + description: "Capacidade do Evento" + required: false + endereco: + type: string + example: "Rua Exemplo, 123 - Cidade, Estado" + description: "Endereço do Evento" + required: false + horario: + type: string + example: "Das 09:00 às 18:00" + description: "Horário de funcionamento do Evento" + required: false + criterios: + type: string + example: "Critérios de uso do espaço" + description: "Critérios de uso do espaço do Evento" + required: false + site: + type: string + example: "https://example.com" + description: "Site do Evento" + required: false + facebook: + type: string + example: "https://facebook.com/example" + description: "Facebook do Evento" + required: false + twitter: + type: string + example: "https://twitter.com/example" + description: "Twitter do Evento" + required: false + googleplus: + type: string + example: "https://plus.google.com/example" + description: "Google+ associado ao Evento" + required: false + regiao: + type: string + example: "Região do Evento" + description: "Região onde o Evento ocorre" + required: false + distrito: + type: string + example: "Distrito do Evento" + description: "Distrito onde o Evento ocorre" + required: false + subprefeitura: + type: string + example: "Subprefeitura do Evento" + description: "Subprefeitura onde o Evento ocorre" + required: false + '@file': + type: object + properties: + header: + type: array + items: + type: string + example: [ "header1", "header2" ] + description: "Cabeçalhos associados ao Evento" + avatar: + type: array + items: + type: string + example: [ "avatar1", "avatar2" ] + description: "Avatares associados ao Evento" + downloads: + type: array + items: + type: string + example: [ "download1", "download2" ] + description: "Downloads associados ao Evento" + gallery: + type: array + items: + type: string + example: [ "gallery1", "gallery2" ] + description: "Galeria de imagens do Evento" + + diff --git a/public/docs/v1/components/schemas/event-find-occurrences.yaml b/public/docs/v1/components/schemas/event-find-occurrences.yaml new file mode 100644 index 0000000000..3692621e27 --- /dev/null +++ b/public/docs/v1/components/schemas/event-find-occurrences.yaml @@ -0,0 +1,113 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Identificador único do evento + "@entityType": + type: string + example: event + description: Tipo de entidade + occurrence_id: + type: integer + example: 2 + description: Identificador da ocorrência + event_id: + type: integer + example: 1 + description: Identificador do evento + starts_on: + type: string + format: date + example: 2024-03-01 + description: Data de início do evento + starts_at: + type: string + example: 11:26:00 + description: Hora de início do evento + ends_on: + type: string + format: date + example: null + description: Data de término do evento + ends_at: + type: string + example: 11:26:00 + description: Hora de término do evento + rule: + type: object + properties: + startsOn: + type: string + format: date + example: 2024-03-01 + description: Data de início da regra + startsAt: + type: string + example: 11:26 + description: Hora de início da regra + endsAt: + type: string + example: 11:26 + description: Hora de término da regra + frequency: + type: string + example: once + description: Frequência da regra + description: + type: string + example: Dia 01 de Março de 2024 das 11:26 às 15:30 + description: Descrição da regra + price: + type: string + example: Gratuito + description: Preço da regra + priceInfo: + type: string + example: "" + description: Informação de preço da regra + spaceId: + type: integer + example: 1 + description: Identificador do espaço da regra + space: + type: integer + example: 1 + description: Espaço da regra + until: + type: string + format: date + example: null + description: Data de término da regra + duration: + type: integer + example: 0 + description: Duração da regra + day: + type: string + example: null + description: Dia da regra + required: [startsOn, startsAt, endsAt, frequency, description, price, priceInfo, spaceId, space, until, duration, day] + description: Regra do evento + space: + type: object + properties: + id: + type: integer + example: 1 + description: Identificador do espaço + "@entityType": + type: string + example: space + description: Tipo de entidade do espaço + required: [id, "@entityType"] + description: Espaço do evento + attendance: + type: string + example: null + description: Presença no evento + _reccurrence_string: + type: string + example: 2.2024-03-01.11:26:00..11:26:00 + description: String de recorrência do evento +description: Objeto de evento \ No newline at end of file diff --git a/public/docs/v1/components/schemas/event-type-groups.yaml b/public/docs/v1/components/schemas/event-type-groups.yaml new file mode 100644 index 0000000000..fda5c5cc76 --- /dev/null +++ b/public/docs/v1/components/schemas/event-type-groups.yaml @@ -0,0 +1,14 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Identificador do grupo de tipos de eventos. + name: + type: string + example: Tipo de Evento + description: Nome do grupo. + types: + type: array + items: + $ref: './event-type.yaml' \ No newline at end of file diff --git a/public/docs/v1/components/schemas/event-type.yaml b/public/docs/v1/components/schemas/event-type.yaml new file mode 100644 index 0000000000..913dfc586d --- /dev/null +++ b/public/docs/v1/components/schemas/event-type.yaml @@ -0,0 +1,13 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id numérico que representa o Tipo do Evento + name: + type: string + example: "Conferência" + description: Um texto que representa o Tipo do Evento +required: + - id + - name diff --git a/public/docs/v1/components/schemas/event.yaml b/public/docs/v1/components/schemas/event.yaml new file mode 100644 index 0000000000..5d68a09cd1 --- /dev/null +++ b/public/docs/v1/components/schemas/event.yaml @@ -0,0 +1,178 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id numérico que representa o Evento + name: + type: string + example: "evento teste" + description: Um texto que representa o nome do Evento + shortDescription: + type: string + example: "teste de evento" + description: Uma breve descrição do Evento + longDescription: + type: string + nullable: true + description: Uma descrição detalhada do Evento + rules: + type: string + nullable: true + description: Regras do Evento + createTimestamp: + $ref: '../common-types/date.yaml' + status: + type: integer + example: 1 + description: Um número que representa o status do Evento + updateTimestamp: + $ref: '../common-types/date.yaml' + owner: + type: integer + example: 1 + description: O Agente que criou o Evento + project: + type: string + nullable: true + description: Projeto associado ao Evento + subsite: + type: string + nullable: true + description: Subsite associado ao Evento + currentUserPermissions: + type: object + properties: + '@control': + type: boolean + example: false + create: + type: boolean + example: false + modify: + type: boolean + example: false + unpublish: + type: boolean + example: false + publish: + type: boolean + example: false + view: + type: boolean + example: true + remove: + type: boolean + example: false + _control: + type: boolean + example: false + viewPrivateFiles: + type: boolean + example: false + changeOwner: + type: boolean + example: false + viewPrivateData: + type: boolean + example: false + createAgentRelation: + type: boolean + example: false + createAgentRelationWithControl: + type: boolean + example: false + removeAgentRelation: + type: boolean + example: false + removeAgentRelationWithControl: + type: boolean + example: false + createSealRelation: + type: boolean + example: false + removeSealRelation: + type: boolean + example: false + destroy: + type: boolean + example: false + archive: + type: boolean + example: false + unarchive: + type: boolean + example: false + description: Permissões do usuário atual para o Evento + classificacaoEtaria: + type: string + example: "18 anos" + description: Classificação etária do Evento + occurrences: + type: array + items: + type: string + description: Ocorrências do Evento + relatedOpportunities: + type: array + items: + type: string + description: Oportunidades relacionadas ao Evento + terms: + type: object + properties: + tag: + type: array + items: + type: string + linguagem: + type: array + items: + type: string + example: ["Curso ou Oficina"] + description: Termos associados ao Evento + metalists: + type: array + items: + type: string + description: Metalistas associadas ao Evento + files: + type: array + items: + type: string + description: Arquivos associados ao Evento + seals: + type: array + items: + type: string + description: Selos associados ao Evento + type: + type: object + properties: + id: + type: integer + example: 1 + name: + type: string + example: "Padrão" + description: Tipo do Evento + subsiteId: + type: integer + nullable: true + description: ID do subsite associado ao Evento + subTitle: + type: string + nullable: true + description: Subtítulo do Evento + registrationInfo: + type: string + nullable: true + description: Informações de registro do Evento + telefonePublico: + type: string + nullable: true + description: Telefone público do Evento + preco: + type: string + nullable: true + description: Preço do Evento \ No newline at end of file diff --git a/public/docs/v1/components/schemas/opportunity-type.yaml b/public/docs/v1/components/schemas/opportunity-type.yaml new file mode 100644 index 0000000000..a55d1ce106 --- /dev/null +++ b/public/docs/v1/components/schemas/opportunity-type.yaml @@ -0,0 +1,13 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id númerico que representa o Tipo de Oportunidade + name: + type: string + example: Festival + description: Um texto que representa o Tipo de Oportunidade +required: + - id + - name diff --git a/public/docs/v1/components/schemas/opportunity.yaml b/public/docs/v1/components/schemas/opportunity.yaml new file mode 100644 index 0000000000..3d67ec833c --- /dev/null +++ b/public/docs/v1/components/schemas/opportunity.yaml @@ -0,0 +1,42 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id númerico que representa o Tipo de Oportunidade + name: + type: string + example: Edital 032024 - Festival de Leitura + description: Um texto que representa o Tipo de Oportunidade + shortDescription: + type: string + description: Uma breve descrição da oportunidade + registrationFrom: + $ref: '../common-types/date.yaml' + registrationTo: + $ref: '../common-types/date.yaml' + publishedRegistrations: + type: boolean + description: Se a Oportunidade possui publicações registradas + registrationCategories: + type: array + description: Uma lista de categorias associadas a essa oportunidade + createTimestamp: + $ref: '../common-types/date.yaml' + publishTimestamp: + $ref: '../common-types/date.yaml' + autoPublish: + type: boolean + description: Se a oportunidade será publicada automaticamente + status: + type: integer + enum: + - 1 + - 0 + - -9 + - -10 + - -2 + description: Um numero que representa o status + owner: + type: object + description: O Agente que criou a oportunidade diff --git a/public/docs/v1/components/schemas/project-describe.yaml b/public/docs/v1/components/schemas/project-describe.yaml new file mode 100644 index 0000000000..8debc433cb --- /dev/null +++ b/public/docs/v1/components/schemas/project-describe.yaml @@ -0,0 +1,333 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id numérico que representa o Projeto + required: true + _type: + type: integer + example: 1 + description: Um número que representa o tipo do Projeto + required: true + name: + type: string + example: "Nome do Projeto" + maxLength: 255 + description: Um texto que representa o nome do Projeto + required: true + shortDescription: + type: string + example: "Descrição curta do Projeto" + description: Uma breve descrição do Projeto + required: true + longDescription: + type: string + example: "Descrição longa do Projeto" + description: Uma descrição detalhada do Projeto + required: false + updateTimestamp: + type: string + format: date-time + example: "2024-03-11 14:52:35.000000" + description: Data e hora da última atualização do Projeto + required: false + startsOn: + type: string + format: date-time + example: "2024-03-11 14:52:35.000000" + description: Data e hora de início do Projeto + required: false + endsOn: + type: string + format: date-time + example: "2024-03-11 14:52:35.000000" + description: Data e hora de término do Projeto + required: false + createTimestamp: + type: string + format: date-time + example: "2024-03-11 14:52:35.000000" + description: Data e hora de criação do Projeto + required: true + status: + type: integer + example: 1 + description: Um número que representa o status do Projeto + required: true + _subsiteId: + type: integer + example: 1 + description: ID do subsite associado ao Projeto + required: false + parent: + type: object + properties: + id: + type: integer + example: 1 + description: ID do Projeto pai + required: false + _children: + type: array + items: + type: object + properties: + id: + type: integer + example: 2 + description: ID do Projeto filho + description: Filhos do Projeto + required: false + owner: + type: object + properties: + id: + type: integer + example: 1 + description: ID do Agente que criou o Projeto + required: true + _events: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID do Evento associado ao Projeto + description: Eventos associados ao Projeto + required: false + _relatedOpportunities: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID da Oportunidade relacionada ao Projeto + description: Oportunidades relacionadas ao Projeto + required: false + __metadata: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID do Metadado associado ao Projeto + description: Metadados associados ao Projeto + required: false + __files: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID do Arquivo associado ao Projeto + description: Arquivos associados ao Projeto + required: false + __agentRelations: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID da Relação de Agente associada ao Projeto + description: Relações de Agente associadas ao Projeto + required: false + __termRelations: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID da Relação de Termo associada ao Projeto + description: Relações de Termo associadas ao Projeto + required: false + __sealRelations: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID da Relação de Selo associada ao Projeto + description: Relações de Selo associadas ao Projeto + required: false + __permissionsCache: + type: array + items: + type: object + properties: + id: + type: integer + example: 1 + description: ID do Cache de Permissão associado ao Projeto + description: Caches de Permissão associados ao Projeto + required: false + subsite: + type: object + properties: + id: + type: integer + example: 1 + description: ID do Subsite associado ao Projeto + required: false + site: + type: string + example: "https://example.com" + description: Site associado ao Projeto + required: false + facebook: + type: string + example: "https://facebook.com/example" + description: Facebook associado ao Projeto + required: false + twitter: + type: string + example: "https://twitter.com/example" + description: Twitter associado ao Projeto + required: false + instagram: + type: string + example: "https://instagram.com/example" + description: Instagram associado ao Projeto + required: false + linkedin: + type: string + example: "https://linkedin.com/in/example" + description: LinkedIn associado ao Projeto + required: false + vimeo: + type: string + example: "https://vimeo.com/example" + description: Vimeo associado ao Projeto + required: false + spotify: + type: string + example: "https://open.spotify.com/user/example" + description: Spotify associado ao Projeto + required: false + youtube: + type: string + example: "https://youtube.com/channel/example" + description: YouTube associado ao Projeto + required: false + pinterest: + type: string + example: "https://pinterest.com/example" + description: Pinterest associado ao Projeto + required: false + emailPublico: + type: string + example: "public@example.com" + description: Email público do Projeto + required: false + emailPrivado: + type: string + example: "private@example.com" + description: Email privado do Projeto + required: false + telefonePublico: + type: string + example: "+5511987654321" + description: Telefone público do Projeto + required: false + telefone1: + type: string + example: "+5511987654321" + description: Telefone 1 do Projeto + required: false + telefone2: + type: string + example: "+5511987654321" + description: Telefone 2 do Projeto + required: false + type: + type: string + example: "Festival" + description: Tipo do Projeto + enum: + - Ciclo + - Concurso + - Conferência Pública Estadual + - Conferência Pública Municipal + - Conferência Pública Nacional + - Conferência Pública Setorial + - Congresso + - Consulta + - Convenção + - Curso + - Edital + - Encontro + - Exibição + - Exposição + - Feira + - Festa Popular + - Festa Religiosa + - Festival + - Fórum + - Inscrições + - Intercâmbio Cultural + - Jornada + - Jornada + - Mostra + - Oficina + - Palestra + - Parada e Desfile Cívico + - Parada e Desfile Festivo + - Parada e Desfile Militar + - Parada e Desfile Político + - Parada e Desfile de Ações Afirmativas + - Pesquisa + - Programa + - Reunião + - Sarau + - Seminário + - Simpósio + required: true + singleUrl: + type: string + example: "https://example.com/single" + description: URL única do Projeto + required: false + editUrl: + type: string + example: "https://example.com/edit" + description: URL de edição do Projeto + required: false + '@file': + type: object + properties: + header: + type: array + items: + type: string + example: ["header"] + avatar: + type: array + items: + type: string + example: ["avatar", "avatarSmall", "avatarMedium", "avatarBig", "avatarEvent"] + downloads: + type: array + items: + type: string + example: ["downloads"] + gallery: + type: array + items: + type: string + example: ["gallery", "galleryThumb", "galleryFull"] + description: Arquivos associados ao Projeto + required: false diff --git a/public/docs/v1/components/schemas/project-type-groups.yaml b/public/docs/v1/components/schemas/project-type-groups.yaml new file mode 100644 index 0000000000..38a04989d7 --- /dev/null +++ b/public/docs/v1/components/schemas/project-type-groups.yaml @@ -0,0 +1,14 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Identificador do grupo de tipos de projeto. + name: + type: string + example: tipo de projeto + description: Nome do grupo. + types: + type: array + items: + $ref: './project-type.yaml' diff --git a/public/docs/v1/components/schemas/project-type.yaml b/public/docs/v1/components/schemas/project-type.yaml new file mode 100644 index 0000000000..fdf740d0a3 --- /dev/null +++ b/public/docs/v1/components/schemas/project-type.yaml @@ -0,0 +1,13 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id númerico que representa o Tipo do Projeto + name: + type: string + example: Festival + description: Um texto que representa o Tipo do Projeto +required: + - id + - name diff --git a/public/docs/v1/components/schemas/project.yaml b/public/docs/v1/components/schemas/project.yaml new file mode 100644 index 0000000000..7906b07562 --- /dev/null +++ b/public/docs/v1/components/schemas/project.yaml @@ -0,0 +1,231 @@ +type: object +properties: + id: + type: integer + example: 4 + description: Um id numérico que representa o Projeto + name: + type: string + example: "teste projeto" + description: Um texto que representa o nome do Projeto + shortDescription: + type: string + example: "teste de projeto" + description: Uma breve descrição do Projeto + longDescription: + type: string + nullable: true + description: Uma descrição detalhada do Projeto + updateTimestamp: + $ref: '../common-types/date.yaml' + startsOn: + type: string + format: date-time + nullable: true + description: Data de início do Projeto + endsOn: + type: string + format: date-time + nullable: true + description: Data de término do Projeto + createTimestamp: + $ref: '../common-types/date.yaml' + status: + type: integer + example: 1 + description: Um número que representa o status do Projeto + parent: + type: integer + nullable: true + description: ID do Projeto pai + owner: + type: integer + example: 1 + description: O Agente que criou o Projeto + subsite: + type: string + nullable: true + description: Subsite associado ao Projeto + currentUserPermissions: + type: object + properties: + '@control': + type: boolean + example: false + createEvents: + type: boolean + example: false + requestEventRelation: + type: boolean + example: false + view: + type: boolean + example: true + create: + type: boolean + example: false + modify: + type: boolean + example: false + remove: + type: boolean + example: false + _control: + type: boolean + example: false + viewPrivateFiles: + type: boolean + example: false + changeOwner: + type: boolean + example: false + viewPrivateData: + type: boolean + example: false + createAgentRelation: + type: boolean + example: false + createAgentRelationWithControl: + type: boolean + example: false + removeAgentRelation: + type: boolean + example: false + removeAgentRelationWithControl: + type: boolean + example: false + createSealRelation: + type: boolean + example: false + removeSealRelation: + type: boolean + example: false + destroy: + type: boolean + example: false + publish: + type: boolean + example: false + archive: + type: boolean + example: false + unarchive: + type: boolean + example: false + description: Permissões do usuário atual para o Projeto + children: + type: array + items: + type: string + description: Filhos do Projeto + events: + type: array + items: + type: string + description: Eventos associados ao Projeto + relatedOpportunities: + type: array + items: + type: string + description: Oportunidades relacionadas ao Projeto + terms: + type: object + properties: + tag: + type: array + items: + type: string + description: Termos associados ao Projeto + metalists: + type: array + items: + type: string + description: Metalistas associadas ao Projeto + files: + type: array + items: + type: string + description: Arquivos associados ao Projeto + seals: + type: array + items: + type: string + description: Selos associados ao Projeto + type: + type: object + properties: + id: + type: integer + example: 1 + name: + type: string + example: "Festival" + description: Tipo do Projeto + subsiteId: + type: integer + nullable: true + description: ID do subsite associado ao Projeto + site: + type: string + nullable: true + description: Site associado ao Projeto + facebook: + type: string + nullable: true + description: Facebook associado ao Projeto + twitter: + type: string + nullable: true + description: Twitter associado ao Projeto + instagram: + type: string + nullable: true + description: Instagram associado ao Projeto + linkedin: + type: string + nullable: true + description: LinkedIn associado ao Projeto + vimeo: + type: string + nullable: true + description: Vimeo associado ao Projeto + spotify: + type: string + nullable: true + description: Spotify associado ao Projeto + youtube: + type: string + nullable: true + description: YouTube associado ao Projeto + pinterest: + type: string + nullable: true + description: Pinterest associado ao Projeto + emailPublico: + type: string + nullable: true + description: Email público do Projeto + emailPrivado: + type: string + nullable: true + description: Email privado do Projeto + telefonePublico: + type: string + nullable: true + description: Telefone público do Projeto + telefone1: + type: string + nullable: true + description: Telefone 1 do Projeto + telefone2: + type: string + nullable: true + description: Telefone 2 do Projeto + relatedAgents: + type: string + nullable: true + description: Agentes relacionados ao Projeto + '@entityType': + type: string + example: project + description: Um texto que representa qual a entidade é retornada diff --git a/public/docs/v1/components/schemas/seal-describe.yaml b/public/docs/v1/components/schemas/seal-describe.yaml new file mode 100644 index 0000000000..e74f01c43c --- /dev/null +++ b/public/docs/v1/components/schemas/seal-describe.yaml @@ -0,0 +1,116 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id numérico que representa o Selo + required: true + name: + type: string + example: "Selo Mapas" + maxLength: 255 + description: Um texto que representa o nome do Selo + required: true + shortDescription: + type: string + example: "Descrição curta Selo Mapas" + description: Uma breve descrição do Selo + required: true + longDescription: + type: string + example: "Descrição longa Selo Mapas" + description: Uma descrição detalhada do Selo + required: false + certificateText: + type: string + example: "Texto do certificado do Selo" + description: Texto do certificado do Selo + required: false + validPeriod: + type: integer + example: 365 + description: Período de validade do Selo + required: true + createTimestamp: + $ref: '../common-types/date.yaml' + status: + type: integer + example: 1 + description: Um número que representa o status do Selo + required: true + lockedFields: + type: array + items: + type: string + example: ["field1", "field2"] + description: Campos bloqueados do Selo + required: false + updateTimestamp: + $ref: '../common-types/date.yaml' + _subsiteId: + type: integer + example: 123 + description: ID do subsite associado ao Selo + required: false + owner: + type: object + example: { "id": 1, "name": "Owner Name" } + description: O Agente que criou o Selo + __metadata: + type: object + example: { "meta1": "value1", "meta2": "value2" } + description: Metadados associados ao Selo + __files: + type: object + example: { "file1": "path/to/file1", "file2": "path/to/file2" } + description: Arquivos associados ao Selo + __agentRelations: + type: object + example: { "agent1": "relation1", "agent2": "relation2" } + description: Relações de agentes associados ao Selo + __permissionsCache: + type: object + example: { "permission1": true, "permission2": false } + description: Cache de permissões associadas ao Selo + subsite: + type: object + example: { "id": 1, "name": "Subsite Name" } + description: Subsite associado ao Selo + site: + type: string + example: "https://example.com" + description: Site associado ao Selo + required: false + singleUrl: + type: string + example: "https://example.com/seal/1" + description: URL única do Selo + required: false + editUrl: + type: string + example: "https://example.com/seal/1/edit" + description: URL de edição do Selo + required: false + '@file': + type: object + properties: + downloads: + type: array + items: + type: string + example: ["file1", "file2"] + header: + type: array + items: + type: string + example: ["header1", "header2"] + avatar: + type: array + items: + type: string + example: ["avatar1", "avatar2"] + gallery: + type: array + items: + type: string + example: ["gallery1", "gallery2"] \ No newline at end of file diff --git a/public/docs/v1/components/schemas/seal-type-groups.yaml b/public/docs/v1/components/schemas/seal-type-groups.yaml new file mode 100644 index 0000000000..f251afc695 --- /dev/null +++ b/public/docs/v1/components/schemas/seal-type-groups.yaml @@ -0,0 +1,12 @@ +type: object +properties: + id: + type: integer + description: Identificador do grupo de tipos de selos. + name: + type: string + description: Nome do grupo. + types: + type: array + items: + $ref: './seal-type.yaml' diff --git a/public/docs/v1/components/schemas/seal-type.yaml b/public/docs/v1/components/schemas/seal-type.yaml new file mode 100644 index 0000000000..8081eb0026 --- /dev/null +++ b/public/docs/v1/components/schemas/seal-type.yaml @@ -0,0 +1,13 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id númerico que representa o Tipo do Selo + name: + type: string + example: Dias + description: Um texto que representa o Tipo do Selo +required: + - id + - name diff --git a/public/docs/v1/components/schemas/seal.yaml b/public/docs/v1/components/schemas/seal.yaml new file mode 100644 index 0000000000..402e4432d4 --- /dev/null +++ b/public/docs/v1/components/schemas/seal.yaml @@ -0,0 +1,136 @@ +type: object +properties: + id: + type: integer + example: 1 + description: Um id numérico que representa o Selo + name: + type: string + example: Selo Mapas + description: Um texto que representa o nome do Selo + shortDescription: + type: string + example: Descrição curta Selo Mapas + description: Uma breve descrição do Selo + longDescription: + type: string + example: Descrição longa Selo Mapas + description: Uma descrição detalhada do Selo + certificateText: + type: string + nullable: true + description: Texto do certificado do Selo + validPeriod: + type: integer + example: 0 + description: Período de validade do Selo + createTimestamp: + $ref: '../common-types/date.yaml' + status: + type: integer + example: 1 + description: Um número que representa o status do Selo + lockedFields: + type: array + items: + type: string + description: Campos bloqueados do Selo + updateTimestamp: + $ref: '../common-types/date.yaml' + owner: + type: integer + example: 1 + description: O Agente que criou o Selo + subsite: + type: string + nullable: true + description: Subsite associado ao Selo + currentUserPermissions: + type: object + properties: + '@control': + type: boolean + example: false + remove: + type: boolean + example: false + archive: + type: boolean + example: false + view: + type: boolean + example: true + create: + type: boolean + example: false + modify: + type: boolean + example: false + _control: + type: boolean + example: false + viewPrivateFiles: + type: boolean + example: false + viewPrivateData: + type: boolean + example: false + changeOwner: + type: boolean + example: false + createAgentRelation: + type: boolean + example: false + createAgentRelationWithControl: + type: boolean + example: false + removeAgentRelation: + type: boolean + example: false + removeAgentRelationWithControl: + type: boolean + example: false + destroy: + type: boolean + example: false + publish: + type: boolean + example: false + unarchive: + type: boolean + example: false + description: Permissões do usuário atual para o Selo + metalists: + type: array + items: + type: string + description: Metalistas associadas ao Selo + files: + type: array + items: + type: string + description: Arquivos associados ao Selo + ownerId: + type: integer + nullable: true + description: ID do proprietário do Selo + subsiteId: + type: integer + nullable: true + description: ID do subsite associado ao Selo + site: + type: string + nullable: true + description: Site associado ao Selo + seals: + type: string + nullable: true + description: Selos associados + relatedAgents: + type: string + nullable: true + description: Agentes relacionados ao Selo + '@entityType': + type: string + example: seal + description: Um texto que representa qual a entidade é retornada diff --git a/public/docs/v1/components/schemas/space-type-group.yaml b/public/docs/v1/components/schemas/space-type-group.yaml new file mode 100644 index 0000000000..b59d0b067b --- /dev/null +++ b/public/docs/v1/components/schemas/space-type-group.yaml @@ -0,0 +1,15 @@ +type: object +properties: + name: + type: string + description: Nome do grupo. + minId: + type: string + description: Identificador do menor id para o grupo. + maxId: + type: string + description: Identificador do maior id para o grupo. + types: + type: array + items: + $ref: '../schemas/space-type.yaml' diff --git a/public/docs/v1/components/schemas/space-type.yaml b/public/docs/v1/components/schemas/space-type.yaml new file mode 100644 index 0000000000..2c9239160a --- /dev/null +++ b/public/docs/v1/components/schemas/space-type.yaml @@ -0,0 +1,8 @@ +type: object +properties: + id: + type: integer + description: O identificador único do espaço. + name: + type: string + description: O nome do tipo de espaço cultural. diff --git a/public/docs/v1/components/schemas/space.yaml b/public/docs/v1/components/schemas/space.yaml new file mode 100644 index 0000000000..2af91e15f5 --- /dev/null +++ b/public/docs/v1/components/schemas/space.yaml @@ -0,0 +1,298 @@ +type: object +properties: + id: + type: integer + example: 5 + description: Um id numérico que representa o espaço + location: + type: object + properties: + latitude: + type: string + example: "0" + description: Latitude do espaço + longitude: + type: string + example: "0" + description: Longitude do espaço + name: + type: string + example: Secult + description: Um texto que representa o nome do espaço + public: + type: boolean + example: false + description: Indica se o espaço é público ou não + shortDescription: + type: string + example: Secult + description: Uma breve descrição do espaço + longDescription: + type: string + example: null + description: Descrição detalhada do espaço + createTimestamp: + $ref: '../common-types/date.yaml' + status: + type: integer + example: 1 + description: Status do espaço + updateTimestamp: + $ref: '../common-types/date.yaml' + parent: + type: integer + description: O espaço pai (se houver) + owner: + type: integer + example: 1 + description: Proprietário do espaço + subsite: + type: integer + description: Subsite do espaço (se houver) + currentUserPermissions: + type: object + properties: + '@control': + type: boolean + example: true + description: Controle do usuário atual + view: + type: boolean + example: true + description: Permissão de visualização + create: + type: boolean + example: true + description: Permissão de criação + modify: + type: boolean + example: true + description: Permissão de modificação + remove: + type: boolean + example: true + description: Permissão de remoção + _control: + type: boolean + example: true + description: Controle especial + viewPrivateFiles: + type: boolean + example: true + description: Visualizar arquivos privados + changeOwner: + type: boolean + example: true + description: Alterar proprietário + viewPrivateData: + type: boolean + example: true + description: Visualizar dados privados + createAgentRelation: + type: boolean + example: true + description: Criar relação de agente + createAgentRelationWithControl: + type: boolean + example: true + description: Criar relação de agente com controle + removeAgentRelation: + type: boolean + example: true + description: Remover relação de agente + removeAgentRelationWithControl: + type: boolean + example: true + description: Remover relação de agente com controle + createSealRelation: + type: boolean + example: true + description: Criar relação de selo + removeSealRelation: + type: boolean + example: true + description: Remover relação de selo + destroy: + type: boolean + example: true + description: Destruir + publish: + type: boolean + example: true + description: Publicar + archive: + type: boolean + example: true + description: Arquivar + unarchive: + type: boolean + example: true + description: Desarquivar + eventOccurrences: + type: array + items: + type: integer + example: [] + description: Ocorrências de eventos associados ao espaço + children: + type: array + items: + type: integer + example: [] + description: Espaços filhos (se houver) + relatedOpportunities: + type: array + items: + type: integer + example: [] + description: Oportunidades relacionadas + terms: + type: object + properties: + tag: + type: array + items: + type: string + example: [] + description: Tags associadas ao espaço + area: + type: array + items: + type: string + example: ["Outros", "Patrimônio Cultural"] + description: Áreas relacionadas ao espaço + metalists: + type: array + items: + type: string + example: [] + description: Meta-listas associadas ao espaço + files: + type: array + items: + type: integer + example: [] + description: Arquivos associados ao espaço + seals: + type: array + items: + type: integer + example: [] + description: Selos associados ao espaço + type: + type: object + properties: + id: + type: integer + example: 50 + description: ID do tipo de espaço + name: + type: string + example: Arquivo Público + description: Nome do tipo de espaço + ownerId: + type: integer + description: ID do proprietário (se houver) + subsiteId: + type: integer + description: ID do subsite (se houver) + emailPublico: + type: string + description: Email público (se houver) + emailPrivado: + type: string + description: Email privado (se houver) + cnpj: + type: string + description: CNPJ (se houver) + razaoSocial: + type: string + description: Razão social (se houver) + telefonePublico: + type: string + description: Telefone público (se houver) + telefone1: + type: string + description: Telefone 1 (se houver) + telefone2: + type: string + description: Telefone 2 (se houver) + acessibilidade: + type: string + description: Acessibilidade (se houver) + acessibilidade_fisica: + type: array + items: + type: string + example: ["Banheiros adaptados", "Bebedouro adaptado", "Circuito de visitação adaptado", "Sanitário adaptado", "Vaga de estacionamento exclusiva para idosos"] + description: Acessibilidade física (se houver) + capacidade: + type: integer + description: Capacidade (se houver) + endereco: + type: string + description: Endereço (se houver) + En_CEP: + type: string + description: CEP (se houver) + En_Nome_Logradouro: + type: string + description: Nome do logradouro (se houver) + En_Num: + type: integer + description: Número do endereço (se houver) + En_Complemento: + type: string + description: Complemento do endereço (se houver) + En_Bairro: + type: string + description: Bairro (se houver) + En_Municipio: + type: string + description: Município (se houver) + En_Estado: + type: string + description: Estado (se houver) + horario: + type: integer + description: Horário (se houver) + criterios: + type: string + description: Critérios (se houver) + site: + type: integer + description: Site (se houver) + facebook: + type: string + description: Facebook (se houver) + twitter: + type: string + description: Twitter (se houver) + instagram: + type: string + description: Instagram (se houver) + linkedin: + type: string + description: LinkedIn (se houver) + vimeo: + type: string + description: Vimeo (se houver) + spotify: + type: string + description: Spotify (se houver) + youtube: + type: string + description: YouTube (se houver) + pinterest: + type: string + description: Pinterest (se houver) + sentNotification: + type: integer + description: Notificação enviada (se houver) + relatedAgents: + type: integer + description: Agentes relacionados (se houver) + '@entityType': + type: string + example: space + description: Tipo de entidade \ No newline at end of file diff --git a/public/docs/v1/index.html b/public/docs/v1/index.html new file mode 100644 index 0000000000..3759f15142 --- /dev/null +++ b/public/docs/v1/index.html @@ -0,0 +1,19 @@ + + + + + + + API Mapas Culturais - Documentação + + + + + +
+ + + + + + \ No newline at end of file diff --git a/public/docs/v1/openapi.yaml b/public/docs/v1/openapi.yaml new file mode 100644 index 0000000000..9fbe4ed1d0 --- /dev/null +++ b/public/docs/v1/openapi.yaml @@ -0,0 +1,189 @@ +openapi: 3.0.2 +info: + title: API Mapas Culturais - OpenAPI 3.0 + description: |- + Descreva aqui o que a API do Mapas faz + + Links Importantes: + - [Mapa Cultural do Ceará](https://mapacultural.secult.ce.gov.br/) + contact: + email: contato@email.com + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + version: 1.0.18 +externalDocs: + description: Find out more about Swagger + url: http://swagger.io +servers: + - url: / +tags: + - name: Agentes + description: Rotas relacionadas aos agentes + - name: Espaços + description: Rotas relacionadas aos espaços + - name: Eventos + description: Rotas relacionadas aos eventos + - name: Oportunidades + description: Rotas relacionadas às oportunidades + - name: Projetos + description: Rotas relacionadas aos projetos + - name: Selos + description: Rotas relacionadas aos selos + - name: Site + description: Rotas relacionadas ao site + - name: Termos + description: Rotas relacionadas aos termos +paths: + /agent/addRole/{id}: + $ref: './components/paths/agent/add-role.yaml' + /agent/archive/{id}: + $ref: './components/paths/agent/archive.yaml' + /agente/{id}: + $ref: './components/paths/agent/route-single-id.yaml' + /agent/index: + $ref: './components/paths/agent/create.yaml' + /agent/publish/{id}: + $ref: './components/paths/agent/publish.yaml' + /agent/removeRole/{id}: + $ref: './components/paths/agent/remove-role.yaml' + /agent/setAsUserProfile: + $ref: './components/paths/agent/set-as-user-profile.yaml' + /agent/undelete/{id}: + $ref: './components/paths/agent/undelete.yaml' + /api/agent/describe: + $ref: './components/paths/agent/describe.yaml' + /api/agent/find: + $ref: './components/paths/agent/find.yaml' + /api/agent/findOne: + $ref: './components/paths/agent/find-one.yaml' + /api/agent/getTypeGroups: + $ref: './components/paths/agent/get-type-groups.yaml' + /api/agent/getTypes: + $ref: './components/paths/agent/get-types.yaml' + /api/event/describe: + $ref: './components/paths/event/describe.yaml' + /api/event/find: + $ref: './components/paths/event/find.yaml' + /api/event/findByLocation: + $ref: './components/paths/event/find-by-location.yaml' + /api/event/findBySpace: + $ref: './components/paths/event/find-by-space.yaml' + /api/event/findOccurrences: + $ref: './components/paths/event/find-occurrences.yaml' + /api/event/findOne: + $ref: './components/paths/event/find-one.yaml' + /api/event/getTypeGroups: + $ref: './components/paths/event/get-type-groups.yaml' + /api/event/getTypes: + $ref: './components/paths/event/get-types.yaml' + /api/event/create: + $ref: './components/paths/event/create.yaml' + /event/single/{id}: + $ref: './components/paths/event/route-single-id.yaml' + /api/opportunity/describe: + $ref: './components/paths/opportunity/describe.yaml' + /api/opportunity/find: + $ref: './components/paths/opportunity/find.yaml' + /api/opportunity/findRegistrations: + $ref: './components/paths/opportunity/find-registrations.yaml' + /api/opportunity/findOne: + $ref: './components/paths/opportunity/find-one.yaml' + /api/opportunity/getTypes: + $ref: './components/paths/opportunity/get-types.yaml' + /api/opportunity/selectFields: + $ref: './components/paths/opportunity/select-fields.yaml' + /api/project/describe: + $ref: './components/paths/project/describe.yaml' + /api/project/find: + $ref: './components/paths/project/find.yaml' + /api/project/findOne: + $ref: './components/paths/project/find-one.yaml' + /api/project/getTypeGroups: + $ref: './components/paths/project/get-type-groups.yaml' + /api/project/getTypes: + $ref: './components/paths/project/get-types.yaml' + /project/index: + $ref: './components/paths/project/create.yaml' + /project/single/{id}: + $ref: './components/paths/project/route-single-id.yaml' + /api/seal/describe: + $ref: './components/paths/seal/describe.yaml' + /api/seal/find: + $ref: './components/paths/seal/find.yaml' + /api/seal/findOne: + $ref: './components/paths/seal/find-one.yaml' + /api/seal/getTypeGroups: + $ref: './components/paths/seal/get-type-groups.yaml' + /api/seal/getTypes: + $ref: './components/paths/seal/get-types.yaml' + /seal/index: + $ref: './components/paths/seal/create.yaml' + /seal/single/{id}: + $ref: './components/paths/seal/route-single-id.yaml' + /api/space/describe: + $ref: './components/paths/space/describe.yaml' + /api/space/find: + $ref: './components/paths/space/find.yaml' + /api/space/findByEvents: + $ref: './components/paths/space/find-by-events.yaml' + /api/space/findOne: + $ref: './components/paths/space/find-one.yaml' + /api/space/getTypeGroups: + $ref: './components/paths/space/get-type-groups.yaml' + /api/space/getTypes: + $ref: './components/paths/space/get-types.yaml' + /space/index: + $ref: './components/paths/space/create.yaml' + /espaco/{id}: + $ref: './components/paths/space/route-single-id.yaml' + /site/version: + $ref: './components/paths/site/version.yaml' + /site/info: + $ref: './components/paths/site/info.yaml' + /term/list/area: + $ref: './components/paths/term/slugs/area.yaml' + /term/list/funcao: + $ref: './components/paths/term/slugs/funcao.yaml' + /term/list/linguagem: + $ref: './components/paths/term/slugs/linguagem.yaml' + /term/list/tag: + $ref: './components/paths/term/slugs/tag.yaml' +components: + schemas: + Agent: + $ref: './components/schemas/agent.yaml' + AgentType: + $ref: './components/schemas/agent-type.yaml' + AgentTypeGroup: + $ref: './components/schemas/agent-type-groups.yaml' + Event: + $ref: './components/schemas/event.yaml' + EventOccurrence: + $ref: './components/schemas/event-find-occurrences.yaml' + EventType: + $ref: './components/schemas/event-type.yaml' + EventTypeGroup: + $ref: './components/schemas/event-type-groups.yaml' + Opportunity: + $ref: './components/schemas/opportunity.yaml' + OpportunityType: + $ref: './components/schemas/opportunity-type.yaml' + Project: + $ref: './components/schemas/project.yaml' + ProjectType: + $ref: './components/schemas/project-type.yaml' + ProjectTypeGroup: + $ref: './components/schemas/project-type-groups.yaml' + Seal: + $ref: './components/schemas/seal.yaml' + SealType: + $ref: './components/schemas/seal-type.yaml' + SealTypeGroup: + $ref: './components/schemas/seal-type-groups.yaml' + Space: + $ref: './components/schemas/space.yaml' + SpaceType: + $ref: './components/schemas/space-type.yaml' + SpaceTypeGroup: + $ref: './components/schemas/space-type-group.yaml' diff --git a/public/docs/v1/swagger/index.css b/public/docs/v1/swagger/index.css new file mode 100644 index 0000000000..f2376fdaa8 --- /dev/null +++ b/public/docs/v1/swagger/index.css @@ -0,0 +1,16 @@ +html { + box-sizing: border-box; + overflow: -moz-scrollbars-vertical; + overflow-y: scroll; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + margin: 0; + background: #fafafa; +} diff --git a/public/docs/v1/swagger/swagger-ui-bundle.js b/public/docs/v1/swagger/swagger-ui-bundle.js new file mode 100644 index 0000000000..604eadede3 --- /dev/null +++ b/public/docs/v1/swagger/swagger-ui-bundle.js @@ -0,0 +1,3 @@ +/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ +!function webpackUniversalModuleDefinition(s,i){"object"==typeof exports&&"object"==typeof module?module.exports=i():"function"==typeof define&&define.amd?define([],i):"object"==typeof exports?exports.SwaggerUIBundle=i():s.SwaggerUIBundle=i()}(this,(()=>(()=>{var s,i,u={69119:(s,i)=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.BLANK_URL=i.relativeFirstCharacters=i.urlSchemeRegex=i.ctrlCharactersRegex=i.htmlCtrlEntityRegex=i.htmlEntitiesRegex=i.invalidProtocolRegex=void 0,i.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im,i.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g,i.htmlCtrlEntityRegex=/&(newline|tab);/gi,i.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,i.urlSchemeRegex=/^.+(:|:)/gim,i.relativeFirstCharacters=[".","/"],i.BLANK_URL="about:blank"},16750:(s,i,u)=>{"use strict";i.J=void 0;var _=u(69119);i.J=function sanitizeUrl(s){if(!s)return _.BLANK_URL;var i=function decodeHtmlCharacters(s){return s.replace(_.ctrlCharactersRegex,"").replace(_.htmlEntitiesRegex,(function(s,i){return String.fromCharCode(i)}))}(s).replace(_.htmlCtrlEntityRegex,"").replace(_.ctrlCharactersRegex,"").trim();if(!i)return _.BLANK_URL;if(function isRelativeUrlWithoutProtocol(s){return _.relativeFirstCharacters.indexOf(s[0])>-1}(i))return i;var u=i.match(_.urlSchemeRegex);if(!u)return i;var w=u[0];return _.invalidProtocolRegex.test(w)?_.BLANK_URL:i}},67526:(s,i)=>{"use strict";i.byteLength=function byteLength(s){var i=getLens(s),u=i[0],_=i[1];return 3*(u+_)/4-_},i.toByteArray=function toByteArray(s){var i,u,x=getLens(s),j=x[0],P=x[1],B=new w(function _byteLength(s,i,u){return 3*(i+u)/4-u}(0,j,P)),$=0,U=P>0?j-4:j;for(u=0;u>16&255,B[$++]=i>>8&255,B[$++]=255&i;2===P&&(i=_[s.charCodeAt(u)]<<2|_[s.charCodeAt(u+1)]>>4,B[$++]=255&i);1===P&&(i=_[s.charCodeAt(u)]<<10|_[s.charCodeAt(u+1)]<<4|_[s.charCodeAt(u+2)]>>2,B[$++]=i>>8&255,B[$++]=255&i);return B},i.fromByteArray=function fromByteArray(s){for(var i,_=s.length,w=_%3,x=[],j=16383,P=0,B=_-w;PB?B:P+j));1===w?(i=s[_-1],x.push(u[i>>2]+u[i<<4&63]+"==")):2===w&&(i=(s[_-2]<<8)+s[_-1],x.push(u[i>>10]+u[i>>4&63]+u[i<<2&63]+"="));return x.join("")};for(var u=[],_=[],w="undefined"!=typeof Uint8Array?Uint8Array:Array,x="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",j=0;j<64;++j)u[j]=x[j],_[x.charCodeAt(j)]=j;function getLens(s){var i=s.length;if(i%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var u=s.indexOf("=");return-1===u&&(u=i),[u,u===i?0:4-u%4]}function encodeChunk(s,i,_){for(var w,x,j=[],P=i;P<_;P+=3)w=(s[P]<<16&16711680)+(s[P+1]<<8&65280)+(255&s[P+2]),j.push(u[(x=w)>>18&63]+u[x>>12&63]+u[x>>6&63]+u[63&x]);return j.join("")}_["-".charCodeAt(0)]=62,_["_".charCodeAt(0)]=63},48287:(s,i,u)=>{"use strict";const _=u(67526),w=u(251),x="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;i.Buffer=Buffer,i.SlowBuffer=function SlowBuffer(s){+s!=s&&(s=0);return Buffer.alloc(+s)},i.INSPECT_MAX_BYTES=50;const j=2147483647;function createBuffer(s){if(s>j)throw new RangeError('The value "'+s+'" is invalid for option "size"');const i=new Uint8Array(s);return Object.setPrototypeOf(i,Buffer.prototype),i}function Buffer(s,i,u){if("number"==typeof s){if("string"==typeof i)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(s)}return from(s,i,u)}function from(s,i,u){if("string"==typeof s)return function fromString(s,i){"string"==typeof i&&""!==i||(i="utf8");if(!Buffer.isEncoding(i))throw new TypeError("Unknown encoding: "+i);const u=0|byteLength(s,i);let _=createBuffer(u);const w=_.write(s,i);w!==u&&(_=_.slice(0,w));return _}(s,i);if(ArrayBuffer.isView(s))return function fromArrayView(s){if(isInstance(s,Uint8Array)){const i=new Uint8Array(s);return fromArrayBuffer(i.buffer,i.byteOffset,i.byteLength)}return fromArrayLike(s)}(s);if(null==s)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s);if(isInstance(s,ArrayBuffer)||s&&isInstance(s.buffer,ArrayBuffer))return fromArrayBuffer(s,i,u);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(s,SharedArrayBuffer)||s&&isInstance(s.buffer,SharedArrayBuffer)))return fromArrayBuffer(s,i,u);if("number"==typeof s)throw new TypeError('The "value" argument must not be of type number. Received type number');const _=s.valueOf&&s.valueOf();if(null!=_&&_!==s)return Buffer.from(_,i,u);const w=function fromObject(s){if(Buffer.isBuffer(s)){const i=0|checked(s.length),u=createBuffer(i);return 0===u.length||s.copy(u,0,0,i),u}if(void 0!==s.length)return"number"!=typeof s.length||numberIsNaN(s.length)?createBuffer(0):fromArrayLike(s);if("Buffer"===s.type&&Array.isArray(s.data))return fromArrayLike(s.data)}(s);if(w)return w;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof s[Symbol.toPrimitive])return Buffer.from(s[Symbol.toPrimitive]("string"),i,u);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s)}function assertSize(s){if("number"!=typeof s)throw new TypeError('"size" argument must be of type number');if(s<0)throw new RangeError('The value "'+s+'" is invalid for option "size"')}function allocUnsafe(s){return assertSize(s),createBuffer(s<0?0:0|checked(s))}function fromArrayLike(s){const i=s.length<0?0:0|checked(s.length),u=createBuffer(i);for(let _=0;_=j)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+j.toString(16)+" bytes");return 0|s}function byteLength(s,i){if(Buffer.isBuffer(s))return s.length;if(ArrayBuffer.isView(s)||isInstance(s,ArrayBuffer))return s.byteLength;if("string"!=typeof s)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof s);const u=s.length,_=arguments.length>2&&!0===arguments[2];if(!_&&0===u)return 0;let w=!1;for(;;)switch(i){case"ascii":case"latin1":case"binary":return u;case"utf8":case"utf-8":return utf8ToBytes(s).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*u;case"hex":return u>>>1;case"base64":return base64ToBytes(s).length;default:if(w)return _?-1:utf8ToBytes(s).length;i=(""+i).toLowerCase(),w=!0}}function slowToString(s,i,u){let _=!1;if((void 0===i||i<0)&&(i=0),i>this.length)return"";if((void 0===u||u>this.length)&&(u=this.length),u<=0)return"";if((u>>>=0)<=(i>>>=0))return"";for(s||(s="utf8");;)switch(s){case"hex":return hexSlice(this,i,u);case"utf8":case"utf-8":return utf8Slice(this,i,u);case"ascii":return asciiSlice(this,i,u);case"latin1":case"binary":return latin1Slice(this,i,u);case"base64":return base64Slice(this,i,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,i,u);default:if(_)throw new TypeError("Unknown encoding: "+s);s=(s+"").toLowerCase(),_=!0}}function swap(s,i,u){const _=s[i];s[i]=s[u],s[u]=_}function bidirectionalIndexOf(s,i,u,_,w){if(0===s.length)return-1;if("string"==typeof u?(_=u,u=0):u>2147483647?u=2147483647:u<-2147483648&&(u=-2147483648),numberIsNaN(u=+u)&&(u=w?0:s.length-1),u<0&&(u=s.length+u),u>=s.length){if(w)return-1;u=s.length-1}else if(u<0){if(!w)return-1;u=0}if("string"==typeof i&&(i=Buffer.from(i,_)),Buffer.isBuffer(i))return 0===i.length?-1:arrayIndexOf(s,i,u,_,w);if("number"==typeof i)return i&=255,"function"==typeof Uint8Array.prototype.indexOf?w?Uint8Array.prototype.indexOf.call(s,i,u):Uint8Array.prototype.lastIndexOf.call(s,i,u):arrayIndexOf(s,[i],u,_,w);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(s,i,u,_,w){let x,j=1,P=s.length,B=i.length;if(void 0!==_&&("ucs2"===(_=String(_).toLowerCase())||"ucs-2"===_||"utf16le"===_||"utf-16le"===_)){if(s.length<2||i.length<2)return-1;j=2,P/=2,B/=2,u/=2}function read(s,i){return 1===j?s[i]:s.readUInt16BE(i*j)}if(w){let _=-1;for(x=u;xP&&(u=P-B),x=u;x>=0;x--){let u=!0;for(let _=0;_w&&(_=w):_=w;const x=i.length;let j;for(_>x/2&&(_=x/2),j=0;j<_;++j){const _=parseInt(i.substr(2*j,2),16);if(numberIsNaN(_))return j;s[u+j]=_}return j}function utf8Write(s,i,u,_){return blitBuffer(utf8ToBytes(i,s.length-u),s,u,_)}function asciiWrite(s,i,u,_){return blitBuffer(function asciiToBytes(s){const i=[];for(let u=0;u>8,w=u%256,x.push(w),x.push(_);return x}(i,s.length-u),s,u,_)}function base64Slice(s,i,u){return 0===i&&u===s.length?_.fromByteArray(s):_.fromByteArray(s.slice(i,u))}function utf8Slice(s,i,u){u=Math.min(s.length,u);const _=[];let w=i;for(;w239?4:i>223?3:i>191?2:1;if(w+j<=u){let u,_,P,B;switch(j){case 1:i<128&&(x=i);break;case 2:u=s[w+1],128==(192&u)&&(B=(31&i)<<6|63&u,B>127&&(x=B));break;case 3:u=s[w+1],_=s[w+2],128==(192&u)&&128==(192&_)&&(B=(15&i)<<12|(63&u)<<6|63&_,B>2047&&(B<55296||B>57343)&&(x=B));break;case 4:u=s[w+1],_=s[w+2],P=s[w+3],128==(192&u)&&128==(192&_)&&128==(192&P)&&(B=(15&i)<<18|(63&u)<<12|(63&_)<<6|63&P,B>65535&&B<1114112&&(x=B))}}null===x?(x=65533,j=1):x>65535&&(x-=65536,_.push(x>>>10&1023|55296),x=56320|1023&x),_.push(x),w+=j}return function decodeCodePointsArray(s){const i=s.length;if(i<=P)return String.fromCharCode.apply(String,s);let u="",_=0;for(;__.length?(Buffer.isBuffer(i)||(i=Buffer.from(i)),i.copy(_,w)):Uint8Array.prototype.set.call(_,i,w);else{if(!Buffer.isBuffer(i))throw new TypeError('"list" argument must be an Array of Buffers');i.copy(_,w)}w+=i.length}return _},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const s=this.length;if(s%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let i=0;iu&&(s+=" ... "),""},x&&(Buffer.prototype[x]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(s,i,u,_,w){if(isInstance(s,Uint8Array)&&(s=Buffer.from(s,s.offset,s.byteLength)),!Buffer.isBuffer(s))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof s);if(void 0===i&&(i=0),void 0===u&&(u=s?s.length:0),void 0===_&&(_=0),void 0===w&&(w=this.length),i<0||u>s.length||_<0||w>this.length)throw new RangeError("out of range index");if(_>=w&&i>=u)return 0;if(_>=w)return-1;if(i>=u)return 1;if(this===s)return 0;let x=(w>>>=0)-(_>>>=0),j=(u>>>=0)-(i>>>=0);const P=Math.min(x,j),B=this.slice(_,w),$=s.slice(i,u);for(let s=0;s>>=0,isFinite(u)?(u>>>=0,void 0===_&&(_="utf8")):(_=u,u=void 0)}const w=this.length-i;if((void 0===u||u>w)&&(u=w),s.length>0&&(u<0||i<0)||i>this.length)throw new RangeError("Attempt to write outside buffer bounds");_||(_="utf8");let x=!1;for(;;)switch(_){case"hex":return hexWrite(this,s,i,u);case"utf8":case"utf-8":return utf8Write(this,s,i,u);case"ascii":case"latin1":case"binary":return asciiWrite(this,s,i,u);case"base64":return base64Write(this,s,i,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,s,i,u);default:if(x)throw new TypeError("Unknown encoding: "+_);_=(""+_).toLowerCase(),x=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const P=4096;function asciiSlice(s,i,u){let _="";u=Math.min(s.length,u);for(let w=i;w_)&&(u=_);let w="";for(let _=i;_u)throw new RangeError("Trying to access beyond buffer length")}function checkInt(s,i,u,_,w,x){if(!Buffer.isBuffer(s))throw new TypeError('"buffer" argument must be a Buffer instance');if(i>w||is.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(s,i,u,_,w){checkIntBI(i,_,w,s,u,7);let x=Number(i&BigInt(4294967295));s[u++]=x,x>>=8,s[u++]=x,x>>=8,s[u++]=x,x>>=8,s[u++]=x;let j=Number(i>>BigInt(32)&BigInt(4294967295));return s[u++]=j,j>>=8,s[u++]=j,j>>=8,s[u++]=j,j>>=8,s[u++]=j,u}function wrtBigUInt64BE(s,i,u,_,w){checkIntBI(i,_,w,s,u,7);let x=Number(i&BigInt(4294967295));s[u+7]=x,x>>=8,s[u+6]=x,x>>=8,s[u+5]=x,x>>=8,s[u+4]=x;let j=Number(i>>BigInt(32)&BigInt(4294967295));return s[u+3]=j,j>>=8,s[u+2]=j,j>>=8,s[u+1]=j,j>>=8,s[u]=j,u+8}function checkIEEE754(s,i,u,_,w,x){if(u+_>s.length)throw new RangeError("Index out of range");if(u<0)throw new RangeError("Index out of range")}function writeFloat(s,i,u,_,x){return i=+i,u>>>=0,x||checkIEEE754(s,0,u,4),w.write(s,i,u,_,23,4),u+4}function writeDouble(s,i,u,_,x){return i=+i,u>>>=0,x||checkIEEE754(s,0,u,8),w.write(s,i,u,_,52,8),u+8}Buffer.prototype.slice=function slice(s,i){const u=this.length;(s=~~s)<0?(s+=u)<0&&(s=0):s>u&&(s=u),(i=void 0===i?u:~~i)<0?(i+=u)<0&&(i=0):i>u&&(i=u),i>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=this[s],w=1,x=0;for(;++x>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=this[s+--i],w=1;for(;i>0&&(w*=256);)_+=this[s+--i]*w;return _},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(s,i){return s>>>=0,i||checkOffset(s,1,this.length),this[s]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(s,i){return s>>>=0,i||checkOffset(s,2,this.length),this[s]|this[s+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(s,i){return s>>>=0,i||checkOffset(s,2,this.length),this[s]<<8|this[s+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),(this[s]|this[s+1]<<8|this[s+2]<<16)+16777216*this[s+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),16777216*this[s]+(this[s+1]<<16|this[s+2]<<8|this[s+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(s){validateNumber(s>>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=i+256*this[++s]+65536*this[++s]+this[++s]*2**24,w=this[++s]+256*this[++s]+65536*this[++s]+u*2**24;return BigInt(_)+(BigInt(w)<>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=i*2**24+65536*this[++s]+256*this[++s]+this[++s],w=this[++s]*2**24+65536*this[++s]+256*this[++s]+u;return(BigInt(_)<>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=this[s],w=1,x=0;for(;++x=w&&(_-=Math.pow(2,8*i)),_},Buffer.prototype.readIntBE=function readIntBE(s,i,u){s>>>=0,i>>>=0,u||checkOffset(s,i,this.length);let _=i,w=1,x=this[s+--_];for(;_>0&&(w*=256);)x+=this[s+--_]*w;return w*=128,x>=w&&(x-=Math.pow(2,8*i)),x},Buffer.prototype.readInt8=function readInt8(s,i){return s>>>=0,i||checkOffset(s,1,this.length),128&this[s]?-1*(255-this[s]+1):this[s]},Buffer.prototype.readInt16LE=function readInt16LE(s,i){s>>>=0,i||checkOffset(s,2,this.length);const u=this[s]|this[s+1]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt16BE=function readInt16BE(s,i){s>>>=0,i||checkOffset(s,2,this.length);const u=this[s+1]|this[s]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt32LE=function readInt32LE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),this[s]|this[s+1]<<8|this[s+2]<<16|this[s+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),this[s]<<24|this[s+1]<<16|this[s+2]<<8|this[s+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(s){validateNumber(s>>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=this[s+4]+256*this[s+5]+65536*this[s+6]+(u<<24);return(BigInt(_)<>>=0,"offset");const i=this[s],u=this[s+7];void 0!==i&&void 0!==u||boundsError(s,this.length-8);const _=(i<<24)+65536*this[++s]+256*this[++s]+this[++s];return(BigInt(_)<>>=0,i||checkOffset(s,4,this.length),w.read(this,s,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(s,i){return s>>>=0,i||checkOffset(s,4,this.length),w.read(this,s,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(s,i){return s>>>=0,i||checkOffset(s,8,this.length),w.read(this,s,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(s,i){return s>>>=0,i||checkOffset(s,8,this.length),w.read(this,s,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(s,i,u,_){if(s=+s,i>>>=0,u>>>=0,!_){checkInt(this,s,i,u,Math.pow(2,8*u)-1,0)}let w=1,x=0;for(this[i]=255&s;++x>>=0,u>>>=0,!_){checkInt(this,s,i,u,Math.pow(2,8*u)-1,0)}let w=u-1,x=1;for(this[i+w]=255&s;--w>=0&&(x*=256);)this[i+w]=s/x&255;return i+u},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,1,255,0),this[i]=255&s,i+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,65535,0),this[i]=255&s,this[i+1]=s>>>8,i+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,65535,0),this[i]=s>>>8,this[i+1]=255&s,i+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,4294967295,0),this[i+3]=s>>>24,this[i+2]=s>>>16,this[i+1]=s>>>8,this[i]=255&s,i+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,4294967295,0),this[i]=s>>>24,this[i+1]=s>>>16,this[i+2]=s>>>8,this[i+3]=255&s,i+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(s,i=0){return wrtBigUInt64LE(this,s,i,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(s,i=0){return wrtBigUInt64BE(this,s,i,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(s,i,u,_){if(s=+s,i>>>=0,!_){const _=Math.pow(2,8*u-1);checkInt(this,s,i,u,_-1,-_)}let w=0,x=1,j=0;for(this[i]=255&s;++w>0)-j&255;return i+u},Buffer.prototype.writeIntBE=function writeIntBE(s,i,u,_){if(s=+s,i>>>=0,!_){const _=Math.pow(2,8*u-1);checkInt(this,s,i,u,_-1,-_)}let w=u-1,x=1,j=0;for(this[i+w]=255&s;--w>=0&&(x*=256);)s<0&&0===j&&0!==this[i+w+1]&&(j=1),this[i+w]=(s/x>>0)-j&255;return i+u},Buffer.prototype.writeInt8=function writeInt8(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,1,127,-128),s<0&&(s=255+s+1),this[i]=255&s,i+1},Buffer.prototype.writeInt16LE=function writeInt16LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,32767,-32768),this[i]=255&s,this[i+1]=s>>>8,i+2},Buffer.prototype.writeInt16BE=function writeInt16BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,2,32767,-32768),this[i]=s>>>8,this[i+1]=255&s,i+2},Buffer.prototype.writeInt32LE=function writeInt32LE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,2147483647,-2147483648),this[i]=255&s,this[i+1]=s>>>8,this[i+2]=s>>>16,this[i+3]=s>>>24,i+4},Buffer.prototype.writeInt32BE=function writeInt32BE(s,i,u){return s=+s,i>>>=0,u||checkInt(this,s,i,4,2147483647,-2147483648),s<0&&(s=4294967295+s+1),this[i]=s>>>24,this[i+1]=s>>>16,this[i+2]=s>>>8,this[i+3]=255&s,i+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(s,i=0){return wrtBigUInt64LE(this,s,i,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(s,i=0){return wrtBigUInt64BE(this,s,i,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(s,i,u){return writeFloat(this,s,i,!0,u)},Buffer.prototype.writeFloatBE=function writeFloatBE(s,i,u){return writeFloat(this,s,i,!1,u)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(s,i,u){return writeDouble(this,s,i,!0,u)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(s,i,u){return writeDouble(this,s,i,!1,u)},Buffer.prototype.copy=function copy(s,i,u,_){if(!Buffer.isBuffer(s))throw new TypeError("argument should be a Buffer");if(u||(u=0),_||0===_||(_=this.length),i>=s.length&&(i=s.length),i||(i=0),_>0&&_=this.length)throw new RangeError("Index out of range");if(_<0)throw new RangeError("sourceEnd out of bounds");_>this.length&&(_=this.length),s.length-i<_-u&&(_=s.length-i+u);const w=_-u;return this===s&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(i,u,_):Uint8Array.prototype.set.call(s,this.subarray(u,_),i),w},Buffer.prototype.fill=function fill(s,i,u,_){if("string"==typeof s){if("string"==typeof i?(_=i,i=0,u=this.length):"string"==typeof u&&(_=u,u=this.length),void 0!==_&&"string"!=typeof _)throw new TypeError("encoding must be a string");if("string"==typeof _&&!Buffer.isEncoding(_))throw new TypeError("Unknown encoding: "+_);if(1===s.length){const i=s.charCodeAt(0);("utf8"===_&&i<128||"latin1"===_)&&(s=i)}}else"number"==typeof s?s&=255:"boolean"==typeof s&&(s=Number(s));if(i<0||this.length>>=0,u=void 0===u?this.length:u>>>0,s||(s=0),"number"==typeof s)for(w=i;w=_+4;u-=3)i=`_${s.slice(u-3,u)}${i}`;return`${s.slice(0,u)}${i}`}function checkIntBI(s,i,u,_,w,x){if(s>u||s3?0===i||i===BigInt(0)?`>= 0${_} and < 2${_} ** ${8*(x+1)}${_}`:`>= -(2${_} ** ${8*(x+1)-1}${_}) and < 2 ** ${8*(x+1)-1}${_}`:`>= ${i}${_} and <= ${u}${_}`,new B.ERR_OUT_OF_RANGE("value",w,s)}!function checkBounds(s,i,u){validateNumber(i,"offset"),void 0!==s[i]&&void 0!==s[i+u]||boundsError(i,s.length-(u+1))}(_,w,x)}function validateNumber(s,i){if("number"!=typeof s)throw new B.ERR_INVALID_ARG_TYPE(i,"number",s)}function boundsError(s,i,u){if(Math.floor(s)!==s)throw validateNumber(s,u),new B.ERR_OUT_OF_RANGE(u||"offset","an integer",s);if(i<0)throw new B.ERR_BUFFER_OUT_OF_BOUNDS;throw new B.ERR_OUT_OF_RANGE(u||"offset",`>= ${u?1:0} and <= ${i}`,s)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(s){return s?`${s} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(s,i){return`The "${s}" argument must be of type number. Received type ${typeof i}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(s,i,u){let _=`The value of "${s}" is out of range.`,w=u;return Number.isInteger(u)&&Math.abs(u)>2**32?w=addNumericalSeparator(String(u)):"bigint"==typeof u&&(w=String(u),(u>BigInt(2)**BigInt(32)||u<-(BigInt(2)**BigInt(32)))&&(w=addNumericalSeparator(w)),w+="n"),_+=` It must be ${i}. Received ${w}`,_}),RangeError);const $=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(s,i){let u;i=i||1/0;const _=s.length;let w=null;const x=[];for(let j=0;j<_;++j){if(u=s.charCodeAt(j),u>55295&&u<57344){if(!w){if(u>56319){(i-=3)>-1&&x.push(239,191,189);continue}if(j+1===_){(i-=3)>-1&&x.push(239,191,189);continue}w=u;continue}if(u<56320){(i-=3)>-1&&x.push(239,191,189),w=u;continue}u=65536+(w-55296<<10|u-56320)}else w&&(i-=3)>-1&&x.push(239,191,189);if(w=null,u<128){if((i-=1)<0)break;x.push(u)}else if(u<2048){if((i-=2)<0)break;x.push(u>>6|192,63&u|128)}else if(u<65536){if((i-=3)<0)break;x.push(u>>12|224,u>>6&63|128,63&u|128)}else{if(!(u<1114112))throw new Error("Invalid code point");if((i-=4)<0)break;x.push(u>>18|240,u>>12&63|128,u>>6&63|128,63&u|128)}}return x}function base64ToBytes(s){return _.toByteArray(function base64clean(s){if((s=(s=s.split("=")[0]).trim().replace($,"")).length<2)return"";for(;s.length%4!=0;)s+="=";return s}(s))}function blitBuffer(s,i,u,_){let w;for(w=0;w<_&&!(w+u>=i.length||w>=s.length);++w)i[w+u]=s[w];return w}function isInstance(s,i){return s instanceof i||null!=s&&null!=s.constructor&&null!=s.constructor.name&&s.constructor.name===i.name}function numberIsNaN(s){return s!=s}const U=function(){const s="0123456789abcdef",i=new Array(256);for(let u=0;u<16;++u){const _=16*u;for(let w=0;w<16;++w)i[_+w]=s[u]+s[w]}return i}();function defineBigIntMethod(s){return"undefined"==typeof BigInt?BufferBigIntNotDefined:s}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},38075:(s,i,u)=>{"use strict";var _=u(70453),w=u(10487),x=w(_("String.prototype.indexOf"));s.exports=function callBoundIntrinsic(s,i){var u=_(s,!!i);return"function"==typeof u&&x(s,".prototype.")>-1?w(u):u}},10487:(s,i,u)=>{"use strict";var _=u(66743),w=u(70453),x=u(96897),j=u(69675),P=w("%Function.prototype.apply%"),B=w("%Function.prototype.call%"),$=w("%Reflect.apply%",!0)||_.call(B,P),U=u(30655),Y=w("%Math.max%");s.exports=function callBind(s){if("function"!=typeof s)throw new j("a function is required");var i=$(_,B,arguments);return x(i,1+Y(0,s.length-(arguments.length-1)),!0)};var X=function applyBind(){return $(_,P,arguments)};U?U(s.exports,"apply",{value:X}):s.exports.apply=X},17965:(s,i,u)=>{"use strict";var _=u(16426),w={"text/plain":"Text","text/html":"Url",default:"Text"};s.exports=function copy(s,i){var u,x,j,P,B,$,U=!1;i||(i={}),u=i.debug||!1;try{if(j=_(),P=document.createRange(),B=document.getSelection(),($=document.createElement("span")).textContent=s,$.ariaHidden="true",$.style.all="unset",$.style.position="fixed",$.style.top=0,$.style.clip="rect(0, 0, 0, 0)",$.style.whiteSpace="pre",$.style.webkitUserSelect="text",$.style.MozUserSelect="text",$.style.msUserSelect="text",$.style.userSelect="text",$.addEventListener("copy",(function(_){if(_.stopPropagation(),i.format)if(_.preventDefault(),void 0===_.clipboardData){u&&console.warn("unable to use e.clipboardData"),u&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var x=w[i.format]||w.default;window.clipboardData.setData(x,s)}else _.clipboardData.clearData(),_.clipboardData.setData(i.format,s);i.onCopy&&(_.preventDefault(),i.onCopy(_.clipboardData))})),document.body.appendChild($),P.selectNodeContents($),B.addRange(P),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");U=!0}catch(_){u&&console.error("unable to copy using execCommand: ",_),u&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(i.format||"text",s),i.onCopy&&i.onCopy(window.clipboardData),U=!0}catch(_){u&&console.error("unable to copy using clipboardData: ",_),u&&console.error("falling back to prompt"),x=function format(s){var i=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return s.replace(/#{\s*key\s*}/g,i)}("message"in i?i.message:"Copy to clipboard: #{key}, Enter"),window.prompt(x,s)}}finally{B&&("function"==typeof B.removeRange?B.removeRange(P):B.removeAllRanges()),$&&document.body.removeChild($),j()}return U}},2205:function(s,i,u){var _;_=void 0!==u.g?u.g:this,s.exports=function(s){if(s.CSS&&s.CSS.escape)return s.CSS.escape;var cssEscape=function(s){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var i,u=String(s),_=u.length,w=-1,x="",j=u.charCodeAt(0);++w<_;)0!=(i=u.charCodeAt(w))?x+=i>=1&&i<=31||127==i||0==w&&i>=48&&i<=57||1==w&&i>=48&&i<=57&&45==j?"\\"+i.toString(16)+" ":0==w&&1==_&&45==i||!(i>=128||45==i||95==i||i>=48&&i<=57||i>=65&&i<=90||i>=97&&i<=122)?"\\"+u.charAt(w):u.charAt(w):x+="�";return x};return s.CSS||(s.CSS={}),s.CSS.escape=cssEscape,cssEscape}(_)},81919:(s,i,u)=>{"use strict";var _=u(48287).Buffer;function isSpecificValue(s){return s instanceof _||s instanceof Date||s instanceof RegExp}function cloneSpecificValue(s){if(s instanceof _){var i=_.alloc?_.alloc(s.length):new _(s.length);return s.copy(i),i}if(s instanceof Date)return new Date(s.getTime());if(s instanceof RegExp)return new RegExp(s);throw new Error("Unexpected situation")}function deepCloneArray(s){var i=[];return s.forEach((function(s,u){"object"==typeof s&&null!==s?Array.isArray(s)?i[u]=deepCloneArray(s):isSpecificValue(s)?i[u]=cloneSpecificValue(s):i[u]=w({},s):i[u]=s})),i}function safeGetProperty(s,i){return"__proto__"===i?void 0:s[i]}var w=s.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var s,i,u=arguments[0];return Array.prototype.slice.call(arguments,1).forEach((function(_){"object"!=typeof _||null===_||Array.isArray(_)||Object.keys(_).forEach((function(x){return i=safeGetProperty(u,x),(s=safeGetProperty(_,x))===u?void 0:"object"!=typeof s||null===s?void(u[x]=s):Array.isArray(s)?void(u[x]=deepCloneArray(s)):isSpecificValue(s)?void(u[x]=cloneSpecificValue(s)):"object"!=typeof i||null===i||Array.isArray(i)?void(u[x]=w({},s)):void(u[x]=w(i,s))}))})),u}},14744:s=>{"use strict";var i=function isMergeableObject(s){return function isNonNullObject(s){return!!s&&"object"==typeof s}(s)&&!function isSpecial(s){var i=Object.prototype.toString.call(s);return"[object RegExp]"===i||"[object Date]"===i||function isReactElement(s){return s.$$typeof===u}(s)}(s)};var u="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function cloneUnlessOtherwiseSpecified(s,i){return!1!==i.clone&&i.isMergeableObject(s)?deepmerge(function emptyTarget(s){return Array.isArray(s)?[]:{}}(s),s,i):s}function defaultArrayMerge(s,i,u){return s.concat(i).map((function(s){return cloneUnlessOtherwiseSpecified(s,u)}))}function getKeys(s){return Object.keys(s).concat(function getEnumerableOwnPropertySymbols(s){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(s).filter((function(i){return Object.propertyIsEnumerable.call(s,i)})):[]}(s))}function propertyIsOnObject(s,i){try{return i in s}catch(s){return!1}}function mergeObject(s,i,u){var _={};return u.isMergeableObject(s)&&getKeys(s).forEach((function(i){_[i]=cloneUnlessOtherwiseSpecified(s[i],u)})),getKeys(i).forEach((function(w){(function propertyIsUnsafe(s,i){return propertyIsOnObject(s,i)&&!(Object.hasOwnProperty.call(s,i)&&Object.propertyIsEnumerable.call(s,i))})(s,w)||(propertyIsOnObject(s,w)&&u.isMergeableObject(i[w])?_[w]=function getMergeFunction(s,i){if(!i.customMerge)return deepmerge;var u=i.customMerge(s);return"function"==typeof u?u:deepmerge}(w,u)(s[w],i[w],u):_[w]=cloneUnlessOtherwiseSpecified(i[w],u))})),_}function deepmerge(s,u,_){(_=_||{}).arrayMerge=_.arrayMerge||defaultArrayMerge,_.isMergeableObject=_.isMergeableObject||i,_.cloneUnlessOtherwiseSpecified=cloneUnlessOtherwiseSpecified;var w=Array.isArray(u);return w===Array.isArray(s)?w?_.arrayMerge(s,u,_):mergeObject(s,u,_):cloneUnlessOtherwiseSpecified(u,_)}deepmerge.all=function deepmergeAll(s,i){if(!Array.isArray(s))throw new Error("first argument should be an array");return s.reduce((function(s,u){return deepmerge(s,u,i)}),{})};var _=deepmerge;s.exports=_},30041:(s,i,u)=>{"use strict";var _=u(30655),w=u(58068),x=u(69675),j=u(75795);s.exports=function defineDataProperty(s,i,u){if(!s||"object"!=typeof s&&"function"!=typeof s)throw new x("`obj` must be an object or a function`");if("string"!=typeof i&&"symbol"!=typeof i)throw new x("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new x("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new x("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new x("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new x("`loose`, if provided, must be a boolean");var P=arguments.length>3?arguments[3]:null,B=arguments.length>4?arguments[4]:null,$=arguments.length>5?arguments[5]:null,U=arguments.length>6&&arguments[6],Y=!!j&&j(s,i);if(_)_(s,i,{configurable:null===$&&Y?Y.configurable:!$,enumerable:null===P&&Y?Y.enumerable:!P,value:u,writable:null===B&&Y?Y.writable:!B});else{if(!U&&(P||B||$))throw new w("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");s[i]=u}}},42838:function(s){s.exports=function(){"use strict";const{entries:s,setPrototypeOf:i,isFrozen:u,getPrototypeOf:_,getOwnPropertyDescriptor:w}=Object;let{freeze:x,seal:j,create:P}=Object,{apply:B,construct:$}="undefined"!=typeof Reflect&&Reflect;x||(x=function freeze(s){return s}),j||(j=function seal(s){return s}),B||(B=function apply(s,i,u){return s.apply(i,u)}),$||($=function construct(s,i){return new s(...i)});const U=unapply(Array.prototype.forEach),Y=unapply(Array.prototype.pop),X=unapply(Array.prototype.push),Z=unapply(String.prototype.toLowerCase),ee=unapply(String.prototype.toString),ae=unapply(String.prototype.match),ie=unapply(String.prototype.replace),le=unapply(String.prototype.indexOf),ce=unapply(String.prototype.trim),pe=unapply(Object.prototype.hasOwnProperty),de=unapply(RegExp.prototype.test),fe=unconstruct(TypeError);function unapply(s){return function(i){for(var u=arguments.length,_=new Array(u>1?u-1:0),w=1;w2&&void 0!==arguments[2]?arguments[2]:Z;i&&i(s,null);let x=_.length;for(;x--;){let i=_[x];if("string"==typeof i){const s=w(i);s!==i&&(u(_)||(_[x]=s),i=s)}s[i]=!0}return s}function cleanArray(s){for(let i=0;i/gm),He=j(/\${[\w\W]*}/gm),Ye=j(/^data-[\-\w.\u00B7-\uFFFF]/),Xe=j(/^aria-[\-\w]+$/),Qe=j(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),et=j(/^(?:\w+script|data):/i),tt=j(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),rt=j(/^html$/i);var nt=Object.freeze({__proto__:null,MUSTACHE_EXPR:ze,ERB_EXPR:We,TMPLIT_EXPR:He,DATA_ATTR:Ye,ARIA_ATTR:Xe,IS_ALLOWED_URI:Qe,IS_SCRIPT_OR_DATA:et,ATTR_WHITESPACE:tt,DOCTYPE_NAME:rt});const ot=function getGlobal(){return"undefined"==typeof window?null:window},st=function _createTrustedTypesPolicy(s,i){if("object"!=typeof s||"function"!=typeof s.createPolicy)return null;let u=null;const _="data-tt-policy-suffix";i&&i.hasAttribute(_)&&(u=i.getAttribute(_));const w="dompurify"+(u?"#"+u:"");try{return s.createPolicy(w,{createHTML:s=>s,createScriptURL:s=>s})}catch(s){return console.warn("TrustedTypes policy "+w+" could not be created."),null}};function createDOMPurify(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ot();const DOMPurify=s=>createDOMPurify(s);if(DOMPurify.version="3.0.9",DOMPurify.removed=[],!i||!i.document||9!==i.document.nodeType)return DOMPurify.isSupported=!1,DOMPurify;let{document:u}=i;const _=u,w=_.currentScript,{DocumentFragment:j,HTMLTemplateElement:B,Node:$,Element:ze,NodeFilter:We,NamedNodeMap:He=i.NamedNodeMap||i.MozNamedAttrMap,HTMLFormElement:Ye,DOMParser:Xe,trustedTypes:et}=i,tt=ze.prototype,at=lookupGetter(tt,"cloneNode"),it=lookupGetter(tt,"nextSibling"),lt=lookupGetter(tt,"childNodes"),ct=lookupGetter(tt,"parentNode");if("function"==typeof B){const s=u.createElement("template");s.content&&s.content.ownerDocument&&(u=s.content.ownerDocument)}let ut,pt="";const{implementation:ht,createNodeIterator:dt,createDocumentFragment:mt,getElementsByTagName:gt}=u,{importNode:yt}=_;let vt={};DOMPurify.isSupported="function"==typeof s&&"function"==typeof ct&&ht&&void 0!==ht.createHTMLDocument;const{MUSTACHE_EXPR:bt,ERB_EXPR:_t,TMPLIT_EXPR:wt,DATA_ATTR:Et,ARIA_ATTR:St,IS_SCRIPT_OR_DATA:xt,ATTR_WHITESPACE:kt}=nt;let{IS_ALLOWED_URI:Ot}=nt,Ct=null;const At=addToSet({},[...ye,...be,..._e,...Se,...Pe]);let jt=null;const It=addToSet({},[...Te,...Re,...qe,...$e]);let Pt=Object.seal(P(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Nt=null,Tt=null,Mt=!0,Rt=!0,Dt=!1,Bt=!0,Lt=!1,Ft=!1,qt=!1,$t=!1,Ut=!1,zt=!1,Vt=!1,Wt=!0,Kt=!1;const Ht="user-content-";let Jt=!0,Gt=!1,Yt={},Xt=null;const Qt=addToSet({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Zt=null;const er=addToSet({},["audio","video","img","source","image","track"]);let tr=null;const rr=addToSet({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),nr="http://www.w3.org/1998/Math/MathML",sr="http://www.w3.org/2000/svg",ar="http://www.w3.org/1999/xhtml";let ir=ar,lr=!1,cr=null;const ur=addToSet({},[nr,sr,ar],ee);let pr=null;const dr=["application/xhtml+xml","text/html"],fr="text/html";let mr=null,gr=null;const yr=u.createElement("form"),vr=function isRegexOrFunction(s){return s instanceof RegExp||s instanceof Function},br=function _parseConfig(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!gr||gr!==s){if(s&&"object"==typeof s||(s={}),s=clone(s),pr=-1===dr.indexOf(s.PARSER_MEDIA_TYPE)?fr:s.PARSER_MEDIA_TYPE,mr="application/xhtml+xml"===pr?ee:Z,Ct=pe(s,"ALLOWED_TAGS")?addToSet({},s.ALLOWED_TAGS,mr):At,jt=pe(s,"ALLOWED_ATTR")?addToSet({},s.ALLOWED_ATTR,mr):It,cr=pe(s,"ALLOWED_NAMESPACES")?addToSet({},s.ALLOWED_NAMESPACES,ee):ur,tr=pe(s,"ADD_URI_SAFE_ATTR")?addToSet(clone(rr),s.ADD_URI_SAFE_ATTR,mr):rr,Zt=pe(s,"ADD_DATA_URI_TAGS")?addToSet(clone(er),s.ADD_DATA_URI_TAGS,mr):er,Xt=pe(s,"FORBID_CONTENTS")?addToSet({},s.FORBID_CONTENTS,mr):Qt,Nt=pe(s,"FORBID_TAGS")?addToSet({},s.FORBID_TAGS,mr):{},Tt=pe(s,"FORBID_ATTR")?addToSet({},s.FORBID_ATTR,mr):{},Yt=!!pe(s,"USE_PROFILES")&&s.USE_PROFILES,Mt=!1!==s.ALLOW_ARIA_ATTR,Rt=!1!==s.ALLOW_DATA_ATTR,Dt=s.ALLOW_UNKNOWN_PROTOCOLS||!1,Bt=!1!==s.ALLOW_SELF_CLOSE_IN_ATTR,Lt=s.SAFE_FOR_TEMPLATES||!1,Ft=s.WHOLE_DOCUMENT||!1,Ut=s.RETURN_DOM||!1,zt=s.RETURN_DOM_FRAGMENT||!1,Vt=s.RETURN_TRUSTED_TYPE||!1,$t=s.FORCE_BODY||!1,Wt=!1!==s.SANITIZE_DOM,Kt=s.SANITIZE_NAMED_PROPS||!1,Jt=!1!==s.KEEP_CONTENT,Gt=s.IN_PLACE||!1,Ot=s.ALLOWED_URI_REGEXP||Qe,ir=s.NAMESPACE||ar,Pt=s.CUSTOM_ELEMENT_HANDLING||{},s.CUSTOM_ELEMENT_HANDLING&&vr(s.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Pt.tagNameCheck=s.CUSTOM_ELEMENT_HANDLING.tagNameCheck),s.CUSTOM_ELEMENT_HANDLING&&vr(s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Pt.attributeNameCheck=s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),s.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Pt.allowCustomizedBuiltInElements=s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Lt&&(Rt=!1),zt&&(Ut=!0),Yt&&(Ct=addToSet({},Pe),jt=[],!0===Yt.html&&(addToSet(Ct,ye),addToSet(jt,Te)),!0===Yt.svg&&(addToSet(Ct,be),addToSet(jt,Re),addToSet(jt,$e)),!0===Yt.svgFilters&&(addToSet(Ct,_e),addToSet(jt,Re),addToSet(jt,$e)),!0===Yt.mathMl&&(addToSet(Ct,Se),addToSet(jt,qe),addToSet(jt,$e))),s.ADD_TAGS&&(Ct===At&&(Ct=clone(Ct)),addToSet(Ct,s.ADD_TAGS,mr)),s.ADD_ATTR&&(jt===It&&(jt=clone(jt)),addToSet(jt,s.ADD_ATTR,mr)),s.ADD_URI_SAFE_ATTR&&addToSet(tr,s.ADD_URI_SAFE_ATTR,mr),s.FORBID_CONTENTS&&(Xt===Qt&&(Xt=clone(Xt)),addToSet(Xt,s.FORBID_CONTENTS,mr)),Jt&&(Ct["#text"]=!0),Ft&&addToSet(Ct,["html","head","body"]),Ct.table&&(addToSet(Ct,["tbody"]),delete Nt.tbody),s.TRUSTED_TYPES_POLICY){if("function"!=typeof s.TRUSTED_TYPES_POLICY.createHTML)throw fe('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof s.TRUSTED_TYPES_POLICY.createScriptURL)throw fe('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ut=s.TRUSTED_TYPES_POLICY,pt=ut.createHTML("")}else void 0===ut&&(ut=st(et,w)),null!==ut&&"string"==typeof pt&&(pt=ut.createHTML(""));x&&x(s),gr=s}},_r=addToSet({},["mi","mo","mn","ms","mtext"]),wr=addToSet({},["foreignobject","desc","title","annotation-xml"]),Er=addToSet({},["title","style","font","a","script"]),Sr=addToSet({},[...be,..._e,...we]),xr=addToSet({},[...Se,...xe]),kr=function _checkValidNamespace(s){let i=ct(s);i&&i.tagName||(i={namespaceURI:ir,tagName:"template"});const u=Z(s.tagName),_=Z(i.tagName);return!!cr[s.namespaceURI]&&(s.namespaceURI===sr?i.namespaceURI===ar?"svg"===u:i.namespaceURI===nr?"svg"===u&&("annotation-xml"===_||_r[_]):Boolean(Sr[u]):s.namespaceURI===nr?i.namespaceURI===ar?"math"===u:i.namespaceURI===sr?"math"===u&&wr[_]:Boolean(xr[u]):s.namespaceURI===ar?!(i.namespaceURI===sr&&!wr[_])&&!(i.namespaceURI===nr&&!_r[_])&&!xr[u]&&(Er[u]||!Sr[u]):!("application/xhtml+xml"!==pr||!cr[s.namespaceURI]))},Or=function _forceRemove(s){X(DOMPurify.removed,{element:s});try{s.parentNode.removeChild(s)}catch(i){s.remove()}},Cr=function _removeAttribute(s,i){try{X(DOMPurify.removed,{attribute:i.getAttributeNode(s),from:i})}catch(s){X(DOMPurify.removed,{attribute:null,from:i})}if(i.removeAttribute(s),"is"===s&&!jt[s])if(Ut||zt)try{Or(i)}catch(s){}else try{i.setAttribute(s,"")}catch(s){}},Ar=function _initDocument(s){let i=null,_=null;if($t)s=""+s;else{const i=ae(s,/^[\r\n\t ]+/);_=i&&i[0]}"application/xhtml+xml"===pr&&ir===ar&&(s=''+s+"");const w=ut?ut.createHTML(s):s;if(ir===ar)try{i=(new Xe).parseFromString(w,pr)}catch(s){}if(!i||!i.documentElement){i=ht.createDocument(ir,"template",null);try{i.documentElement.innerHTML=lr?pt:w}catch(s){}}const x=i.body||i.documentElement;return s&&_&&x.insertBefore(u.createTextNode(_),x.childNodes[0]||null),ir===ar?gt.call(i,Ft?"html":"body")[0]:Ft?i.documentElement:x},jr=function _createNodeIterator(s){return dt.call(s.ownerDocument||s,s,We.SHOW_ELEMENT|We.SHOW_COMMENT|We.SHOW_TEXT,null)},Ir=function _isClobbered(s){return s instanceof Ye&&("string"!=typeof s.nodeName||"string"!=typeof s.textContent||"function"!=typeof s.removeChild||!(s.attributes instanceof He)||"function"!=typeof s.removeAttribute||"function"!=typeof s.setAttribute||"string"!=typeof s.namespaceURI||"function"!=typeof s.insertBefore||"function"!=typeof s.hasChildNodes)},Pr=function _isNode(s){return"function"==typeof $&&s instanceof $},Nr=function _executeHook(s,i,u){vt[s]&&U(vt[s],(s=>{s.call(DOMPurify,i,u,gr)}))},Tr=function _sanitizeElements(s){let i=null;if(Nr("beforeSanitizeElements",s,null),Ir(s))return Or(s),!0;const u=mr(s.nodeName);if(Nr("uponSanitizeElement",s,{tagName:u,allowedTags:Ct}),s.hasChildNodes()&&!Pr(s.firstElementChild)&&de(/<[/\w]/g,s.innerHTML)&&de(/<[/\w]/g,s.textContent))return Or(s),!0;if(!Ct[u]||Nt[u]){if(!Nt[u]&&Rr(u)){if(Pt.tagNameCheck instanceof RegExp&&de(Pt.tagNameCheck,u))return!1;if(Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(u))return!1}if(Jt&&!Xt[u]){const i=ct(s)||s.parentNode,u=lt(s)||s.childNodes;if(u&&i)for(let _=u.length-1;_>=0;--_)i.insertBefore(at(u[_],!0),it(s))}return Or(s),!0}return s instanceof ze&&!kr(s)?(Or(s),!0):"noscript"!==u&&"noembed"!==u&&"noframes"!==u||!de(/<\/no(script|embed|frames)/i,s.innerHTML)?(Lt&&3===s.nodeType&&(i=s.textContent,U([bt,_t,wt],(s=>{i=ie(i,s," ")})),s.textContent!==i&&(X(DOMPurify.removed,{element:s.cloneNode()}),s.textContent=i)),Nr("afterSanitizeElements",s,null),!1):(Or(s),!0)},Mr=function _isValidAttribute(s,i,_){if(Wt&&("id"===i||"name"===i)&&(_ in u||_ in yr))return!1;if(Rt&&!Tt[i]&&de(Et,i));else if(Mt&&de(St,i));else if(!jt[i]||Tt[i]){if(!(Rr(s)&&(Pt.tagNameCheck instanceof RegExp&&de(Pt.tagNameCheck,s)||Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(s))&&(Pt.attributeNameCheck instanceof RegExp&&de(Pt.attributeNameCheck,i)||Pt.attributeNameCheck instanceof Function&&Pt.attributeNameCheck(i))||"is"===i&&Pt.allowCustomizedBuiltInElements&&(Pt.tagNameCheck instanceof RegExp&&de(Pt.tagNameCheck,_)||Pt.tagNameCheck instanceof Function&&Pt.tagNameCheck(_))))return!1}else if(tr[i]);else if(de(Ot,ie(_,kt,"")));else if("src"!==i&&"xlink:href"!==i&&"href"!==i||"script"===s||0!==le(_,"data:")||!Zt[s])if(Dt&&!de(xt,ie(_,kt,"")));else if(_)return!1;return!0},Rr=function _isBasicCustomElement(s){return"annotation-xml"!==s&&s.indexOf("-")>0},Dr=function _sanitizeAttributes(s){Nr("beforeSanitizeAttributes",s,null);const{attributes:i}=s;if(!i)return;const u={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:jt};let _=i.length;for(;_--;){const w=i[_],{name:x,namespaceURI:j,value:P}=w,B=mr(x);let $="value"===x?P:ce(P);if(u.attrName=B,u.attrValue=$,u.keepAttr=!0,u.forceKeepAttr=void 0,Nr("uponSanitizeAttribute",s,u),$=u.attrValue,u.forceKeepAttr)continue;if(Cr(x,s),!u.keepAttr)continue;if(!Bt&&de(/\/>/i,$)){Cr(x,s);continue}Lt&&U([bt,_t,wt],(s=>{$=ie($,s," ")}));const X=mr(s.nodeName);if(Mr(X,B,$)){if(!Kt||"id"!==B&&"name"!==B||(Cr(x,s),$=Ht+$),ut&&"object"==typeof et&&"function"==typeof et.getAttributeType)if(j);else switch(et.getAttributeType(X,B)){case"TrustedHTML":$=ut.createHTML($);break;case"TrustedScriptURL":$=ut.createScriptURL($)}try{j?s.setAttributeNS(j,x,$):s.setAttribute(x,$),Y(DOMPurify.removed)}catch(s){}}}Nr("afterSanitizeAttributes",s,null)},Br=function _sanitizeShadowDOM(s){let i=null;const u=jr(s);for(Nr("beforeSanitizeShadowDOM",s,null);i=u.nextNode();)Nr("uponSanitizeShadowNode",i,null),Tr(i)||(i.content instanceof j&&_sanitizeShadowDOM(i.content),Dr(i));Nr("afterSanitizeShadowDOM",s,null)};return DOMPurify.sanitize=function(s){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=null,w=null,x=null,P=null;if(lr=!s,lr&&(s="\x3c!--\x3e"),"string"!=typeof s&&!Pr(s)){if("function"!=typeof s.toString)throw fe("toString is not a function");if("string"!=typeof(s=s.toString()))throw fe("dirty is not a string, aborting")}if(!DOMPurify.isSupported)return s;if(qt||br(i),DOMPurify.removed=[],"string"==typeof s&&(Gt=!1),Gt){if(s.nodeName){const i=mr(s.nodeName);if(!Ct[i]||Nt[i])throw fe("root node is forbidden and cannot be sanitized in-place")}}else if(s instanceof $)u=Ar("\x3c!----\x3e"),w=u.ownerDocument.importNode(s,!0),1===w.nodeType&&"BODY"===w.nodeName||"HTML"===w.nodeName?u=w:u.appendChild(w);else{if(!Ut&&!Lt&&!Ft&&-1===s.indexOf("<"))return ut&&Vt?ut.createHTML(s):s;if(u=Ar(s),!u)return Ut?null:Vt?pt:""}u&&$t&&Or(u.firstChild);const B=jr(Gt?s:u);for(;x=B.nextNode();)Tr(x)||(x.content instanceof j&&Br(x.content),Dr(x));if(Gt)return s;if(Ut){if(zt)for(P=mt.call(u.ownerDocument);u.firstChild;)P.appendChild(u.firstChild);else P=u;return(jt.shadowroot||jt.shadowrootmode)&&(P=yt.call(_,P,!0)),P}let Y=Ft?u.outerHTML:u.innerHTML;return Ft&&Ct["!doctype"]&&u.ownerDocument&&u.ownerDocument.doctype&&u.ownerDocument.doctype.name&&de(rt,u.ownerDocument.doctype.name)&&(Y="\n"+Y),Lt&&U([bt,_t,wt],(s=>{Y=ie(Y,s," ")})),ut&&Vt?ut.createHTML(Y):Y},DOMPurify.setConfig=function(){br(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),qt=!0},DOMPurify.clearConfig=function(){gr=null,qt=!1},DOMPurify.isValidAttribute=function(s,i,u){gr||br({});const _=mr(s),w=mr(i);return Mr(_,w,u)},DOMPurify.addHook=function(s,i){"function"==typeof i&&(vt[s]=vt[s]||[],X(vt[s],i))},DOMPurify.removeHook=function(s){if(vt[s])return Y(vt[s])},DOMPurify.removeHooks=function(s){vt[s]&&(vt[s]=[])},DOMPurify.removeAllHooks=function(){vt={}},DOMPurify}return createDOMPurify()}()},78004:s=>{"use strict";class SubRange{constructor(s,i){this.low=s,this.high=i,this.length=1+i-s}overlaps(s){return!(this.highs.high)}touches(s){return!(this.high+1s.high)}add(s){return new SubRange(Math.min(this.low,s.low),Math.max(this.high,s.high))}subtract(s){return s.low<=this.low&&s.high>=this.high?[]:s.low>this.low&&s.highs+i.length),0)}add(s,i){var _add=s=>{for(var i=0;i{for(var i=0;i{for(var i=0;i{for(var u=i.low;u<=i.high;)s.push(u),u++;return s}),[])}subranges(){return this.ranges.map((s=>({low:s.low,high:s.high,length:1+s.high-s.low})))}}s.exports=DRange},30655:(s,i,u)=>{"use strict";var _=u(70453)("%Object.defineProperty%",!0)||!1;if(_)try{_({},"a",{value:1})}catch(s){_=!1}s.exports=_},41237:s=>{"use strict";s.exports=EvalError},69383:s=>{"use strict";s.exports=Error},79290:s=>{"use strict";s.exports=RangeError},79538:s=>{"use strict";s.exports=ReferenceError},58068:s=>{"use strict";s.exports=SyntaxError},69675:s=>{"use strict";s.exports=TypeError},35345:s=>{"use strict";s.exports=URIError},37007:s=>{"use strict";var i,u="object"==typeof Reflect?Reflect:null,_=u&&"function"==typeof u.apply?u.apply:function ReflectApply(s,i,u){return Function.prototype.apply.call(s,i,u)};i=u&&"function"==typeof u.ownKeys?u.ownKeys:Object.getOwnPropertySymbols?function ReflectOwnKeys(s){return Object.getOwnPropertyNames(s).concat(Object.getOwnPropertySymbols(s))}:function ReflectOwnKeys(s){return Object.getOwnPropertyNames(s)};var w=Number.isNaN||function NumberIsNaN(s){return s!=s};function EventEmitter(){EventEmitter.init.call(this)}s.exports=EventEmitter,s.exports.once=function once(s,i){return new Promise((function(u,_){function errorListener(u){s.removeListener(i,resolver),_(u)}function resolver(){"function"==typeof s.removeListener&&s.removeListener("error",errorListener),u([].slice.call(arguments))}eventTargetAgnosticAddListener(s,i,resolver,{once:!0}),"error"!==i&&function addErrorHandlerIfEventEmitter(s,i,u){"function"==typeof s.on&&eventTargetAgnosticAddListener(s,"error",i,u)}(s,errorListener,{once:!0})}))},EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._eventsCount=0,EventEmitter.prototype._maxListeners=void 0;var x=10;function checkListener(s){if("function"!=typeof s)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof s)}function _getMaxListeners(s){return void 0===s._maxListeners?EventEmitter.defaultMaxListeners:s._maxListeners}function _addListener(s,i,u,_){var w,x,j;if(checkListener(u),void 0===(x=s._events)?(x=s._events=Object.create(null),s._eventsCount=0):(void 0!==x.newListener&&(s.emit("newListener",i,u.listener?u.listener:u),x=s._events),j=x[i]),void 0===j)j=x[i]=u,++s._eventsCount;else if("function"==typeof j?j=x[i]=_?[u,j]:[j,u]:_?j.unshift(u):j.push(u),(w=_getMaxListeners(s))>0&&j.length>w&&!j.warned){j.warned=!0;var P=new Error("Possible EventEmitter memory leak detected. "+j.length+" "+String(i)+" listeners added. Use emitter.setMaxListeners() to increase limit");P.name="MaxListenersExceededWarning",P.emitter=s,P.type=i,P.count=j.length,function ProcessEmitWarning(s){console&&console.warn&&console.warn(s)}(P)}return s}function onceWrapper(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function _onceWrap(s,i,u){var _={fired:!1,wrapFn:void 0,target:s,type:i,listener:u},w=onceWrapper.bind(_);return w.listener=u,_.wrapFn=w,w}function _listeners(s,i,u){var _=s._events;if(void 0===_)return[];var w=_[i];return void 0===w?[]:"function"==typeof w?u?[w.listener||w]:[w]:u?function unwrapListeners(s){for(var i=new Array(s.length),u=0;u0&&(j=i[0]),j instanceof Error)throw j;var P=new Error("Unhandled error."+(j?" ("+j.message+")":""));throw P.context=j,P}var B=x[s];if(void 0===B)return!1;if("function"==typeof B)_(B,this,i);else{var $=B.length,U=arrayClone(B,$);for(u=0;u<$;++u)_(U[u],this,i)}return!0},EventEmitter.prototype.addListener=function addListener(s,i){return _addListener(this,s,i,!1)},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.prependListener=function prependListener(s,i){return _addListener(this,s,i,!0)},EventEmitter.prototype.once=function once(s,i){return checkListener(i),this.on(s,_onceWrap(this,s,i)),this},EventEmitter.prototype.prependOnceListener=function prependOnceListener(s,i){return checkListener(i),this.prependListener(s,_onceWrap(this,s,i)),this},EventEmitter.prototype.removeListener=function removeListener(s,i){var u,_,w,x,j;if(checkListener(i),void 0===(_=this._events))return this;if(void 0===(u=_[s]))return this;if(u===i||u.listener===i)0==--this._eventsCount?this._events=Object.create(null):(delete _[s],_.removeListener&&this.emit("removeListener",s,u.listener||i));else if("function"!=typeof u){for(w=-1,x=u.length-1;x>=0;x--)if(u[x]===i||u[x].listener===i){j=u[x].listener,w=x;break}if(w<0)return this;0===w?u.shift():function spliceOne(s,i){for(;i+1=0;_--)this.removeListener(s,i[_]);return this},EventEmitter.prototype.listeners=function listeners(s){return _listeners(this,s,!0)},EventEmitter.prototype.rawListeners=function rawListeners(s){return _listeners(this,s,!1)},EventEmitter.listenerCount=function(s,i){return"function"==typeof s.listenerCount?s.listenerCount(i):listenerCount.call(s,i)},EventEmitter.prototype.listenerCount=listenerCount,EventEmitter.prototype.eventNames=function eventNames(){return this._eventsCount>0?i(this._events):[]}},85587:(s,i,u)=>{"use strict";var _=u(26311),w=create(Error);function create(s){return FormattedError.displayName=s.displayName||s.name,FormattedError;function FormattedError(i){return i&&(i=_.apply(null,arguments)),new s(i)}}s.exports=w,w.eval=create(EvalError),w.range=create(RangeError),w.reference=create(ReferenceError),w.syntax=create(SyntaxError),w.type=create(TypeError),w.uri=create(URIError),w.create=create},26311:s=>{!function(){var i;function format(s){for(var i,u,_,w,x=1,j=[].slice.call(arguments),P=0,B=s.length,$="",U=!1,Y=!1,nextArg=function(){return j[x++]},slurpNumber=function(){for(var u="";/\d/.test(s[P]);)u+=s[P++],i=s[P];return u.length>0?parseInt(u):null};P{"use strict";var i=Object.prototype.toString,u=Math.max,_=function concatty(s,i){for(var u=[],_=0;_{"use strict";var _=u(89353);s.exports=Function.prototype.bind||_},70453:(s,i,u)=>{"use strict";var _,w=u(69383),x=u(41237),j=u(79290),P=u(79538),B=u(58068),$=u(69675),U=u(35345),Y=Function,getEvalledConstructor=function(s){try{return Y('"use strict"; return ('+s+").constructor;")()}catch(s){}},X=Object.getOwnPropertyDescriptor;if(X)try{X({},"")}catch(s){X=null}var throwTypeError=function(){throw new $},Z=X?function(){try{return throwTypeError}catch(s){try{return X(arguments,"callee").get}catch(s){return throwTypeError}}}():throwTypeError,ee=u(64039)(),ae=u(80024)(),ie=Object.getPrototypeOf||(ae?function(s){return s.__proto__}:null),le={},ce="undefined"!=typeof Uint8Array&&ie?ie(Uint8Array):_,pe={__proto__:null,"%AggregateError%":"undefined"==typeof AggregateError?_:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?_:ArrayBuffer,"%ArrayIteratorPrototype%":ee&&ie?ie([][Symbol.iterator]()):_,"%AsyncFromSyncIteratorPrototype%":_,"%AsyncFunction%":le,"%AsyncGenerator%":le,"%AsyncGeneratorFunction%":le,"%AsyncIteratorPrototype%":le,"%Atomics%":"undefined"==typeof Atomics?_:Atomics,"%BigInt%":"undefined"==typeof BigInt?_:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?_:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?_:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?_:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":w,"%eval%":eval,"%EvalError%":x,"%Float32Array%":"undefined"==typeof Float32Array?_:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?_:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?_:FinalizationRegistry,"%Function%":Y,"%GeneratorFunction%":le,"%Int8Array%":"undefined"==typeof Int8Array?_:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?_:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?_:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":ee&&ie?ie(ie([][Symbol.iterator]())):_,"%JSON%":"object"==typeof JSON?JSON:_,"%Map%":"undefined"==typeof Map?_:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&ee&&ie?ie((new Map)[Symbol.iterator]()):_,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?_:Promise,"%Proxy%":"undefined"==typeof Proxy?_:Proxy,"%RangeError%":j,"%ReferenceError%":P,"%Reflect%":"undefined"==typeof Reflect?_:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?_:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&ee&&ie?ie((new Set)[Symbol.iterator]()):_,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?_:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":ee&&ie?ie(""[Symbol.iterator]()):_,"%Symbol%":ee?Symbol:_,"%SyntaxError%":B,"%ThrowTypeError%":Z,"%TypedArray%":ce,"%TypeError%":$,"%Uint8Array%":"undefined"==typeof Uint8Array?_:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?_:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?_:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?_:Uint32Array,"%URIError%":U,"%WeakMap%":"undefined"==typeof WeakMap?_:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?_:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?_:WeakSet};if(ie)try{null.error}catch(s){var de=ie(ie(s));pe["%Error.prototype%"]=de}var fe=function doEval(s){var i;if("%AsyncFunction%"===s)i=getEvalledConstructor("async function () {}");else if("%GeneratorFunction%"===s)i=getEvalledConstructor("function* () {}");else if("%AsyncGeneratorFunction%"===s)i=getEvalledConstructor("async function* () {}");else if("%AsyncGenerator%"===s){var u=doEval("%AsyncGeneratorFunction%");u&&(i=u.prototype)}else if("%AsyncIteratorPrototype%"===s){var _=doEval("%AsyncGenerator%");_&&ie&&(i=ie(_.prototype))}return pe[s]=i,i},ye={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},be=u(66743),_e=u(9957),we=be.call(Function.call,Array.prototype.concat),Se=be.call(Function.apply,Array.prototype.splice),xe=be.call(Function.call,String.prototype.replace),Pe=be.call(Function.call,String.prototype.slice),Te=be.call(Function.call,RegExp.prototype.exec),Re=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,qe=/\\(\\)?/g,$e=function getBaseIntrinsic(s,i){var u,_=s;if(_e(ye,_)&&(_="%"+(u=ye[_])[0]+"%"),_e(pe,_)){var w=pe[_];if(w===le&&(w=fe(_)),void 0===w&&!i)throw new $("intrinsic "+s+" exists, but is not available. Please file an issue!");return{alias:u,name:_,value:w}}throw new B("intrinsic "+s+" does not exist!")};s.exports=function GetIntrinsic(s,i){if("string"!=typeof s||0===s.length)throw new $("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof i)throw new $('"allowMissing" argument must be a boolean');if(null===Te(/^%?[^%]*%?$/,s))throw new B("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var u=function stringToPath(s){var i=Pe(s,0,1),u=Pe(s,-1);if("%"===i&&"%"!==u)throw new B("invalid intrinsic syntax, expected closing `%`");if("%"===u&&"%"!==i)throw new B("invalid intrinsic syntax, expected opening `%`");var _=[];return xe(s,Re,(function(s,i,u,w){_[_.length]=u?xe(w,qe,"$1"):i||s})),_}(s),_=u.length>0?u[0]:"",w=$e("%"+_+"%",i),x=w.name,j=w.value,P=!1,U=w.alias;U&&(_=U[0],Se(u,we([0,1],U)));for(var Y=1,Z=!0;Y=u.length){var le=X(j,ee);j=(Z=!!le)&&"get"in le&&!("originalValue"in le.get)?le.get:j[ee]}else Z=_e(j,ee),j=j[ee];Z&&!P&&(pe[x]=j)}}return j}},75795:(s,i,u)=>{"use strict";var _=u(70453)("%Object.getOwnPropertyDescriptor%",!0);if(_)try{_([],"length")}catch(s){_=null}s.exports=_},30592:(s,i,u)=>{"use strict";var _=u(30655),w=function hasPropertyDescriptors(){return!!_};w.hasArrayLengthDefineBug=function hasArrayLengthDefineBug(){if(!_)return null;try{return 1!==_([],"length",{value:1}).length}catch(s){return!0}},s.exports=w},80024:s=>{"use strict";var i={__proto__:null,foo:{}},u=Object;s.exports=function hasProto(){return{__proto__:i}.foo===i.foo&&!(i instanceof u)}},64039:(s,i,u)=>{"use strict";var _="undefined"!=typeof Symbol&&Symbol,w=u(41333);s.exports=function hasNativeSymbols(){return"function"==typeof _&&("function"==typeof Symbol&&("symbol"==typeof _("foo")&&("symbol"==typeof Symbol("bar")&&w())))}},41333:s=>{"use strict";s.exports=function hasSymbols(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var s={},i=Symbol("test"),u=Object(i);if("string"==typeof i)return!1;if("[object Symbol]"!==Object.prototype.toString.call(i))return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;for(i in s[i]=42,s)return!1;if("function"==typeof Object.keys&&0!==Object.keys(s).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(s).length)return!1;var _=Object.getOwnPropertySymbols(s);if(1!==_.length||_[0]!==i)return!1;if(!Object.prototype.propertyIsEnumerable.call(s,i))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var w=Object.getOwnPropertyDescriptor(s,i);if(42!==w.value||!0!==w.enumerable)return!1}return!0}},9957:(s,i,u)=>{"use strict";var _=Function.prototype.call,w=Object.prototype.hasOwnProperty,x=u(66743);s.exports=x.call(_,w)},45981:s=>{function deepFreeze(s){return s instanceof Map?s.clear=s.delete=s.set=function(){throw new Error("map is read-only")}:s instanceof Set&&(s.add=s.clear=s.delete=function(){throw new Error("set is read-only")}),Object.freeze(s),Object.getOwnPropertyNames(s).forEach((function(i){var u=s[i];"object"!=typeof u||Object.isFrozen(u)||deepFreeze(u)})),s}var i=deepFreeze,u=deepFreeze;i.default=u;class Response{constructor(s){void 0===s.data&&(s.data={}),this.data=s.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function escapeHTML(s){return s.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function inherit(s,...i){const u=Object.create(null);for(const i in s)u[i]=s[i];return i.forEach((function(s){for(const i in s)u[i]=s[i]})),u}const emitsWrappingTags=s=>!!s.kind;class HTMLRenderer{constructor(s,i){this.buffer="",this.classPrefix=i.classPrefix,s.walk(this)}addText(s){this.buffer+=escapeHTML(s)}openNode(s){if(!emitsWrappingTags(s))return;let i=s.kind;s.sublanguage||(i=`${this.classPrefix}${i}`),this.span(i)}closeNode(s){emitsWrappingTags(s)&&(this.buffer+="")}value(){return this.buffer}span(s){this.buffer+=``}}class TokenTree{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(s){this.top.children.push(s)}openNode(s){const i={kind:s,children:[]};this.add(i),this.stack.push(i)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(s){return this.constructor._walk(s,this.rootNode)}static _walk(s,i){return"string"==typeof i?s.addText(i):i.children&&(s.openNode(i),i.children.forEach((i=>this._walk(s,i))),s.closeNode(i)),s}static _collapse(s){"string"!=typeof s&&s.children&&(s.children.every((s=>"string"==typeof s))?s.children=[s.children.join("")]:s.children.forEach((s=>{TokenTree._collapse(s)})))}}class TokenTreeEmitter extends TokenTree{constructor(s){super(),this.options=s}addKeyword(s,i){""!==s&&(this.openNode(i),this.addText(s),this.closeNode())}addText(s){""!==s&&this.add(s)}addSublanguage(s,i){const u=s.root;u.kind=i,u.sublanguage=!0,this.add(u)}toHTML(){return new HTMLRenderer(this,this.options).value()}finalize(){return!0}}function source(s){return s?"string"==typeof s?s:s.source:null}const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;const w="[a-zA-Z]\\w*",x="[a-zA-Z_]\\w*",j="\\b\\d+(\\.\\d+)?",P="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",B="\\b(0b[01]+)",$={begin:"\\\\[\\s\\S]",relevance:0},U={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[$]},Y={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[$]},X={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT=function(s,i,u={}){const _=inherit({className:"comment",begin:s,end:i,contains:[]},u);return _.contains.push(X),_.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),_},Z=COMMENT("//","$"),ee=COMMENT("/\\*","\\*/"),ae=COMMENT("#","$"),ie={className:"number",begin:j,relevance:0},le={className:"number",begin:P,relevance:0},ce={className:"number",begin:B,relevance:0},pe={className:"number",begin:j+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},de={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[$,{begin:/\[/,end:/\]/,relevance:0,contains:[$]}]}]},fe={className:"title",begin:w,relevance:0},ye={className:"title",begin:x,relevance:0},be={begin:"\\.\\s*"+x,relevance:0};var _e=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:w,UNDERSCORE_IDENT_RE:x,NUMBER_RE:j,C_NUMBER_RE:P,BINARY_NUMBER_RE:B,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(s={})=>{const i=/^#![ ]*\//;return s.binary&&(s.begin=function concat(...s){return s.map((s=>source(s))).join("")}(i,/.*\b/,s.binary,/\b.*/)),inherit({className:"meta",begin:i,end:/$/,relevance:0,"on:begin":(s,i)=>{0!==s.index&&i.ignoreMatch()}},s)},BACKSLASH_ESCAPE:$,APOS_STRING_MODE:U,QUOTE_STRING_MODE:Y,PHRASAL_WORDS_MODE:X,COMMENT,C_LINE_COMMENT_MODE:Z,C_BLOCK_COMMENT_MODE:ee,HASH_COMMENT_MODE:ae,NUMBER_MODE:ie,C_NUMBER_MODE:le,BINARY_NUMBER_MODE:ce,CSS_NUMBER_MODE:pe,REGEXP_MODE:de,TITLE_MODE:fe,UNDERSCORE_TITLE_MODE:ye,METHOD_GUARD:be,END_SAME_AS_BEGIN:function(s){return Object.assign(s,{"on:begin":(s,i)=>{i.data._beginMatch=s[1]},"on:end":(s,i)=>{i.data._beginMatch!==s[1]&&i.ignoreMatch()}})}});function skipIfhasPrecedingDot(s,i){"."===s.input[s.index-1]&&i.ignoreMatch()}function beginKeywords(s,i){i&&s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",s.__beforeBegin=skipIfhasPrecedingDot,s.keywords=s.keywords||s.beginKeywords,delete s.beginKeywords,void 0===s.relevance&&(s.relevance=0))}function compileIllegal(s,i){Array.isArray(s.illegal)&&(s.illegal=function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}(...s.illegal))}function compileMatch(s,i){if(s.match){if(s.begin||s.end)throw new Error("begin & end are not supported with match");s.begin=s.match,delete s.match}}function compileRelevance(s,i){void 0===s.relevance&&(s.relevance=1)}const we=["of","and","for","in","not","or","if","then","parent","list","value"],Se="keyword";function compileKeywords(s,i,u=Se){const _={};return"string"==typeof s?compileList(u,s.split(" ")):Array.isArray(s)?compileList(u,s):Object.keys(s).forEach((function(u){Object.assign(_,compileKeywords(s[u],i,u))})),_;function compileList(s,u){i&&(u=u.map((s=>s.toLowerCase()))),u.forEach((function(i){const u=i.split("|");_[u[0]]=[s,scoreForKeyword(u[0],u[1])]}))}}function scoreForKeyword(s,i){return i?Number(i):function commonKeyword(s){return we.includes(s.toLowerCase())}(s)?0:1}function compileLanguage(s,{plugins:i}){function langRe(i,u){return new RegExp(source(i),"m"+(s.case_insensitive?"i":"")+(u?"g":""))}class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(s,i){i.position=this.position++,this.matchIndexes[this.matchAt]=i,this.regexes.push([i,s]),this.matchAt+=function countMatchGroups(s){return new RegExp(s.toString()+"|").exec("").length-1}(s)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const s=this.regexes.map((s=>s[1]));this.matcherRe=langRe(function join(s,i="|"){let u=0;return s.map((s=>{u+=1;const i=u;let w=source(s),x="";for(;w.length>0;){const s=_.exec(w);if(!s){x+=w;break}x+=w.substring(0,s.index),w=w.substring(s.index+s[0].length),"\\"===s[0][0]&&s[1]?x+="\\"+String(Number(s[1])+i):(x+=s[0],"("===s[0]&&u++)}return x})).map((s=>`(${s})`)).join(i)}(s),!0),this.lastIndex=0}exec(s){this.matcherRe.lastIndex=this.lastIndex;const i=this.matcherRe.exec(s);if(!i)return null;const u=i.findIndex(((s,i)=>i>0&&void 0!==s)),_=this.matchIndexes[u];return i.splice(0,u),Object.assign(i,_)}}class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(s){if(this.multiRegexes[s])return this.multiRegexes[s];const i=new MultiRegex;return this.rules.slice(s).forEach((([s,u])=>i.addRule(s,u))),i.compile(),this.multiRegexes[s]=i,i}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(s,i){this.rules.push([s,i]),"begin"===i.type&&this.count++}exec(s){const i=this.getMatcher(this.regexIndex);i.lastIndex=this.lastIndex;let u=i.exec(s);if(this.resumingScanAtSamePosition())if(u&&u.index===this.lastIndex);else{const i=this.getMatcher(0);i.lastIndex=this.lastIndex+1,u=i.exec(s)}return u&&(this.regexIndex+=u.position+1,this.regexIndex===this.count&&this.considerAll()),u}}if(s.compilerExtensions||(s.compilerExtensions=[]),s.contains&&s.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return s.classNameAliases=inherit(s.classNameAliases||{}),function compileMode(i,u){const _=i;if(i.isCompiled)return _;[compileMatch].forEach((s=>s(i,u))),s.compilerExtensions.forEach((s=>s(i,u))),i.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach((s=>s(i,u))),i.isCompiled=!0;let w=null;if("object"==typeof i.keywords&&(w=i.keywords.$pattern,delete i.keywords.$pattern),i.keywords&&(i.keywords=compileKeywords(i.keywords,s.case_insensitive)),i.lexemes&&w)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return w=w||i.lexemes||/\w+/,_.keywordPatternRe=langRe(w,!0),u&&(i.begin||(i.begin=/\B|\b/),_.beginRe=langRe(i.begin),i.endSameAsBegin&&(i.end=i.begin),i.end||i.endsWithParent||(i.end=/\B|\b/),i.end&&(_.endRe=langRe(i.end)),_.terminatorEnd=source(i.end)||"",i.endsWithParent&&u.terminatorEnd&&(_.terminatorEnd+=(i.end?"|":"")+u.terminatorEnd)),i.illegal&&(_.illegalRe=langRe(i.illegal)),i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((function(s){return function expandOrCloneMode(s){s.variants&&!s.cachedVariants&&(s.cachedVariants=s.variants.map((function(i){return inherit(s,{variants:null},i)})));if(s.cachedVariants)return s.cachedVariants;if(dependencyOnParent(s))return inherit(s,{starts:s.starts?inherit(s.starts):null});if(Object.isFrozen(s))return inherit(s);return s}("self"===s?i:s)}))),i.contains.forEach((function(s){compileMode(s,_)})),i.starts&&compileMode(i.starts,u),_.matcher=function buildModeRegex(s){const i=new ResumableMultiRegex;return s.contains.forEach((s=>i.addRule(s.begin,{rule:s,type:"begin"}))),s.terminatorEnd&&i.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&i.addRule(s.illegal,{type:"illegal"}),i}(_),_}(s)}function dependencyOnParent(s){return!!s&&(s.endsWithParent||dependencyOnParent(s.starts))}function BuildVuePlugin(s){const i={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!s.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,escapeHTML(this.code);let i={};return this.autoDetect?(i=s.highlightAuto(this.code),this.detectedLanguage=i.language):(i=s.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),i.value},autoDetect(){return!this.language||function hasValueOrEmptyAttribute(s){return Boolean(s||""===s)}(this.autodetect)},ignoreIllegals:()=>!0},render(s){return s("pre",{},[s("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:i,VuePlugin:{install(s){s.component("highlightjs",i)}}}}const xe={"after:highlightElement":({el:s,result:i,text:u})=>{const _=nodeStream(s);if(!_.length)return;const w=document.createElement("div");w.innerHTML=i.value,i.value=function mergeStreams(s,i,u){let _=0,w="";const x=[];function selectStream(){return s.length&&i.length?s[0].offset!==i[0].offset?s[0].offset"}function close(s){w+=""}function render(s){("start"===s.event?open:close)(s.node)}for(;s.length||i.length;){let i=selectStream();if(w+=escapeHTML(u.substring(_,i[0].offset)),_=i[0].offset,i===s){x.reverse().forEach(close);do{render(i.splice(0,1)[0]),i=selectStream()}while(i===s&&i.length&&i[0].offset===_);x.reverse().forEach(open)}else"start"===i[0].event?x.push(i[0].node):x.pop(),render(i.splice(0,1)[0])}return w+escapeHTML(u.substr(_))}(_,nodeStream(w),u)}};function tag(s){return s.nodeName.toLowerCase()}function nodeStream(s){const i=[];return function _nodeStream(s,u){for(let _=s.firstChild;_;_=_.nextSibling)3===_.nodeType?u+=_.nodeValue.length:1===_.nodeType&&(i.push({event:"start",offset:u,node:_}),u=_nodeStream(_,u),tag(_).match(/br|hr|img|input/)||i.push({event:"stop",offset:u,node:_}));return u}(s,0),i}const Pe={},error=s=>{console.error(s)},warn=(s,...i)=>{console.log(`WARN: ${s}`,...i)},deprecated=(s,i)=>{Pe[`${s}/${i}`]||(console.log(`Deprecated as of ${s}. ${i}`),Pe[`${s}/${i}`]=!0)},Te=escapeHTML,Re=inherit,qe=Symbol("nomatch");var $e=function(s){const u=Object.create(null),_=Object.create(null),w=[];let x=!0;const j=/(^(<[^>]+>|\t|)+|\n)/gm,P="Could not find the language '{}', did you forget to load/include a language module?",B={disableAutodetect:!0,name:"Plain text",contains:[]};let $={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(s){return $.noHighlightRe.test(s)}function highlight(s,i,u,_){let w="",x="";"object"==typeof i?(w=s,u=i.ignoreIllegals,x=i.language,_=void 0):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),x=s,w=i);const j={code:w,language:x};fire("before:highlight",j);const P=j.result?j.result:_highlight(j.language,j.code,u,_);return P.code=j.code,fire("after:highlight",P),P}function _highlight(s,i,_,j){function keywordData(s,i){const u=U.case_insensitive?i[0].toLowerCase():i[0];return Object.prototype.hasOwnProperty.call(s.keywords,u)&&s.keywords[u]}function processBuffer(){null!=Z.subLanguage?function processSubLanguage(){if(""===ie)return;let s=null;if("string"==typeof Z.subLanguage){if(!u[Z.subLanguage])return void ae.addText(ie);s=_highlight(Z.subLanguage,ie,!0,ee[Z.subLanguage]),ee[Z.subLanguage]=s.top}else s=highlightAuto(ie,Z.subLanguage.length?Z.subLanguage:null);Z.relevance>0&&(le+=s.relevance),ae.addSublanguage(s.emitter,s.language)}():function processKeywords(){if(!Z.keywords)return void ae.addText(ie);let s=0;Z.keywordPatternRe.lastIndex=0;let i=Z.keywordPatternRe.exec(ie),u="";for(;i;){u+=ie.substring(s,i.index);const _=keywordData(Z,i);if(_){const[s,w]=_;if(ae.addText(u),u="",le+=w,s.startsWith("_"))u+=i[0];else{const u=U.classNameAliases[s]||s;ae.addKeyword(i[0],u)}}else u+=i[0];s=Z.keywordPatternRe.lastIndex,i=Z.keywordPatternRe.exec(ie)}u+=ie.substr(s),ae.addText(u)}(),ie=""}function startNewMode(s){return s.className&&ae.openNode(U.classNameAliases[s.className]||s.className),Z=Object.create(s,{parent:{value:Z}}),Z}function endOfMode(s,i,u){let _=function startsWith(s,i){const u=s&&s.exec(i);return u&&0===u.index}(s.endRe,u);if(_){if(s["on:end"]){const u=new Response(s);s["on:end"](i,u),u.isMatchIgnored&&(_=!1)}if(_){for(;s.endsParent&&s.parent;)s=s.parent;return s}}if(s.endsWithParent)return endOfMode(s.parent,i,u)}function doIgnore(s){return 0===Z.matcher.regexIndex?(ie+=s[0],1):(de=!0,0)}function doBeginMatch(s){const i=s[0],u=s.rule,_=new Response(u),w=[u.__beforeBegin,u["on:begin"]];for(const u of w)if(u&&(u(s,_),_.isMatchIgnored))return doIgnore(i);return u&&u.endSameAsBegin&&(u.endRe=function escape(s){return new RegExp(s.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(i)),u.skip?ie+=i:(u.excludeBegin&&(ie+=i),processBuffer(),u.returnBegin||u.excludeBegin||(ie=i)),startNewMode(u),u.returnBegin?0:i.length}function doEndMatch(s){const u=s[0],_=i.substr(s.index),w=endOfMode(Z,s,_);if(!w)return qe;const x=Z;x.skip?ie+=u:(x.returnEnd||x.excludeEnd||(ie+=u),processBuffer(),x.excludeEnd&&(ie=u));do{Z.className&&ae.closeNode(),Z.skip||Z.subLanguage||(le+=Z.relevance),Z=Z.parent}while(Z!==w.parent);return w.starts&&(w.endSameAsBegin&&(w.starts.endRe=w.endRe),startNewMode(w.starts)),x.returnEnd?0:u.length}let B={};function processLexeme(u,w){const j=w&&w[0];if(ie+=u,null==j)return processBuffer(),0;if("begin"===B.type&&"end"===w.type&&B.index===w.index&&""===j){if(ie+=i.slice(w.index,w.index+1),!x){const i=new Error("0 width match regex");throw i.languageName=s,i.badRule=B.rule,i}return 1}if(B=w,"begin"===w.type)return doBeginMatch(w);if("illegal"===w.type&&!_){const s=new Error('Illegal lexeme "'+j+'" for mode "'+(Z.className||"")+'"');throw s.mode=Z,s}if("end"===w.type){const s=doEndMatch(w);if(s!==qe)return s}if("illegal"===w.type&&""===j)return 1;if(pe>1e5&&pe>3*w.index){throw new Error("potential infinite loop, way more iterations than matches")}return ie+=j,j.length}const U=getLanguage(s);if(!U)throw error(P.replace("{}",s)),new Error('Unknown language: "'+s+'"');const Y=compileLanguage(U,{plugins:w});let X="",Z=j||Y;const ee={},ae=new $.__emitter($);!function processContinuations(){const s=[];for(let i=Z;i!==U;i=i.parent)i.className&&s.unshift(i.className);s.forEach((s=>ae.openNode(s)))}();let ie="",le=0,ce=0,pe=0,de=!1;try{for(Z.matcher.considerAll();;){pe++,de?de=!1:Z.matcher.considerAll(),Z.matcher.lastIndex=ce;const s=Z.matcher.exec(i);if(!s)break;const u=processLexeme(i.substring(ce,s.index),s);ce=s.index+u}return processLexeme(i.substr(ce)),ae.closeAllNodes(),ae.finalize(),X=ae.toHTML(),{relevance:Math.floor(le),value:X,language:s,illegal:!1,emitter:ae,top:Z}}catch(u){if(u.message&&u.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:u.message,context:i.slice(ce-100,ce+100),mode:u.mode},sofar:X,relevance:0,value:Te(i),emitter:ae};if(x)return{illegal:!1,relevance:0,value:Te(i),emitter:ae,language:s,top:Z,errorRaised:u};throw u}}function highlightAuto(s,i){i=i||$.languages||Object.keys(u);const _=function justTextHighlightResult(s){const i={relevance:0,emitter:new $.__emitter($),value:Te(s),illegal:!1,top:B};return i.emitter.addText(s),i}(s),w=i.filter(getLanguage).filter(autoDetection).map((i=>_highlight(i,s,!1)));w.unshift(_);const x=w.sort(((s,i)=>{if(s.relevance!==i.relevance)return i.relevance-s.relevance;if(s.language&&i.language){if(getLanguage(s.language).supersetOf===i.language)return 1;if(getLanguage(i.language).supersetOf===s.language)return-1}return 0})),[j,P]=x,U=j;return U.second_best=P,U}const U={"before:highlightElement":({el:s})=>{$.useBR&&(s.innerHTML=s.innerHTML.replace(/\n/g,"").replace(//g,"\n"))},"after:highlightElement":({result:s})=>{$.useBR&&(s.value=s.value.replace(/\n/g,"
"))}},Y=/^(<[^>]+>|\t)+/gm,X={"after:highlightElement":({result:s})=>{$.tabReplace&&(s.value=s.value.replace(Y,(s=>s.replace(/\t/g,$.tabReplace))))}};function highlightElement(s){let i=null;const u=function blockLanguage(s){let i=s.className+" ";i+=s.parentNode?s.parentNode.className:"";const u=$.languageDetectRe.exec(i);if(u){const i=getLanguage(u[1]);return i||(warn(P.replace("{}",u[1])),warn("Falling back to no-highlight mode for this block.",s)),i?u[1]:"no-highlight"}return i.split(/\s+/).find((s=>shouldNotHighlight(s)||getLanguage(s)))}(s);if(shouldNotHighlight(u))return;fire("before:highlightElement",{el:s,language:u}),i=s;const w=i.textContent,x=u?highlight(w,{language:u,ignoreIllegals:!0}):highlightAuto(w);fire("after:highlightElement",{el:s,result:x,text:w}),s.innerHTML=x.value,function updateClassName(s,i,u){const w=i?_[i]:u;s.classList.add("hljs"),w&&s.classList.add(w)}(s,u,x.language),s.result={language:x.language,re:x.relevance,relavance:x.relevance},x.second_best&&(s.second_best={language:x.second_best.language,re:x.second_best.relevance,relavance:x.second_best.relevance})}const initHighlighting=()=>{if(initHighlighting.called)return;initHighlighting.called=!0,deprecated("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(highlightElement)};let Z=!1;function highlightAll(){if("loading"===document.readyState)return void(Z=!0);document.querySelectorAll("pre code").forEach(highlightElement)}function getLanguage(s){return s=(s||"").toLowerCase(),u[s]||u[_[s]]}function registerAliases(s,{languageName:i}){"string"==typeof s&&(s=[s]),s.forEach((s=>{_[s.toLowerCase()]=i}))}function autoDetection(s){const i=getLanguage(s);return i&&!i.disableAutodetect}function fire(s,i){const u=s;w.forEach((function(s){s[u]&&s[u](i)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function boot(){Z&&highlightAll()}),!1),Object.assign(s,{highlight,highlightAuto,highlightAll,fixMarkup:function deprecateFixMarkup(s){return deprecated("10.2.0","fixMarkup will be removed entirely in v11.0"),deprecated("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function fixMarkup(s){return $.tabReplace||$.useBR?s.replace(j,(s=>"\n"===s?$.useBR?"
":s:$.tabReplace?s.replace(/\t/g,$.tabReplace):s)):s}(s)},highlightElement,highlightBlock:function deprecateHighlightBlock(s){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(s)},configure:function configure(s){s.useBR&&(deprecated("10.3.0","'useBR' will be removed entirely in v11.0"),deprecated("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),$=Re($,s)},initHighlighting,initHighlightingOnLoad:function initHighlightingOnLoad(){deprecated("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),Z=!0},registerLanguage:function registerLanguage(i,_){let w=null;try{w=_(s)}catch(s){if(error("Language definition for '{}' could not be registered.".replace("{}",i)),!x)throw s;error(s),w=B}w.name||(w.name=i),u[i]=w,w.rawDefinition=_.bind(null,s),w.aliases&®isterAliases(w.aliases,{languageName:i})},unregisterLanguage:function unregisterLanguage(s){delete u[s];for(const i of Object.keys(_))_[i]===s&&delete _[i]},listLanguages:function listLanguages(){return Object.keys(u)},getLanguage,registerAliases,requireLanguage:function requireLanguage(s){deprecated("10.4.0","requireLanguage will be removed entirely in v11."),deprecated("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const i=getLanguage(s);if(i)return i;throw new Error("The '{}' language is required, but not loaded.".replace("{}",s))},autoDetection,inherit:Re,addPlugin:function addPlugin(s){!function upgradePluginAPI(s){s["before:highlightBlock"]&&!s["before:highlightElement"]&&(s["before:highlightElement"]=i=>{s["before:highlightBlock"](Object.assign({block:i.el},i))}),s["after:highlightBlock"]&&!s["after:highlightElement"]&&(s["after:highlightElement"]=i=>{s["after:highlightBlock"](Object.assign({block:i.el},i))})}(s),w.push(s)},vuePlugin:BuildVuePlugin(s).VuePlugin}),s.debugMode=function(){x=!1},s.safeMode=function(){x=!0},s.versionString="10.7.3";for(const s in _e)"object"==typeof _e[s]&&i(_e[s]);return Object.assign(s,_e),s.addPlugin(U),s.addPlugin(xe),s.addPlugin(X),s}({});s.exports=$e},35344:s=>{function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function bash(s){const i={},u={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[i]}]};Object.assign(i,{className:"variable",variants:[{begin:concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},u]});const _={className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},w={begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},x={className:"string",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE,i,_]};_.contains.push(x);const j={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,i]},P=s.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),B={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[P,s.SHEBANG(),B,j,s.HASH_COMMENT_MODE,w,x,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},i]}}},73402:s=>{function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function http(s){const i="HTTP/(2|1\\.[01])",u={className:"attribute",begin:concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},_=[u,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+i+" \\d{3})",end:/$/,contains:[{className:"meta",begin:i},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:_}},{begin:"(?=^[A-Z]+ (.*?) "+i+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:i},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:_}},s.inherit(u,{relevance:0})]}}},95089:s=>{const i="[A-Za-z$_][0-9A-Za-z$_]*",u=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],_=["true","false","null","undefined","NaN","Infinity"],w=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function javascript(s){const x=i,j="<>",P="",B={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(s,i)=>{const u=s[0].length+s.index,_=s.input[u];"<"!==_?">"===_&&(((s,{after:i})=>{const u="",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:s.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:$,contains:fe}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:j,end:P},{begin:B.begin,"on:begin":B.isTrulyOpeningTag,end:B.end}],subLanguage:"xml",contains:[{begin:B.begin,end:B.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:$,contains:["self",s.inherit(s.TITLE_MODE,{begin:x}),ye],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:s.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[ye,s.inherit(s.TITLE_MODE,{begin:x})]},{variants:[{begin:"\\."+x},{begin:"\\$"+x}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},s.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[s.inherit(s.TITLE_MODE,{begin:x}),"self",ye]},{begin:"(get|set)\\s+(?="+x+"\\()",end:/\{/,keywords:"get set",contains:[s.inherit(s.TITLE_MODE,{begin:x}),{begin:/\(\)/},ye]},{begin:/\$[(.]/}]}}},65772:s=>{s.exports=function json(s){const i={literal:"true false null"},u=[s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE],_=[s.QUOTE_STRING_MODE,s.C_NUMBER_MODE],w={end:",",endsWithParent:!0,excludeEnd:!0,contains:_,keywords:i},x={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE],illegal:"\\n"},s.inherit(w,{begin:/:/})].concat(u),illegal:"\\S"},j={begin:"\\[",end:"\\]",contains:[s.inherit(w)],illegal:"\\S"};return _.push(x,j),u.forEach((function(s){_.push(s)})),{name:"JSON",contains:_,keywords:i,illegal:"\\S"}}},26571:s=>{s.exports=function powershell(s){const i={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},u={begin:"`[\\s\\S]",relevance:0},_={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},w={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[u,_,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},x={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},j=s.inherit(s.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),P={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},B={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[s.TITLE_MODE]},$={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[_]}]},U={begin:/using\s/,end:/$/,returnBegin:!0,contains:[w,x,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},Y={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},X={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(i.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},s.inherit(s.TITLE_MODE,{endsParent:!0})]},Z=[X,j,u,s.NUMBER_MODE,w,x,P,_,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],ee={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",Z,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return X.contains.unshift(ee),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:i,contains:Z.concat(B,$,U,Y,ee)}}},17285:s=>{function source(s){return s?"string"==typeof s?s:s.source:null}function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>source(s))).join("")}function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}s.exports=function xml(s){const i=concat(/[A-Z_]/,function optional(s){return concat("(",s,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),u={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},_={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},w=s.inherit(_,{begin:/\(/,end:/\)/}),x=s.inherit(s.APOS_STRING_MODE,{className:"meta-string"}),j=s.inherit(s.QUOTE_STRING_MODE,{className:"meta-string"}),P={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[_,j,x,w,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[_,w,j,x]}]}]},s.COMMENT(//,{relevance:10}),{begin://,relevance:10},u,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[P],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[P],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:i,relevance:0,starts:P}]},{className:"tag",begin:concat(/<\//,lookahead(concat(i,/>/))),contains:[{className:"name",begin:i,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},17533:s=>{s.exports=function yaml(s){var i="true false yes no null",u="[\\w#;/?:@&=+$,.~*'()[\\]]+",_={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[s.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},w=s.inherit(_,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),x={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},j={end:",",endsWithParent:!0,excludeEnd:!0,keywords:i,relevance:0},P={begin:/\{/,end:/\}/,contains:[j],illegal:"\\n",relevance:0},B={begin:"\\[",end:"\\]",contains:[j],illegal:"\\n",relevance:0},$=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+u},{className:"type",begin:"!<"+u+">"},{className:"type",begin:"!"+u},{className:"type",begin:"!!"+u},{className:"meta",begin:"&"+s.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+s.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},s.HASH_COMMENT_MODE,{beginKeywords:i,keywords:{literal:i}},x,{className:"number",begin:s.C_NUMBER_RE+"\\b",relevance:0},P,B,_],U=[...$];return U.pop(),U.push(w),j.contains=U,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:$}}},251:(s,i)=>{i.read=function(s,i,u,_,w){var x,j,P=8*w-_-1,B=(1<>1,U=-7,Y=u?w-1:0,X=u?-1:1,Z=s[i+Y];for(Y+=X,x=Z&(1<<-U)-1,Z>>=-U,U+=P;U>0;x=256*x+s[i+Y],Y+=X,U-=8);for(j=x&(1<<-U)-1,x>>=-U,U+=_;U>0;j=256*j+s[i+Y],Y+=X,U-=8);if(0===x)x=1-$;else{if(x===B)return j?NaN:1/0*(Z?-1:1);j+=Math.pow(2,_),x-=$}return(Z?-1:1)*j*Math.pow(2,x-_)},i.write=function(s,i,u,_,w,x){var j,P,B,$=8*x-w-1,U=(1<<$)-1,Y=U>>1,X=23===w?Math.pow(2,-24)-Math.pow(2,-77):0,Z=_?0:x-1,ee=_?1:-1,ae=i<0||0===i&&1/i<0?1:0;for(i=Math.abs(i),isNaN(i)||i===1/0?(P=isNaN(i)?1:0,j=U):(j=Math.floor(Math.log(i)/Math.LN2),i*(B=Math.pow(2,-j))<1&&(j--,B*=2),(i+=j+Y>=1?X/B:X*Math.pow(2,1-Y))*B>=2&&(j++,B/=2),j+Y>=U?(P=0,j=U):j+Y>=1?(P=(i*B-1)*Math.pow(2,w),j+=Y):(P=i*Math.pow(2,Y-1)*Math.pow(2,w),j=0));w>=8;s[u+Z]=255&P,Z+=ee,P/=256,w-=8);for(j=j<0;s[u+Z]=255&j,Z+=ee,j/=256,$-=8);s[u+Z-ee]|=128*ae}},9404:function(s){s.exports=function(){"use strict";var s=Array.prototype.slice;function createClass(s,i){i&&(s.prototype=Object.create(i.prototype)),s.prototype.constructor=s}function Iterable(s){return isIterable(s)?s:Seq(s)}function KeyedIterable(s){return isKeyed(s)?s:KeyedSeq(s)}function IndexedIterable(s){return isIndexed(s)?s:IndexedSeq(s)}function SetIterable(s){return isIterable(s)&&!isAssociative(s)?s:SetSeq(s)}function isIterable(s){return!(!s||!s[i])}function isKeyed(s){return!(!s||!s[u])}function isIndexed(s){return!(!s||!s[_])}function isAssociative(s){return isKeyed(s)||isIndexed(s)}function isOrdered(s){return!(!s||!s[w])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var i="@@__IMMUTABLE_ITERABLE__@@",u="@@__IMMUTABLE_KEYED__@@",_="@@__IMMUTABLE_INDEXED__@@",w="@@__IMMUTABLE_ORDERED__@@",x="delete",j=5,P=1<>>0;if(""+u!==i||4294967295===u)return NaN;i=u}return i<0?ensureSize(s)+i:i}function returnTrue(){return!0}function wholeSlice(s,i,u){return(0===s||void 0!==u&&s<=-u)&&(void 0===i||void 0!==u&&i>=u)}function resolveBegin(s,i){return resolveIndex(s,i,0)}function resolveEnd(s,i){return resolveIndex(s,i,i)}function resolveIndex(s,i,u){return void 0===s?u:s<0?Math.max(0,i+s):void 0===i?s:Math.min(i,s)}var X=0,Z=1,ee=2,ae="function"==typeof Symbol&&Symbol.iterator,ie="@@iterator",le=ae||ie;function Iterator(s){this.next=s}function iteratorValue(s,i,u,_){var w=0===s?i:1===s?u:[i,u];return _?_.value=w:_={value:w,done:!1},_}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(s){return!!getIteratorFn(s)}function isIterator(s){return s&&"function"==typeof s.next}function getIterator(s){var i=getIteratorFn(s);return i&&i.call(s)}function getIteratorFn(s){var i=s&&(ae&&s[ae]||s[ie]);if("function"==typeof i)return i}function isArrayLike(s){return s&&"number"==typeof s.length}function Seq(s){return null==s?emptySequence():isIterable(s)?s.toSeq():seqFromValue(s)}function KeyedSeq(s){return null==s?emptySequence().toKeyedSeq():isIterable(s)?isKeyed(s)?s.toSeq():s.fromEntrySeq():keyedSeqFromValue(s)}function IndexedSeq(s){return null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s.toIndexedSeq():indexedSeqFromValue(s)}function SetSeq(s){return(null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s:indexedSeqFromValue(s)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=X,Iterator.VALUES=Z,Iterator.ENTRIES=ee,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[le]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(s,i){return seqIterate(this,s,i,!0)},Seq.prototype.__iterator=function(s,i){return seqIterator(this,s,i,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(s,i){return seqIterate(this,s,i,!1)},IndexedSeq.prototype.__iterator=function(s,i){return seqIterator(this,s,i,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var ce,pe,de,fe="@@__IMMUTABLE_SEQ__@@";function ArraySeq(s){this._array=s,this.size=s.length}function ObjectSeq(s){var i=Object.keys(s);this._object=s,this._keys=i,this.size=i.length}function IterableSeq(s){this._iterable=s,this.size=s.length||s.size}function IteratorSeq(s){this._iterator=s,this._iteratorCache=[]}function isSeq(s){return!(!s||!s[fe])}function emptySequence(){return ce||(ce=new ArraySeq([]))}function keyedSeqFromValue(s){var i=Array.isArray(s)?new ArraySeq(s).fromEntrySeq():isIterator(s)?new IteratorSeq(s).fromEntrySeq():hasIterator(s)?new IterableSeq(s).fromEntrySeq():"object"==typeof s?new ObjectSeq(s):void 0;if(!i)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+s);return i}function indexedSeqFromValue(s){var i=maybeIndexedSeqFromValue(s);if(!i)throw new TypeError("Expected Array or iterable object of values: "+s);return i}function seqFromValue(s){var i=maybeIndexedSeqFromValue(s)||"object"==typeof s&&new ObjectSeq(s);if(!i)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+s);return i}function maybeIndexedSeqFromValue(s){return isArrayLike(s)?new ArraySeq(s):isIterator(s)?new IteratorSeq(s):hasIterator(s)?new IterableSeq(s):void 0}function seqIterate(s,i,u,_){var w=s._cache;if(w){for(var x=w.length-1,j=0;j<=x;j++){var P=w[u?x-j:j];if(!1===i(P[1],_?P[0]:j,s))return j+1}return j}return s.__iterateUncached(i,u)}function seqIterator(s,i,u,_){var w=s._cache;if(w){var x=w.length-1,j=0;return new Iterator((function(){var s=w[u?x-j:j];return j++>x?iteratorDone():iteratorValue(i,_?s[0]:j-1,s[1])}))}return s.__iteratorUncached(i,u)}function fromJS(s,i){return i?fromJSWith(i,s,"",{"":s}):fromJSDefault(s)}function fromJSWith(s,i,u,_){return Array.isArray(i)?s.call(_,u,IndexedSeq(i).map((function(u,_){return fromJSWith(s,u,_,i)}))):isPlainObj(i)?s.call(_,u,KeyedSeq(i).map((function(u,_){return fromJSWith(s,u,_,i)}))):i}function fromJSDefault(s){return Array.isArray(s)?IndexedSeq(s).map(fromJSDefault).toList():isPlainObj(s)?KeyedSeq(s).map(fromJSDefault).toMap():s}function isPlainObj(s){return s&&(s.constructor===Object||void 0===s.constructor)}function is(s,i){if(s===i||s!=s&&i!=i)return!0;if(!s||!i)return!1;if("function"==typeof s.valueOf&&"function"==typeof i.valueOf){if((s=s.valueOf())===(i=i.valueOf())||s!=s&&i!=i)return!0;if(!s||!i)return!1}return!("function"!=typeof s.equals||"function"!=typeof i.equals||!s.equals(i))}function deepEqual(s,i){if(s===i)return!0;if(!isIterable(i)||void 0!==s.size&&void 0!==i.size&&s.size!==i.size||void 0!==s.__hash&&void 0!==i.__hash&&s.__hash!==i.__hash||isKeyed(s)!==isKeyed(i)||isIndexed(s)!==isIndexed(i)||isOrdered(s)!==isOrdered(i))return!1;if(0===s.size&&0===i.size)return!0;var u=!isAssociative(s);if(isOrdered(s)){var _=s.entries();return i.every((function(s,i){var w=_.next().value;return w&&is(w[1],s)&&(u||is(w[0],i))}))&&_.next().done}var w=!1;if(void 0===s.size)if(void 0===i.size)"function"==typeof s.cacheResult&&s.cacheResult();else{w=!0;var x=s;s=i,i=x}var j=!0,P=i.__iterate((function(i,_){if(u?!s.has(i):w?!is(i,s.get(_,$)):!is(s.get(_,$),i))return j=!1,!1}));return j&&s.size===P}function Repeat(s,i){if(!(this instanceof Repeat))return new Repeat(s,i);if(this._value=s,this.size=void 0===i?1/0:Math.max(0,i),0===this.size){if(pe)return pe;pe=this}}function invariant(s,i){if(!s)throw new Error(i)}function Range(s,i,u){if(!(this instanceof Range))return new Range(s,i,u);if(invariant(0!==u,"Cannot step a Range by 0"),s=s||0,void 0===i&&(i=1/0),u=void 0===u?1:Math.abs(u),i_?iteratorDone():iteratorValue(s,w,u[i?_-w++:w++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(s,i){return void 0===i||this.has(s)?this._object[s]:i},ObjectSeq.prototype.has=function(s){return this._object.hasOwnProperty(s)},ObjectSeq.prototype.__iterate=function(s,i){for(var u=this._object,_=this._keys,w=_.length-1,x=0;x<=w;x++){var j=_[i?w-x:x];if(!1===s(u[j],j,this))return x+1}return x},ObjectSeq.prototype.__iterator=function(s,i){var u=this._object,_=this._keys,w=_.length-1,x=0;return new Iterator((function(){var j=_[i?w-x:x];return x++>w?iteratorDone():iteratorValue(s,j,u[j])}))},ObjectSeq.prototype[w]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(s,i){if(i)return this.cacheResult().__iterate(s,i);var u=getIterator(this._iterable),_=0;if(isIterator(u))for(var w;!(w=u.next()).done&&!1!==s(w.value,_++,this););return _},IterableSeq.prototype.__iteratorUncached=function(s,i){if(i)return this.cacheResult().__iterator(s,i);var u=getIterator(this._iterable);if(!isIterator(u))return new Iterator(iteratorDone);var _=0;return new Iterator((function(){var i=u.next();return i.done?i:iteratorValue(s,_++,i.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(s,i){if(i)return this.cacheResult().__iterate(s,i);for(var u,_=this._iterator,w=this._iteratorCache,x=0;x=_.length){var i=u.next();if(i.done)return i;_[w]=i.value}return iteratorValue(s,w,_[w++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(s,i){return this.has(s)?this._value:i},Repeat.prototype.includes=function(s){return is(this._value,s)},Repeat.prototype.slice=function(s,i){var u=this.size;return wholeSlice(s,i,u)?this:new Repeat(this._value,resolveEnd(i,u)-resolveBegin(s,u))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(s){return is(this._value,s)?0:-1},Repeat.prototype.lastIndexOf=function(s){return is(this._value,s)?this.size:-1},Repeat.prototype.__iterate=function(s,i){for(var u=0;u=0&&i=0&&uu?iteratorDone():iteratorValue(s,x++,j)}))},Range.prototype.equals=function(s){return s instanceof Range?this._start===s._start&&this._end===s._end&&this._step===s._step:deepEqual(this,s)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var ye="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(s,i){var u=65535&(s|=0),_=65535&(i|=0);return u*_+((s>>>16)*_+u*(i>>>16)<<16>>>0)|0};function smi(s){return s>>>1&1073741824|3221225471&s}function hash(s){if(!1===s||null==s)return 0;if("function"==typeof s.valueOf&&(!1===(s=s.valueOf())||null==s))return 0;if(!0===s)return 1;var i=typeof s;if("number"===i){if(s!=s||s===1/0)return 0;var u=0|s;for(u!==s&&(u^=4294967295*s);s>4294967295;)u^=s/=4294967295;return smi(u)}if("string"===i)return s.length>Te?cachedHashString(s):hashString(s);if("function"==typeof s.hashCode)return s.hashCode();if("object"===i)return hashJSObj(s);if("function"==typeof s.toString)return hashString(s.toString());throw new Error("Value type "+i+" cannot be hashed.")}function cachedHashString(s){var i=$e[s];return void 0===i&&(i=hashString(s),qe===Re&&(qe=0,$e={}),qe++,$e[s]=i),i}function hashString(s){for(var i=0,u=0;u0)switch(s.nodeType){case 1:return s.uniqueID;case 9:return s.documentElement&&s.documentElement.uniqueID}}var we,Se="function"==typeof WeakMap;Se&&(we=new WeakMap);var xe=0,Pe="__immutablehash__";"function"==typeof Symbol&&(Pe=Symbol(Pe));var Te=16,Re=255,qe=0,$e={};function assertNotInfinite(s){invariant(s!==1/0,"Cannot perform this action with an infinite size.")}function Map(s){return null==s?emptyMap():isMap(s)&&!isOrdered(s)?s:emptyMap().withMutations((function(i){var u=KeyedIterable(s);assertNotInfinite(u.size),u.forEach((function(s,u){return i.set(u,s)}))}))}function isMap(s){return!(!s||!s[We])}createClass(Map,KeyedCollection),Map.of=function(){var i=s.call(arguments,0);return emptyMap().withMutations((function(s){for(var u=0;u=i.length)throw new Error("Missing value for key: "+i[u]);s.set(i[u],i[u+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(s,i){return this._root?this._root.get(0,void 0,s,i):i},Map.prototype.set=function(s,i){return updateMap(this,s,i)},Map.prototype.setIn=function(s,i){return this.updateIn(s,$,(function(){return i}))},Map.prototype.remove=function(s){return updateMap(this,s,$)},Map.prototype.deleteIn=function(s){return this.updateIn(s,(function(){return $}))},Map.prototype.update=function(s,i,u){return 1===arguments.length?s(this):this.updateIn([s],i,u)},Map.prototype.updateIn=function(s,i,u){u||(u=i,i=void 0);var _=updateInDeepMap(this,forceIterator(s),i,u);return _===$?void 0:_},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(i){return mergeIntoMapWith(this,i,s.call(arguments,1))},Map.prototype.mergeIn=function(i){var u=s.call(arguments,1);return this.updateIn(i,emptyMap(),(function(s){return"function"==typeof s.merge?s.merge.apply(s,u):u[u.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(i){var u=s.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(i),u)},Map.prototype.mergeDeepIn=function(i){var u=s.call(arguments,1);return this.updateIn(i,emptyMap(),(function(s){return"function"==typeof s.mergeDeep?s.mergeDeep.apply(s,u):u[u.length-1]}))},Map.prototype.sort=function(s){return OrderedMap(sortFactory(this,s))},Map.prototype.sortBy=function(s,i){return OrderedMap(sortFactory(this,i,s))},Map.prototype.withMutations=function(s){var i=this.asMutable();return s(i),i.wasAltered()?i.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(s,i){return new MapIterator(this,s,i)},Map.prototype.__iterate=function(s,i){var u=this,_=0;return this._root&&this._root.iterate((function(i){return _++,s(i[1],i[0],u)}),i),_},Map.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeMap(this.size,this._root,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Map.isMap=isMap;var ze,We="@@__IMMUTABLE_MAP__@@",He=Map.prototype;function ArrayMapNode(s,i){this.ownerID=s,this.entries=i}function BitmapIndexedNode(s,i,u){this.ownerID=s,this.bitmap=i,this.nodes=u}function HashArrayMapNode(s,i,u){this.ownerID=s,this.count=i,this.nodes=u}function HashCollisionNode(s,i,u){this.ownerID=s,this.keyHash=i,this.entries=u}function ValueNode(s,i,u){this.ownerID=s,this.keyHash=i,this.entry=u}function MapIterator(s,i,u){this._type=i,this._reverse=u,this._stack=s._root&&mapIteratorFrame(s._root)}function mapIteratorValue(s,i){return iteratorValue(s,i[0],i[1])}function mapIteratorFrame(s,i){return{node:s,index:0,__prev:i}}function makeMap(s,i,u,_){var w=Object.create(He);return w.size=s,w._root=i,w.__ownerID=u,w.__hash=_,w.__altered=!1,w}function emptyMap(){return ze||(ze=makeMap(0))}function updateMap(s,i,u){var _,w;if(s._root){var x=MakeRef(U),j=MakeRef(Y);if(_=updateNode(s._root,s.__ownerID,0,void 0,i,u,x,j),!j.value)return s;w=s.size+(x.value?u===$?-1:1:0)}else{if(u===$)return s;w=1,_=new ArrayMapNode(s.__ownerID,[[i,u]])}return s.__ownerID?(s.size=w,s._root=_,s.__hash=void 0,s.__altered=!0,s):_?makeMap(w,_):emptyMap()}function updateNode(s,i,u,_,w,x,j,P){return s?s.update(i,u,_,w,x,j,P):x===$?s:(SetRef(P),SetRef(j),new ValueNode(i,_,[w,x]))}function isLeafNode(s){return s.constructor===ValueNode||s.constructor===HashCollisionNode}function mergeIntoNode(s,i,u,_,w){if(s.keyHash===_)return new HashCollisionNode(i,_,[s.entry,w]);var x,P=(0===u?s.keyHash:s.keyHash>>>u)&B,$=(0===u?_:_>>>u)&B;return new BitmapIndexedNode(i,1<>>=1)j[B]=1&u?i[x++]:void 0;return j[_]=w,new HashArrayMapNode(s,x+1,j)}function mergeIntoMapWith(s,i,u){for(var _=[],w=0;w>1&1431655765))+(s>>2&858993459))+(s>>4)&252645135,s+=s>>8,127&(s+=s>>16)}function setIn(s,i,u,_){var w=_?s:arrCopy(s);return w[i]=u,w}function spliceIn(s,i,u,_){var w=s.length+1;if(_&&i+1===w)return s[i]=u,s;for(var x=new Array(w),j=0,P=0;P=Ye)return createNodes(s,B,_,w);var Z=s&&s===this.ownerID,ee=Z?B:arrCopy(B);return X?P?U===Y-1?ee.pop():ee[U]=ee.pop():ee[U]=[_,w]:ee.push([_,w]),Z?(this.entries=ee,this):new ArrayMapNode(s,ee)}},BitmapIndexedNode.prototype.get=function(s,i,u,_){void 0===i&&(i=hash(u));var w=1<<((0===s?i:i>>>s)&B),x=this.bitmap;return 0==(x&w)?_:this.nodes[popCount(x&w-1)].get(s+j,i,u,_)},BitmapIndexedNode.prototype.update=function(s,i,u,_,w,x,P){void 0===u&&(u=hash(_));var U=(0===i?u:u>>>i)&B,Y=1<=Xe)return expandNodes(s,ae,X,U,le);if(Z&&!le&&2===ae.length&&isLeafNode(ae[1^ee]))return ae[1^ee];if(Z&&le&&1===ae.length&&isLeafNode(le))return le;var ce=s&&s===this.ownerID,pe=Z?le?X:X^Y:X|Y,de=Z?le?setIn(ae,ee,le,ce):spliceOut(ae,ee,ce):spliceIn(ae,ee,le,ce);return ce?(this.bitmap=pe,this.nodes=de,this):new BitmapIndexedNode(s,pe,de)},HashArrayMapNode.prototype.get=function(s,i,u,_){void 0===i&&(i=hash(u));var w=(0===s?i:i>>>s)&B,x=this.nodes[w];return x?x.get(s+j,i,u,_):_},HashArrayMapNode.prototype.update=function(s,i,u,_,w,x,P){void 0===u&&(u=hash(_));var U=(0===i?u:u>>>i)&B,Y=w===$,X=this.nodes,Z=X[U];if(Y&&!Z)return this;var ee=updateNode(Z,s,i+j,u,_,w,x,P);if(ee===Z)return this;var ae=this.count;if(Z){if(!ee&&--ae0&&_=0&&s>>i&B;if(_>=this.array.length)return new VNode([],s);var w,x=0===_;if(i>0){var P=this.array[_];if((w=P&&P.removeBefore(s,i-j,u))===P&&x)return this}if(x&&!w)return this;var $=editableVNode(this,s);if(!x)for(var U=0;U<_;U++)$.array[U]=void 0;return w&&($.array[_]=w),$},VNode.prototype.removeAfter=function(s,i,u){if(u===(i?1<>>i&B;if(w>=this.array.length)return this;if(i>0){var x=this.array[w];if((_=x&&x.removeAfter(s,i-j,u))===x&&w===this.array.length-1)return this}var P=editableVNode(this,s);return P.array.splice(w+1),_&&(P.array[w]=_),P};var rt,nt,ot={};function iterateList(s,i){var u=s._origin,_=s._capacity,w=getTailOffset(_),x=s._tail;return iterateNodeOrLeaf(s._root,s._level,0);function iterateNodeOrLeaf(s,i,u){return 0===i?iterateLeaf(s,u):iterateNode(s,i,u)}function iterateLeaf(s,j){var B=j===w?x&&x.array:s&&s.array,$=j>u?0:u-j,U=_-j;return U>P&&(U=P),function(){if($===U)return ot;var s=i?--U:$++;return B&&B[s]}}function iterateNode(s,w,x){var B,$=s&&s.array,U=x>u?0:u-x>>w,Y=1+(_-x>>w);return Y>P&&(Y=P),function(){for(;;){if(B){var s=B();if(s!==ot)return s;B=null}if(U===Y)return ot;var u=i?--Y:U++;B=iterateNodeOrLeaf($&&$[u],w-j,x+(u<=s.size||i<0)return s.withMutations((function(s){i<0?setListBounds(s,i).set(0,u):setListBounds(s,0,i+1).set(i,u)}));i+=s._origin;var _=s._tail,w=s._root,x=MakeRef(Y);return i>=getTailOffset(s._capacity)?_=updateVNode(_,s.__ownerID,0,i,u,x):w=updateVNode(w,s.__ownerID,s._level,i,u,x),x.value?s.__ownerID?(s._root=w,s._tail=_,s.__hash=void 0,s.__altered=!0,s):makeList(s._origin,s._capacity,s._level,w,_):s}function updateVNode(s,i,u,_,w,x){var P,$=_>>>u&B,U=s&&$0){var Y=s&&s.array[$],X=updateVNode(Y,i,u-j,_,w,x);return X===Y?s:((P=editableVNode(s,i)).array[$]=X,P)}return U&&s.array[$]===w?s:(SetRef(x),P=editableVNode(s,i),void 0===w&&$===P.array.length-1?P.array.pop():P.array[$]=w,P)}function editableVNode(s,i){return i&&s&&i===s.ownerID?s:new VNode(s?s.array.slice():[],i)}function listNodeFor(s,i){if(i>=getTailOffset(s._capacity))return s._tail;if(i<1<0;)u=u.array[i>>>_&B],_-=j;return u}}function setListBounds(s,i,u){void 0!==i&&(i|=0),void 0!==u&&(u|=0);var _=s.__ownerID||new OwnerID,w=s._origin,x=s._capacity,P=w+i,$=void 0===u?x:u<0?x+u:w+u;if(P===w&&$===x)return s;if(P>=$)return s.clear();for(var U=s._level,Y=s._root,X=0;P+X<0;)Y=new VNode(Y&&Y.array.length?[void 0,Y]:[],_),X+=1<<(U+=j);X&&(P+=X,w+=X,$+=X,x+=X);for(var Z=getTailOffset(x),ee=getTailOffset($);ee>=1<Z?new VNode([],_):ae;if(ae&&ee>Z&&Pj;ce-=j){var pe=Z>>>ce&B;le=le.array[pe]=editableVNode(le.array[pe],_)}le.array[Z>>>j&B]=ae}if($=ee)P-=ee,$-=ee,U=j,Y=null,ie=ie&&ie.removeBefore(_,0,P);else if(P>w||ee>>U&B;if(de!==ee>>>U&B)break;de&&(X+=(1<w&&(Y=Y.removeBefore(_,U,P-X)),Y&&eew&&(w=P.size),isIterable(j)||(P=P.map((function(s){return fromJS(s)}))),_.push(P)}return w>s.size&&(s=s.setSize(w)),mergeIntoCollectionWith(s,i,_)}function getTailOffset(s){return s>>j<=P&&j.size>=2*x.size?(_=(w=j.filter((function(s,i){return void 0!==s&&B!==i}))).toKeyedSeq().map((function(s){return s[0]})).flip().toMap(),s.__ownerID&&(_.__ownerID=w.__ownerID=s.__ownerID)):(_=x.remove(i),w=B===j.size-1?j.pop():j.set(B,void 0))}else if(U){if(u===j.get(B)[1])return s;_=x,w=j.set(B,[i,u])}else _=x.set(i,j.size),w=j.set(j.size,[i,u]);return s.__ownerID?(s.size=_.size,s._map=_,s._list=w,s.__hash=void 0,s):makeOrderedMap(_,w)}function ToKeyedSequence(s,i){this._iter=s,this._useKeys=i,this.size=s.size}function ToIndexedSequence(s){this._iter=s,this.size=s.size}function ToSetSequence(s){this._iter=s,this.size=s.size}function FromEntriesSequence(s){this._iter=s,this.size=s.size}function flipFactory(s){var i=makeSequence(s);return i._iter=s,i.size=s.size,i.flip=function(){return s},i.reverse=function(){var i=s.reverse.apply(this);return i.flip=function(){return s.reverse()},i},i.has=function(i){return s.includes(i)},i.includes=function(i){return s.has(i)},i.cacheResult=cacheResultThrough,i.__iterateUncached=function(i,u){var _=this;return s.__iterate((function(s,u){return!1!==i(u,s,_)}),u)},i.__iteratorUncached=function(i,u){if(i===ee){var _=s.__iterator(i,u);return new Iterator((function(){var s=_.next();if(!s.done){var i=s.value[0];s.value[0]=s.value[1],s.value[1]=i}return s}))}return s.__iterator(i===Z?X:Z,u)},i}function mapFactory(s,i,u){var _=makeSequence(s);return _.size=s.size,_.has=function(i){return s.has(i)},_.get=function(_,w){var x=s.get(_,$);return x===$?w:i.call(u,x,_,s)},_.__iterateUncached=function(_,w){var x=this;return s.__iterate((function(s,w,j){return!1!==_(i.call(u,s,w,j),w,x)}),w)},_.__iteratorUncached=function(_,w){var x=s.__iterator(ee,w);return new Iterator((function(){var w=x.next();if(w.done)return w;var j=w.value,P=j[0];return iteratorValue(_,P,i.call(u,j[1],P,s),w)}))},_}function reverseFactory(s,i){var u=makeSequence(s);return u._iter=s,u.size=s.size,u.reverse=function(){return s},s.flip&&(u.flip=function(){var i=flipFactory(s);return i.reverse=function(){return s.flip()},i}),u.get=function(u,_){return s.get(i?u:-1-u,_)},u.has=function(u){return s.has(i?u:-1-u)},u.includes=function(i){return s.includes(i)},u.cacheResult=cacheResultThrough,u.__iterate=function(i,u){var _=this;return s.__iterate((function(s,u){return i(s,u,_)}),!u)},u.__iterator=function(i,u){return s.__iterator(i,!u)},u}function filterFactory(s,i,u,_){var w=makeSequence(s);return _&&(w.has=function(_){var w=s.get(_,$);return w!==$&&!!i.call(u,w,_,s)},w.get=function(_,w){var x=s.get(_,$);return x!==$&&i.call(u,x,_,s)?x:w}),w.__iterateUncached=function(w,x){var j=this,P=0;return s.__iterate((function(s,x,B){if(i.call(u,s,x,B))return P++,w(s,_?x:P-1,j)}),x),P},w.__iteratorUncached=function(w,x){var j=s.__iterator(ee,x),P=0;return new Iterator((function(){for(;;){var x=j.next();if(x.done)return x;var B=x.value,$=B[0],U=B[1];if(i.call(u,U,$,s))return iteratorValue(w,_?$:P++,U,x)}}))},w}function countByFactory(s,i,u){var _=Map().asMutable();return s.__iterate((function(w,x){_.update(i.call(u,w,x,s),0,(function(s){return s+1}))})),_.asImmutable()}function groupByFactory(s,i,u){var _=isKeyed(s),w=(isOrdered(s)?OrderedMap():Map()).asMutable();s.__iterate((function(x,j){w.update(i.call(u,x,j,s),(function(s){return(s=s||[]).push(_?[j,x]:x),s}))}));var x=iterableClass(s);return w.map((function(i){return reify(s,x(i))}))}function sliceFactory(s,i,u,_){var w=s.size;if(void 0!==i&&(i|=0),void 0!==u&&(u===1/0?u=w:u|=0),wholeSlice(i,u,w))return s;var x=resolveBegin(i,w),j=resolveEnd(u,w);if(x!=x||j!=j)return sliceFactory(s.toSeq().cacheResult(),i,u,_);var P,B=j-x;B==B&&(P=B<0?0:B);var $=makeSequence(s);return $.size=0===P?P:s.size&&P||void 0,!_&&isSeq(s)&&P>=0&&($.get=function(i,u){return(i=wrapIndex(this,i))>=0&&iP)return iteratorDone();var s=w.next();return _||i===Z?s:iteratorValue(i,B-1,i===X?void 0:s.value[1],s)}))},$}function takeWhileFactory(s,i,u){var _=makeSequence(s);return _.__iterateUncached=function(_,w){var x=this;if(w)return this.cacheResult().__iterate(_,w);var j=0;return s.__iterate((function(s,w,P){return i.call(u,s,w,P)&&++j&&_(s,w,x)})),j},_.__iteratorUncached=function(_,w){var x=this;if(w)return this.cacheResult().__iterator(_,w);var j=s.__iterator(ee,w),P=!0;return new Iterator((function(){if(!P)return iteratorDone();var s=j.next();if(s.done)return s;var w=s.value,B=w[0],$=w[1];return i.call(u,$,B,x)?_===ee?s:iteratorValue(_,B,$,s):(P=!1,iteratorDone())}))},_}function skipWhileFactory(s,i,u,_){var w=makeSequence(s);return w.__iterateUncached=function(w,x){var j=this;if(x)return this.cacheResult().__iterate(w,x);var P=!0,B=0;return s.__iterate((function(s,x,$){if(!P||!(P=i.call(u,s,x,$)))return B++,w(s,_?x:B-1,j)})),B},w.__iteratorUncached=function(w,x){var j=this;if(x)return this.cacheResult().__iterator(w,x);var P=s.__iterator(ee,x),B=!0,$=0;return new Iterator((function(){var s,x,U;do{if((s=P.next()).done)return _||w===Z?s:iteratorValue(w,$++,w===X?void 0:s.value[1],s);var Y=s.value;x=Y[0],U=Y[1],B&&(B=i.call(u,U,x,j))}while(B);return w===ee?s:iteratorValue(w,x,U,s)}))},w}function concatFactory(s,i){var u=isKeyed(s),_=[s].concat(i).map((function(s){return isIterable(s)?u&&(s=KeyedIterable(s)):s=u?keyedSeqFromValue(s):indexedSeqFromValue(Array.isArray(s)?s:[s]),s})).filter((function(s){return 0!==s.size}));if(0===_.length)return s;if(1===_.length){var w=_[0];if(w===s||u&&isKeyed(w)||isIndexed(s)&&isIndexed(w))return w}var x=new ArraySeq(_);return u?x=x.toKeyedSeq():isIndexed(s)||(x=x.toSetSeq()),(x=x.flatten(!0)).size=_.reduce((function(s,i){if(void 0!==s){var u=i.size;if(void 0!==u)return s+u}}),0),x}function flattenFactory(s,i,u){var _=makeSequence(s);return _.__iterateUncached=function(_,w){var x=0,j=!1;function flatDeep(s,P){var B=this;s.__iterate((function(s,w){return(!i||P0}function zipWithFactory(s,i,u){var _=makeSequence(s);return _.size=new ArraySeq(u).map((function(s){return s.size})).min(),_.__iterate=function(s,i){for(var u,_=this.__iterator(Z,i),w=0;!(u=_.next()).done&&!1!==s(u.value,w++,this););return w},_.__iteratorUncached=function(s,_){var w=u.map((function(s){return s=Iterable(s),getIterator(_?s.reverse():s)})),x=0,j=!1;return new Iterator((function(){var u;return j||(u=w.map((function(s){return s.next()})),j=u.some((function(s){return s.done}))),j?iteratorDone():iteratorValue(s,x++,i.apply(null,u.map((function(s){return s.value}))))}))},_}function reify(s,i){return isSeq(s)?i:s.constructor(i)}function validateEntry(s){if(s!==Object(s))throw new TypeError("Expected [K, V] tuple: "+s)}function resolveSize(s){return assertNotInfinite(s.size),ensureSize(s)}function iterableClass(s){return isKeyed(s)?KeyedIterable:isIndexed(s)?IndexedIterable:SetIterable}function makeSequence(s){return Object.create((isKeyed(s)?KeyedSeq:isIndexed(s)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(s,i){return s>i?1:s=0;u--)i={value:arguments[u],next:i};return this.__ownerID?(this.size=s,this._head=i,this.__hash=void 0,this.__altered=!0,this):makeStack(s,i)},Stack.prototype.pushAll=function(s){if(0===(s=IndexedIterable(s)).size)return this;assertNotInfinite(s.size);var i=this.size,u=this._head;return s.reverse().forEach((function(s){i++,u={value:s,next:u}})),this.__ownerID?(this.size=i,this._head=u,this.__hash=void 0,this.__altered=!0,this):makeStack(i,u)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(s){return this.pushAll(s)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(s,i){if(wholeSlice(s,i,this.size))return this;var u=resolveBegin(s,this.size);if(resolveEnd(i,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,s,i);for(var _=this.size-u,w=this._head;u--;)w=w.next;return this.__ownerID?(this.size=_,this._head=w,this.__hash=void 0,this.__altered=!0,this):makeStack(_,w)},Stack.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeStack(this.size,this._head,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Stack.prototype.__iterate=function(s,i){if(i)return this.reverse().__iterate(s);for(var u=0,_=this._head;_&&!1!==s(_.value,u++,this);)_=_.next;return u},Stack.prototype.__iterator=function(s,i){if(i)return this.reverse().__iterator(s);var u=0,_=this._head;return new Iterator((function(){if(_){var i=_.value;return _=_.next,iteratorValue(s,u++,i)}return iteratorDone()}))},Stack.isStack=isStack;var pt,ht="@@__IMMUTABLE_STACK__@@",dt=Stack.prototype;function makeStack(s,i,u,_){var w=Object.create(dt);return w.size=s,w._head=i,w.__ownerID=u,w.__hash=_,w.__altered=!1,w}function emptyStack(){return pt||(pt=makeStack(0))}function mixin(s,i){var keyCopier=function(u){s.prototype[u]=i[u]};return Object.keys(i).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(i).forEach(keyCopier),s}dt[ht]=!0,dt.withMutations=He.withMutations,dt.asMutable=He.asMutable,dt.asImmutable=He.asImmutable,dt.wasAltered=He.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var s=new Array(this.size||0);return this.valueSeq().__iterate((function(i,u){s[u]=i})),s},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJS?s.toJS():s})).__toJS()},toJSON:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJSON?s.toJSON():s})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var s={};return this.__iterate((function(i,u){s[u]=i})),s},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(s,i){return 0===this.size?s+i:s+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+i},concat:function(){return reify(this,concatFactory(this,s.call(arguments,0)))},includes:function(s){return this.some((function(i){return is(i,s)}))},entries:function(){return this.__iterator(ee)},every:function(s,i){assertNotInfinite(this.size);var u=!0;return this.__iterate((function(_,w,x){if(!s.call(i,_,w,x))return u=!1,!1})),u},filter:function(s,i){return reify(this,filterFactory(this,s,i,!0))},find:function(s,i,u){var _=this.findEntry(s,i);return _?_[1]:u},forEach:function(s,i){return assertNotInfinite(this.size),this.__iterate(i?s.bind(i):s)},join:function(s){assertNotInfinite(this.size),s=void 0!==s?""+s:",";var i="",u=!0;return this.__iterate((function(_){u?u=!1:i+=s,i+=null!=_?_.toString():""})),i},keys:function(){return this.__iterator(X)},map:function(s,i){return reify(this,mapFactory(this,s,i))},reduce:function(s,i,u){var _,w;return assertNotInfinite(this.size),arguments.length<2?w=!0:_=i,this.__iterate((function(i,x,j){w?(w=!1,_=i):_=s.call(u,_,i,x,j)})),_},reduceRight:function(s,i,u){var _=this.toKeyedSeq().reverse();return _.reduce.apply(_,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(s,i){return reify(this,sliceFactory(this,s,i,!0))},some:function(s,i){return!this.every(not(s),i)},sort:function(s){return reify(this,sortFactory(this,s))},values:function(){return this.__iterator(Z)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(s,i){return ensureSize(s?this.toSeq().filter(s,i):this)},countBy:function(s,i){return countByFactory(this,s,i)},equals:function(s){return deepEqual(this,s)},entrySeq:function(){var s=this;if(s._cache)return new ArraySeq(s._cache);var i=s.toSeq().map(entryMapper).toIndexedSeq();return i.fromEntrySeq=function(){return s.toSeq()},i},filterNot:function(s,i){return this.filter(not(s),i)},findEntry:function(s,i,u){var _=u;return this.__iterate((function(u,w,x){if(s.call(i,u,w,x))return _=[w,u],!1})),_},findKey:function(s,i){var u=this.findEntry(s,i);return u&&u[0]},findLast:function(s,i,u){return this.toKeyedSeq().reverse().find(s,i,u)},findLastEntry:function(s,i,u){return this.toKeyedSeq().reverse().findEntry(s,i,u)},findLastKey:function(s,i){return this.toKeyedSeq().reverse().findKey(s,i)},first:function(){return this.find(returnTrue)},flatMap:function(s,i){return reify(this,flatMapFactory(this,s,i))},flatten:function(s){return reify(this,flattenFactory(this,s,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(s,i){return this.find((function(i,u){return is(u,s)}),void 0,i)},getIn:function(s,i){for(var u,_=this,w=forceIterator(s);!(u=w.next()).done;){var x=u.value;if((_=_&&_.get?_.get(x,$):$)===$)return i}return _},groupBy:function(s,i){return groupByFactory(this,s,i)},has:function(s){return this.get(s,$)!==$},hasIn:function(s){return this.getIn(s,$)!==$},isSubset:function(s){return s="function"==typeof s.includes?s:Iterable(s),this.every((function(i){return s.includes(i)}))},isSuperset:function(s){return(s="function"==typeof s.isSubset?s:Iterable(s)).isSubset(this)},keyOf:function(s){return this.findKey((function(i){return is(i,s)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(s){return this.toKeyedSeq().reverse().keyOf(s)},max:function(s){return maxFactory(this,s)},maxBy:function(s,i){return maxFactory(this,i,s)},min:function(s){return maxFactory(this,s?neg(s):defaultNegComparator)},minBy:function(s,i){return maxFactory(this,i?neg(i):defaultNegComparator,s)},rest:function(){return this.slice(1)},skip:function(s){return this.slice(Math.max(0,s))},skipLast:function(s){return reify(this,this.toSeq().reverse().skip(s).reverse())},skipWhile:function(s,i){return reify(this,skipWhileFactory(this,s,i,!0))},skipUntil:function(s,i){return this.skipWhile(not(s),i)},sortBy:function(s,i){return reify(this,sortFactory(this,i,s))},take:function(s){return this.slice(0,Math.max(0,s))},takeLast:function(s){return reify(this,this.toSeq().reverse().take(s).reverse())},takeWhile:function(s,i){return reify(this,takeWhileFactory(this,s,i))},takeUntil:function(s,i){return this.takeWhile(not(s),i)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var mt=Iterable.prototype;mt[i]=!0,mt[le]=mt.values,mt.__toJS=mt.toArray,mt.__toStringMapper=quoteString,mt.inspect=mt.toSource=function(){return this.toString()},mt.chain=mt.flatMap,mt.contains=mt.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(s,i){var u=this,_=0;return reify(this,this.toSeq().map((function(w,x){return s.call(i,[x,w],_++,u)})).fromEntrySeq())},mapKeys:function(s,i){var u=this;return reify(this,this.toSeq().flip().map((function(_,w){return s.call(i,_,w,u)})).flip())}});var gt=KeyedIterable.prototype;function keyMapper(s,i){return i}function entryMapper(s,i){return[i,s]}function not(s){return function(){return!s.apply(this,arguments)}}function neg(s){return function(){return-s.apply(this,arguments)}}function quoteString(s){return"string"==typeof s?JSON.stringify(s):String(s)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(s,i){return si?-1:0}function hashIterable(s){if(s.size===1/0)return 0;var i=isOrdered(s),u=isKeyed(s),_=i?1:0;return murmurHashOfSize(s.__iterate(u?i?function(s,i){_=31*_+hashMerge(hash(s),hash(i))|0}:function(s,i){_=_+hashMerge(hash(s),hash(i))|0}:i?function(s){_=31*_+hash(s)|0}:function(s){_=_+hash(s)|0}),_)}function murmurHashOfSize(s,i){return i=ye(i,3432918353),i=ye(i<<15|i>>>-15,461845907),i=ye(i<<13|i>>>-13,5),i=ye((i=(i+3864292196|0)^s)^i>>>16,2246822507),i=smi((i=ye(i^i>>>13,3266489909))^i>>>16)}function hashMerge(s,i){return s^i+2654435769+(s<<6)+(s>>2)|0}return gt[u]=!0,gt[le]=mt.entries,gt.__toJS=mt.toObject,gt.__toStringMapper=function(s,i){return JSON.stringify(i)+": "+quoteString(s)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(s,i){return reify(this,filterFactory(this,s,i,!1))},findIndex:function(s,i){var u=this.findEntry(s,i);return u?u[0]:-1},indexOf:function(s){var i=this.keyOf(s);return void 0===i?-1:i},lastIndexOf:function(s){var i=this.lastKeyOf(s);return void 0===i?-1:i},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(s,i){return reify(this,sliceFactory(this,s,i,!1))},splice:function(s,i){var u=arguments.length;if(i=Math.max(0|i,0),0===u||2===u&&!i)return this;s=resolveBegin(s,s<0?this.count():this.size);var _=this.slice(0,s);return reify(this,1===u?_:_.concat(arrCopy(arguments,2),this.slice(s+i)))},findLastIndex:function(s,i){var u=this.findLastEntry(s,i);return u?u[0]:-1},first:function(){return this.get(0)},flatten:function(s){return reify(this,flattenFactory(this,s,!1))},get:function(s,i){return(s=wrapIndex(this,s))<0||this.size===1/0||void 0!==this.size&&s>this.size?i:this.find((function(i,u){return u===s}),void 0,i)},has:function(s){return(s=wrapIndex(this,s))>=0&&(void 0!==this.size?this.size===1/0||s{"function"==typeof Object.create?s.exports=function inherits(s,i){i&&(s.super_=i,s.prototype=Object.create(i.prototype,{constructor:{value:s,enumerable:!1,writable:!0,configurable:!0}}))}:s.exports=function inherits(s,i){if(i){s.super_=i;var TempCtor=function(){};TempCtor.prototype=i.prototype,s.prototype=new TempCtor,s.prototype.constructor=s}}},5419:s=>{s.exports=function(s,i,u,_){var w=new Blob(void 0!==_?[_,s]:[s],{type:u||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(w,i);else{var x=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(w):window.webkitURL.createObjectURL(w),j=document.createElement("a");j.style.display="none",j.href=x,j.setAttribute("download",i),void 0===j.download&&j.setAttribute("target","_blank"),document.body.appendChild(j),j.click(),setTimeout((function(){document.body.removeChild(j),window.URL.revokeObjectURL(x)}),200)}}},20181:(s,i,u)=>{var _=NaN,w="[object Symbol]",x=/^\s+|\s+$/g,j=/^[-+]0x[0-9a-f]+$/i,P=/^0b[01]+$/i,B=/^0o[0-7]+$/i,$=parseInt,U="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g,Y="object"==typeof self&&self&&self.Object===Object&&self,X=U||Y||Function("return this")(),Z=Object.prototype.toString,ee=Math.max,ae=Math.min,now=function(){return X.Date.now()};function isObject(s){var i=typeof s;return!!s&&("object"==i||"function"==i)}function toNumber(s){if("number"==typeof s)return s;if(function isSymbol(s){return"symbol"==typeof s||function isObjectLike(s){return!!s&&"object"==typeof s}(s)&&Z.call(s)==w}(s))return _;if(isObject(s)){var i="function"==typeof s.valueOf?s.valueOf():s;s=isObject(i)?i+"":i}if("string"!=typeof s)return 0===s?s:+s;s=s.replace(x,"");var u=P.test(s);return u||B.test(s)?$(s.slice(2),u?2:8):j.test(s)?_:+s}s.exports=function debounce(s,i,u){var _,w,x,j,P,B,$=0,U=!1,Y=!1,X=!0;if("function"!=typeof s)throw new TypeError("Expected a function");function invokeFunc(i){var u=_,x=w;return _=w=void 0,$=i,j=s.apply(x,u)}function shouldInvoke(s){var u=s-B;return void 0===B||u>=i||u<0||Y&&s-$>=x}function timerExpired(){var s=now();if(shouldInvoke(s))return trailingEdge(s);P=setTimeout(timerExpired,function remainingWait(s){var u=i-(s-B);return Y?ae(u,x-(s-$)):u}(s))}function trailingEdge(s){return P=void 0,X&&_?invokeFunc(s):(_=w=void 0,j)}function debounced(){var s=now(),u=shouldInvoke(s);if(_=arguments,w=this,B=s,u){if(void 0===P)return function leadingEdge(s){return $=s,P=setTimeout(timerExpired,i),U?invokeFunc(s):j}(B);if(Y)return P=setTimeout(timerExpired,i),invokeFunc(B)}return void 0===P&&(P=setTimeout(timerExpired,i)),j}return i=toNumber(i)||0,isObject(u)&&(U=!!u.leading,x=(Y="maxWait"in u)?ee(toNumber(u.maxWait)||0,i):x,X="trailing"in u?!!u.trailing:X),debounced.cancel=function cancel(){void 0!==P&&clearTimeout(P),$=0,_=B=w=P=void 0},debounced.flush=function flush(){return void 0===P?j:trailingEdge(now())},debounced}},55580:(s,i,u)=>{var _=u(56110)(u(9325),"DataView");s.exports=_},21549:(s,i,u)=>{var _=u(22032),w=u(63862),x=u(66721),j=u(12749),P=u(35749);function Hash(s){var i=-1,u=null==s?0:s.length;for(this.clear();++i{var _=u(39344),w=u(94033);function LazyWrapper(s){this.__wrapped__=s,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}LazyWrapper.prototype=_(w.prototype),LazyWrapper.prototype.constructor=LazyWrapper,s.exports=LazyWrapper},80079:(s,i,u)=>{var _=u(63702),w=u(70080),x=u(24739),j=u(48655),P=u(31175);function ListCache(s){var i=-1,u=null==s?0:s.length;for(this.clear();++i{var _=u(39344),w=u(94033);function LodashWrapper(s,i){this.__wrapped__=s,this.__actions__=[],this.__chain__=!!i,this.__index__=0,this.__values__=void 0}LodashWrapper.prototype=_(w.prototype),LodashWrapper.prototype.constructor=LodashWrapper,s.exports=LodashWrapper},68223:(s,i,u)=>{var _=u(56110)(u(9325),"Map");s.exports=_},53661:(s,i,u)=>{var _=u(63040),w=u(17670),x=u(90289),j=u(4509),P=u(72949);function MapCache(s){var i=-1,u=null==s?0:s.length;for(this.clear();++i{var _=u(56110)(u(9325),"Promise");s.exports=_},76545:(s,i,u)=>{var _=u(56110)(u(9325),"Set");s.exports=_},38859:(s,i,u)=>{var _=u(53661),w=u(31380),x=u(51459);function SetCache(s){var i=-1,u=null==s?0:s.length;for(this.__data__=new _;++i{var _=u(80079),w=u(51420),x=u(90938),j=u(63605),P=u(29817),B=u(80945);function Stack(s){var i=this.__data__=new _(s);this.size=i.size}Stack.prototype.clear=w,Stack.prototype.delete=x,Stack.prototype.get=j,Stack.prototype.has=P,Stack.prototype.set=B,s.exports=Stack},51873:(s,i,u)=>{var _=u(9325).Symbol;s.exports=_},37828:(s,i,u)=>{var _=u(9325).Uint8Array;s.exports=_},28303:(s,i,u)=>{var _=u(56110)(u(9325),"WeakMap");s.exports=_},91033:s=>{s.exports=function apply(s,i,u){switch(u.length){case 0:return s.call(i);case 1:return s.call(i,u[0]);case 2:return s.call(i,u[0],u[1]);case 3:return s.call(i,u[0],u[1],u[2])}return s.apply(i,u)}},83729:s=>{s.exports=function arrayEach(s,i){for(var u=-1,_=null==s?0:s.length;++u<_&&!1!==i(s[u],u,s););return s}},79770:s=>{s.exports=function arrayFilter(s,i){for(var u=-1,_=null==s?0:s.length,w=0,x=[];++u<_;){var j=s[u];i(j,u,s)&&(x[w++]=j)}return x}},15325:(s,i,u)=>{var _=u(96131);s.exports=function arrayIncludes(s,i){return!!(null==s?0:s.length)&&_(s,i,0)>-1}},70695:(s,i,u)=>{var _=u(78096),w=u(72428),x=u(56449),j=u(3656),P=u(30361),B=u(37167),$=Object.prototype.hasOwnProperty;s.exports=function arrayLikeKeys(s,i){var u=x(s),U=!u&&w(s),Y=!u&&!U&&j(s),X=!u&&!U&&!Y&&B(s),Z=u||U||Y||X,ee=Z?_(s.length,String):[],ae=ee.length;for(var ie in s)!i&&!$.call(s,ie)||Z&&("length"==ie||Y&&("offset"==ie||"parent"==ie)||X&&("buffer"==ie||"byteLength"==ie||"byteOffset"==ie)||P(ie,ae))||ee.push(ie);return ee}},34932:s=>{s.exports=function arrayMap(s,i){for(var u=-1,_=null==s?0:s.length,w=Array(_);++u<_;)w[u]=i(s[u],u,s);return w}},14528:s=>{s.exports=function arrayPush(s,i){for(var u=-1,_=i.length,w=s.length;++u<_;)s[w+u]=i[u];return s}},40882:s=>{s.exports=function arrayReduce(s,i,u,_){var w=-1,x=null==s?0:s.length;for(_&&x&&(u=s[++w]);++w{s.exports=function arraySome(s,i){for(var u=-1,_=null==s?0:s.length;++u<_;)if(i(s[u],u,s))return!0;return!1}},61074:s=>{s.exports=function asciiToArray(s){return s.split("")}},1733:s=>{var i=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;s.exports=function asciiWords(s){return s.match(i)||[]}},87805:(s,i,u)=>{var _=u(43360),w=u(75288);s.exports=function assignMergeValue(s,i,u){(void 0!==u&&!w(s[i],u)||void 0===u&&!(i in s))&&_(s,i,u)}},16547:(s,i,u)=>{var _=u(43360),w=u(75288),x=Object.prototype.hasOwnProperty;s.exports=function assignValue(s,i,u){var j=s[i];x.call(s,i)&&w(j,u)&&(void 0!==u||i in s)||_(s,i,u)}},26025:(s,i,u)=>{var _=u(75288);s.exports=function assocIndexOf(s,i){for(var u=s.length;u--;)if(_(s[u][0],i))return u;return-1}},74733:(s,i,u)=>{var _=u(21791),w=u(95950);s.exports=function baseAssign(s,i){return s&&_(i,w(i),s)}},43838:(s,i,u)=>{var _=u(21791),w=u(37241);s.exports=function baseAssignIn(s,i){return s&&_(i,w(i),s)}},43360:(s,i,u)=>{var _=u(93243);s.exports=function baseAssignValue(s,i,u){"__proto__"==i&&_?_(s,i,{configurable:!0,enumerable:!0,value:u,writable:!0}):s[i]=u}},9999:(s,i,u)=>{var _=u(37217),w=u(83729),x=u(16547),j=u(74733),P=u(43838),B=u(93290),$=u(23007),U=u(92271),Y=u(48948),X=u(50002),Z=u(83349),ee=u(5861),ae=u(76189),ie=u(77199),le=u(35529),ce=u(56449),pe=u(3656),de=u(87730),fe=u(23805),ye=u(38440),be=u(95950),_e=u(37241),we="[object Arguments]",Se="[object Function]",xe="[object Object]",Pe={};Pe[we]=Pe["[object Array]"]=Pe["[object ArrayBuffer]"]=Pe["[object DataView]"]=Pe["[object Boolean]"]=Pe["[object Date]"]=Pe["[object Float32Array]"]=Pe["[object Float64Array]"]=Pe["[object Int8Array]"]=Pe["[object Int16Array]"]=Pe["[object Int32Array]"]=Pe["[object Map]"]=Pe["[object Number]"]=Pe[xe]=Pe["[object RegExp]"]=Pe["[object Set]"]=Pe["[object String]"]=Pe["[object Symbol]"]=Pe["[object Uint8Array]"]=Pe["[object Uint8ClampedArray]"]=Pe["[object Uint16Array]"]=Pe["[object Uint32Array]"]=!0,Pe["[object Error]"]=Pe[Se]=Pe["[object WeakMap]"]=!1,s.exports=function baseClone(s,i,u,Te,Re,qe){var $e,ze=1&i,We=2&i,He=4&i;if(u&&($e=Re?u(s,Te,Re,qe):u(s)),void 0!==$e)return $e;if(!fe(s))return s;var Ye=ce(s);if(Ye){if($e=ae(s),!ze)return $(s,$e)}else{var Xe=ee(s),Qe=Xe==Se||"[object GeneratorFunction]"==Xe;if(pe(s))return B(s,ze);if(Xe==xe||Xe==we||Qe&&!Re){if($e=We||Qe?{}:le(s),!ze)return We?Y(s,P($e,s)):U(s,j($e,s))}else{if(!Pe[Xe])return Re?s:{};$e=ie(s,Xe,ze)}}qe||(qe=new _);var et=qe.get(s);if(et)return et;qe.set(s,$e),ye(s)?s.forEach((function(_){$e.add(baseClone(_,i,u,_,s,qe))})):de(s)&&s.forEach((function(_,w){$e.set(w,baseClone(_,i,u,w,s,qe))}));var tt=Ye?void 0:(He?We?Z:X:We?_e:be)(s);return w(tt||s,(function(_,w){tt&&(_=s[w=_]),x($e,w,baseClone(_,i,u,w,s,qe))})),$e}},39344:(s,i,u)=>{var _=u(23805),w=Object.create,x=function(){function object(){}return function(s){if(!_(s))return{};if(w)return w(s);object.prototype=s;var i=new object;return object.prototype=void 0,i}}();s.exports=x},80909:(s,i,u)=>{var _=u(30641),w=u(38329)(_);s.exports=w},2523:s=>{s.exports=function baseFindIndex(s,i,u,_){for(var w=s.length,x=u+(_?1:-1);_?x--:++x{var _=u(14528),w=u(45891);s.exports=function baseFlatten(s,i,u,x,j){var P=-1,B=s.length;for(u||(u=w),j||(j=[]);++P0&&u($)?i>1?baseFlatten($,i-1,u,x,j):_(j,$):x||(j[j.length]=$)}return j}},86649:(s,i,u)=>{var _=u(83221)();s.exports=_},30641:(s,i,u)=>{var _=u(86649),w=u(95950);s.exports=function baseForOwn(s,i){return s&&_(s,i,w)}},47422:(s,i,u)=>{var _=u(31769),w=u(77797);s.exports=function baseGet(s,i){for(var u=0,x=(i=_(i,s)).length;null!=s&&u{var _=u(14528),w=u(56449);s.exports=function baseGetAllKeys(s,i,u){var x=i(s);return w(s)?x:_(x,u(s))}},72552:(s,i,u)=>{var _=u(51873),w=u(659),x=u(59350),j=_?_.toStringTag:void 0;s.exports=function baseGetTag(s){return null==s?void 0===s?"[object Undefined]":"[object Null]":j&&j in Object(s)?w(s):x(s)}},28077:s=>{s.exports=function baseHasIn(s,i){return null!=s&&i in Object(s)}},96131:(s,i,u)=>{var _=u(2523),w=u(85463),x=u(76959);s.exports=function baseIndexOf(s,i,u){return i==i?x(s,i,u):_(s,w,u)}},27534:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function baseIsArguments(s){return w(s)&&"[object Arguments]"==_(s)}},60270:(s,i,u)=>{var _=u(87068),w=u(40346);s.exports=function baseIsEqual(s,i,u,x,j){return s===i||(null==s||null==i||!w(s)&&!w(i)?s!=s&&i!=i:_(s,i,u,x,baseIsEqual,j))}},87068:(s,i,u)=>{var _=u(37217),w=u(25911),x=u(21986),j=u(50689),P=u(5861),B=u(56449),$=u(3656),U=u(37167),Y="[object Arguments]",X="[object Array]",Z="[object Object]",ee=Object.prototype.hasOwnProperty;s.exports=function baseIsEqualDeep(s,i,u,ae,ie,le){var ce=B(s),pe=B(i),de=ce?X:P(s),fe=pe?X:P(i),ye=(de=de==Y?Z:de)==Z,be=(fe=fe==Y?Z:fe)==Z,_e=de==fe;if(_e&&$(s)){if(!$(i))return!1;ce=!0,ye=!1}if(_e&&!ye)return le||(le=new _),ce||U(s)?w(s,i,u,ae,ie,le):x(s,i,de,u,ae,ie,le);if(!(1&u)){var we=ye&&ee.call(s,"__wrapped__"),Se=be&&ee.call(i,"__wrapped__");if(we||Se){var xe=we?s.value():s,Pe=Se?i.value():i;return le||(le=new _),ie(xe,Pe,u,ae,le)}}return!!_e&&(le||(le=new _),j(s,i,u,ae,ie,le))}},29172:(s,i,u)=>{var _=u(5861),w=u(40346);s.exports=function baseIsMap(s){return w(s)&&"[object Map]"==_(s)}},41799:(s,i,u)=>{var _=u(37217),w=u(60270);s.exports=function baseIsMatch(s,i,u,x){var j=u.length,P=j,B=!x;if(null==s)return!P;for(s=Object(s);j--;){var $=u[j];if(B&&$[2]?$[1]!==s[$[0]]:!($[0]in s))return!1}for(;++j{s.exports=function baseIsNaN(s){return s!=s}},45083:(s,i,u)=>{var _=u(1882),w=u(87296),x=u(23805),j=u(47473),P=/^\[object .+?Constructor\]$/,B=Function.prototype,$=Object.prototype,U=B.toString,Y=$.hasOwnProperty,X=RegExp("^"+U.call(Y).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");s.exports=function baseIsNative(s){return!(!x(s)||w(s))&&(_(s)?X:P).test(j(s))}},16038:(s,i,u)=>{var _=u(5861),w=u(40346);s.exports=function baseIsSet(s){return w(s)&&"[object Set]"==_(s)}},4901:(s,i,u)=>{var _=u(72552),w=u(30294),x=u(40346),j={};j["[object Float32Array]"]=j["[object Float64Array]"]=j["[object Int8Array]"]=j["[object Int16Array]"]=j["[object Int32Array]"]=j["[object Uint8Array]"]=j["[object Uint8ClampedArray]"]=j["[object Uint16Array]"]=j["[object Uint32Array]"]=!0,j["[object Arguments]"]=j["[object Array]"]=j["[object ArrayBuffer]"]=j["[object Boolean]"]=j["[object DataView]"]=j["[object Date]"]=j["[object Error]"]=j["[object Function]"]=j["[object Map]"]=j["[object Number]"]=j["[object Object]"]=j["[object RegExp]"]=j["[object Set]"]=j["[object String]"]=j["[object WeakMap]"]=!1,s.exports=function baseIsTypedArray(s){return x(s)&&w(s.length)&&!!j[_(s)]}},15389:(s,i,u)=>{var _=u(93663),w=u(87978),x=u(83488),j=u(56449),P=u(50583);s.exports=function baseIteratee(s){return"function"==typeof s?s:null==s?x:"object"==typeof s?j(s)?w(s[0],s[1]):_(s):P(s)}},88984:(s,i,u)=>{var _=u(55527),w=u(3650),x=Object.prototype.hasOwnProperty;s.exports=function baseKeys(s){if(!_(s))return w(s);var i=[];for(var u in Object(s))x.call(s,u)&&"constructor"!=u&&i.push(u);return i}},72903:(s,i,u)=>{var _=u(23805),w=u(55527),x=u(90181),j=Object.prototype.hasOwnProperty;s.exports=function baseKeysIn(s){if(!_(s))return x(s);var i=w(s),u=[];for(var P in s)("constructor"!=P||!i&&j.call(s,P))&&u.push(P);return u}},94033:s=>{s.exports=function baseLodash(){}},93663:(s,i,u)=>{var _=u(41799),w=u(10776),x=u(67197);s.exports=function baseMatches(s){var i=w(s);return 1==i.length&&i[0][2]?x(i[0][0],i[0][1]):function(u){return u===s||_(u,s,i)}}},87978:(s,i,u)=>{var _=u(60270),w=u(58156),x=u(80631),j=u(28586),P=u(30756),B=u(67197),$=u(77797);s.exports=function baseMatchesProperty(s,i){return j(s)&&P(i)?B($(s),i):function(u){var j=w(u,s);return void 0===j&&j===i?x(u,s):_(i,j,3)}}},85250:(s,i,u)=>{var _=u(37217),w=u(87805),x=u(86649),j=u(42824),P=u(23805),B=u(37241),$=u(14974);s.exports=function baseMerge(s,i,u,U,Y){s!==i&&x(i,(function(x,B){if(Y||(Y=new _),P(x))j(s,i,B,u,baseMerge,U,Y);else{var X=U?U($(s,B),x,B+"",s,i,Y):void 0;void 0===X&&(X=x),w(s,B,X)}}),B)}},42824:(s,i,u)=>{var _=u(87805),w=u(93290),x=u(71961),j=u(23007),P=u(35529),B=u(72428),$=u(56449),U=u(83693),Y=u(3656),X=u(1882),Z=u(23805),ee=u(11331),ae=u(37167),ie=u(14974),le=u(69884);s.exports=function baseMergeDeep(s,i,u,ce,pe,de,fe){var ye=ie(s,u),be=ie(i,u),_e=fe.get(be);if(_e)_(s,u,_e);else{var we=de?de(ye,be,u+"",s,i,fe):void 0,Se=void 0===we;if(Se){var xe=$(be),Pe=!xe&&Y(be),Te=!xe&&!Pe&&ae(be);we=be,xe||Pe||Te?$(ye)?we=ye:U(ye)?we=j(ye):Pe?(Se=!1,we=w(be,!0)):Te?(Se=!1,we=x(be,!0)):we=[]:ee(be)||B(be)?(we=ye,B(ye)?we=le(ye):Z(ye)&&!X(ye)||(we=P(be))):Se=!1}Se&&(fe.set(be,we),pe(we,be,ce,de,fe),fe.delete(be)),_(s,u,we)}}},47237:s=>{s.exports=function baseProperty(s){return function(i){return null==i?void 0:i[s]}}},17255:(s,i,u)=>{var _=u(47422);s.exports=function basePropertyDeep(s){return function(i){return _(i,s)}}},54552:s=>{s.exports=function basePropertyOf(s){return function(i){return null==s?void 0:s[i]}}},85558:s=>{s.exports=function baseReduce(s,i,u,_,w){return w(s,(function(s,w,x){u=_?(_=!1,s):i(u,s,w,x)})),u}},69302:(s,i,u)=>{var _=u(83488),w=u(56757),x=u(32865);s.exports=function baseRest(s,i){return x(w(s,i,_),s+"")}},73170:(s,i,u)=>{var _=u(16547),w=u(31769),x=u(30361),j=u(23805),P=u(77797);s.exports=function baseSet(s,i,u,B){if(!j(s))return s;for(var $=-1,U=(i=w(i,s)).length,Y=U-1,X=s;null!=X&&++${var _=u(83488),w=u(48152),x=w?function(s,i){return w.set(s,i),s}:_;s.exports=x},19570:(s,i,u)=>{var _=u(37334),w=u(93243),x=u(83488),j=w?function(s,i){return w(s,"toString",{configurable:!0,enumerable:!1,value:_(i),writable:!0})}:x;s.exports=j},25160:s=>{s.exports=function baseSlice(s,i,u){var _=-1,w=s.length;i<0&&(i=-i>w?0:w+i),(u=u>w?w:u)<0&&(u+=w),w=i>u?0:u-i>>>0,i>>>=0;for(var x=Array(w);++_{var _=u(80909);s.exports=function baseSome(s,i){var u;return _(s,(function(s,_,w){return!(u=i(s,_,w))})),!!u}},78096:s=>{s.exports=function baseTimes(s,i){for(var u=-1,_=Array(s);++u{var _=u(51873),w=u(34932),x=u(56449),j=u(44394),P=_?_.prototype:void 0,B=P?P.toString:void 0;s.exports=function baseToString(s){if("string"==typeof s)return s;if(x(s))return w(s,baseToString)+"";if(j(s))return B?B.call(s):"";var i=s+"";return"0"==i&&1/s==-Infinity?"-0":i}},54128:(s,i,u)=>{var _=u(31800),w=/^\s+/;s.exports=function baseTrim(s){return s?s.slice(0,_(s)+1).replace(w,""):s}},27301:s=>{s.exports=function baseUnary(s){return function(i){return s(i)}}},19931:(s,i,u)=>{var _=u(31769),w=u(68090),x=u(68969),j=u(77797);s.exports=function baseUnset(s,i){return i=_(i,s),null==(s=x(s,i))||delete s[j(w(i))]}},51234:s=>{s.exports=function baseZipObject(s,i,u){for(var _=-1,w=s.length,x=i.length,j={};++_{s.exports=function cacheHas(s,i){return s.has(i)}},31769:(s,i,u)=>{var _=u(56449),w=u(28586),x=u(61802),j=u(13222);s.exports=function castPath(s,i){return _(s)?s:w(s,i)?[s]:x(j(s))}},28754:(s,i,u)=>{var _=u(25160);s.exports=function castSlice(s,i,u){var w=s.length;return u=void 0===u?w:u,!i&&u>=w?s:_(s,i,u)}},49653:(s,i,u)=>{var _=u(37828);s.exports=function cloneArrayBuffer(s){var i=new s.constructor(s.byteLength);return new _(i).set(new _(s)),i}},93290:(s,i,u)=>{s=u.nmd(s);var _=u(9325),w=i&&!i.nodeType&&i,x=w&&s&&!s.nodeType&&s,j=x&&x.exports===w?_.Buffer:void 0,P=j?j.allocUnsafe:void 0;s.exports=function cloneBuffer(s,i){if(i)return s.slice();var u=s.length,_=P?P(u):new s.constructor(u);return s.copy(_),_}},76169:(s,i,u)=>{var _=u(49653);s.exports=function cloneDataView(s,i){var u=i?_(s.buffer):s.buffer;return new s.constructor(u,s.byteOffset,s.byteLength)}},73201:s=>{var i=/\w*$/;s.exports=function cloneRegExp(s){var u=new s.constructor(s.source,i.exec(s));return u.lastIndex=s.lastIndex,u}},93736:(s,i,u)=>{var _=u(51873),w=_?_.prototype:void 0,x=w?w.valueOf:void 0;s.exports=function cloneSymbol(s){return x?Object(x.call(s)):{}}},71961:(s,i,u)=>{var _=u(49653);s.exports=function cloneTypedArray(s,i){var u=i?_(s.buffer):s.buffer;return new s.constructor(u,s.byteOffset,s.length)}},91596:s=>{var i=Math.max;s.exports=function composeArgs(s,u,_,w){for(var x=-1,j=s.length,P=_.length,B=-1,$=u.length,U=i(j-P,0),Y=Array($+U),X=!w;++B<$;)Y[B]=u[B];for(;++x{var i=Math.max;s.exports=function composeArgsRight(s,u,_,w){for(var x=-1,j=s.length,P=-1,B=_.length,$=-1,U=u.length,Y=i(j-B,0),X=Array(Y+U),Z=!w;++x{s.exports=function copyArray(s,i){var u=-1,_=s.length;for(i||(i=Array(_));++u<_;)i[u]=s[u];return i}},21791:(s,i,u)=>{var _=u(16547),w=u(43360);s.exports=function copyObject(s,i,u,x){var j=!u;u||(u={});for(var P=-1,B=i.length;++P{var _=u(21791),w=u(4664);s.exports=function copySymbols(s,i){return _(s,w(s),i)}},48948:(s,i,u)=>{var _=u(21791),w=u(86375);s.exports=function copySymbolsIn(s,i){return _(s,w(s),i)}},55481:(s,i,u)=>{var _=u(9325)["__core-js_shared__"];s.exports=_},58523:s=>{s.exports=function countHolders(s,i){for(var u=s.length,_=0;u--;)s[u]===i&&++_;return _}},20999:(s,i,u)=>{var _=u(69302),w=u(36800);s.exports=function createAssigner(s){return _((function(i,u){var _=-1,x=u.length,j=x>1?u[x-1]:void 0,P=x>2?u[2]:void 0;for(j=s.length>3&&"function"==typeof j?(x--,j):void 0,P&&w(u[0],u[1],P)&&(j=x<3?void 0:j,x=1),i=Object(i);++_{var _=u(64894);s.exports=function createBaseEach(s,i){return function(u,w){if(null==u)return u;if(!_(u))return s(u,w);for(var x=u.length,j=i?x:-1,P=Object(u);(i?j--:++j{s.exports=function createBaseFor(s){return function(i,u,_){for(var w=-1,x=Object(i),j=_(i),P=j.length;P--;){var B=j[s?P:++w];if(!1===u(x[B],B,x))break}return i}}},11842:(s,i,u)=>{var _=u(82819),w=u(9325);s.exports=function createBind(s,i,u){var x=1&i,j=_(s);return function wrapper(){return(this&&this!==w&&this instanceof wrapper?j:s).apply(x?u:this,arguments)}}},12507:(s,i,u)=>{var _=u(28754),w=u(49698),x=u(63912),j=u(13222);s.exports=function createCaseFirst(s){return function(i){i=j(i);var u=w(i)?x(i):void 0,P=u?u[0]:i.charAt(0),B=u?_(u,1).join(""):i.slice(1);return P[s]()+B}}},45539:(s,i,u)=>{var _=u(40882),w=u(50828),x=u(66645),j=RegExp("['’]","g");s.exports=function createCompounder(s){return function(i){return _(x(w(i).replace(j,"")),s,"")}}},82819:(s,i,u)=>{var _=u(39344),w=u(23805);s.exports=function createCtor(s){return function(){var i=arguments;switch(i.length){case 0:return new s;case 1:return new s(i[0]);case 2:return new s(i[0],i[1]);case 3:return new s(i[0],i[1],i[2]);case 4:return new s(i[0],i[1],i[2],i[3]);case 5:return new s(i[0],i[1],i[2],i[3],i[4]);case 6:return new s(i[0],i[1],i[2],i[3],i[4],i[5]);case 7:return new s(i[0],i[1],i[2],i[3],i[4],i[5],i[6])}var u=_(s.prototype),x=s.apply(u,i);return w(x)?x:u}}},77078:(s,i,u)=>{var _=u(91033),w=u(82819),x=u(37471),j=u(18073),P=u(11287),B=u(36306),$=u(9325);s.exports=function createCurry(s,i,u){var U=w(s);return function wrapper(){for(var w=arguments.length,Y=Array(w),X=w,Z=P(wrapper);X--;)Y[X]=arguments[X];var ee=w<3&&Y[0]!==Z&&Y[w-1]!==Z?[]:B(Y,Z);return(w-=ee.length){var _=u(15389),w=u(64894),x=u(95950);s.exports=function createFind(s){return function(i,u,j){var P=Object(i);if(!w(i)){var B=_(u,3);i=x(i),u=function(s){return B(P[s],s,P)}}var $=s(i,u,j);return $>-1?P[B?i[$]:$]:void 0}}},37471:(s,i,u)=>{var _=u(91596),w=u(53320),x=u(58523),j=u(82819),P=u(18073),B=u(11287),$=u(68294),U=u(36306),Y=u(9325);s.exports=function createHybrid(s,i,u,X,Z,ee,ae,ie,le,ce){var pe=128&i,de=1&i,fe=2&i,ye=24&i,be=512&i,_e=fe?void 0:j(s);return function wrapper(){for(var we=arguments.length,Se=Array(we),xe=we;xe--;)Se[xe]=arguments[xe];if(ye)var Pe=B(wrapper),Te=x(Se,Pe);if(X&&(Se=_(Se,X,Z,ye)),ee&&(Se=w(Se,ee,ae,ye)),we-=Te,ye&&we1&&Se.reverse(),pe&&le{var _=u(91033),w=u(82819),x=u(9325);s.exports=function createPartial(s,i,u,j){var P=1&i,B=w(s);return function wrapper(){for(var i=-1,w=arguments.length,$=-1,U=j.length,Y=Array(U+w),X=this&&this!==x&&this instanceof wrapper?B:s;++${var _=u(85087),w=u(54641),x=u(70981);s.exports=function createRecurry(s,i,u,j,P,B,$,U,Y,X){var Z=8&i;i|=Z?32:64,4&(i&=~(Z?64:32))||(i&=-4);var ee=[s,i,P,Z?B:void 0,Z?$:void 0,Z?void 0:B,Z?void 0:$,U,Y,X],ae=u.apply(void 0,ee);return _(s)&&w(ae,ee),ae.placeholder=j,x(ae,s,i)}},66977:(s,i,u)=>{var _=u(68882),w=u(11842),x=u(77078),j=u(37471),P=u(24168),B=u(37381),$=u(3209),U=u(54641),Y=u(70981),X=u(61489),Z=Math.max;s.exports=function createWrap(s,i,u,ee,ae,ie,le,ce){var pe=2&i;if(!pe&&"function"!=typeof s)throw new TypeError("Expected a function");var de=ee?ee.length:0;if(de||(i&=-97,ee=ae=void 0),le=void 0===le?le:Z(X(le),0),ce=void 0===ce?ce:X(ce),de-=ae?ae.length:0,64&i){var fe=ee,ye=ae;ee=ae=void 0}var be=pe?void 0:B(s),_e=[s,i,u,ee,ae,fe,ye,ie,le,ce];if(be&&$(_e,be),s=_e[0],i=_e[1],u=_e[2],ee=_e[3],ae=_e[4],!(ce=_e[9]=void 0===_e[9]?pe?0:s.length:Z(_e[9]-de,0))&&24&i&&(i&=-25),i&&1!=i)we=8==i||16==i?x(s,i,ce):32!=i&&33!=i||ae.length?j.apply(void 0,_e):P(s,i,u,ee);else var we=w(s,i,u);return Y((be?_:U)(we,_e),s,i)}},53138:(s,i,u)=>{var _=u(11331);s.exports=function customOmitClone(s){return _(s)?void 0:s}},24647:(s,i,u)=>{var _=u(54552)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});s.exports=_},93243:(s,i,u)=>{var _=u(56110),w=function(){try{var s=_(Object,"defineProperty");return s({},"",{}),s}catch(s){}}();s.exports=w},25911:(s,i,u)=>{var _=u(38859),w=u(14248),x=u(19219);s.exports=function equalArrays(s,i,u,j,P,B){var $=1&u,U=s.length,Y=i.length;if(U!=Y&&!($&&Y>U))return!1;var X=B.get(s),Z=B.get(i);if(X&&Z)return X==i&&Z==s;var ee=-1,ae=!0,ie=2&u?new _:void 0;for(B.set(s,i),B.set(i,s);++ee{var _=u(51873),w=u(37828),x=u(75288),j=u(25911),P=u(20317),B=u(84247),$=_?_.prototype:void 0,U=$?$.valueOf:void 0;s.exports=function equalByTag(s,i,u,_,$,Y,X){switch(u){case"[object DataView]":if(s.byteLength!=i.byteLength||s.byteOffset!=i.byteOffset)return!1;s=s.buffer,i=i.buffer;case"[object ArrayBuffer]":return!(s.byteLength!=i.byteLength||!Y(new w(s),new w(i)));case"[object Boolean]":case"[object Date]":case"[object Number]":return x(+s,+i);case"[object Error]":return s.name==i.name&&s.message==i.message;case"[object RegExp]":case"[object String]":return s==i+"";case"[object Map]":var Z=P;case"[object Set]":var ee=1&_;if(Z||(Z=B),s.size!=i.size&&!ee)return!1;var ae=X.get(s);if(ae)return ae==i;_|=2,X.set(s,i);var ie=j(Z(s),Z(i),_,$,Y,X);return X.delete(s),ie;case"[object Symbol]":if(U)return U.call(s)==U.call(i)}return!1}},50689:(s,i,u)=>{var _=u(50002),w=Object.prototype.hasOwnProperty;s.exports=function equalObjects(s,i,u,x,j,P){var B=1&u,$=_(s),U=$.length;if(U!=_(i).length&&!B)return!1;for(var Y=U;Y--;){var X=$[Y];if(!(B?X in i:w.call(i,X)))return!1}var Z=P.get(s),ee=P.get(i);if(Z&&ee)return Z==i&&ee==s;var ae=!0;P.set(s,i),P.set(i,s);for(var ie=B;++Y{var _=u(35970),w=u(56757),x=u(32865);s.exports=function flatRest(s){return x(w(s,void 0,_),s+"")}},34840:(s,i,u)=>{var _="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g;s.exports=_},50002:(s,i,u)=>{var _=u(82199),w=u(4664),x=u(95950);s.exports=function getAllKeys(s){return _(s,x,w)}},83349:(s,i,u)=>{var _=u(82199),w=u(86375),x=u(37241);s.exports=function getAllKeysIn(s){return _(s,x,w)}},37381:(s,i,u)=>{var _=u(48152),w=u(63950),x=_?function(s){return _.get(s)}:w;s.exports=x},62284:(s,i,u)=>{var _=u(84629),w=Object.prototype.hasOwnProperty;s.exports=function getFuncName(s){for(var i=s.name+"",u=_[i],x=w.call(_,i)?u.length:0;x--;){var j=u[x],P=j.func;if(null==P||P==s)return j.name}return i}},11287:s=>{s.exports=function getHolder(s){return s.placeholder}},12651:(s,i,u)=>{var _=u(74218);s.exports=function getMapData(s,i){var u=s.__data__;return _(i)?u["string"==typeof i?"string":"hash"]:u.map}},10776:(s,i,u)=>{var _=u(30756),w=u(95950);s.exports=function getMatchData(s){for(var i=w(s),u=i.length;u--;){var x=i[u],j=s[x];i[u]=[x,j,_(j)]}return i}},56110:(s,i,u)=>{var _=u(45083),w=u(10392);s.exports=function getNative(s,i){var u=w(s,i);return _(u)?u:void 0}},28879:(s,i,u)=>{var _=u(74335)(Object.getPrototypeOf,Object);s.exports=_},659:(s,i,u)=>{var _=u(51873),w=Object.prototype,x=w.hasOwnProperty,j=w.toString,P=_?_.toStringTag:void 0;s.exports=function getRawTag(s){var i=x.call(s,P),u=s[P];try{s[P]=void 0;var _=!0}catch(s){}var w=j.call(s);return _&&(i?s[P]=u:delete s[P]),w}},4664:(s,i,u)=>{var _=u(79770),w=u(63345),x=Object.prototype.propertyIsEnumerable,j=Object.getOwnPropertySymbols,P=j?function(s){return null==s?[]:(s=Object(s),_(j(s),(function(i){return x.call(s,i)})))}:w;s.exports=P},86375:(s,i,u)=>{var _=u(14528),w=u(28879),x=u(4664),j=u(63345),P=Object.getOwnPropertySymbols?function(s){for(var i=[];s;)_(i,x(s)),s=w(s);return i}:j;s.exports=P},5861:(s,i,u)=>{var _=u(55580),w=u(68223),x=u(32804),j=u(76545),P=u(28303),B=u(72552),$=u(47473),U="[object Map]",Y="[object Promise]",X="[object Set]",Z="[object WeakMap]",ee="[object DataView]",ae=$(_),ie=$(w),le=$(x),ce=$(j),pe=$(P),de=B;(_&&de(new _(new ArrayBuffer(1)))!=ee||w&&de(new w)!=U||x&&de(x.resolve())!=Y||j&&de(new j)!=X||P&&de(new P)!=Z)&&(de=function(s){var i=B(s),u="[object Object]"==i?s.constructor:void 0,_=u?$(u):"";if(_)switch(_){case ae:return ee;case ie:return U;case le:return Y;case ce:return X;case pe:return Z}return i}),s.exports=de},10392:s=>{s.exports=function getValue(s,i){return null==s?void 0:s[i]}},75251:s=>{var i=/\{\n\/\* \[wrapped with (.+)\] \*/,u=/,? & /;s.exports=function getWrapDetails(s){var _=s.match(i);return _?_[1].split(u):[]}},49326:(s,i,u)=>{var _=u(31769),w=u(72428),x=u(56449),j=u(30361),P=u(30294),B=u(77797);s.exports=function hasPath(s,i,u){for(var $=-1,U=(i=_(i,s)).length,Y=!1;++${var i=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");s.exports=function hasUnicode(s){return i.test(s)}},45434:s=>{var i=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;s.exports=function hasUnicodeWord(s){return i.test(s)}},22032:(s,i,u)=>{var _=u(81042);s.exports=function hashClear(){this.__data__=_?_(null):{},this.size=0}},63862:s=>{s.exports=function hashDelete(s){var i=this.has(s)&&delete this.__data__[s];return this.size-=i?1:0,i}},66721:(s,i,u)=>{var _=u(81042),w=Object.prototype.hasOwnProperty;s.exports=function hashGet(s){var i=this.__data__;if(_){var u=i[s];return"__lodash_hash_undefined__"===u?void 0:u}return w.call(i,s)?i[s]:void 0}},12749:(s,i,u)=>{var _=u(81042),w=Object.prototype.hasOwnProperty;s.exports=function hashHas(s){var i=this.__data__;return _?void 0!==i[s]:w.call(i,s)}},35749:(s,i,u)=>{var _=u(81042);s.exports=function hashSet(s,i){var u=this.__data__;return this.size+=this.has(s)?0:1,u[s]=_&&void 0===i?"__lodash_hash_undefined__":i,this}},76189:s=>{var i=Object.prototype.hasOwnProperty;s.exports=function initCloneArray(s){var u=s.length,_=new s.constructor(u);return u&&"string"==typeof s[0]&&i.call(s,"index")&&(_.index=s.index,_.input=s.input),_}},77199:(s,i,u)=>{var _=u(49653),w=u(76169),x=u(73201),j=u(93736),P=u(71961);s.exports=function initCloneByTag(s,i,u){var B=s.constructor;switch(i){case"[object ArrayBuffer]":return _(s);case"[object Boolean]":case"[object Date]":return new B(+s);case"[object DataView]":return w(s,u);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return P(s,u);case"[object Map]":case"[object Set]":return new B;case"[object Number]":case"[object String]":return new B(s);case"[object RegExp]":return x(s);case"[object Symbol]":return j(s)}}},35529:(s,i,u)=>{var _=u(39344),w=u(28879),x=u(55527);s.exports=function initCloneObject(s){return"function"!=typeof s.constructor||x(s)?{}:_(w(s))}},62060:s=>{var i=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;s.exports=function insertWrapDetails(s,u){var _=u.length;if(!_)return s;var w=_-1;return u[w]=(_>1?"& ":"")+u[w],u=u.join(_>2?", ":" "),s.replace(i,"{\n/* [wrapped with "+u+"] */\n")}},45891:(s,i,u)=>{var _=u(51873),w=u(72428),x=u(56449),j=_?_.isConcatSpreadable:void 0;s.exports=function isFlattenable(s){return x(s)||w(s)||!!(j&&s&&s[j])}},30361:s=>{var i=/^(?:0|[1-9]\d*)$/;s.exports=function isIndex(s,u){var _=typeof s;return!!(u=null==u?9007199254740991:u)&&("number"==_||"symbol"!=_&&i.test(s))&&s>-1&&s%1==0&&s{var _=u(75288),w=u(64894),x=u(30361),j=u(23805);s.exports=function isIterateeCall(s,i,u){if(!j(u))return!1;var P=typeof i;return!!("number"==P?w(u)&&x(i,u.length):"string"==P&&i in u)&&_(u[i],s)}},28586:(s,i,u)=>{var _=u(56449),w=u(44394),x=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,j=/^\w*$/;s.exports=function isKey(s,i){if(_(s))return!1;var u=typeof s;return!("number"!=u&&"symbol"!=u&&"boolean"!=u&&null!=s&&!w(s))||(j.test(s)||!x.test(s)||null!=i&&s in Object(i))}},74218:s=>{s.exports=function isKeyable(s){var i=typeof s;return"string"==i||"number"==i||"symbol"==i||"boolean"==i?"__proto__"!==s:null===s}},85087:(s,i,u)=>{var _=u(30980),w=u(37381),x=u(62284),j=u(53758);s.exports=function isLaziable(s){var i=x(s),u=j[i];if("function"!=typeof u||!(i in _.prototype))return!1;if(s===u)return!0;var P=w(u);return!!P&&s===P[0]}},87296:(s,i,u)=>{var _,w=u(55481),x=(_=/[^.]+$/.exec(w&&w.keys&&w.keys.IE_PROTO||""))?"Symbol(src)_1."+_:"";s.exports=function isMasked(s){return!!x&&x in s}},55527:s=>{var i=Object.prototype;s.exports=function isPrototype(s){var u=s&&s.constructor;return s===("function"==typeof u&&u.prototype||i)}},30756:(s,i,u)=>{var _=u(23805);s.exports=function isStrictComparable(s){return s==s&&!_(s)}},63702:s=>{s.exports=function listCacheClear(){this.__data__=[],this.size=0}},70080:(s,i,u)=>{var _=u(26025),w=Array.prototype.splice;s.exports=function listCacheDelete(s){var i=this.__data__,u=_(i,s);return!(u<0)&&(u==i.length-1?i.pop():w.call(i,u,1),--this.size,!0)}},24739:(s,i,u)=>{var _=u(26025);s.exports=function listCacheGet(s){var i=this.__data__,u=_(i,s);return u<0?void 0:i[u][1]}},48655:(s,i,u)=>{var _=u(26025);s.exports=function listCacheHas(s){return _(this.__data__,s)>-1}},31175:(s,i,u)=>{var _=u(26025);s.exports=function listCacheSet(s,i){var u=this.__data__,w=_(u,s);return w<0?(++this.size,u.push([s,i])):u[w][1]=i,this}},63040:(s,i,u)=>{var _=u(21549),w=u(80079),x=u(68223);s.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new _,map:new(x||w),string:new _}}},17670:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheDelete(s){var i=_(this,s).delete(s);return this.size-=i?1:0,i}},90289:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheGet(s){return _(this,s).get(s)}},4509:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheHas(s){return _(this,s).has(s)}},72949:(s,i,u)=>{var _=u(12651);s.exports=function mapCacheSet(s,i){var u=_(this,s),w=u.size;return u.set(s,i),this.size+=u.size==w?0:1,this}},20317:s=>{s.exports=function mapToArray(s){var i=-1,u=Array(s.size);return s.forEach((function(s,_){u[++i]=[_,s]})),u}},67197:s=>{s.exports=function matchesStrictComparable(s,i){return function(u){return null!=u&&(u[s]===i&&(void 0!==i||s in Object(u)))}}},62224:(s,i,u)=>{var _=u(50104);s.exports=function memoizeCapped(s){var i=_(s,(function(s){return 500===u.size&&u.clear(),s})),u=i.cache;return i}},3209:(s,i,u)=>{var _=u(91596),w=u(53320),x=u(36306),j="__lodash_placeholder__",P=128,B=Math.min;s.exports=function mergeData(s,i){var u=s[1],$=i[1],U=u|$,Y=U<131,X=$==P&&8==u||$==P&&256==u&&s[7].length<=i[8]||384==$&&i[7].length<=i[8]&&8==u;if(!Y&&!X)return s;1&$&&(s[2]=i[2],U|=1&u?0:4);var Z=i[3];if(Z){var ee=s[3];s[3]=ee?_(ee,Z,i[4]):Z,s[4]=ee?x(s[3],j):i[4]}return(Z=i[5])&&(ee=s[5],s[5]=ee?w(ee,Z,i[6]):Z,s[6]=ee?x(s[5],j):i[6]),(Z=i[7])&&(s[7]=Z),$&P&&(s[8]=null==s[8]?i[8]:B(s[8],i[8])),null==s[9]&&(s[9]=i[9]),s[0]=i[0],s[1]=U,s}},48152:(s,i,u)=>{var _=u(28303),w=_&&new _;s.exports=w},81042:(s,i,u)=>{var _=u(56110)(Object,"create");s.exports=_},3650:(s,i,u)=>{var _=u(74335)(Object.keys,Object);s.exports=_},90181:s=>{s.exports=function nativeKeysIn(s){var i=[];if(null!=s)for(var u in Object(s))i.push(u);return i}},86009:(s,i,u)=>{s=u.nmd(s);var _=u(34840),w=i&&!i.nodeType&&i,x=w&&s&&!s.nodeType&&s,j=x&&x.exports===w&&_.process,P=function(){try{var s=x&&x.require&&x.require("util").types;return s||j&&j.binding&&j.binding("util")}catch(s){}}();s.exports=P},59350:s=>{var i=Object.prototype.toString;s.exports=function objectToString(s){return i.call(s)}},74335:s=>{s.exports=function overArg(s,i){return function(u){return s(i(u))}}},56757:(s,i,u)=>{var _=u(91033),w=Math.max;s.exports=function overRest(s,i,u){return i=w(void 0===i?s.length-1:i,0),function(){for(var x=arguments,j=-1,P=w(x.length-i,0),B=Array(P);++j{var _=u(47422),w=u(25160);s.exports=function parent(s,i){return i.length<2?s:_(s,w(i,0,-1))}},84629:s=>{s.exports={}},68294:(s,i,u)=>{var _=u(23007),w=u(30361),x=Math.min;s.exports=function reorder(s,i){for(var u=s.length,j=x(i.length,u),P=_(s);j--;){var B=i[j];s[j]=w(B,u)?P[B]:void 0}return s}},36306:s=>{var i="__lodash_placeholder__";s.exports=function replaceHolders(s,u){for(var _=-1,w=s.length,x=0,j=[];++_{var _=u(34840),w="object"==typeof self&&self&&self.Object===Object&&self,x=_||w||Function("return this")();s.exports=x},14974:s=>{s.exports=function safeGet(s,i){if(("constructor"!==i||"function"!=typeof s[i])&&"__proto__"!=i)return s[i]}},31380:s=>{s.exports=function setCacheAdd(s){return this.__data__.set(s,"__lodash_hash_undefined__"),this}},51459:s=>{s.exports=function setCacheHas(s){return this.__data__.has(s)}},54641:(s,i,u)=>{var _=u(68882),w=u(51811)(_);s.exports=w},84247:s=>{s.exports=function setToArray(s){var i=-1,u=Array(s.size);return s.forEach((function(s){u[++i]=s})),u}},32865:(s,i,u)=>{var _=u(19570),w=u(51811)(_);s.exports=w},70981:(s,i,u)=>{var _=u(75251),w=u(62060),x=u(32865),j=u(75948);s.exports=function setWrapToString(s,i,u){var P=i+"";return x(s,w(P,j(_(P),u)))}},51811:s=>{var i=Date.now;s.exports=function shortOut(s){var u=0,_=0;return function(){var w=i(),x=16-(w-_);if(_=w,x>0){if(++u>=800)return arguments[0]}else u=0;return s.apply(void 0,arguments)}}},51420:(s,i,u)=>{var _=u(80079);s.exports=function stackClear(){this.__data__=new _,this.size=0}},90938:s=>{s.exports=function stackDelete(s){var i=this.__data__,u=i.delete(s);return this.size=i.size,u}},63605:s=>{s.exports=function stackGet(s){return this.__data__.get(s)}},29817:s=>{s.exports=function stackHas(s){return this.__data__.has(s)}},80945:(s,i,u)=>{var _=u(80079),w=u(68223),x=u(53661);s.exports=function stackSet(s,i){var u=this.__data__;if(u instanceof _){var j=u.__data__;if(!w||j.length<199)return j.push([s,i]),this.size=++u.size,this;u=this.__data__=new x(j)}return u.set(s,i),this.size=u.size,this}},76959:s=>{s.exports=function strictIndexOf(s,i,u){for(var _=u-1,w=s.length;++_{var _=u(61074),w=u(49698),x=u(42054);s.exports=function stringToArray(s){return w(s)?x(s):_(s)}},61802:(s,i,u)=>{var _=u(62224),w=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,x=/\\(\\)?/g,j=_((function(s){var i=[];return 46===s.charCodeAt(0)&&i.push(""),s.replace(w,(function(s,u,_,w){i.push(_?w.replace(x,"$1"):u||s)})),i}));s.exports=j},77797:(s,i,u)=>{var _=u(44394);s.exports=function toKey(s){if("string"==typeof s||_(s))return s;var i=s+"";return"0"==i&&1/s==-Infinity?"-0":i}},47473:s=>{var i=Function.prototype.toString;s.exports=function toSource(s){if(null!=s){try{return i.call(s)}catch(s){}try{return s+""}catch(s){}}return""}},31800:s=>{var i=/\s/;s.exports=function trimmedEndIndex(s){for(var u=s.length;u--&&i.test(s.charAt(u)););return u}},42054:s=>{var i="\\ud800-\\udfff",u="["+i+"]",_="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",w="\\ud83c[\\udffb-\\udfff]",x="[^"+i+"]",j="(?:\\ud83c[\\udde6-\\uddff]){2}",P="[\\ud800-\\udbff][\\udc00-\\udfff]",B="(?:"+_+"|"+w+")"+"?",$="[\\ufe0e\\ufe0f]?",U=$+B+("(?:\\u200d(?:"+[x,j,P].join("|")+")"+$+B+")*"),Y="(?:"+[x+_+"?",_,j,P,u].join("|")+")",X=RegExp(w+"(?="+w+")|"+Y+U,"g");s.exports=function unicodeToArray(s){return s.match(X)||[]}},22225:s=>{var i="\\ud800-\\udfff",u="\\u2700-\\u27bf",_="a-z\\xdf-\\xf6\\xf8-\\xff",w="A-Z\\xc0-\\xd6\\xd8-\\xde",x="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",j="["+x+"]",P="\\d+",B="["+u+"]",$="["+_+"]",U="[^"+i+x+P+u+_+w+"]",Y="(?:\\ud83c[\\udde6-\\uddff]){2}",X="[\\ud800-\\udbff][\\udc00-\\udfff]",Z="["+w+"]",ee="(?:"+$+"|"+U+")",ae="(?:"+Z+"|"+U+")",ie="(?:['’](?:d|ll|m|re|s|t|ve))?",le="(?:['’](?:D|LL|M|RE|S|T|VE))?",ce="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",pe="[\\ufe0e\\ufe0f]?",de=pe+ce+("(?:\\u200d(?:"+["[^"+i+"]",Y,X].join("|")+")"+pe+ce+")*"),fe="(?:"+[B,Y,X].join("|")+")"+de,ye=RegExp([Z+"?"+$+"+"+ie+"(?="+[j,Z,"$"].join("|")+")",ae+"+"+le+"(?="+[j,Z+ee,"$"].join("|")+")",Z+"?"+ee+"+"+ie,Z+"+"+le,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",P,fe].join("|"),"g");s.exports=function unicodeWords(s){return s.match(ye)||[]}},75948:(s,i,u)=>{var _=u(83729),w=u(15325),x=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];s.exports=function updateWrapDetails(s,i){return _(x,(function(u){var _="_."+u[0];i&u[1]&&!w(s,_)&&s.push(_)})),s.sort()}},80257:(s,i,u)=>{var _=u(30980),w=u(56017),x=u(23007);s.exports=function wrapperClone(s){if(s instanceof _)return s.clone();var i=new w(s.__wrapped__,s.__chain__);return i.__actions__=x(s.__actions__),i.__index__=s.__index__,i.__values__=s.__values__,i}},64626:(s,i,u)=>{var _=u(66977);s.exports=function ary(s,i,u){return i=u?void 0:i,i=s&&null==i?s.length:i,_(s,128,void 0,void 0,void 0,void 0,i)}},84058:(s,i,u)=>{var _=u(14792),w=u(45539)((function(s,i,u){return i=i.toLowerCase(),s+(u?_(i):i)}));s.exports=w},14792:(s,i,u)=>{var _=u(13222),w=u(55808);s.exports=function capitalize(s){return w(_(s).toLowerCase())}},32629:(s,i,u)=>{var _=u(9999);s.exports=function clone(s){return _(s,4)}},37334:s=>{s.exports=function constant(s){return function(){return s}}},49747:(s,i,u)=>{var _=u(66977);function curry(s,i,u){var w=_(s,8,void 0,void 0,void 0,void 0,void 0,i=u?void 0:i);return w.placeholder=curry.placeholder,w}curry.placeholder={},s.exports=curry},38221:(s,i,u)=>{var _=u(23805),w=u(10124),x=u(99374),j=Math.max,P=Math.min;s.exports=function debounce(s,i,u){var B,$,U,Y,X,Z,ee=0,ae=!1,ie=!1,le=!0;if("function"!=typeof s)throw new TypeError("Expected a function");function invokeFunc(i){var u=B,_=$;return B=$=void 0,ee=i,Y=s.apply(_,u)}function shouldInvoke(s){var u=s-Z;return void 0===Z||u>=i||u<0||ie&&s-ee>=U}function timerExpired(){var s=w();if(shouldInvoke(s))return trailingEdge(s);X=setTimeout(timerExpired,function remainingWait(s){var u=i-(s-Z);return ie?P(u,U-(s-ee)):u}(s))}function trailingEdge(s){return X=void 0,le&&B?invokeFunc(s):(B=$=void 0,Y)}function debounced(){var s=w(),u=shouldInvoke(s);if(B=arguments,$=this,Z=s,u){if(void 0===X)return function leadingEdge(s){return ee=s,X=setTimeout(timerExpired,i),ae?invokeFunc(s):Y}(Z);if(ie)return clearTimeout(X),X=setTimeout(timerExpired,i),invokeFunc(Z)}return void 0===X&&(X=setTimeout(timerExpired,i)),Y}return i=x(i)||0,_(u)&&(ae=!!u.leading,U=(ie="maxWait"in u)?j(x(u.maxWait)||0,i):U,le="trailing"in u?!!u.trailing:le),debounced.cancel=function cancel(){void 0!==X&&clearTimeout(X),ee=0,B=Z=$=X=void 0},debounced.flush=function flush(){return void 0===X?Y:trailingEdge(w())},debounced}},50828:(s,i,u)=>{var _=u(24647),w=u(13222),x=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,j=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");s.exports=function deburr(s){return(s=w(s))&&s.replace(x,_).replace(j,"")}},75288:s=>{s.exports=function eq(s,i){return s===i||s!=s&&i!=i}},7309:(s,i,u)=>{var _=u(62006)(u(24713));s.exports=_},24713:(s,i,u)=>{var _=u(2523),w=u(15389),x=u(61489),j=Math.max;s.exports=function findIndex(s,i,u){var P=null==s?0:s.length;if(!P)return-1;var B=null==u?0:x(u);return B<0&&(B=j(P+B,0)),_(s,w(i,3),B)}},35970:(s,i,u)=>{var _=u(83120);s.exports=function flatten(s){return(null==s?0:s.length)?_(s,1):[]}},73424:(s,i,u)=>{var _=u(16962),w=u(2874),x=Array.prototype.push;function baseAry(s,i){return 2==i?function(i,u){return s(i,u)}:function(i){return s(i)}}function cloneArray(s){for(var i=s?s.length:0,u=Array(i);i--;)u[i]=s[i];return u}function wrapImmutable(s,i){return function(){var u=arguments.length;if(u){for(var _=Array(u);u--;)_[u]=arguments[u];var w=_[0]=i.apply(void 0,_);return s.apply(void 0,_),w}}}s.exports=function baseConvert(s,i,u,j){var P="function"==typeof i,B=i===Object(i);if(B&&(j=u,u=i,i=void 0),null==u)throw new TypeError;j||(j={});var $={cap:!("cap"in j)||j.cap,curry:!("curry"in j)||j.curry,fixed:!("fixed"in j)||j.fixed,immutable:!("immutable"in j)||j.immutable,rearg:!("rearg"in j)||j.rearg},U=P?u:w,Y="curry"in j&&j.curry,X="fixed"in j&&j.fixed,Z="rearg"in j&&j.rearg,ee=P?u.runInContext():void 0,ae=P?u:{ary:s.ary,assign:s.assign,clone:s.clone,curry:s.curry,forEach:s.forEach,isArray:s.isArray,isError:s.isError,isFunction:s.isFunction,isWeakMap:s.isWeakMap,iteratee:s.iteratee,keys:s.keys,rearg:s.rearg,toInteger:s.toInteger,toPath:s.toPath},ie=ae.ary,le=ae.assign,ce=ae.clone,pe=ae.curry,de=ae.forEach,fe=ae.isArray,ye=ae.isError,be=ae.isFunction,_e=ae.isWeakMap,we=ae.keys,Se=ae.rearg,xe=ae.toInteger,Pe=ae.toPath,Te=we(_.aryMethod),Re={castArray:function(s){return function(){var i=arguments[0];return fe(i)?s(cloneArray(i)):s.apply(void 0,arguments)}},iteratee:function(s){return function(){var i=arguments[1],u=s(arguments[0],i),_=u.length;return $.cap&&"number"==typeof i?(i=i>2?i-2:1,_&&_<=i?u:baseAry(u,i)):u}},mixin:function(s){return function(i){var u=this;if(!be(u))return s(u,Object(i));var _=[];return de(we(i),(function(s){be(i[s])&&_.push([s,u.prototype[s]])})),s(u,Object(i)),de(_,(function(s){var i=s[1];be(i)?u.prototype[s[0]]=i:delete u.prototype[s[0]]})),u}},nthArg:function(s){return function(i){var u=i<0?1:xe(i)+1;return pe(s(i),u)}},rearg:function(s){return function(i,u){var _=u?u.length:0;return pe(s(i,u),_)}},runInContext:function(i){return function(u){return baseConvert(s,i(u),j)}}};function castCap(s,i){if($.cap){var u=_.iterateeRearg[s];if(u)return function iterateeRearg(s,i){return overArg(s,(function(s){var u=i.length;return function baseArity(s,i){return 2==i?function(i,u){return s.apply(void 0,arguments)}:function(i){return s.apply(void 0,arguments)}}(Se(baseAry(s,u),i),u)}))}(i,u);var w=!P&&_.iterateeAry[s];if(w)return function iterateeAry(s,i){return overArg(s,(function(s){return"function"==typeof s?baseAry(s,i):s}))}(i,w)}return i}function castFixed(s,i,u){if($.fixed&&(X||!_.skipFixed[s])){var w=_.methodSpread[s],j=w&&w.start;return void 0===j?ie(i,u):function flatSpread(s,i){return function(){for(var u=arguments.length,_=u-1,w=Array(u);u--;)w[u]=arguments[u];var j=w[i],P=w.slice(0,i);return j&&x.apply(P,j),i!=_&&x.apply(P,w.slice(i+1)),s.apply(this,P)}}(i,j)}return i}function castRearg(s,i,u){return $.rearg&&u>1&&(Z||!_.skipRearg[s])?Se(i,_.methodRearg[s]||_.aryRearg[u]):i}function cloneByPath(s,i){for(var u=-1,_=(i=Pe(i)).length,w=_-1,x=ce(Object(s)),j=x;null!=j&&++u<_;){var P=i[u],B=j[P];null==B||be(B)||ye(B)||_e(B)||(j[P]=ce(u==w?B:Object(B))),j=j[P]}return x}function createConverter(s,i){var u=_.aliasToReal[s]||s,w=_.remap[u]||u,x=j;return function(s){var _=P?ee:ae,j=P?ee[w]:i,B=le(le({},x),s);return baseConvert(_,u,j,B)}}function overArg(s,i){return function(){var u=arguments.length;if(!u)return s();for(var _=Array(u);u--;)_[u]=arguments[u];var w=$.rearg?0:u-1;return _[w]=i(_[w]),s.apply(void 0,_)}}function wrap(s,i,u){var w,x=_.aliasToReal[s]||s,j=i,P=Re[x];return P?j=P(i):$.immutable&&(_.mutate.array[x]?j=wrapImmutable(i,cloneArray):_.mutate.object[x]?j=wrapImmutable(i,function createCloner(s){return function(i){return s({},i)}}(i)):_.mutate.set[x]&&(j=wrapImmutable(i,cloneByPath))),de(Te,(function(s){return de(_.aryMethod[s],(function(i){if(x==i){var u=_.methodSpread[x],P=u&&u.afterRearg;return w=P?castFixed(x,castRearg(x,j,s),s):castRearg(x,castFixed(x,j,s),s),w=function castCurry(s,i,u){return Y||$.curry&&u>1?pe(i,u):i}(0,w=castCap(x,w),s),!1}})),!w})),w||(w=j),w==i&&(w=Y?pe(w,1):function(){return i.apply(this,arguments)}),w.convert=createConverter(x,i),w.placeholder=i.placeholder=u,w}if(!B)return wrap(i,u,U);var qe=u,$e=[];return de(Te,(function(s){de(_.aryMethod[s],(function(s){var i=qe[_.remap[s]||s];i&&$e.push([s,wrap(s,i,qe)])}))})),de(we(qe),(function(s){var i=qe[s];if("function"==typeof i){for(var u=$e.length;u--;)if($e[u][0]==s)return;i.convert=createConverter(s,i),$e.push([s,i])}})),de($e,(function(s){qe[s[0]]=s[1]})),qe.convert=function convertLib(s){return qe.runInContext.convert(s)(void 0)},qe.placeholder=qe,de(we(qe),(function(s){de(_.realToAlias[s]||[],(function(i){qe[i]=qe[s]}))})),qe}},16962:(s,i)=>{i.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},i.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},i.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},i.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},i.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},i.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},i.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},i.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},i.realToAlias=function(){var s=Object.prototype.hasOwnProperty,u=i.aliasToReal,_={};for(var w in u){var x=u[w];s.call(_,x)?_[x].push(w):_[x]=[w]}return _}(),i.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},i.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},i.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},47934:(s,i,u)=>{s.exports={ary:u(64626),assign:u(74733),clone:u(32629),curry:u(49747),forEach:u(83729),isArray:u(56449),isError:u(23546),isFunction:u(1882),isWeakMap:u(47886),iteratee:u(33855),keys:u(88984),rearg:u(84195),toInteger:u(61489),toPath:u(42072)}},56367:(s,i,u)=>{s.exports=u(77731)},79920:(s,i,u)=>{var _=u(73424),w=u(47934);s.exports=function convert(s,i,u){return _(w,s,i,u)}},2874:s=>{s.exports={}},77731:(s,i,u)=>{var _=u(79920)("set",u(63560));_.placeholder=u(2874),s.exports=_},58156:(s,i,u)=>{var _=u(47422);s.exports=function get(s,i,u){var w=null==s?void 0:_(s,i);return void 0===w?u:w}},80631:(s,i,u)=>{var _=u(28077),w=u(49326);s.exports=function hasIn(s,i){return null!=s&&w(s,i,_)}},83488:s=>{s.exports=function identity(s){return s}},72428:(s,i,u)=>{var _=u(27534),w=u(40346),x=Object.prototype,j=x.hasOwnProperty,P=x.propertyIsEnumerable,B=_(function(){return arguments}())?_:function(s){return w(s)&&j.call(s,"callee")&&!P.call(s,"callee")};s.exports=B},56449:s=>{var i=Array.isArray;s.exports=i},64894:(s,i,u)=>{var _=u(1882),w=u(30294);s.exports=function isArrayLike(s){return null!=s&&w(s.length)&&!_(s)}},83693:(s,i,u)=>{var _=u(64894),w=u(40346);s.exports=function isArrayLikeObject(s){return w(s)&&_(s)}},53812:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function isBoolean(s){return!0===s||!1===s||w(s)&&"[object Boolean]"==_(s)}},3656:(s,i,u)=>{s=u.nmd(s);var _=u(9325),w=u(89935),x=i&&!i.nodeType&&i,j=x&&s&&!s.nodeType&&s,P=j&&j.exports===x?_.Buffer:void 0,B=(P?P.isBuffer:void 0)||w;s.exports=B},62193:(s,i,u)=>{var _=u(88984),w=u(5861),x=u(72428),j=u(56449),P=u(64894),B=u(3656),$=u(55527),U=u(37167),Y=Object.prototype.hasOwnProperty;s.exports=function isEmpty(s){if(null==s)return!0;if(P(s)&&(j(s)||"string"==typeof s||"function"==typeof s.splice||B(s)||U(s)||x(s)))return!s.length;var i=w(s);if("[object Map]"==i||"[object Set]"==i)return!s.size;if($(s))return!_(s).length;for(var u in s)if(Y.call(s,u))return!1;return!0}},2404:(s,i,u)=>{var _=u(60270);s.exports=function isEqual(s,i){return _(s,i)}},23546:(s,i,u)=>{var _=u(72552),w=u(40346),x=u(11331);s.exports=function isError(s){if(!w(s))return!1;var i=_(s);return"[object Error]"==i||"[object DOMException]"==i||"string"==typeof s.message&&"string"==typeof s.name&&!x(s)}},1882:(s,i,u)=>{var _=u(72552),w=u(23805);s.exports=function isFunction(s){if(!w(s))return!1;var i=_(s);return"[object Function]"==i||"[object GeneratorFunction]"==i||"[object AsyncFunction]"==i||"[object Proxy]"==i}},30294:s=>{s.exports=function isLength(s){return"number"==typeof s&&s>-1&&s%1==0&&s<=9007199254740991}},87730:(s,i,u)=>{var _=u(29172),w=u(27301),x=u(86009),j=x&&x.isMap,P=j?w(j):_;s.exports=P},5187:s=>{s.exports=function isNull(s){return null===s}},98023:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function isNumber(s){return"number"==typeof s||w(s)&&"[object Number]"==_(s)}},23805:s=>{s.exports=function isObject(s){var i=typeof s;return null!=s&&("object"==i||"function"==i)}},40346:s=>{s.exports=function isObjectLike(s){return null!=s&&"object"==typeof s}},11331:(s,i,u)=>{var _=u(72552),w=u(28879),x=u(40346),j=Function.prototype,P=Object.prototype,B=j.toString,$=P.hasOwnProperty,U=B.call(Object);s.exports=function isPlainObject(s){if(!x(s)||"[object Object]"!=_(s))return!1;var i=w(s);if(null===i)return!0;var u=$.call(i,"constructor")&&i.constructor;return"function"==typeof u&&u instanceof u&&B.call(u)==U}},38440:(s,i,u)=>{var _=u(16038),w=u(27301),x=u(86009),j=x&&x.isSet,P=j?w(j):_;s.exports=P},85015:(s,i,u)=>{var _=u(72552),w=u(56449),x=u(40346);s.exports=function isString(s){return"string"==typeof s||!w(s)&&x(s)&&"[object String]"==_(s)}},44394:(s,i,u)=>{var _=u(72552),w=u(40346);s.exports=function isSymbol(s){return"symbol"==typeof s||w(s)&&"[object Symbol]"==_(s)}},37167:(s,i,u)=>{var _=u(4901),w=u(27301),x=u(86009),j=x&&x.isTypedArray,P=j?w(j):_;s.exports=P},47886:(s,i,u)=>{var _=u(5861),w=u(40346);s.exports=function isWeakMap(s){return w(s)&&"[object WeakMap]"==_(s)}},33855:(s,i,u)=>{var _=u(9999),w=u(15389);s.exports=function iteratee(s){return w("function"==typeof s?s:_(s,1))}},95950:(s,i,u)=>{var _=u(70695),w=u(88984),x=u(64894);s.exports=function keys(s){return x(s)?_(s):w(s)}},37241:(s,i,u)=>{var _=u(70695),w=u(72903),x=u(64894);s.exports=function keysIn(s){return x(s)?_(s,!0):w(s)}},68090:s=>{s.exports=function last(s){var i=null==s?0:s.length;return i?s[i-1]:void 0}},50104:(s,i,u)=>{var _=u(53661);function memoize(s,i){if("function"!=typeof s||null!=i&&"function"!=typeof i)throw new TypeError("Expected a function");var memoized=function(){var u=arguments,_=i?i.apply(this,u):u[0],w=memoized.cache;if(w.has(_))return w.get(_);var x=s.apply(this,u);return memoized.cache=w.set(_,x)||w,x};return memoized.cache=new(memoize.Cache||_),memoized}memoize.Cache=_,s.exports=memoize},55364:(s,i,u)=>{var _=u(85250),w=u(20999)((function(s,i,u){_(s,i,u)}));s.exports=w},6048:s=>{s.exports=function negate(s){if("function"!=typeof s)throw new TypeError("Expected a function");return function(){var i=arguments;switch(i.length){case 0:return!s.call(this);case 1:return!s.call(this,i[0]);case 2:return!s.call(this,i[0],i[1]);case 3:return!s.call(this,i[0],i[1],i[2])}return!s.apply(this,i)}}},63950:s=>{s.exports=function noop(){}},10124:(s,i,u)=>{var _=u(9325);s.exports=function(){return _.Date.now()}},90179:(s,i,u)=>{var _=u(34932),w=u(9999),x=u(19931),j=u(31769),P=u(21791),B=u(53138),$=u(38816),U=u(83349),Y=$((function(s,i){var u={};if(null==s)return u;var $=!1;i=_(i,(function(i){return i=j(i,s),$||($=i.length>1),i})),P(s,U(s),u),$&&(u=w(u,7,B));for(var Y=i.length;Y--;)x(u,i[Y]);return u}));s.exports=Y},50583:(s,i,u)=>{var _=u(47237),w=u(17255),x=u(28586),j=u(77797);s.exports=function property(s){return x(s)?_(j(s)):w(s)}},84195:(s,i,u)=>{var _=u(66977),w=u(38816),x=w((function(s,i){return _(s,256,void 0,void 0,void 0,i)}));s.exports=x},40860:(s,i,u)=>{var _=u(40882),w=u(80909),x=u(15389),j=u(85558),P=u(56449);s.exports=function reduce(s,i,u){var B=P(s)?_:j,$=arguments.length<3;return B(s,x(i,4),u,$,w)}},63560:(s,i,u)=>{var _=u(73170);s.exports=function set(s,i,u){return null==s?s:_(s,i,u)}},42426:(s,i,u)=>{var _=u(14248),w=u(15389),x=u(90916),j=u(56449),P=u(36800);s.exports=function some(s,i,u){var B=j(s)?_:x;return u&&P(s,i,u)&&(i=void 0),B(s,w(i,3))}},63345:s=>{s.exports=function stubArray(){return[]}},89935:s=>{s.exports=function stubFalse(){return!1}},17400:(s,i,u)=>{var _=u(99374),w=1/0;s.exports=function toFinite(s){return s?(s=_(s))===w||s===-1/0?17976931348623157e292*(s<0?-1:1):s==s?s:0:0===s?s:0}},61489:(s,i,u)=>{var _=u(17400);s.exports=function toInteger(s){var i=_(s),u=i%1;return i==i?u?i-u:i:0}},80218:(s,i,u)=>{var _=u(13222);s.exports=function toLower(s){return _(s).toLowerCase()}},99374:(s,i,u)=>{var _=u(54128),w=u(23805),x=u(44394),j=/^[-+]0x[0-9a-f]+$/i,P=/^0b[01]+$/i,B=/^0o[0-7]+$/i,$=parseInt;s.exports=function toNumber(s){if("number"==typeof s)return s;if(x(s))return NaN;if(w(s)){var i="function"==typeof s.valueOf?s.valueOf():s;s=w(i)?i+"":i}if("string"!=typeof s)return 0===s?s:+s;s=_(s);var u=P.test(s);return u||B.test(s)?$(s.slice(2),u?2:8):j.test(s)?NaN:+s}},42072:(s,i,u)=>{var _=u(34932),w=u(23007),x=u(56449),j=u(44394),P=u(61802),B=u(77797),$=u(13222);s.exports=function toPath(s){return x(s)?_(s,B):j(s)?[s]:w(P($(s)))}},69884:(s,i,u)=>{var _=u(21791),w=u(37241);s.exports=function toPlainObject(s){return _(s,w(s))}},13222:(s,i,u)=>{var _=u(77556);s.exports=function toString(s){return null==s?"":_(s)}},55808:(s,i,u)=>{var _=u(12507)("toUpperCase");s.exports=_},66645:(s,i,u)=>{var _=u(1733),w=u(45434),x=u(13222),j=u(22225);s.exports=function words(s,i,u){return s=x(s),void 0===(i=u?void 0:i)?w(s)?j(s):_(s):s.match(i)||[]}},53758:(s,i,u)=>{var _=u(30980),w=u(56017),x=u(94033),j=u(56449),P=u(40346),B=u(80257),$=Object.prototype.hasOwnProperty;function lodash(s){if(P(s)&&!j(s)&&!(s instanceof _)){if(s instanceof w)return s;if($.call(s,"__wrapped__"))return B(s)}return new w(s)}lodash.prototype=x.prototype,lodash.prototype.constructor=lodash,s.exports=lodash},47248:(s,i,u)=>{var _=u(16547),w=u(51234);s.exports=function zipObject(s,i){return w(s||[],i||[],_)}},43768:(s,i,u)=>{"use strict";var _=u(45981),w=u(85587);i.highlight=highlight,i.highlightAuto=function highlightAuto(s,i){var u,j,P,B,$=i||{},U=$.subset||_.listLanguages(),Y=$.prefix,X=U.length,Z=-1;null==Y&&(Y=x);if("string"!=typeof s)throw w("Expected `string` for value, got `%s`",s);j={relevance:0,language:null,value:[]},u={relevance:0,language:null,value:[]};for(;++Zj.relevance&&(j=P),P.relevance>u.relevance&&(j=u,u=P));j.language&&(u.secondBest=j);return u},i.registerLanguage=function registerLanguage(s,i){_.registerLanguage(s,i)},i.listLanguages=function listLanguages(){return _.listLanguages()},i.registerAlias=function registerAlias(s,i){var u,w=s;i&&((w={})[s]=i);for(u in w)_.registerAliases(w[u],{languageName:u})},Emitter.prototype.addText=function text(s){var i,u,_=this.stack;if(""===s)return;i=_[_.length-1],(u=i.children[i.children.length-1])&&"text"===u.type?u.value+=s:i.children.push({type:"text",value:s})},Emitter.prototype.addKeyword=function addKeyword(s,i){this.openNode(i),this.addText(s),this.closeNode()},Emitter.prototype.addSublanguage=function addSublanguage(s,i){var u=this.stack,_=u[u.length-1],w=s.rootNode.children,x=i?{type:"element",tagName:"span",properties:{className:[i]},children:w}:w;_.children=_.children.concat(x)},Emitter.prototype.openNode=function open(s){var i=this.stack,u=this.options.classPrefix+s,_=i[i.length-1],w={type:"element",tagName:"span",properties:{className:[u]},children:[]};_.children.push(w),i.push(w)},Emitter.prototype.closeNode=function close(){this.stack.pop()},Emitter.prototype.closeAllNodes=noop,Emitter.prototype.finalize=noop,Emitter.prototype.toHTML=function toHtmlNoop(){return""};var x="hljs-";function highlight(s,i,u){var j,P=_.configure({}),B=(u||{}).prefix;if("string"!=typeof s)throw w("Expected `string` for name, got `%s`",s);if(!_.getLanguage(s))throw w("Unknown language: `%s` is not registered",s);if("string"!=typeof i)throw w("Expected `string` for value, got `%s`",i);if(null==B&&(B=x),_.configure({__emitter:Emitter,classPrefix:B}),j=_.highlight(i,{language:s,ignoreIllegals:!0}),_.configure(P||{}),j.errorRaised)throw j.errorRaised;return{relevance:j.relevance,language:j.language,value:j.emitter.rootNode.children}}function Emitter(s){this.options=s,this.rootNode={children:[]},this.stack=[this.rootNode]}function noop(){}},92340:(s,i,u)=>{const _=u(6048);function coerceElementMatchingCallback(s){return"string"==typeof s?i=>i.element===s:s.constructor&&s.extend?i=>i instanceof s:s}class ArraySlice{constructor(s){this.elements=s||[]}toValue(){return this.elements.map((s=>s.toValue()))}map(s,i){return this.elements.map(s,i)}flatMap(s,i){return this.map(s,i).reduce(((s,i)=>s.concat(i)),[])}compactMap(s,i){const u=[];return this.forEach((_=>{const w=s.bind(i)(_);w&&u.push(w)})),u}filter(s,i){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(s,i))}reject(s,i){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(_(s),i))}find(s,i){return s=coerceElementMatchingCallback(s),this.elements.find(s,i)}forEach(s,i){this.elements.forEach(s,i)}reduce(s,i){return this.elements.reduce(s,i)}includes(s){return this.elements.some((i=>i.equals(s)))}shift(){return this.elements.shift()}unshift(s){this.elements.unshift(this.refract(s))}push(s){return this.elements.push(this.refract(s)),this}add(s){this.push(s)}get(s){return this.elements[s]}getValue(s){const i=this.elements[s];if(i)return i.toValue()}get length(){return this.elements.length}get isEmpty(){return 0===this.elements.length}get first(){return this.elements[0]}}"undefined"!=typeof Symbol&&(ArraySlice.prototype[Symbol.iterator]=function symbol(){return this.elements[Symbol.iterator]()}),s.exports=ArraySlice},55973:s=>{class KeyValuePair{constructor(s,i){this.key=s,this.value=i}clone(){const s=new KeyValuePair;return this.key&&(s.key=this.key.clone()),this.value&&(s.value=this.value.clone()),s}}s.exports=KeyValuePair},3110:(s,i,u)=>{const _=u(5187),w=u(85015),x=u(98023),j=u(53812),P=u(23805),B=u(85105),$=u(86804);class Namespace{constructor(s){this.elementMap={},this.elementDetection=[],this.Element=$.Element,this.KeyValuePair=$.KeyValuePair,s&&s.noDefault||this.useDefault(),this._attributeElementKeys=[],this._attributeElementArrayKeys=[]}use(s){return s.namespace&&s.namespace({base:this}),s.load&&s.load({base:this}),this}useDefault(){return this.register("null",$.NullElement).register("string",$.StringElement).register("number",$.NumberElement).register("boolean",$.BooleanElement).register("array",$.ArrayElement).register("object",$.ObjectElement).register("member",$.MemberElement).register("ref",$.RefElement).register("link",$.LinkElement),this.detect(_,$.NullElement,!1).detect(w,$.StringElement,!1).detect(x,$.NumberElement,!1).detect(j,$.BooleanElement,!1).detect(Array.isArray,$.ArrayElement,!1).detect(P,$.ObjectElement,!1),this}register(s,i){return this._elements=void 0,this.elementMap[s]=i,this}unregister(s){return this._elements=void 0,delete this.elementMap[s],this}detect(s,i,u){return void 0===u||u?this.elementDetection.unshift([s,i]):this.elementDetection.push([s,i]),this}toElement(s){if(s instanceof this.Element)return s;let i;for(let u=0;u{const i=s[0].toUpperCase()+s.substr(1);this._elements[i]=this.elementMap[s]}))),this._elements}get serialiser(){return new B(this)}}B.prototype.Namespace=Namespace,s.exports=Namespace},10866:(s,i,u)=>{const _=u(6048),w=u(92340);class ObjectSlice extends w{map(s,i){return this.elements.map((u=>s.bind(i)(u.value,u.key,u)))}filter(s,i){return new ObjectSlice(this.elements.filter((u=>s.bind(i)(u.value,u.key,u))))}reject(s,i){return this.filter(_(s.bind(i)))}forEach(s,i){return this.elements.forEach(((u,_)=>{s.bind(i)(u.value,u.key,u,_)}))}keys(){return this.map(((s,i)=>i.toValue()))}values(){return this.map((s=>s.toValue()))}}s.exports=ObjectSlice},86804:(s,i,u)=>{const _=u(10316),w=u(41067),x=u(71167),j=u(40239),P=u(12242),B=u(6233),$=u(87726),U=u(61045),Y=u(86303),X=u(14540),Z=u(92340),ee=u(10866),ae=u(55973);function refract(s){if(s instanceof _)return s;if("string"==typeof s)return new x(s);if("number"==typeof s)return new j(s);if("boolean"==typeof s)return new P(s);if(null===s)return new w;if(Array.isArray(s))return new B(s.map(refract));if("object"==typeof s){return new U(s)}return s}_.prototype.ObjectElement=U,_.prototype.RefElement=X,_.prototype.MemberElement=$,_.prototype.refract=refract,Z.prototype.refract=refract,s.exports={Element:_,NullElement:w,StringElement:x,NumberElement:j,BooleanElement:P,ArrayElement:B,MemberElement:$,ObjectElement:U,LinkElement:Y,RefElement:X,refract,ArraySlice:Z,ObjectSlice:ee,KeyValuePair:ae}},86303:(s,i,u)=>{const _=u(10316);s.exports=class LinkElement extends _{constructor(s,i,u){super(s||[],i,u),this.element="link"}get relation(){return this.attributes.get("relation")}set relation(s){this.attributes.set("relation",s)}get href(){return this.attributes.get("href")}set href(s){this.attributes.set("href",s)}}},14540:(s,i,u)=>{const _=u(10316);s.exports=class RefElement extends _{constructor(s,i,u){super(s||[],i,u),this.element="ref",this.path||(this.path="element")}get path(){return this.attributes.get("path")}set path(s){this.attributes.set("path",s)}}},34035:(s,i,u)=>{const _=u(3110),w=u(86804);i.g$=_,i.KeyValuePair=u(55973),i.G6=w.ArraySlice,i.ot=w.ObjectSlice,i.Hg=w.Element,i.Om=w.StringElement,i.kT=w.NumberElement,i.bd=w.BooleanElement,i.Os=w.NullElement,i.wE=w.ArrayElement,i.Sh=w.ObjectElement,i.Pr=w.MemberElement,i.sI=w.RefElement,i.Ft=w.LinkElement,i.e=w.refract,u(85105),u(75147)},6233:(s,i,u)=>{const _=u(6048),w=u(10316),x=u(92340);class ArrayElement extends w{constructor(s,i,u){super(s||[],i,u),this.element="array"}primitive(){return"array"}get(s){return this.content[s]}getValue(s){const i=this.get(s);if(i)return i.toValue()}getIndex(s){return this.content[s]}set(s,i){return this.content[s]=this.refract(i),this}remove(s){const i=this.content.splice(s,1);return i.length?i[0]:null}map(s,i){return this.content.map(s,i)}flatMap(s,i){return this.map(s,i).reduce(((s,i)=>s.concat(i)),[])}compactMap(s,i){const u=[];return this.forEach((_=>{const w=s.bind(i)(_);w&&u.push(w)})),u}filter(s,i){return new x(this.content.filter(s,i))}reject(s,i){return this.filter(_(s),i)}reduce(s,i){let u,_;void 0!==i?(u=0,_=this.refract(i)):(u=1,_="object"===this.primitive()?this.first.value:this.first);for(let i=u;i{s.bind(i)(u,this.refract(_))}))}shift(){return this.content.shift()}unshift(s){this.content.unshift(this.refract(s))}push(s){return this.content.push(this.refract(s)),this}add(s){this.push(s)}findElements(s,i){const u=i||{},_=!!u.recursive,w=void 0===u.results?[]:u.results;return this.forEach(((i,u,x)=>{_&&void 0!==i.findElements&&i.findElements(s,{results:w,recursive:_}),s(i,u,x)&&w.push(i)})),w}find(s){return new x(this.findElements(s,{recursive:!0}))}findByElement(s){return this.find((i=>i.element===s))}findByClass(s){return this.find((i=>i.classes.includes(s)))}getById(s){return this.find((i=>i.id.toValue()===s)).first}includes(s){return this.content.some((i=>i.equals(s)))}contains(s){return this.includes(s)}empty(){return new this.constructor([])}"fantasy-land/empty"(){return this.empty()}concat(s){return new this.constructor(this.content.concat(s.content))}"fantasy-land/concat"(s){return this.concat(s)}"fantasy-land/map"(s){return new this.constructor(this.map(s))}"fantasy-land/chain"(s){return this.map((i=>s(i)),this).reduce(((s,i)=>s.concat(i)),this.empty())}"fantasy-land/filter"(s){return new this.constructor(this.content.filter(s))}"fantasy-land/reduce"(s,i){return this.content.reduce(s,i)}get length(){return this.content.length}get isEmpty(){return 0===this.content.length}get first(){return this.getIndex(0)}get second(){return this.getIndex(1)}get last(){return this.getIndex(this.length-1)}}ArrayElement.empty=function empty(){return new this},ArrayElement["fantasy-land/empty"]=ArrayElement.empty,"undefined"!=typeof Symbol&&(ArrayElement.prototype[Symbol.iterator]=function symbol(){return this.content[Symbol.iterator]()}),s.exports=ArrayElement},12242:(s,i,u)=>{const _=u(10316);s.exports=class BooleanElement extends _{constructor(s,i,u){super(s,i,u),this.element="boolean"}primitive(){return"boolean"}}},10316:(s,i,u)=>{const _=u(2404),w=u(55973),x=u(92340);class Element{constructor(s,i,u){i&&(this.meta=i),u&&(this.attributes=u),this.content=s}freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,this.meta.freeze()),this._attributes&&(this.attributes.parent=this,this.attributes.freeze()),this.children.forEach((s=>{s.parent=this,s.freeze()}),this),this.content&&Array.isArray(this.content)&&Object.freeze(this.content),Object.freeze(this))}primitive(){}clone(){const s=new this.constructor;return s.element=this.element,this.meta.length&&(s._meta=this.meta.clone()),this.attributes.length&&(s._attributes=this.attributes.clone()),this.content?this.content.clone?s.content=this.content.clone():Array.isArray(this.content)?s.content=this.content.map((s=>s.clone())):s.content=this.content:s.content=this.content,s}toValue(){return this.content instanceof Element?this.content.toValue():this.content instanceof w?{key:this.content.key.toValue(),value:this.content.value?this.content.value.toValue():void 0}:this.content&&this.content.map?this.content.map((s=>s.toValue()),this):this.content}toRef(s){if(""===this.id.toValue())throw Error("Cannot create reference to an element that does not contain an ID");const i=new this.RefElement(this.id.toValue());return s&&(i.path=s),i}findRecursive(...s){if(arguments.length>1&&!this.isFrozen)throw new Error("Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`");const i=s.pop();let u=new x;const append=(s,i)=>(s.push(i),s),checkElement=(s,u)=>{u.element===i&&s.push(u);const _=u.findRecursive(i);return _&&_.reduce(append,s),u.content instanceof w&&(u.content.key&&checkElement(s,u.content.key),u.content.value&&checkElement(s,u.content.value)),s};return this.content&&(this.content.element&&checkElement(u,this.content),Array.isArray(this.content)&&this.content.reduce(checkElement,u)),s.isEmpty||(u=u.filter((i=>{let u=i.parents.map((s=>s.element));for(const i in s){const _=s[i],w=u.indexOf(_);if(-1===w)return!1;u=u.splice(0,w)}return!0}))),u}set(s){return this.content=s,this}equals(s){return _(this.toValue(),s)}getMetaProperty(s,i){if(!this.meta.hasKey(s)){if(this.isFrozen){const s=this.refract(i);return s.freeze(),s}this.meta.set(s,i)}return this.meta.get(s)}setMetaProperty(s,i){this.meta.set(s,i)}get element(){return this._storedElement||"element"}set element(s){this._storedElement=s}get content(){return this._content}set content(s){if(s instanceof Element)this._content=s;else if(s instanceof x)this.content=s.elements;else if("string"==typeof s||"number"==typeof s||"boolean"==typeof s||"null"===s||null==s)this._content=s;else if(s instanceof w)this._content=s;else if(Array.isArray(s))this._content=s.map(this.refract);else{if("object"!=typeof s)throw new Error("Cannot set content to given value");this._content=Object.keys(s).map((i=>new this.MemberElement(i,s[i])))}}get meta(){if(!this._meta){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._meta=new this.ObjectElement}return this._meta}set meta(s){s instanceof this.ObjectElement?this._meta=s:this.meta.set(s||{})}get attributes(){if(!this._attributes){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._attributes=new this.ObjectElement}return this._attributes}set attributes(s){s instanceof this.ObjectElement?this._attributes=s:this.attributes.set(s||{})}get id(){return this.getMetaProperty("id","")}set id(s){this.setMetaProperty("id",s)}get classes(){return this.getMetaProperty("classes",[])}set classes(s){this.setMetaProperty("classes",s)}get title(){return this.getMetaProperty("title","")}set title(s){this.setMetaProperty("title",s)}get description(){return this.getMetaProperty("description","")}set description(s){this.setMetaProperty("description",s)}get links(){return this.getMetaProperty("links",[])}set links(s){this.setMetaProperty("links",s)}get isFrozen(){return Object.isFrozen(this)}get parents(){let{parent:s}=this;const i=new x;for(;s;)i.push(s),s=s.parent;return i}get children(){if(Array.isArray(this.content))return new x(this.content);if(this.content instanceof w){const s=new x([this.content.key]);return this.content.value&&s.push(this.content.value),s}return this.content instanceof Element?new x([this.content]):new x}get recursiveChildren(){const s=new x;return this.children.forEach((i=>{s.push(i),i.recursiveChildren.forEach((i=>{s.push(i)}))})),s}}s.exports=Element},87726:(s,i,u)=>{const _=u(55973),w=u(10316);s.exports=class MemberElement extends w{constructor(s,i,u,w){super(new _,u,w),this.element="member",this.key=s,this.value=i}get key(){return this.content.key}set key(s){this.content.key=this.refract(s)}get value(){return this.content.value}set value(s){this.content.value=this.refract(s)}}},41067:(s,i,u)=>{const _=u(10316);s.exports=class NullElement extends _{constructor(s,i,u){super(s||null,i,u),this.element="null"}primitive(){return"null"}set(){return new Error("Cannot set the value of null")}}},40239:(s,i,u)=>{const _=u(10316);s.exports=class NumberElement extends _{constructor(s,i,u){super(s,i,u),this.element="number"}primitive(){return"number"}}},61045:(s,i,u)=>{const _=u(6048),w=u(23805),x=u(6233),j=u(87726),P=u(10866);s.exports=class ObjectElement extends x{constructor(s,i,u){super(s||[],i,u),this.element="object"}primitive(){return"object"}toValue(){return this.content.reduce(((s,i)=>(s[i.key.toValue()]=i.value?i.value.toValue():void 0,s)),{})}get(s){const i=this.getMember(s);if(i)return i.value}getMember(s){if(void 0!==s)return this.content.find((i=>i.key.toValue()===s))}remove(s){let i=null;return this.content=this.content.filter((u=>u.key.toValue()!==s||(i=u,!1))),i}getKey(s){const i=this.getMember(s);if(i)return i.key}set(s,i){if(w(s))return Object.keys(s).forEach((i=>{this.set(i,s[i])})),this;const u=s,_=this.getMember(u);return _?_.value=i:this.content.push(new j(u,i)),this}keys(){return this.content.map((s=>s.key.toValue()))}values(){return this.content.map((s=>s.value.toValue()))}hasKey(s){return this.content.some((i=>i.key.equals(s)))}items(){return this.content.map((s=>[s.key.toValue(),s.value.toValue()]))}map(s,i){return this.content.map((u=>s.bind(i)(u.value,u.key,u)))}compactMap(s,i){const u=[];return this.forEach(((_,w,x)=>{const j=s.bind(i)(_,w,x);j&&u.push(j)})),u}filter(s,i){return new P(this.content).filter(s,i)}reject(s,i){return this.filter(_(s),i)}forEach(s,i){return this.content.forEach((u=>s.bind(i)(u.value,u.key,u)))}}},71167:(s,i,u)=>{const _=u(10316);s.exports=class StringElement extends _{constructor(s,i,u){super(s,i,u),this.element="string"}primitive(){return"string"}get length(){return this.content.length}}},75147:(s,i,u)=>{const _=u(85105);s.exports=class JSON06Serialiser extends _{serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);let i;s._attributes&&s.attributes.get("variable")&&(i=s.attributes.get("variable"));const u={element:s.element};s._meta&&s._meta.length>0&&(u.meta=this.serialiseObject(s.meta));const _="enum"===s.element||-1!==s.attributes.keys().indexOf("enumerations");if(_){const i=this.enumSerialiseAttributes(s);i&&(u.attributes=i)}else if(s._attributes&&s._attributes.length>0){let{attributes:_}=s;_.get("metadata")&&(_=_.clone(),_.set("meta",_.get("metadata")),_.remove("metadata")),"member"===s.element&&i&&(_=_.clone(),_.remove("variable")),_.length>0&&(u.attributes=this.serialiseObject(_))}if(_)u.content=this.enumSerialiseContent(s,u);else if(this[`${s.element}SerialiseContent`])u.content=this[`${s.element}SerialiseContent`](s,u);else if(void 0!==s.content){let _;i&&s.content.key?(_=s.content.clone(),_.key.attributes.set("variable",i),_=this.serialiseContent(_)):_=this.serialiseContent(s.content),this.shouldSerialiseContent(s,_)&&(u.content=_)}else this.shouldSerialiseContent(s,s.content)&&s instanceof this.namespace.elements.Array&&(u.content=[]);return u}shouldSerialiseContent(s,i){return"parseResult"===s.element||"httpRequest"===s.element||"httpResponse"===s.element||"category"===s.element||"link"===s.element||void 0!==i&&(!Array.isArray(i)||0!==i.length)}refSerialiseContent(s,i){return delete i.attributes,{href:s.toValue(),path:s.path.toValue()}}sourceMapSerialiseContent(s){return s.toValue()}dataStructureSerialiseContent(s){return[this.serialiseContent(s.content)]}enumSerialiseAttributes(s){const i=s.attributes.clone(),u=i.remove("enumerations")||new this.namespace.elements.Array([]),_=i.get("default");let w=i.get("samples")||new this.namespace.elements.Array([]);if(_&&_.content&&(_.content.attributes&&_.content.attributes.remove("typeAttributes"),i.set("default",new this.namespace.elements.Array([_.content]))),w.forEach((s=>{s.content&&s.content.element&&s.content.attributes.remove("typeAttributes")})),s.content&&0!==u.length&&w.unshift(s.content),w=w.map((s=>s instanceof this.namespace.elements.Array?[s]:new this.namespace.elements.Array([s.content]))),w.length&&i.set("samples",w),i.length>0)return this.serialiseObject(i)}enumSerialiseContent(s){if(s._attributes){const i=s.attributes.get("enumerations");if(i&&i.length>0)return i.content.map((s=>{const i=s.clone();return i.attributes.remove("typeAttributes"),this.serialise(i)}))}if(s.content){const i=s.content.clone();return i.attributes.remove("typeAttributes"),[this.serialise(i)]}return[]}deserialise(s){if("string"==typeof s)return new this.namespace.elements.String(s);if("number"==typeof s)return new this.namespace.elements.Number(s);if("boolean"==typeof s)return new this.namespace.elements.Boolean(s);if(null===s)return new this.namespace.elements.Null;if(Array.isArray(s))return new this.namespace.elements.Array(s.map(this.deserialise,this));const i=this.namespace.getElementClass(s.element),u=new i;u.element!==s.element&&(u.element=s.element),s.meta&&this.deserialiseObject(s.meta,u.meta),s.attributes&&this.deserialiseObject(s.attributes,u.attributes);const _=this.deserialiseContent(s.content);if(void 0===_&&null!==u.content||(u.content=_),"enum"===u.element){u.content&&u.attributes.set("enumerations",u.content);let s=u.attributes.get("samples");if(u.attributes.remove("samples"),s){const _=s;s=new this.namespace.elements.Array,_.forEach((_=>{_.forEach((_=>{const w=new i(_);w.element=u.element,s.push(w)}))}));const w=s.shift();u.content=w?w.content:void 0,u.attributes.set("samples",s)}else u.content=void 0;let _=u.attributes.get("default");if(_&&_.length>0){_=_.get(0);const s=new i(_);s.element=u.element,u.attributes.set("default",s)}}else if("dataStructure"===u.element&&Array.isArray(u.content))[u.content]=u.content;else if("category"===u.element){const s=u.attributes.get("meta");s&&(u.attributes.set("metadata",s),u.attributes.remove("meta"))}else"member"===u.element&&u.key&&u.key._attributes&&u.key._attributes.getValue("variable")&&(u.attributes.set("variable",u.key.attributes.get("variable")),u.key.attributes.remove("variable"));return u}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const i={key:this.serialise(s.key)};return s.value&&(i.value=this.serialise(s.value)),i}return s&&s.map?s.map(this.serialise,this):s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const i=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(i.value=this.deserialise(s.value)),i}if(s.map)return s.map(this.deserialise,this)}return s}shouldRefract(s){return!!(s._attributes&&s.attributes.keys().length||s._meta&&s.meta.keys().length)||"enum"!==s.element&&(s.element!==s.primitive()||"member"===s.element)}convertKeyToRefract(s,i){return this.shouldRefract(i)?this.serialise(i):"enum"===i.element?this.serialiseEnum(i):"array"===i.element?i.map((i=>this.shouldRefract(i)||"default"===s?this.serialise(i):"array"===i.element||"object"===i.element||"enum"===i.element?i.children.map((s=>this.serialise(s))):i.toValue())):"object"===i.element?(i.content||[]).map(this.serialise,this):i.toValue()}serialiseEnum(s){return s.children.map((s=>this.serialise(s)))}serialiseObject(s){const i={};return s.forEach(((s,u)=>{if(s){const _=u.toValue();i[_]=this.convertKeyToRefract(_,s)}})),i}deserialiseObject(s,i){Object.keys(s).forEach((u=>{i.set(u,this.deserialise(s[u]))}))}}},85105:s=>{s.exports=class JSONSerialiser{constructor(s){this.namespace=s||new this.Namespace}serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);const i={element:s.element};s._meta&&s._meta.length>0&&(i.meta=this.serialiseObject(s.meta)),s._attributes&&s._attributes.length>0&&(i.attributes=this.serialiseObject(s.attributes));const u=this.serialiseContent(s.content);return void 0!==u&&(i.content=u),i}deserialise(s){if(!s.element)throw new Error("Given value is not an object containing an element name");const i=new(this.namespace.getElementClass(s.element));i.element!==s.element&&(i.element=s.element),s.meta&&this.deserialiseObject(s.meta,i.meta),s.attributes&&this.deserialiseObject(s.attributes,i.attributes);const u=this.deserialiseContent(s.content);return void 0===u&&null!==i.content||(i.content=u),i}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const i={key:this.serialise(s.key)};return s.value&&(i.value=this.serialise(s.value)),i}if(s&&s.map){if(0===s.length)return;return s.map(this.serialise,this)}return s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const i=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(i.value=this.deserialise(s.value)),i}if(s.map)return s.map(this.deserialise,this)}return s}serialiseObject(s){const i={};if(s.forEach(((s,u)=>{s&&(i[u.toValue()]=this.serialise(s))})),0!==Object.keys(i).length)return i}deserialiseObject(s,i){Object.keys(s).forEach((u=>{i.set(u,this.deserialise(s[u]))}))}}},58859:(s,i,u)=>{var _="function"==typeof Map&&Map.prototype,w=Object.getOwnPropertyDescriptor&&_?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,x=_&&w&&"function"==typeof w.get?w.get:null,j=_&&Map.prototype.forEach,P="function"==typeof Set&&Set.prototype,B=Object.getOwnPropertyDescriptor&&P?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,$=P&&B&&"function"==typeof B.get?B.get:null,U=P&&Set.prototype.forEach,Y="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,X="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,Z="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,ee=Boolean.prototype.valueOf,ae=Object.prototype.toString,ie=Function.prototype.toString,le=String.prototype.match,ce=String.prototype.slice,pe=String.prototype.replace,de=String.prototype.toUpperCase,fe=String.prototype.toLowerCase,ye=RegExp.prototype.test,be=Array.prototype.concat,_e=Array.prototype.join,we=Array.prototype.slice,Se=Math.floor,xe="function"==typeof BigInt?BigInt.prototype.valueOf:null,Pe=Object.getOwnPropertySymbols,Te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,Re="function"==typeof Symbol&&"object"==typeof Symbol.iterator,qe="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===Re||"symbol")?Symbol.toStringTag:null,$e=Object.prototype.propertyIsEnumerable,ze=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(s){return s.__proto__}:null);function addNumericSeparator(s,i){if(s===1/0||s===-1/0||s!=s||s&&s>-1e3&&s<1e3||ye.call(/e/,i))return i;var u=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof s){var _=s<0?-Se(-s):Se(s);if(_!==s){var w=String(_),x=ce.call(i,w.length+1);return pe.call(w,u,"$&_")+"."+pe.call(pe.call(x,/([0-9]{3})/g,"$&_"),/_$/,"")}}return pe.call(i,u,"$&_")}var We=u(42634),He=We.custom,Ye=isSymbol(He)?He:null;function wrapQuotes(s,i,u){var _="double"===(u.quoteStyle||i)?'"':"'";return _+s+_}function quote(s){return pe.call(String(s),/"/g,""")}function isArray(s){return!("[object Array]"!==toStr(s)||qe&&"object"==typeof s&&qe in s)}function isRegExp(s){return!("[object RegExp]"!==toStr(s)||qe&&"object"==typeof s&&qe in s)}function isSymbol(s){if(Re)return s&&"object"==typeof s&&s instanceof Symbol;if("symbol"==typeof s)return!0;if(!s||"object"!=typeof s||!Te)return!1;try{return Te.call(s),!0}catch(s){}return!1}s.exports=function inspect_(s,i,_,w){var P=i||{};if(has(P,"quoteStyle")&&"single"!==P.quoteStyle&&"double"!==P.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(has(P,"maxStringLength")&&("number"==typeof P.maxStringLength?P.maxStringLength<0&&P.maxStringLength!==1/0:null!==P.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var B=!has(P,"customInspect")||P.customInspect;if("boolean"!=typeof B&&"symbol"!==B)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(has(P,"indent")&&null!==P.indent&&"\t"!==P.indent&&!(parseInt(P.indent,10)===P.indent&&P.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(has(P,"numericSeparator")&&"boolean"!=typeof P.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var ae=P.numericSeparator;if(void 0===s)return"undefined";if(null===s)return"null";if("boolean"==typeof s)return s?"true":"false";if("string"==typeof s)return inspectString(s,P);if("number"==typeof s){if(0===s)return 1/0/s>0?"0":"-0";var de=String(s);return ae?addNumericSeparator(s,de):de}if("bigint"==typeof s){var ye=String(s)+"n";return ae?addNumericSeparator(s,ye):ye}var Se=void 0===P.depth?5:P.depth;if(void 0===_&&(_=0),_>=Se&&Se>0&&"object"==typeof s)return isArray(s)?"[Array]":"[Object]";var Pe=function getIndent(s,i){var u;if("\t"===s.indent)u="\t";else{if(!("number"==typeof s.indent&&s.indent>0))return null;u=_e.call(Array(s.indent+1)," ")}return{base:u,prev:_e.call(Array(i+1),u)}}(P,_);if(void 0===w)w=[];else if(indexOf(w,s)>=0)return"[Circular]";function inspect(s,i,u){if(i&&(w=we.call(w)).push(i),u){var x={depth:P.depth};return has(P,"quoteStyle")&&(x.quoteStyle=P.quoteStyle),inspect_(s,x,_+1,w)}return inspect_(s,P,_+1,w)}if("function"==typeof s&&!isRegExp(s)){var He=function nameOf(s){if(s.name)return s.name;var i=le.call(ie.call(s),/^function\s*([\w$]+)/);if(i)return i[1];return null}(s),Xe=arrObjKeys(s,inspect);return"[Function"+(He?": "+He:" (anonymous)")+"]"+(Xe.length>0?" { "+_e.call(Xe,", ")+" }":"")}if(isSymbol(s)){var Qe=Re?pe.call(String(s),/^(Symbol\(.*\))_[^)]*$/,"$1"):Te.call(s);return"object"!=typeof s||Re?Qe:markBoxed(Qe)}if(function isElement(s){if(!s||"object"!=typeof s)return!1;if("undefined"!=typeof HTMLElement&&s instanceof HTMLElement)return!0;return"string"==typeof s.nodeName&&"function"==typeof s.getAttribute}(s)){for(var et="<"+fe.call(String(s.nodeName)),tt=s.attributes||[],rt=0;rt"}if(isArray(s)){if(0===s.length)return"[]";var nt=arrObjKeys(s,inspect);return Pe&&!function singleLineValues(s){for(var i=0;i=0)return!1;return!0}(nt)?"["+indentedJoin(nt,Pe)+"]":"[ "+_e.call(nt,", ")+" ]"}if(function isError(s){return!("[object Error]"!==toStr(s)||qe&&"object"==typeof s&&qe in s)}(s)){var ot=arrObjKeys(s,inspect);return"cause"in Error.prototype||!("cause"in s)||$e.call(s,"cause")?0===ot.length?"["+String(s)+"]":"{ ["+String(s)+"] "+_e.call(ot,", ")+" }":"{ ["+String(s)+"] "+_e.call(be.call("[cause]: "+inspect(s.cause),ot),", ")+" }"}if("object"==typeof s&&B){if(Ye&&"function"==typeof s[Ye]&&We)return We(s,{depth:Se-_});if("symbol"!==B&&"function"==typeof s.inspect)return s.inspect()}if(function isMap(s){if(!x||!s||"object"!=typeof s)return!1;try{x.call(s);try{$.call(s)}catch(s){return!0}return s instanceof Map}catch(s){}return!1}(s)){var st=[];return j&&j.call(s,(function(i,u){st.push(inspect(u,s,!0)+" => "+inspect(i,s))})),collectionOf("Map",x.call(s),st,Pe)}if(function isSet(s){if(!$||!s||"object"!=typeof s)return!1;try{$.call(s);try{x.call(s)}catch(s){return!0}return s instanceof Set}catch(s){}return!1}(s)){var at=[];return U&&U.call(s,(function(i){at.push(inspect(i,s))})),collectionOf("Set",$.call(s),at,Pe)}if(function isWeakMap(s){if(!Y||!s||"object"!=typeof s)return!1;try{Y.call(s,Y);try{X.call(s,X)}catch(s){return!0}return s instanceof WeakMap}catch(s){}return!1}(s))return weakCollectionOf("WeakMap");if(function isWeakSet(s){if(!X||!s||"object"!=typeof s)return!1;try{X.call(s,X);try{Y.call(s,Y)}catch(s){return!0}return s instanceof WeakSet}catch(s){}return!1}(s))return weakCollectionOf("WeakSet");if(function isWeakRef(s){if(!Z||!s||"object"!=typeof s)return!1;try{return Z.call(s),!0}catch(s){}return!1}(s))return weakCollectionOf("WeakRef");if(function isNumber(s){return!("[object Number]"!==toStr(s)||qe&&"object"==typeof s&&qe in s)}(s))return markBoxed(inspect(Number(s)));if(function isBigInt(s){if(!s||"object"!=typeof s||!xe)return!1;try{return xe.call(s),!0}catch(s){}return!1}(s))return markBoxed(inspect(xe.call(s)));if(function isBoolean(s){return!("[object Boolean]"!==toStr(s)||qe&&"object"==typeof s&&qe in s)}(s))return markBoxed(ee.call(s));if(function isString(s){return!("[object String]"!==toStr(s)||qe&&"object"==typeof s&&qe in s)}(s))return markBoxed(inspect(String(s)));if("undefined"!=typeof window&&s===window)return"{ [object Window] }";if(s===u.g)return"{ [object globalThis] }";if(!function isDate(s){return!("[object Date]"!==toStr(s)||qe&&"object"==typeof s&&qe in s)}(s)&&!isRegExp(s)){var it=arrObjKeys(s,inspect),lt=ze?ze(s)===Object.prototype:s instanceof Object||s.constructor===Object,ct=s instanceof Object?"":"null prototype",ut=!lt&&qe&&Object(s)===s&&qe in s?ce.call(toStr(s),8,-1):ct?"Object":"",pt=(lt||"function"!=typeof s.constructor?"":s.constructor.name?s.constructor.name+" ":"")+(ut||ct?"["+_e.call(be.call([],ut||[],ct||[]),": ")+"] ":"");return 0===it.length?pt+"{}":Pe?pt+"{"+indentedJoin(it,Pe)+"}":pt+"{ "+_e.call(it,", ")+" }"}return String(s)};var Xe=Object.prototype.hasOwnProperty||function(s){return s in this};function has(s,i){return Xe.call(s,i)}function toStr(s){return ae.call(s)}function indexOf(s,i){if(s.indexOf)return s.indexOf(i);for(var u=0,_=s.length;u<_;u++)if(s[u]===i)return u;return-1}function inspectString(s,i){if(s.length>i.maxStringLength){var u=s.length-i.maxStringLength,_="... "+u+" more character"+(u>1?"s":"");return inspectString(ce.call(s,0,i.maxStringLength),i)+_}return wrapQuotes(pe.call(pe.call(s,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,lowbyte),"single",i)}function lowbyte(s){var i=s.charCodeAt(0),u={8:"b",9:"t",10:"n",12:"f",13:"r"}[i];return u?"\\"+u:"\\x"+(i<16?"0":"")+de.call(i.toString(16))}function markBoxed(s){return"Object("+s+")"}function weakCollectionOf(s){return s+" { ? }"}function collectionOf(s,i,u,_){return s+" ("+i+") {"+(_?indentedJoin(u,_):_e.call(u,", "))+"}"}function indentedJoin(s,i){if(0===s.length)return"";var u="\n"+i.prev+i.base;return u+_e.call(s,","+u)+"\n"+i.prev}function arrObjKeys(s,i){var u=isArray(s),_=[];if(u){_.length=s.length;for(var w=0;w{var i,u,_=s.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(s){if(i===setTimeout)return setTimeout(s,0);if((i===defaultSetTimout||!i)&&setTimeout)return i=setTimeout,setTimeout(s,0);try{return i(s,0)}catch(u){try{return i.call(null,s,0)}catch(u){return i.call(this,s,0)}}}!function(){try{i="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(s){i=defaultSetTimout}try{u="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(s){u=defaultClearTimeout}}();var w,x=[],j=!1,P=-1;function cleanUpNextTick(){j&&w&&(j=!1,w.length?x=w.concat(x):P=-1,x.length&&drainQueue())}function drainQueue(){if(!j){var s=runTimeout(cleanUpNextTick);j=!0;for(var i=x.length;i;){for(w=x,x=[];++P1)for(var u=1;u{"use strict";var _=u(6925);function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,s.exports=function(){function shim(s,i,u,w,x,j){if(j!==_){var P=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw P.name="Invariant Violation",P}}function getShim(){return shim}shim.isRequired=shim;var s={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return s.PropTypes=s,s}},5556:(s,i,u)=>{s.exports=u(2694)()},6925:s=>{"use strict";s.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},74765:s=>{"use strict";var i=String.prototype.replace,u=/%20/g,_="RFC1738",w="RFC3986";s.exports={default:w,formatters:{RFC1738:function(s){return i.call(s,u,"+")},RFC3986:function(s){return String(s)}},RFC1738:_,RFC3986:w}},55373:(s,i,u)=>{"use strict";var _=u(98636),w=u(62642),x=u(74765);s.exports={formats:x,parse:w,stringify:_}},62642:(s,i,u)=>{"use strict";var _=u(37720),w=Object.prototype.hasOwnProperty,x=Array.isArray,j={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:_.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(s){return s.replace(/&#(\d+);/g,(function(s,i){return String.fromCharCode(parseInt(i,10))}))},parseArrayValue=function(s,i){return s&&"string"==typeof s&&i.comma&&s.indexOf(",")>-1?s.split(","):s},P=function parseQueryStringKeys(s,i,u,_){if(s){var x=u.allowDots?s.replace(/\.([^.[]+)/g,"[$1]"):s,j=/(\[[^[\]]*])/g,P=u.depth>0&&/(\[[^[\]]*])/.exec(x),B=P?x.slice(0,P.index):x,$=[];if(B){if(!u.plainObjects&&w.call(Object.prototype,B)&&!u.allowPrototypes)return;$.push(B)}for(var U=0;u.depth>0&&null!==(P=j.exec(x))&&U=0;--x){var j,P=s[x];if("[]"===P&&u.parseArrays)j=[].concat(w);else{j=u.plainObjects?Object.create(null):{};var B="["===P.charAt(0)&&"]"===P.charAt(P.length-1)?P.slice(1,-1):P,$=parseInt(B,10);u.parseArrays||""!==B?!isNaN($)&&P!==B&&String($)===B&&$>=0&&u.parseArrays&&$<=u.arrayLimit?(j=[])[$]=w:"__proto__"!==B&&(j[B]=w):j={0:w}}w=j}return w}($,i,u,_)}};s.exports=function(s,i){var u=function normalizeParseOptions(s){if(!s)return j;if(null!==s.decoder&&void 0!==s.decoder&&"function"!=typeof s.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==s.charset&&"utf-8"!==s.charset&&"iso-8859-1"!==s.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var i=void 0===s.charset?j.charset:s.charset;return{allowDots:void 0===s.allowDots?j.allowDots:!!s.allowDots,allowPrototypes:"boolean"==typeof s.allowPrototypes?s.allowPrototypes:j.allowPrototypes,allowSparse:"boolean"==typeof s.allowSparse?s.allowSparse:j.allowSparse,arrayLimit:"number"==typeof s.arrayLimit?s.arrayLimit:j.arrayLimit,charset:i,charsetSentinel:"boolean"==typeof s.charsetSentinel?s.charsetSentinel:j.charsetSentinel,comma:"boolean"==typeof s.comma?s.comma:j.comma,decoder:"function"==typeof s.decoder?s.decoder:j.decoder,delimiter:"string"==typeof s.delimiter||_.isRegExp(s.delimiter)?s.delimiter:j.delimiter,depth:"number"==typeof s.depth||!1===s.depth?+s.depth:j.depth,ignoreQueryPrefix:!0===s.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof s.interpretNumericEntities?s.interpretNumericEntities:j.interpretNumericEntities,parameterLimit:"number"==typeof s.parameterLimit?s.parameterLimit:j.parameterLimit,parseArrays:!1!==s.parseArrays,plainObjects:"boolean"==typeof s.plainObjects?s.plainObjects:j.plainObjects,strictNullHandling:"boolean"==typeof s.strictNullHandling?s.strictNullHandling:j.strictNullHandling}}(i);if(""===s||null==s)return u.plainObjects?Object.create(null):{};for(var B="string"==typeof s?function parseQueryStringValues(s,i){var u,P={},B=i.ignoreQueryPrefix?s.replace(/^\?/,""):s,$=i.parameterLimit===1/0?void 0:i.parameterLimit,U=B.split(i.delimiter,$),Y=-1,X=i.charset;if(i.charsetSentinel)for(u=0;u-1&&(ee=x(ee)?[ee]:ee),w.call(P,Z)?P[Z]=_.combine(P[Z],ee):P[Z]=ee}return P}(s,u):s,$=u.plainObjects?Object.create(null):{},U=Object.keys(B),Y=0;Y{"use strict";var _=u(920),w=u(37720),x=u(74765),j=Object.prototype.hasOwnProperty,P={brackets:function brackets(s){return s+"[]"},comma:"comma",indices:function indices(s,i){return s+"["+i+"]"},repeat:function repeat(s){return s}},B=Array.isArray,$=String.prototype.split,U=Array.prototype.push,pushToArray=function(s,i){U.apply(s,B(i)?i:[i])},Y=Date.prototype.toISOString,X=x.default,Z={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:w.encode,encodeValuesOnly:!1,format:X,formatter:x.formatters[X],indices:!1,serializeDate:function serializeDate(s){return Y.call(s)},skipNulls:!1,strictNullHandling:!1},ee={},ae=function stringify(s,i,u,x,j,P,U,Y,X,ae,ie,le,ce,pe,de,fe){for(var ye=s,be=fe,_e=0,we=!1;void 0!==(be=be.get(ee))&&!we;){var Se=be.get(s);if(_e+=1,void 0!==Se){if(Se===_e)throw new RangeError("Cyclic object value");we=!0}void 0===be.get(ee)&&(_e=0)}if("function"==typeof Y?ye=Y(i,ye):ye instanceof Date?ye=ie(ye):"comma"===u&&B(ye)&&(ye=w.maybeMap(ye,(function(s){return s instanceof Date?ie(s):s}))),null===ye){if(j)return U&&!pe?U(i,Z.encoder,de,"key",le):i;ye=""}if(function isNonNullishPrimitive(s){return"string"==typeof s||"number"==typeof s||"boolean"==typeof s||"symbol"==typeof s||"bigint"==typeof s}(ye)||w.isBuffer(ye)){if(U){var xe=pe?i:U(i,Z.encoder,de,"key",le);if("comma"===u&&pe){for(var Pe=$.call(String(ye),","),Te="",Re=0;Re0?ye.join(",")||null:void 0}];else if(B(Y))qe=Y;else{var ze=Object.keys(ye);qe=X?ze.sort(X):ze}for(var We=x&&B(ye)&&1===ye.length?i+"[]":i,He=0;He0?de+pe:""}},37720:(s,i,u)=>{"use strict";var _=u(74765),w=Object.prototype.hasOwnProperty,x=Array.isArray,j=function(){for(var s=[],i=0;i<256;++i)s.push("%"+((i<16?"0":"")+i.toString(16)).toUpperCase());return s}(),P=function arrayToObject(s,i){for(var u=i&&i.plainObjects?Object.create(null):{},_=0;_1;){var i=s.pop(),u=i.obj[i.prop];if(x(u)){for(var _=[],w=0;w=48&&U<=57||U>=65&&U<=90||U>=97&&U<=122||x===_.RFC1738&&(40===U||41===U)?B+=P.charAt($):U<128?B+=j[U]:U<2048?B+=j[192|U>>6]+j[128|63&U]:U<55296||U>=57344?B+=j[224|U>>12]+j[128|U>>6&63]+j[128|63&U]:($+=1,U=65536+((1023&U)<<10|1023&P.charCodeAt($)),B+=j[240|U>>18]+j[128|U>>12&63]+j[128|U>>6&63]+j[128|63&U])}return B},isBuffer:function isBuffer(s){return!(!s||"object"!=typeof s)&&!!(s.constructor&&s.constructor.isBuffer&&s.constructor.isBuffer(s))},isRegExp:function isRegExp(s){return"[object RegExp]"===Object.prototype.toString.call(s)},maybeMap:function maybeMap(s,i){if(x(s)){for(var u=[],_=0;_{"use strict";var u=Object.prototype.hasOwnProperty;function decode(s){try{return decodeURIComponent(s.replace(/\+/g," "))}catch(s){return null}}function encode(s){try{return encodeURIComponent(s)}catch(s){return null}}i.stringify=function querystringify(s,i){i=i||"";var _,w,x=[];for(w in"string"!=typeof i&&(i="?"),s)if(u.call(s,w)){if((_=s[w])||null!=_&&!isNaN(_)||(_=""),w=encode(w),_=encode(_),null===w||null===_)continue;x.push(w+"="+_)}return x.length?i+x.join("&"):""},i.parse=function querystring(s){for(var i,u=/([^=?#&]+)=?([^&]*)/g,_={};i=u.exec(s);){var w=decode(i[1]),x=decode(i[2]);null===w||null===x||w in _||(_[w]=x)}return _}},41859:(s,i,u)=>{const _=u(27096),w=u(78004),x=_.types;s.exports=class RandExp{constructor(s,i){if(this._setDefaults(s),s instanceof RegExp)this.ignoreCase=s.ignoreCase,this.multiline=s.multiline,s=s.source;else{if("string"!=typeof s)throw new Error("Expected a regexp or string");this.ignoreCase=i&&-1!==i.indexOf("i"),this.multiline=i&&-1!==i.indexOf("m")}this.tokens=_(s)}_setDefaults(s){this.max=null!=s.max?s.max:null!=RandExp.prototype.max?RandExp.prototype.max:100,this.defaultRange=s.defaultRange?s.defaultRange:this.defaultRange.clone(),s.randInt&&(this.randInt=s.randInt)}gen(){return this._gen(this.tokens,[])}_gen(s,i){var u,_,w,j,P;switch(s.type){case x.ROOT:case x.GROUP:if(s.followedBy||s.notFollowedBy)return"";for(s.remember&&void 0===s.groupNumber&&(s.groupNumber=i.push(null)-1),_="",j=0,P=(u=s.options?this._randSelect(s.options):s.stack).length;j{"use strict";var _=u(65606),w=65536,x=4294967295;var j=u(92861).Buffer,P=u.g.crypto||u.g.msCrypto;P&&P.getRandomValues?s.exports=function randomBytes(s,i){if(s>x)throw new RangeError("requested too many random bytes");var u=j.allocUnsafe(s);if(s>0)if(s>w)for(var B=0;B{"use strict";function _typeof(s){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},_typeof(s)}Object.defineProperty(i,"__esModule",{value:!0}),i.CopyToClipboard=void 0;var _=_interopRequireDefault(u(96540)),w=_interopRequireDefault(u(17965)),x=["text","onCopy","options","children"];function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function ownKeys(s,i){var u=Object.keys(s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(s);i&&(_=_.filter((function(i){return Object.getOwnPropertyDescriptor(s,i).enumerable}))),u.push.apply(u,_)}return u}function _objectSpread(s){for(var i=1;i=0||(w[u]=s[u]);return w}(s,i);if(Object.getOwnPropertySymbols){var x=Object.getOwnPropertySymbols(s);for(_=0;_=0||Object.prototype.propertyIsEnumerable.call(s,u)&&(w[u]=s[u])}return w}function _defineProperties(s,i){for(var u=0;u{"use strict";var _=u(25264).CopyToClipboard;_.CopyToClipboard=_,s.exports=_},81214:(s,i,u)=>{"use strict";function _typeof(s){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},_typeof(s)}Object.defineProperty(i,"__esModule",{value:!0}),i.DebounceInput=void 0;var _=_interopRequireDefault(u(96540)),w=_interopRequireDefault(u(20181)),x=["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"];function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function _objectWithoutProperties(s,i){if(null==s)return{};var u,_,w=function _objectWithoutPropertiesLoose(s,i){if(null==s)return{};var u,_,w={},x=Object.keys(s);for(_=0;_=0||(w[u]=s[u]);return w}(s,i);if(Object.getOwnPropertySymbols){var x=Object.getOwnPropertySymbols(s);for(_=0;_=0||Object.prototype.propertyIsEnumerable.call(s,u)&&(w[u]=s[u])}return w}function ownKeys(s,i){var u=Object.keys(s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(s);i&&(_=_.filter((function(i){return Object.getOwnPropertyDescriptor(s,i).enumerable}))),u.push.apply(u,_)}return u}function _objectSpread(s){for(var i=1;i=_?u.notify(s):i.length>w.length&&u.notify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:""})}))}))})),_defineProperty(_assertThisInitialized(u),"onKeyDown",(function(s){"Enter"===s.key&&u.forceNotify(s);var i=u.props.onKeyDown;i&&(s.persist(),i(s))})),_defineProperty(_assertThisInitialized(u),"onBlur",(function(s){u.forceNotify(s);var i=u.props.onBlur;i&&(s.persist(),i(s))})),_defineProperty(_assertThisInitialized(u),"createNotifier",(function(s){if(s<0)u.notify=function(){return null};else if(0===s)u.notify=u.doNotify;else{var i=(0,w.default)((function(s){u.isDebouncing=!1,u.doNotify(s)}),s);u.notify=function(s){u.isDebouncing=!0,i(s)},u.flush=function(){return i.flush()},u.cancel=function(){u.isDebouncing=!1,i.cancel()}}})),_defineProperty(_assertThisInitialized(u),"doNotify",(function(){u.props.onChange.apply(void 0,arguments)})),_defineProperty(_assertThisInitialized(u),"forceNotify",(function(s){var i=u.props.debounceTimeout;if(u.isDebouncing||!(i>0)){u.cancel&&u.cancel();var _=u.state.value,w=u.props.minLength;_.length>=w?u.doNotify(s):u.doNotify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:_})}))}})),u.isDebouncing=!1,u.state={value:void 0===s.value||null===s.value?"":s.value};var _=u.props.debounceTimeout;return u.createNotifier(_),u}return function _createClass(s,i,u){return i&&_defineProperties(s.prototype,i),u&&_defineProperties(s,u),Object.defineProperty(s,"prototype",{writable:!1}),s}(DebounceInput,[{key:"componentDidUpdate",value:function componentDidUpdate(s){if(!this.isDebouncing){var i=this.props,u=i.value,_=i.debounceTimeout,w=s.debounceTimeout,x=s.value,j=this.state.value;void 0!==u&&x!==u&&j!==u&&this.setState({value:u}),_!==w&&this.createNotifier(_)}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.flush&&this.flush()}},{key:"render",value:function render(){var s,i,u=this.props,w=u.element,j=(u.onChange,u.value,u.minLength,u.debounceTimeout,u.forceNotifyByEnter),P=u.forceNotifyOnBlur,B=u.onKeyDown,$=u.onBlur,U=u.inputRef,Y=_objectWithoutProperties(u,x),X=this.state.value;s=j?{onKeyDown:this.onKeyDown}:B?{onKeyDown:B}:{},i=P?{onBlur:this.onBlur}:$?{onBlur:$}:{};var Z=U?{ref:U}:{};return _.default.createElement(w,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},Y),{},{onChange:this.onChange,value:X},s),i),Z))}}]),DebounceInput}(_.default.PureComponent);i.DebounceInput=j,_defineProperty(j,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},24677:(s,i,u)=>{"use strict";var _=u(81214).DebounceInput;_.DebounceInput=_,s.exports=_},22551:(s,i,u)=>{"use strict";var _=u(96540),w=u(69982);function p(s){for(var i="https://reactjs.org/docs/error-decoder.html?invariant="+s,u=1;u