diff --git a/README.md b/README.md index 39dedd60ec..bdff47b434 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,137 @@ -# Dynamox Developer Challenges +# 🎟️ Event Management System -## About Dynamox +Aplicação web desenvolvida como parte de um **teste técnico**, com o objetivo de demonstrar habilidades no desenvolvimento de interfaces modernas, controle de acesso por papéis de usuário e gerenciamento de eventos. -[Dynamox](https://dynamox.net/) is a high-tech firm specializing in vibration analysis and industrial asset condition monitoring. Our expert team develops comprehensive hardware and software solutions, encompassing firmware, mobile applications (Android and iOS), and full-stack cloud native applications. +A aplicação permite que **administradores gerenciem eventos** enquanto **leitores podem visualizar as informações disponíveis**. -With our proficiency in signal processing for vibration and acoustics, we deliver advanced and precise monitoring systems. We are committed to optimizing operational efficiency and facilitating proactive maintenance through our innovative technology and integrated solutions. +--- -## Positions +# 🌐 Deploy -We are looking for developers who are passionate about learning, growing, and contributing to our team. You will play a key role in our development efforts, working on a variety of projects and collaborating with different teams to build and improve our solutions. +A aplicação está disponível em: -We value flexibility and collaboration, hence we provide opportunities for you to lend your skills to other teams when required. Join us on this exciting journey as we revolutionize our digital platforms. Currently we are particularly interested in individuals who can identify with one of the following role descriptions: +https://dyna-eventhub.vercel.app/ -### Junior Software Developer +--- -With limited experience, assists in coding, testing, and stabilizing systems under supervision. Communicates with immediate team members and solves straightforward problems with guidance. Should display a willingness to learn and grow professionally. This is an individual contributor role. +# 👥 Usuários de Teste -### Mid-level Software Developer +Para facilitar a avaliação do sistema, existem dois usuários pré-configurados: -With a certain level of proven experience, contributes to software development, solves moderate problems, and starts handling ambiguous situations with minimal guidance. Communicates with the broader team and engages in code reviews and documentation. This role also includes supporting junior engineers and commitment to continuous learning. This is an individual contributor role. +### 🔑 Admin -### Senior-level Software Developer +Email: -With vast experience, enhances software development, leading complex system development and ambiguous situation handling. Tackles intricate problems and mentors junior and mid-level engineers. Champions coding standards, project strategy, and technology adoption. Communicates across teams, influencing technical and non-technical stakeholders. This individual contributor role blends technical expertise with leadership, focusing on innovation, mentorship, and strategic contributions to the development process. +``` +admin@events.com +``` -## Challenges Full-Stack +Senha: -- [ ] [01 - Dynamox Full-Stack Node.js React Developer Challenge](./full-stack-challenge.md) -- [ ] [02 - Dynamox Full-Stack C# React Developer Challenge](./full-stack-csharp-react-challenge.md) - -## Challenges Front-End +``` +admin123 +``` -- [ ] [01 - Dynamox Front-end React Developer Challenge Marketing Teams](./front-end-challenge-v1.md) -- [ ] [02 - Dynamox Front-end React Developer Challenge Product Teams](./front-end-challenge-v2.md) +Permissões: -## Challenges DevOps +* Criar eventos +* Editar eventos +* Excluir eventos +* Visualizar eventos -- [ ] [01 - Dynamox DevOps Developer Challenge Foundation Teams](./dev-sec-fin-ops-challenge-v1/README.md) +--- -## Challenges Mobile +### 👤 Reader -- [ ] [01 - Dynamox Kotlin Multiplatform Developer Challenge](./kotlin-multiplatform-challenge.md) -- [ ] [02 - Dynamox Android Developer Challenge](./android-challenge.md) -- [ ] [03 - Dynamox iOS Developer Challenge](./ios-challenge.md) +Email: -## Challenge Back-End -- [ ] [01 - Dynamox Back-End Time Series ](./back-end-challenge-v1.md) +``` +reader@events.com +``` -## Challenge QA -- [ ] [01- Dynamox QA Challenge](./qa-challenge.md) +Senha: -
+``` +reader123 +``` -**Good luck! We look forward to reviewing your submission.** 🚀 +Permissões: + +* Apenas visualizar eventos + +--- + +# ⚙️ Rodando o projeto localmente + +### 1️⃣ Clonar o repositório + +```bash +git clone https://github.com/olivan94/developer-challenges.git +cd dynamox-event-app +``` + +--- + +### 2️⃣ Instalar as dependências + +```bash +npm install +``` + +--- + +### 3️⃣ Iniciar a aplicação + +Em outro terminal: + +```bash +npm run dev +``` + +A aplicação estará disponível em: + +``` +http://localhost:3001 +``` + +--- + +# ⚠️ Observação Importante + +Antes de rodar a aplicação, **certifique-se de que está na pasta correta do projeto**, onde está localizado o arquivo: + +``` +package.json +``` + +Caso contrário os comandos `npm install` ou `npm run dev` podem não funcionar corretamente. + +--- + +# 🛠️ Tecnologias Utilizadas + +* Next.js +* React +* Redux Toolkit +* Material UI +* json-server + +--- + +# 📌 Funcionalidades + +* Autenticação de usuário +* Controle de acesso por papel (Admin / Reader) +* Listagem de eventos +* Criação de eventos +* Edição de eventos +* Exclusão de eventos +* Interface responsiva + +--- + +# 📄 Observações + +Este projeto foi desenvolvido exclusivamente para fins de avaliação técnica. + +--- diff --git a/android-challenge.md b/android-challenge.md deleted file mode 100644 index bb3168beec..0000000000 --- a/android-challenge.md +++ /dev/null @@ -1,130 +0,0 @@ -# Dynamox Android Developer Challenge - -## Overview - -The test consists of developing a robust and intuitive Android Quiz application in Kotlin. - -The quiz is composed by a sequence of 10 multiple-choice questions. When the app opens, the user enters their name or nickname and presses a button to start the quiz. Questions must be obtained via HTTP requests and are received in JSON format as shown below. - -```json -{ - "id": "22", - "statement": "What is the name of the coolest company in the world?", - "options": [ - "Google", - "Microsoft", - "Dynamox", - "Spotify", - "Amazon" - ] -} -``` - -The response to each question is checked via an HTTP POST request. The server returns whether the answer was correct or not sending true or false in JSON format as shown below. - -```json -{ - "result": true -} -``` - -The users of the app should know whether they got the question right before moving on to the next one. At the end of the 10 questions, the app should display the user's score and offer an option to restart the quiz. - -Throughout the challenge, we expect you to demonstrate familiarity with the proposed technologies, apply development best practices, and showcase your problem-solving skills. **Code quality, clarity, readability, and maintainability** will be the main evaluation points. - -## User Stories and Functional Requirements -Below are the functional requirements for the application. Feel free to make any assumptions you deem necessary to complete the challenge, documenting them in the README. - -### 1 - Quiz visualization and answer submission -- [ ] As a user, I want to load a question with a set of alternative answers, so that I can choose the one that is right. -- [ ] As a user, I want to choose an answer for a question from a set of alternatives and submit it, so that I can know if I made the right choice. - -### 2 - Quiz navigation -- [ ] As a user, I want to move to the next question once I have received the result of my answer submission, so that I can get to the end of the quiz. -- [ ] As a user, I want to know the final score for the quiz once I have submitted 10 answers, so that I could share it with friends -- [ ] As a user I want to restart the quiz with new questions, so that I could get a new score - -### 3 - User management -- [ ] As a user, I want to register my name or nickname, so that different users could use the app -- [ ] As a user, I want to save the score of every quiz I made, so that I can visualize the score of every user at all times - -## Backend API - -- Backend host: https://quiz-api-bwi5hjqyaq-uc.a.run.app - -### GET /question - -Use this endpoint to obtain a random question from the server. It returns a response in the following format: - -```json -{ - "id": "22", - "statement": "What is the name of the coolest company in the world?", - "options": [ - "Google", - "Microsoft", - "Dynamox", - "Spotify", - "Amazon" - ] -} -``` - -### POST /answer?questionId=$id - -Use this endpoint to check whether the user's answer is correct. The POST body must contain the user's answer in the following format: - -```json -{ - "answer": "Dynamox" -} -``` - -The server will return: - -```json -{ - "result": true -} -``` - -## Mandatory Technical Requirements - -- [ ] The application must be written in **Kotlin** -- [ ] Use a data persistence mechanism to store players and scores -- [ ] Use Jetpack Compose for the views -- [ ] Ensure correct business logic and behavior with automated unit tests. - ---- - -## Bonus Points (Optional Requirements) -These items (1 to 3) are not mandatory, but implementing them will significantly enhance the quality of your evaluation. - -### 1 - Best Practices & Architecture -- [ ] Use **Dependency Injection** to manage the application's dependencies. -- [ ] Use **Kotlin Flow/Coroutines** for asynchronous operations. -- [ ] Use consistent design, animations, icons, etc. -- [ ] Divide the solution into **layers of responsibility** (e.g., Api, Application, Domain, Infrastructure). -- [ ] Implement some design pattern. -- [ ] Implement **consistent error handling**, with appropriate HTTP status codes (e.g., `400` for validation, `404` for not found, `500` for unexpected errors). - -### 2 - Quality & DevOps -- [ ] Write **integration tests** for the main business logic. -- [ ] Create a **README.md** file with clear instructions to run the project locally (either with Docker or manually). - ---- - -## Evaluation Criteria - -- Technical capability -- Android knowledge -- Project and code architecture -- Code reuse -- Code readability -- Commit history - -## Submission Instructions -1. **Fork** this repository to your personal GitHub account. -2. Create a new **branch** from `main` with your name (e.g., `firstname-lastname`). -3. After completing the challenge, open a **Pull Request** from your branch to the original repository's `main` branch. -4. Our team will be notified, review your solution, and get in touch with you. \ No newline at end of file diff --git a/back-end-challenge-v1.md b/back-end-challenge-v1.md deleted file mode 100644 index 46d4e8d19d..0000000000 --- a/back-end-challenge-v1.md +++ /dev/null @@ -1,79 +0,0 @@ -# Dynamox Back-end Developer Challenge - -[< back to README](./README.md) - -Dynamox Back-end|Data Science development team presents you with the following challenge: - -**Using Python develop a sever side solution that demonstrate your expertise in back-end development.** - ---- - -Keep in mind the challenge aims to reproduce an environment where you could demonstrate your skills. - -In order to help guiding your development process we will provide some requirements. It is not mandatory to fulfill all requirements to submit your implementation. The more requirements you implement, the more resources we will have to assess your skills and knowledge. - -Use your best judgement to prioritize tasks to meet the time you have available. Feel free to make any assumptions you consider necessary to complete the task. - -## Challenge 1: Signal Processing API🌐 - -### Overview -In this challenge, you will create a modern and performant api that showcases your expertise in backend development, database modeling and networking. - - -### Functional Requirements and User Stories - -The server side application is the backbone of many modern applications, low latency, high diponibility, safety and security are crucial, your implementation must follow best practices in those areas. Your back-end application is a time-series processor, it holds time-series data in a persistant storage, it can receive raw data series, and retrieve metrics about the time series, and delete the same data. - -1 - User Stories -1. [ ] As a user, I want to be able to store a raw data series. -2. [ ] As a user, I want to be able to retrieve metrics about the time series. -3. [ ] As a user, I want to be able to delete a time series i've sent to the server. -4. [ ] As a user, I want to be able to retrieve the number of time series i've stored in the server. -5. [ ] As a user, I want to be able to retrieve the a full time series, i've stored. - -2 - Technical Requirements -1. [ ] Use Python -2. [ ] Use a REST-API framework (ex.: FastAPI) -3. [ ] The latency between client and the server side must be below 350ms in all requests -4. [ ] Use a database to store the time series data -5. [ ] Ensure correct business logic and behavior with automated unit tests (ex.: pytest); - -3 - Bonus -1. [ ] Deploy your application to a cloud provider and provide the api url. -2. [ ] Implement a functionality that gives me a future prediction of the time series data. -3. [ ] Add load balancer to the application. -4. [ ] Add load tests to the application. - - -## Evaluation Criteria - -Each one of the items above will be evaluated as "Not Implemented", "Implemented with Issues", "Implemented", or "Implemented with Excellence". In order to assess different profiles and experiences, we expect candidates applying to more senior levels demonstrate a deeper understanding of the requirements and implement more of them in the same deadline. - -In general we will be looking for the following: -1. [ ] Anyone should be able to follow the instructions and run the application. -2. [ ] Back-end code successfully integrated with a persistant storage. -3. [ ] Stories were implemented according to the functional requirements. -4. [ ] Problem-solving skills and ability to handle ambiguity. -5. [ ] Code quality, readability, and maintainability. -6. [ ] Code is well-organized and documented. - -## Ready to Begin the Challenges? - -* Fork this repository to your own Github account. -* Create a new branch using your first name and last name. For example: `caroline-oliveira`. -* After completing the challenge, create a pull request to this repository (https://github.com/dynamox-s-a/developer-challenges) pointing to the main branch. -* We will receive a notification about your pull request, review your solution and get in touch with you. -
- -**Good luck! We look forward to reviewing your submission.** 🚀 - -## Frequently Asked Questions - -* Is it necessary to fork the project? - **Yes, this allows us to see how much time you spent on the challenge.** - -* Can I use IA to complete the challenge? - **Yes, however have in mind you will need to explain your decision and code** - -* If I have more questions, who can I contact? - **Please reply to the email who sent you this test.** diff --git a/dev-sec-fin-ops-challenge-v1/.gitignore b/dev-sec-fin-ops-challenge-v1/.gitignore deleted file mode 100644 index 9b8a46e692..0000000000 --- a/dev-sec-fin-ops-challenge-v1/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# Local .terraform directories -**/.terraform/* - -# .tfstate files -*.tfstate -*.tfstate.* - -# Crash log files -crash.log -crash.*.log - -# Exclude all .tfvars files, which are likely to contain sensitive data, such as -# password, private keys, and other secrets. These should not be part of version -# control as they are data points which are potentially sensitive and subject -# to change depending on the environment. -*.tfvars -*.tfvars.json - -# Ignore override files as they are usually used to override resources locally and so -# are not checked in -override.tf -override.tf.json -*_override.tf -*_override.tf.json - -# Include override files you do wish to add to version control using negated pattern -# !example_override.tf - -# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan -# example: *tfplan* - -# Ignore CLI configuration files -.terraformrc -terraform.rc diff --git a/dev-sec-fin-ops-challenge-v1/README.md b/dev-sec-fin-ops-challenge-v1/README.md deleted file mode 100644 index 864bf895b7..0000000000 --- a/dev-sec-fin-ops-challenge-v1/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# Dynamox Dev-Sec-Fin-Ops Developer Challenge - -[< back to Dynamox Developer Challenges](https://github.com/dynamox-s-a/developer-challenges) - -In order to contribute to the enhancement of Dynamox solutions, we present you with the following challenge: - -Build a robust and intuitive infrastructure developed using Terraform, Kubernetes, Docker, and Google Cloud. It should include two Kubernetes workloads and brief analysis about DevOps, SecOps and FinOps. **This workloads are extremously complex: an extractor and an API that counts the number of successful requests. Please use this merely as a case of study.** - -While going through the challenge, you should be able to handle ambiguous situations, adhere to best practices in cloud development, and demonstrate excellent problem-solving skills. Effective communication through well-documented code, code quality, readability, and maintainability will also be evaluated. - -## User Stories and Functional Requirements - -Here you have the functional requirements for the application. You are free to make any assumptions you consider necessary to complete the challenge. If you have any questions, reply to the email who sent you this test. - ---- - -It is not mandatory to implement all the listed requirements before submitting your implementation. Just keep in mind that the more requirements you implement, the more you will be able to demonstrate your skills and knowledge. **Plan yourself to demonstrate what you want. Planning for future implementantion that are not required is also encoraged.** - -We will expect candidates applying to more senior levels to demonstrate a deeper understanding of the requirements and to implement / plan / propose more of them for the same deadline. - ---- - -You can use the following user stories as a guide to implement the application features. [Use dev-sec-fin-ops-challenge-answer-template.md as your answer template](./challenge-answer-template.md). - -1 - Backend Deployment - -1. [ ] As an user, I want to request (via a REST API) the number of successful requests received by the Backend Deployment. -1. [ ] As a developer, I want to run the service locally. -1. [ ] As a developer, I want to run the service in docker environment. -1. [ ] As a developer, I want to run the service in minikube environment. - -2 - Extraction Cronjob - -1. [ ] As an user, I want to access the requests that were extracted from Backend Deployment in a frequency of every-15-minutes by the Extractor Cronjob. -1. [ ] As a developer, I want to run the service locally. -1. [ ] As a developer, I want to run the service in docker environment. -1. [ ] As a developer, I want to run the service in minikube environment. - -3 - DevOps Analysis - -1. [ ] Describe the process to release a new version of these services and propose/implement automation pipelines. - -4 - SecOps Analysis - -1. [ ] List any security risks involving these services and propose mitigation actions. - -5 - FinOps Analysis - -1. [ ] Make 30-days and 365-days cost estimative of the services on Google Cloud, considering the following configurations. -**Attention! Do not use this number of pods in your test configuration, avoid cloud charges whenever is possible** - -| Attributes | Backend Deployment | Extraction Cronjob | -| -------------- | ------------------ | ------------------ | -| Machine Type | n1-highcpu-4 | n1-highmem-2 | -| Number of Pods | 55 | 28 | -| CPU | 1250m | 0.5 | -| Memory | 512Mi | 2Gi | - -6 - Bonus - -1. [ ] Draw a architectural diagram for this test. -1. [ ] Implement your own back-end code (NodeJS JavaScript runtime or Python is a differentiator). -1. [ ] Use Nest.js Framework (JS) or FastApi Framework (Python) for the back-end. -1. [ ] Use either PostgreSQL, MongoDB, or filesystem bucket-like solution (for example, Google Storage) as a persistence layer of your backend. -1. [ ] Implement logs for the applications (let us know how to find them, otherwise we won't be able to evaluate). -1. [ ] Implement unit tests for the application (let us know how to run them, otherwise we won't be able to evaluate). -1. [ ] Implement e2e tests (full user flow) with Cypress (NodeJs) or Pytest (Python). -1. [ ] If you were provided with a baseline code, identify any areas of bad code or suboptimal implementations, refactor them, and documment refactors. -1. [ ] Implement and document DevOps, SecOps, and FinOps improvements. -1. [ ] Implement an authentication/authorization layer. -1. [ ] Use service monitoring tools (such as Prometheus, Grafana). -1. [ ] Deploy your application to a cloud provider (Google Cloud is a differentiator) and provide a link for the running app. - -7 - Tips - -1. [ ] Not familiar with Terraform? Check out [these tutorials](https://developer.hashicorp.com/terraform/tutorials) to get started. -1. [ ] Not familiar with MiniKube? Check out [these tutorials](https://minikube.sigs.k8s.io/docs/tutorials/) to get started. -1. [ ] Not familiar with Docker? Check out [these tutorials](https://docs.docker.com/get-started/) to get started. -1. [ ] You can mock your back-end using a docker image like [nginx](https://hub.docker.com/_/nginx) or a package like [json-server](https://www.npmjs.com/package/json-server), which creates a fake REST API. Bear in mind that those implementing their own back-end will check more boxes in the evaluation process. - -
- -## Evaluation Criteria - -The items listed above will have different weights in the evaluation process. Each one of them will be evaluated as "Not Implemented", "Implemented with Issues", "Implemented", or "Implemented with Excellence". Use your judgement to prioritize the requirements you will implement in the time you have available. - -In general we will be looking for the following: - -1. [ ] Anyone should be able to follow the instructions and run the applications. -1. [ ] User stories were implemented according to the functional requirements. -1. [ ] Infrastructure code is successfully integrated with a backend APIs (either a fake one, or one you built yourself). -1. [ ] Infrastructure code is successfully integrated with local or cloud infrastructure. -1. [ ] Documment future implementations in a clear way. -1. [ ] Ability to refactor existing code (if applicable) and write tests for the written code. -1. [ ] Adherence to best practices in cloud development. -1. [ ] Problem-solving skills and ability to handle ambiguity. -1. [ ] Code quality, readability, and maintainability. - -## Ready to Begin the Challenges? - -1. [ ] Fork this repository to your own Github account. -1. [ ] Create a new branch using your first name and last name. For example: `caroline-oliveira`. -1. [ ] After completing the challenge, create a pull request to this repository (https://github.com/dynamox-s-a/dev-sec-fin-ops-developer-challenge), aimed at the main branch. -1. [ ] We will receive a notification about your pull request, review your solution, and get in touch with you. - -## Frequently Asked Questions - -1. Is it necessary to fork the project? - **Yes, this allows us to see how much time you spent on the challenge.** - -1. If I have more questions, who can I contact? - **Please reply to the email who sent you this test** - -1. Can I build my own back-end API? - **Yes, you can build your own back-end API, but it needs to use NodeJS or Python.** - -1. Can I use any NodeJS framework to the back-end? - **Yes, but we encourage you to use Nest.js. We are currently migrating away from pure ExpressJS and from Adonis.** - -
- -**Good luck! We look forward to reviewing your submission.** 🚀 diff --git a/dev-sec-fin-ops-challenge-v1/challenge-answer-template.md b/dev-sec-fin-ops-challenge-v1/challenge-answer-template.md deleted file mode 100644 index 67ecbad26c..0000000000 --- a/dev-sec-fin-ops-challenge-v1/challenge-answer-template.md +++ /dev/null @@ -1,41 +0,0 @@ -# Dynamox Dev-Sec-Fin-Ops Developer Challenge Answer Template - -The following is a template for your answer to [Dynamox Dev-Sec-Fin-Ops Developer Challenge](./README.md). - -## Initial Setup - -* [Git setup](https://git-scm.com/downloads) -* Editor setup ([Visual Studio Code](https://code.visualstudio.com/download) is a differentiator) - -## Test's Setup - -* Backend Deployment - * [O.S. environment setup](src/services/backend-deployment/README.md) - * [Docker environment setup](src/services/backend-deployment/README.md) - * [Minikube environment setup](src/infrastructure-as-code/README.md) - * Cloud environment setup -* Extractor Cronjob - * [O.S. environment setup](src/services/backend-deployment/README.md) - * [Docker environment setup](src/services/backend-deployment/README.md) - * [Minikube environment setup](src/infrastructure-as-code/README.md) - * Cloud environment setup - -## Test's architectural diagram - -TODO. - -## DevOps Brief Analysis - -TODO. - -## SecOps Brief Analysis - -TODO. - -## FinOps Brief Analysis - -TODO. - -## Future Implementations Plan - -TODO. diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/PROVISIONING.md b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/PROVISIONING.md deleted file mode 100644 index f0c8eeef02..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/PROVISIONING.md +++ /dev/null @@ -1,15 +0,0 @@ -# Provisioning - -Manual steps for provisioning Infrastructure as Code (IaC). - -## Install tools - -* [Terraform setup](https://developer.hashicorp.com/terraform/install), [for Windows tips](https://learn.microsoft.com/en-us/azure/developer/terraform/get-started-windows-bash?tabs=bash) -* [Docker setup](https://docs.docker.com/get-docker/) -* [Minikube setup](https://minikube.sigs.k8s.io/docs/start/) - -## Start Minikube Cluster - -```bash -minikube start -``` diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/README.md b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/README.md deleted file mode 100644 index 41173b9c05..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Setup - -Setup for provisioning Infrastructure as Code (IaC). - -``` bash -. -└── infrastructure-as-code/ - ├── modules # Collection of multiple resources about the same service/solution. - ├── production # end-user environment - └── staging # test/developer environment -``` - -## Provisioning - -* [Provisioning](./PROVISIONING.md) - -## Apply Terraform IaC - -```bash -cd ./src/infrastructure-as-code/production -terraform init -terraform plan -terraform apply -``` - -## Validate Kubernetes workloads - -```bash -kubectl get pods -``` - -## Cleanup - -```bash -cd ./src/infrastructure-as-code/production -terraform destroy -minikube stop -minikube delete -``` diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/.terraform-docs.yml b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/.terraform-docs.yml deleted file mode 100644 index a0b1a4133c..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/.terraform-docs.yml +++ /dev/null @@ -1,40 +0,0 @@ -formatter: "markdown table" -version: "0.17.0" - -content: |- - {{ .Requirements }} - - {{ .Inputs }} - - {{ .Outputs }} - - {{ .Resources }} - -output: - file: README.md - mode: inject - -sections: - hide: [providers] - -output-values: - enabled: false - from: "" - -sort: - enabled: false - -settings: - anchor: true - color: true - default: true - description: false - escape: true - hide-empty: false - html: true - indent: 2 - lockfile: true - read-comments: true - required: true - sensitive: true - type: true diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/README.md b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/README.md deleted file mode 100644 index f1d1f64675..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Backend Deployment Module - - -## Requirements - -| Name | Version | -|------|---------| -| [kubernetes](#requirement\_kubernetes) | ~> 2.27 | - -## Inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| [name](#input\_name) | Backend Deployment name | `string` | n/a | yes | -| [image](#input\_image) | Backend Deployment image | `string` | n/a | yes | -| [replicas](#input\_replicas) | Backend Deployment number of replicas | `string` | n/a | yes | -| [limits](#input\_limits) | Backend Deployment number of replicas |
object({
cpu = string
memory = string
})
| n/a | yes | -| [requests](#input\_requests) | Backend Deployment number of replicas |
object({
cpu = string
memory = string
})
| n/a | yes | - -## Outputs - -No outputs. - -## Resources - -| Name | Type | -|------|------| -| [kubernetes_deployment_v1.main](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment_v1) | resource | - diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/main.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/main.tf deleted file mode 100644 index 61b8238cd8..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/main.tf +++ /dev/null @@ -1,49 +0,0 @@ -locals { - module_version = reverse(split("/", abspath(path.module)))[0] - module_name = reverse(split("/", abspath(path.module)))[1] -} - -resource "kubernetes_deployment_v1" "main" { - metadata { - name = var.name - labels = { - test = var.name - } - } - - spec { - replicas = var.replicas - - selector { - match_labels = { - test = var.name - } - } - - template { - metadata { - labels = { - test = var.name - } - } - - spec { - container { - image = var.image - name = var.name - - resources { - limits = { - cpu = var.limits.cpu - memory = var.limits.memory - } - requests = { - cpu = var.requests.cpu - memory = var.requests.memory - } - } - } - } - } - } -} \ No newline at end of file diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/outputs.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/outputs.tf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/providers.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/providers.tf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/variables.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/variables.tf deleted file mode 100644 index f8d2114c84..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/variables.tf +++ /dev/null @@ -1,30 +0,0 @@ -variable "name" { - description = "Backend Deployment name" - type = string -} - -variable "image" { - description = "Backend Deployment image" - type = string -} - -variable "replicas" { - description = "Backend Deployment number of replicas" - type = string -} - -variable "limits" { - description = "Backend Deployment number of replicas" - type = object({ - cpu = string - memory = string - }) -} - -variable "requests" { - description = "Backend Deployment number of replicas" - type = object({ - cpu = string - memory = string - }) -} diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/version.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/version.tf deleted file mode 100644 index be03bc4c0a..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/backend-deployment/v1.0.0/version.tf +++ /dev/null @@ -1,8 +0,0 @@ -terraform { - required_providers { - kubernetes = { - source = "hashicorp/kubernetes" - version = "~> 2.27" - } - } -} \ No newline at end of file diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/.terraform-docs.yml b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/.terraform-docs.yml deleted file mode 100644 index 16ab28e57a..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/.terraform-docs.yml +++ /dev/null @@ -1,40 +0,0 @@ -formatter: "markdown table" -version: "0.16.0" - -content: |- - {{ .Requirements }} - - {{ .Inputs }} - - {{ .Outputs }} - - {{ .Resources }} - -output: - file: README.md - mode: inject - -sections: - hide: [providers] - -output-values: - enabled: false - from: "" - -sort: - enabled: false - -settings: - anchor: true - color: true - default: true - description: false - escape: true - hide-empty: false - html: true - indent: 2 - lockfile: true - read-comments: true - required: true - sensitive: true - type: true diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/README.md b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/README.md deleted file mode 100644 index a7b79507be..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# $MODULE - - -## Requirements - -No requirements. - -## Inputs - -No inputs. - -## Outputs - -No outputs. - -## Resources - -No resources. - diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/main.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/main.tf deleted file mode 100644 index b8a40401bd..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/main.tf +++ /dev/null @@ -1,4 +0,0 @@ -locals { - module_version = reverse(split("/", abspath(path.module)))[0] - module_name = reverse(split("/", abspath(path.module)))[1] -} diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/outputs.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/outputs.tf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/providers.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/providers.tf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/variables.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/variables.tf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/version.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/modules/extractor-cronjob/v0.0.1/version.tf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/production/backend-deployment.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/production/backend-deployment.tf deleted file mode 100644 index 8b60bbc650..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/production/backend-deployment.tf +++ /dev/null @@ -1,20 +0,0 @@ -provider "kubernetes" { - config_path = "~/.kube/config" - config_context = "minikube" -} - - -module "backend_deployment" { - source = "../modules/backend-deployment/v1.0.0" - name = "backend-deployment" - replicas = 1 - image = "nginx" - limits = { - cpu = "0.5" - memory = "250Mi" - } - requests = { - cpu = "0.25" - memory = "100Mi" - } -} diff --git a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/staging/main.tf b/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/staging/main.tf deleted file mode 100644 index dbe93f8120..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/infrastructure-as-code/staging/main.tf +++ /dev/null @@ -1,4 +0,0 @@ -provider "kubernetes" { - config_path = "~/.kube/config" - config_context = "minikube" -} \ No newline at end of file diff --git a/dev-sec-fin-ops-challenge-v1/src/services/backend-deployment/README.md b/dev-sec-fin-ops-challenge-v1/src/services/backend-deployment/README.md deleted file mode 100644 index 870fc50fa3..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/services/backend-deployment/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Backend Deployment Service - -## O.S. Environment Setup - -* [Nodejs setup](https://nodejs.org/en/download) -* [Python setup](https://www.python.org/downloads/) - -TODO. - -## Docker Environment Setup - -TODO. diff --git a/dev-sec-fin-ops-challenge-v1/src/services/extractor-cronjob/README.md b/dev-sec-fin-ops-challenge-v1/src/services/extractor-cronjob/README.md deleted file mode 100644 index ef3d0b6e3d..0000000000 --- a/dev-sec-fin-ops-challenge-v1/src/services/extractor-cronjob/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Extractor Cronjob Service - -## O.S. Environment Setup - -* [Nodejs setup](https://nodejs.org/en/download) -* [Python setup](https://www.python.org/downloads/) - -TODO. - -## Docker Environment Setup - -TODO. diff --git a/dynamox-event-app/.gitignore b/dynamox-event-app/.gitignore new file mode 100644 index 0000000000..63271800a2 --- /dev/null +++ b/dynamox-event-app/.gitignore @@ -0,0 +1,39 @@ +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/dynamox-event-app/db.json b/dynamox-event-app/db.json new file mode 100644 index 0000000000..a06a3cdb72 --- /dev/null +++ b/dynamox-event-app/db.json @@ -0,0 +1,68 @@ +{ + "users": [ + { + "id": 1, + "email": "admin@events.com", + "password": "admin123", + "role": "admin", + "name": "Admin User" + }, + { + "id": 2, + "email": "reader@events.com", + "password": "reader123", + "role": "reader", + "name": "Reader User" + } + ], + "events": [ + { + "id": "af4391dc-bb04-45b4-b74a-1ffc1d154b73", + "name": "React Summit 2026", + "dateTime": "2026-06-15T09:00", + "location": "Amsterdam, Netherlands", + "description": "The biggest React conference in the world. Join thousands of developers to learn about the latest React features, patterns, and best practices from industry experts.", + "category": "Conference" + }, + { + "id": "2ca4ff8d-ecd8-40c5-926e-7e08d88d0525", + "name": "TypeScript Deep Dive Workshop", + "dateTime": "2026-04-20T14:00", + "location": "Online", + "description": "A hands-on workshop covering advanced TypeScript patterns including generics, conditional types, mapped types, and building type-safe libraries from scratch.", + "category": "Workshop" + }, + { + "id": "565d21f9-dcb2-41fd-ba6b-ac077fe85dd2", + "name": "Startup Networking Night", + "dateTime": "2026-05-10T18:30", + "location": "São Paulo, Brazil", + "description": "Connect with fellow entrepreneurs, investors, and tech enthusiasts at our monthly networking event. Great food, drinks, and conversations about the future of tech.", + "category": "Networking" + }, + { + "id": "2a52d65a-9f5a-4970-b0e0-d8538310655c", + "name": "AI in Frontend Development", + "dateTime": "2026-03-28T16:00", + "location": "Online", + "description": "Explore how artificial intelligence is transforming frontend development workflows. Learn about AI-powered code generation, testing, design systems, and developer tools.", + "category": "Webinar" + }, + { + "id": "a1872365-2bf1-45a4-93d1-6ca2a41c8dcb", + "name": "Design Systems at Scale", + "dateTime": "2025-12-01T10:00", + "location": "Berlin, Germany", + "description": "Learn how leading companies build and maintain design systems that scale across hundreds of products and thousands of developers. Includes case studies and workshops.", + "category": "Conference" + }, + { + "id": "59e62a81-7278-442c-8302-01a5f45194f7", + "name": "GraphQL Masterclass", + "dateTime": "2025-11-15T09:00", + "location": "London, UK", + "description": "An intensive full-day workshop on GraphQL including schema design, resolvers, authentication patterns, caching strategies, and performance optimization techniques.", + "category": "Workshop" + } + ] +} \ No newline at end of file diff --git a/dynamox-event-app/next.config.ts b/dynamox-event-app/next.config.ts new file mode 100644 index 0000000000..0b1ec0bf60 --- /dev/null +++ b/dynamox-event-app/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + reactCompiler: true, +}; + +export default nextConfig; diff --git a/dynamox-event-app/package-lock.json b/dynamox-event-app/package-lock.json new file mode 100644 index 0000000000..162ef2065c --- /dev/null +++ b/dynamox-event-app/package-lock.json @@ -0,0 +1,2852 @@ +{ + "name": "dynamox-event-app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dynamox-event-app", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.9", + "@mui/material": "^7.3.9", + "@reduxjs/toolkit": "^2.11.2", + "axios": "^1.13.6", + "date-fns": "^4.1.0", + "json-server": "^1.0.0-beta.13", + "next": "^16.1.6", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-redux": "^9.2.0" + }, + "devDependencies": { + "@types/node": "^25.5.0", + "@types/react": "^19.2.14", + "babel-plugin-react-compiler": "^1.0.0", + "typescript": "^5.9.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.9.tgz", + "integrity": "sha512-MOkOCTfbMJwLshlBCKJ59V2F/uaLYfmKnN76kksj6jlGUVdI25A9Hzs08m+zjBRdLv+sK7Rqdsefe8X7h/6PCw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.9.tgz", + "integrity": "sha512-BT+zPJXss8Hg/oEMRmHl17Q97bPACG4ufFSfGEdhiE96jOyR5Dz1ty7ZWt1fVGR0y1p+sSgEwQT/MNZQmoWDCw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^7.3.9", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.9.tgz", + "integrity": "sha512-I8yO3t4T0y7bvDiR1qhIN6iBWZOTBfVOnmLlM7K6h3dx5YX2a7rnkuXzc2UkZaqhxY9NgTnEbdPlokR1RxCNRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/core-downloads-tracker": "^7.3.9", + "@mui/system": "^7.3.9", + "@mui/types": "^7.4.12", + "@mui/utils": "^7.3.9", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.3", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^7.3.9", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.9.tgz", + "integrity": "sha512-ErIyRQvsiQEq7Yvcvfw9UDHngaqjMy9P3JDPnRAaKG5qhpl2C4tX/W1S4zJvpu+feihmZJStjIyvnv6KDbIrlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "^7.3.9", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.9.tgz", + "integrity": "sha512-JqujWt5bX4okjUPGpVof/7pvgClqh7HvIbsIBIOOlCh2u3wG/Bwp4+E1bc1dXSwkrkp9WUAoNdI5HEC+5HKvMw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.9.tgz", + "integrity": "sha512-aL1q9am8XpRrSabv9qWf5RHhJICJql34wnrc1nz0MuOglPRYF/liN+c8VqZdTvUn9qg+ZjRVbKf4sJVFfIDtmg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/private-theming": "^7.3.9", + "@mui/styled-engine": "^7.3.9", + "@mui/types": "^7.4.12", + "@mui/utils": "^7.3.9", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.4.12", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.12.tgz", + "integrity": "sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.9.tgz", + "integrity": "sha512-U6SdZaGbfb65fqTsH3V5oJdFj9uYwyLE2WVuNvmbggTSDBb8QHrFsqY8BN3taK9t3yJ8/BPHD/kNvLNyjwM7Yw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/types": "^7.4.12", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@next/env": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", + "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", + "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", + "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", + "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", + "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", + "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", + "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", + "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", + "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tinyhttp/accepts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@tinyhttp/accepts/-/accepts-2.3.0.tgz", + "integrity": "sha512-hdKkMGAUqnagpWO1R8rVBYqbu4sWQ2Fo682gkJmO0nl54DPvnzxx81b2WZtV3VwB7EdLfUoasj2BAkyTcyZ5aw==", + "license": "MIT", + "dependencies": { + "mime": "4.1.0" + }, + "engines": { + "node": ">=14.13.1" + }, + "funding": { + "type": "individual", + "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1" + } + }, + "node_modules/@tinyhttp/app": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@tinyhttp/app/-/app-3.0.6.tgz", + "integrity": "sha512-jJYl9mc7nXY4gCyvot3tplCG6hVj+zm7sOZrT91et2Rg8M0oxBCVKVeX1tPhvVfOtYHQsz7mRlC1yk6yNLk79Q==", + "license": "MIT", + "dependencies": { + "@tinyhttp/accepts": "^2.3.0", + "@tinyhttp/cookie": "2.1.1", + "@tinyhttp/proxy-addr": "3.0.1", + "@tinyhttp/req": "2.2.8", + "@tinyhttp/res": "2.2.10", + "@tinyhttp/router": "2.2.5", + "regexparam": "^2.0.2" + }, + "engines": { + "node": ">=16.10.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1" + } + }, + "node_modules/@tinyhttp/content-disposition": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@tinyhttp/content-disposition/-/content-disposition-2.2.4.tgz", + "integrity": "sha512-5Kc5CM2Ysn3vTTArBs2vESUt0AQiWZA86yc1TI3B+lxXmtEq133C1nxXNOgnzhrivdPZIh3zLj5gDnZjoLL5GA==", + "license": "MIT", + "engines": { + "node": ">=12.17.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1" + } + }, + "node_modules/@tinyhttp/content-type": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@tinyhttp/content-type/-/content-type-0.1.4.tgz", + "integrity": "sha512-dl6f3SHIJPYbhsW1oXdrqOmLSQF/Ctlv3JnNfXAE22kIP7FosqJHxkz/qj2gv465prG8ODKH5KEyhBkvwrueKQ==", + "license": "MIT", + "engines": { + "node": ">=12.4" + } + }, + "node_modules/@tinyhttp/cookie": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@tinyhttp/cookie/-/cookie-2.1.1.tgz", + "integrity": "sha512-h/kL9jY0e0Dvad+/QU3efKZww0aTvZJslaHj3JTPmIPC9Oan9+kYqmh3M6L5JUQRuTJYFK2nzgL2iJtH2S+6dA==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1" + } + }, + "node_modules/@tinyhttp/cookie-signature": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@tinyhttp/cookie-signature/-/cookie-signature-2.1.1.tgz", + "integrity": "sha512-VDsSMY5OJfQJIAtUgeQYhqMPSZptehFSfvEEtxr+4nldPA8IImlp3QVcOVuK985g4AFR4Hl1sCbWCXoqBnVWnw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@tinyhttp/cors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tinyhttp/cors/-/cors-2.0.1.tgz", + "integrity": "sha512-qrmo6WJuaiCzKWagv2yA/kw6hIISfF/hOqPWwmI6w0o8apeTMmRN3DoCFvQ/wNVuWVdU5J4KU7OX8aaSOEq51A==", + "license": "MIT", + "dependencies": { + "@tinyhttp/vary": "^0.1.3" + }, + "engines": { + "node": ">=12.20 || 14.x || >=16" + } + }, + "node_modules/@tinyhttp/encode-url": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@tinyhttp/encode-url/-/encode-url-2.1.1.tgz", + "integrity": "sha512-AhY+JqdZ56qV77tzrBm0qThXORbsVjs/IOPgGCS7x/wWnsa/Bx30zDUU/jPAUcSzNOzt860x9fhdGpzdqbUeUw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@tinyhttp/etag": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@tinyhttp/etag/-/etag-2.1.2.tgz", + "integrity": "sha512-j80fPKimGqdmMh6962y+BtQsnYPVCzZfJw0HXjyH70VaJBHLKGF+iYhcKqzI3yef6QBNa8DKIPsbEYpuwApXTw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@tinyhttp/forwarded": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@tinyhttp/forwarded/-/forwarded-2.1.2.tgz", + "integrity": "sha512-9H/eulJ68ElY/+zYpTpNhZ7vxGV+cnwaR6+oQSm7bVgZMyuQfgROW/qvZuhmgDTIxnGMXst+Ba4ij6w6Krcs3w==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@tinyhttp/logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tinyhttp/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-Ma1fJ9CwUbn9r61/4HW6+nflsVoslpOnCrfQ6UeZq7GGIgwLzofms3HoSVG7M+AyRMJpxlfcDdbH5oFVroDMKA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.20", + "dayjs": "^1.11.13", + "http-status-emojis": "^2.2.0" + }, + "engines": { + "node": ">=14.18 || >=16.20" + } + }, + "node_modules/@tinyhttp/proxy-addr": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tinyhttp/proxy-addr/-/proxy-addr-3.0.1.tgz", + "integrity": "sha512-vP0JVsy9ZMIldsaP/QHdMF+sb3B6wn7e2QXRdqpX/Cqz1ie35Am29DK88DeVmiwdTQle3FtYaVNtU3RgTGYZ+w==", + "license": "MIT", + "dependencies": { + "@tinyhttp/forwarded": "2.1.2" + }, + "engines": { + "node": ">=16.10.0" + } + }, + "node_modules/@tinyhttp/req": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@tinyhttp/req/-/req-2.2.8.tgz", + "integrity": "sha512-HCsceFNgMpssUsnRao16iJyyfdWRwKlhL7OMTPUEjZsZGREnBzpjlrPHA31G5xNNzR7XOWVXDXGyrGgSpcwGSA==", + "license": "MIT", + "dependencies": { + "@tinyhttp/accepts": "2.3.0", + "@tinyhttp/type-is": "2.2.5", + "@tinyhttp/url": "2.1.1", + "header-range-parser": "^1.1.3" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/@tinyhttp/res": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@tinyhttp/res/-/res-2.2.10.tgz", + "integrity": "sha512-ou+7T+x14xMrGwW0Rv+FOu4zYfXkTRf25yKMMOIuFyPyYOg27pbxtdiDVYJU1D5s6DFFdmenu0iXOSd1KABfYA==", + "license": "MIT", + "dependencies": { + "@tinyhttp/content-disposition": "2.2.4", + "@tinyhttp/cookie": "2.1.1", + "@tinyhttp/cookie-signature": "2.1.1", + "@tinyhttp/encode-url": "2.1.1", + "@tinyhttp/req": "2.2.8", + "@tinyhttp/send": "2.2.4", + "@tinyhttp/vary": "^0.1.3", + "mime": "4.1.0" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/@tinyhttp/router": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@tinyhttp/router/-/router-2.2.5.tgz", + "integrity": "sha512-HI9Mpo9+IVpCzx/36okjJvtvifBSh3Ufhl9n1vylAbNLEykceJiMBkr06+W0qqRlo8TiZeUtg2XinEJu+GFcRA==", + "license": "MIT", + "dependencies": { + "regexparam": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tinyhttp/send": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@tinyhttp/send/-/send-2.2.4.tgz", + "integrity": "sha512-DgEY185oQUd2LTKHM+he/m3sjYWB7yL0WLNrasoSEHaCfzstm0+viltqqOvEV7UtkSB3oRRo+OWiEtYKmd6h5w==", + "license": "MIT", + "dependencies": { + "@tinyhttp/content-type": "^0.1.4", + "@tinyhttp/etag": "2.1.2", + "mime": "4.1.0" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/@tinyhttp/type-is": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@tinyhttp/type-is/-/type-is-2.2.5.tgz", + "integrity": "sha512-BCPEB+NV8v/9lzEE9GbfRPAKVsyayp84m6SSWn70j8yFkPBXeuVeq004pwVrjW1CRdmAZz9ZSH147pqqzAdr5g==", + "license": "MIT", + "dependencies": { + "@tinyhttp/content-type": "^0.1.4", + "mime": "4.1.0" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/@tinyhttp/url": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@tinyhttp/url/-/url-2.1.1.tgz", + "integrity": "sha512-POJeq2GQ5jI7Zrdmj22JqOijB5/GeX+LEX7DUdml1hUnGbJOTWDx7zf2b5cCERj7RoXL67zTgyzVblBJC+NJWg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@tinyhttp/vary": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@tinyhttp/vary/-/vary-0.1.3.tgz", + "integrity": "sha512-SoL83sQXAGiHN1jm2VwLUWQSQeDAAl1ywOm6T0b0Cg1CZhVsjoiZadmjhxF6FHCCY7OHHVaLnTgSMxTPIDLxMg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz", + "integrity": "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001778", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz", + "integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dot-prop": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-10.1.0.tgz", + "integrity": "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==", + "license": "MIT", + "dependencies": { + "type-fest": "^5.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eta": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-4.5.1.tgz", + "integrity": "sha512-EaNCGm+8XEIU7YNcc+THptWAO5NfKBHHARxt+wxZljj9bTr/+arRoOm9/MpGt4n6xn9fLnPFRSoLD0WFYGFUxQ==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/bgub/eta?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/header-range-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/header-range-parser/-/header-range-parser-1.1.5.tgz", + "integrity": "sha512-n5JOx67HBL0MGqtu6NFoEYWb+xDYAOgBI5dBkyMDff1xHbhGnjCMglj1aiMNPHps6HwXO+2i5jbPU/zJSk7etQ==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/http-status-emojis": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http-status-emojis/-/http-status-emojis-2.2.0.tgz", + "integrity": "sha512-ompKtgwpx8ff0hsbpIB7oE4ax1LXoHmftsHHStMELX56ivG3GhofTX8ZHWlUaFKfGjcGjw6G3rPk7dJRXMmbbg==", + "license": "MIT" + }, + "node_modules/immer": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflection": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-3.0.2.tgz", + "integrity": "sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-server": { + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/json-server/-/json-server-1.0.0-beta.13.tgz", + "integrity": "sha512-WYSvMgqNE1YkTlX2GudSKLewFfAQJ+0YE31pdXynFoN9e1O/T+tLepG/wrtC0q1+CnEjmol4h2VT0PIwxjy/Pw==", + "license": "MIT", + "dependencies": { + "@tinyhttp/app": "^3.0.1", + "@tinyhttp/cors": "^2.0.1", + "@tinyhttp/logger": "^2.1.0", + "chalk": "^5.6.2", + "chokidar": "^5.0.0", + "dot-prop": "^10.1.0", + "eta": "^4.5.0", + "inflection": "^3.0.2", + "json5": "^2.2.3", + "lowdb": "^7.0.1", + "milliparsec": "^5.1.0", + "sirv": "^3.0.2", + "sort-on": "^7.0.0" + }, + "bin": { + "json-server": "lib/bin.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowdb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz", + "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==", + "license": "MIT", + "dependencies": { + "steno": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/milliparsec": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/milliparsec/-/milliparsec-5.1.1.tgz", + "integrity": "sha512-jkEDaSWZp4/Q3vprqdqukBqUEyNNqC1pwTjZ5cp9YkaR1wv5fvTCd8VFsecbw7i8DNBGjzhJ83MDoPZlcTaPQg==", + "license": "MIT", + "engines": { + "node": ">=18.13 || >=19.20 || >=20" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", + "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.1.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.1.6", + "@next/swc-darwin-x64": "16.1.6", + "@next/swc-linux-arm64-gnu": "16.1.6", + "@next/swc-linux-arm64-musl": "16.1.6", + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", + "@next/swc-win32-arm64-msvc": "16.1.6", + "@next/swc-win32-x64-msvc": "16.1.6", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-is": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", + "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/regexparam": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.2.tgz", + "integrity": "sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sort-on": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/sort-on/-/sort-on-7.0.0.tgz", + "integrity": "sha512-e+4RRxt7jsWdGPp4H5PKOER/ELYlemNB1plvW686Qi3j4WVaCjCpro2zaTD7Cn0VtBImq/hg3x1JfovMNXXfJQ==", + "license": "MIT", + "dependencies": { + "dot-prop": "^10.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/steno": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz", + "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", + "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + } + } +} diff --git a/dynamox-event-app/package.json b/dynamox-event-app/package.json new file mode 100644 index 0000000000..e8de8fe505 --- /dev/null +++ b/dynamox-event-app/package.json @@ -0,0 +1,37 @@ +{ + "name": "dynamox-event-app", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint", + "lint:fix": "eslint --fix", + "vercel-build": "next dev" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.9", + "@mui/material": "^7.3.9", + "@reduxjs/toolkit": "^2.11.2", + "axios": "^1.13.6", + "date-fns": "^4.1.0", + "json-server": "^1.0.0-beta.13", + "next": "^16.1.6", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-redux": "^9.2.0" + }, + "devDependencies": { + "@types/node": "^25.5.0", + "@types/react": "^19.2.14", + "babel-plugin-react-compiler": "^1.0.0", + "typescript": "^5.9.3" + } +} diff --git a/dynamox-event-app/src/app/(protected)/dashboard/page.tsx b/dynamox-event-app/src/app/(protected)/dashboard/page.tsx new file mode 100644 index 0000000000..8a564cc45a --- /dev/null +++ b/dynamox-event-app/src/app/(protected)/dashboard/page.tsx @@ -0,0 +1,223 @@ +'use client' + +import { useState } from 'react' +import { isPast } from 'date-fns' + +import { + useGetEventsQuery, + useCreateEventMutation, + useUpdateEventMutation, + useDeleteEventMutation +} from '@/services/eventsApi' + +import { Event } from '@/types/event' +import { EventCard } from '@/components/EventCard' +import { EventForm } from '@/components/EventForm' + +import { + Box, + Typography, + Button, + Grid, + Stack, + Dialog, + DialogTitle, + DialogContent, + DialogActions +} from '@mui/material' + +import AddIcon from '@mui/icons-material/Add' +import CalendarMonthIcon from '@mui/icons-material/CalendarMonth' +import BarChartIcon from '@mui/icons-material/BarChart' +import DashboardStats from '@/components/DashboardStats' +import { useToast } from '@/context/ToastProvider' + +export default function AdminDashboard() { + const { showToast } = useToast() + + const { data: events = [], isLoading } = useGetEventsQuery() + + const [createEvent] = useCreateEventMutation() + const [updateEvent] = useUpdateEventMutation() + const [deleteEvent] = useDeleteEventMutation() + + const [formOpen, setFormOpen] = useState(false) + const [editingEvent, setEditingEvent] = useState(null) + const [deleteId, setDeleteId] = useState(null) + + const upcoming = events.filter(e => !isPast(new Date(e.dateTime))).length + const past = events.length - upcoming + + const handleEdit = (event: Event) => { + setEditingEvent(event) + setFormOpen(true) + } + + const handleCreate = () => { + setEditingEvent(null) + setFormOpen(true) + } + + const handleSubmit = async (data: Omit) => { + try { + if (editingEvent) { + await updateEvent({ + id: editingEvent.id, + event: data + }).unwrap() + + showToast("Evento atualizado com sucesso", "success") + } else { + await createEvent(data).unwrap() + showToast("Evento criado com sucesso", "success") + } + + setFormOpen(false) + } catch (err: any) { + showToast(err?.data?.message || "Falha ao processar evento", "error") + } + } + + const confirmDelete = async () => { + + if (deleteId) { + try { + await deleteEvent(deleteId).unwrap() + setDeleteId(null) + showToast("Evento excluído com sucesso", "success") + } catch (err: any) { + showToast(err?.data?.message || "Falha ao deletar evento", "error") + } + } + + } + + if (isLoading) { + return Carregando eventos... + } + + return ( + + + + + + + + Admin Dashboard + + + + Gerencie todos os seus eventos + + + + + + + + + + } /> + } /> + } /> + + + + + + {events.map(event => ( + + + + setDeleteId(id)} + /> + + + + ))} + + + + + {events.length === 0 && ( + + + + + + + Ainda não há eventos. + + + + + )} + + + + setDeleteId(null)} + > + + + Excluir evento + + + + + + Esta ação não poderá ser desfeita. Tem certeza que deseja excluir este evento? + + + + + + + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/(protected)/events/page.tsx b/dynamox-event-app/src/app/(protected)/events/page.tsx new file mode 100644 index 0000000000..1a56aaddc2 --- /dev/null +++ b/dynamox-event-app/src/app/(protected)/events/page.tsx @@ -0,0 +1,162 @@ +'use client'; + +import { useState } from 'react'; +import { EventCard } from '@/components/EventCard'; +import { useGetEventsQuery } from '@/services/eventsApi'; +import { useFilteredEvents } from '@/hooks/useFilteredEvents'; + +import { + Box, + Typography, + TextField, + Select, + MenuItem, + FormControl, + InputLabel, + Tabs, + Tab, + Grid, + Stack, + InputAdornment +} from '@mui/material'; + +import SearchIcon from '@mui/icons-material/Search'; +import CalendarMonthIcon from '@mui/icons-material/CalendarMonth'; + +import { EventCategory } from '@/types/event'; + +type SortBy = 'date-asc' | 'date-desc' | 'name-asc' | 'name-desc'; + +export default function EventsPage() { + const [search, setSearch] = useState(''); + const [categoryFilter, setCategoryFilter] = useState('all'); + const [sortBy, setSortBy] = useState('date-asc'); + const [tab, setTab] = useState<'upcoming' | 'past'>('upcoming'); + + const { data: events = [], isLoading } = useGetEventsQuery(); + const { upcoming, past, list } = useFilteredEvents({events, search, categoryFilter, sortBy, tab}) + + const categories: EventCategory[] = [ + 'Conference', + 'Workshop', + 'Webinar', + 'Networking', + 'Other' + ]; + + if (isLoading) { + return Carregando eventos...; + } + + return ( + + + + + Eventos + + + Descubra e explore novos eventos + + + + + + setSearch(e.target.value)} + slotProps={{ + input: { + startAdornment: ( + + + + ) + } + }} + /> + + + Categoria + + + + + Ordenar por + + + + + setTab(v)} + > + + + + + + {list.length > 0 ? ( + + {list.map(event => ( + + + + ))} + + ) : ( + + + + {tab === 'upcoming' + ? 'Nenhum evento futuro encontrado' + : 'Nenhum evento passado encontrado'} + + + )} + + + + ); +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/(protected)/layout.tsx b/dynamox-event-app/src/app/(protected)/layout.tsx new file mode 100644 index 0000000000..83820df2a6 --- /dev/null +++ b/dynamox-event-app/src/app/(protected)/layout.tsx @@ -0,0 +1,46 @@ +'use client'; + +import { useEffect } from 'react'; +import { useAuth } from '@/context/AuthContext'; +import { useRouter } from 'next/navigation'; +import { usePathname } from 'next/navigation'; +import AppLayout from '@/components/AppLayout'; +import Box from '@mui/material/Box'; +import CircularProgress from '@mui/material/CircularProgress'; + +export default function ProtectedLayout({ + children, +}: { + children: React.ReactNode +}) { + const { isAuthenticated, user, isLoading } = useAuth(); + const router = useRouter(); + const pathName = usePathname(); + + useEffect(() => { + if (!isLoading && !isAuthenticated) { + router.replace('/login'); + } + + if (!isLoading && isAuthenticated && pathName.startsWith('/dashboard') && user?.role !== 'admin') { + router.replace('/events'); + } + }, [isAuthenticated, router, user, pathName, isLoading]); + + if (isLoading || !isAuthenticated) { + return ( + + + + ); + } + + return {children}; +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/api/events/[id]/route.ts b/dynamox-event-app/src/app/api/events/[id]/route.ts new file mode 100644 index 0000000000..e3cdac8d98 --- /dev/null +++ b/dynamox-event-app/src/app/api/events/[id]/route.ts @@ -0,0 +1,73 @@ +import { NextResponse } from "next/server" +import { events } from "@/lib/eventsStore" + +export async function PATCH( + req: Request, + { params }: { params: Promise<{ id: string }> } +) { + + try { + + const { id } = await params + const body = await req.json() + + const index = events.findIndex(e => String(e.id) === id) + + if (index === -1) { + return NextResponse.json( + { message: "Event not found" }, + { status: 404 } + ) + } + + events[index] = { + ...events[index], + ...body + } + + return NextResponse.json(events[index]) + + } catch (error) { + + return NextResponse.json( + { message: "Failed to update event" }, + { status: 500 } + ) + + } +} + +export async function DELETE( + req: Request, + { params }: { params: Promise<{ id: string }> } +) { + + try { + + const { id } = await params + + const index = events.findIndex(e => String(e.id) === id) + + if (index === -1) { + return NextResponse.json( + { message: "Event not found" }, + { status: 404 } + ) + } + + events.splice(index, 1) + + return NextResponse.json({ + message: "Event deleted successfully" + }) + + } catch (error) { + + return NextResponse.json( + { message: "Failed to delete event" }, + { status: 500 } + ) + + } + +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/api/events/route.ts b/dynamox-event-app/src/app/api/events/route.ts new file mode 100644 index 0000000000..60cf02092a --- /dev/null +++ b/dynamox-event-app/src/app/api/events/route.ts @@ -0,0 +1,20 @@ +import { NextResponse } from "next/server" +import { events } from "@/lib/eventsStore" + +export async function GET() { + return NextResponse.json(events) +} + +export async function POST(req: Request) { + + const body = await req.json() + + const newEvent = { + id: crypto.randomUUID(), + ...body + } + + events.push(newEvent) + + return NextResponse.json(newEvent) +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/api/users/route.ts b/dynamox-event-app/src/app/api/users/route.ts new file mode 100644 index 0000000000..9cfa4a3a60 --- /dev/null +++ b/dynamox-event-app/src/app/api/users/route.ts @@ -0,0 +1,6 @@ +import { NextResponse } from 'next/server' +import db from '../../../../db.json' + +export async function GET() { + return NextResponse.json(db.users) +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/icon.png b/dynamox-event-app/src/app/icon.png new file mode 100644 index 0000000000..2fe6793576 Binary files /dev/null and b/dynamox-event-app/src/app/icon.png differ diff --git a/dynamox-event-app/src/app/layout.tsx b/dynamox-event-app/src/app/layout.tsx new file mode 100644 index 0000000000..4e055310e9 --- /dev/null +++ b/dynamox-event-app/src/app/layout.tsx @@ -0,0 +1,28 @@ +'use client' + +import { AuthProvider } from '@/context/AuthContext'; +import { ToastProvider } from '@/context/ToastProvider'; +import StoreProvider from '@/redux/StoreProvider'; +import ThemeRegistry from '@/theme/ThemeRegistry'; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + + + + + {children} + + + + + + + ) +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/login/page.tsx b/dynamox-event-app/src/app/login/page.tsx new file mode 100644 index 0000000000..214742cc14 --- /dev/null +++ b/dynamox-event-app/src/app/login/page.tsx @@ -0,0 +1,137 @@ +'use client'; + +import { useState } from 'react'; +import { useRouter } from 'next/navigation'; + +import { + Box, + Card, + CardContent, + CardHeader, + TextField, + Typography, + Button, + Alert, + Container, + Stack +} from '@mui/material'; + +import ConfirmationNumberIcon from '@mui/icons-material/ConfirmationNumber'; +import { useAuth } from '@/context/AuthContext'; + +export default function Login() { + const router = useRouter(); + const { login } = useAuth(); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + + const handleSubmit = async (e: React.SubmitEvent) => { + e.preventDefault(); + setError(''); + + const result = await login(email, password); + + if (result.success) { + const user = JSON.parse(localStorage.getItem('auth_user') || '{}'); + + router.push(user.role === 'admin' ? '/dashboard' : '/events'); + } else { + setError(result.error || 'Login failed'); + } + }; + + return ( + + + + + + + + + + EventHub + + + + Faça login para gerenciar seus eventos. + + + + + + + +
+ + + + {error && ( + + {error} + + )} + + setEmail(e.target.value)} + fullWidth + required + /> + + setPassword(e.target.value)} + fullWidth + required + /> + + + + +
+
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/dynamox-event-app/src/app/page.tsx b/dynamox-event-app/src/app/page.tsx new file mode 100644 index 0000000000..18235e1562 --- /dev/null +++ b/dynamox-event-app/src/app/page.tsx @@ -0,0 +1,15 @@ +'use client' + +import { useEffect } from 'react'; +import { useRouter } from 'next/navigation'; + +export default function HomePage() { + + const router = useRouter(); + + useEffect(() => { + router.push('/login'); + }, []); + + return null; +} \ No newline at end of file diff --git a/dynamox-event-app/src/components/AppLayout.tsx b/dynamox-event-app/src/components/AppLayout.tsx new file mode 100644 index 0000000000..2b129eb19d --- /dev/null +++ b/dynamox-event-app/src/components/AppLayout.tsx @@ -0,0 +1,152 @@ +'use client'; + +import { useAuth } from '@/context/AuthContext'; +import { useRouter, usePathname } from 'next/navigation'; + +import { + AppBar, + Toolbar, + Typography, + Button, + Box, + Container, + Stack, + IconButton +} from '@mui/material'; + +import ConfirmationNumberIcon from '@mui/icons-material/ConfirmationNumber'; +import CalendarMonthIcon from '@mui/icons-material/CalendarMonth'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import LogoutIcon from '@mui/icons-material/Logout'; + +export default function AppLayout({ children }: { children: React.ReactNode }) { + + const { user, logout } = useAuth(); + const router = useRouter(); + const pathname = usePathname(); + + const isActive = (path: string) => pathname === path; + + const handleLogout = () => { + logout(); + router.push('/login'); + }; + + return ( + + + + + + + + + + + + + EventHub + + + + + + + {user?.role === 'admin' && ( + + )} + + + + + + + + + + {user?.name} + + + + {user?.role} + + + + + + + + + + + + {/* Mobile */} + + + {user?.role === 'admin' && ( + + )} + + + + + + + + + {children} + + + + ); +} \ No newline at end of file diff --git a/dynamox-event-app/src/components/DashboardStats.tsx b/dynamox-event-app/src/components/DashboardStats.tsx new file mode 100644 index 0000000000..7a36e82d9f --- /dev/null +++ b/dynamox-event-app/src/components/DashboardStats.tsx @@ -0,0 +1,45 @@ +'use client'; + +import { + Typography, + Box, + Stack, + Grid, + Card, + CardContent, +} from '@mui/material'; + +import { ReactNode } from 'react'; + +type DashboardStatsProps = { + icon: ReactNode + value: number | string + label: string +} + +export default function DashboardStats({ + icon, + value, + label +}: DashboardStatsProps) { + + return ( + + + + + {icon} + + + {value} + + + {label} + + + + + + + ); +} \ No newline at end of file diff --git a/dynamox-event-app/src/components/EventCard.tsx b/dynamox-event-app/src/components/EventCard.tsx new file mode 100644 index 0000000000..994c19d067 --- /dev/null +++ b/dynamox-event-app/src/components/EventCard.tsx @@ -0,0 +1,170 @@ +'use client'; + +import { Event, EventCategory } from '@/types/event'; +import { ChipProps } from '@mui/material/Chip'; + +import { + Card, + CardContent, + CardHeader, + Typography, + Chip, + Stack, + Button, +} from '@mui/material'; + +import CalendarMonthIcon from '@mui/icons-material/CalendarMonth'; +import LocationOnIcon from '@mui/icons-material/LocationOn'; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/Delete'; + +import { format, isPast } from 'date-fns'; + +interface EventCardProps { + event: Event; + showActions?: boolean; + onEdit?: (event: Event) => void; + onDelete?: (id: string) => void; +} + +const categoryColors: Record = { + Conference: 'primary', + Workshop: 'secondary', + Webinar: 'success', + Networking: 'warning', + Other: 'default' +}; + +export function EventCard({ + event, + showActions, + onEdit, + onDelete +}: EventCardProps) { + + const eventDate = new Date(event.dateTime); + const past = isPast(eventDate); + + const categoryStyle = categoryColors[event.category] || categoryColors.Other; + + return ( + + + + {event.name} + + + + + + {past && ( + + )} + + + } + /> + + + + + + + + + {format(eventDate, 'MMM d, yyyy · h:mm a')} + + + + + + + {event.location} + + + + + {event.description} + + + {showActions && ( + + + + + + )} + + + + + + ); +} \ No newline at end of file diff --git a/dynamox-event-app/src/components/EventForm.tsx b/dynamox-event-app/src/components/EventForm.tsx new file mode 100644 index 0000000000..f43a8244c3 --- /dev/null +++ b/dynamox-event-app/src/components/EventForm.tsx @@ -0,0 +1,244 @@ +'use client' + +import { useState, useEffect } from 'react' +import { Event, EventCategory } from '@/types/event' + +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Button, + TextField, + Typography, + MenuItem, + Stack +} from '@mui/material' + +const categories: EventCategory[] = [ + 'Conference', + 'Workshop', + 'Webinar', + 'Networking', + 'Other' +] + +interface EventFormDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + event?: Event | null + onSubmit: (data: Omit) => void +} + +type EventForm = Omit + +const emptyForm: EventForm = { + name: '', + dateTime: '', + location: '', + description: '', + category: 'Conference' +} + +export const EventForm = ({ + open, + onOpenChange, + event, + onSubmit +}: EventFormDialogProps) => { + + const [form, setForm] = useState(emptyForm) + const [errors, setErrors] = useState>({}) + + useEffect(() => { + if (event) { + setForm({ + name: event.name, + dateTime: event.dateTime, + location: event.location, + description: event.description, + category: event.category + }) + } else { + setForm(emptyForm) + } + + setErrors({}) + }, [event, open]) + + const updateField = (field: keyof EventForm, value: string) => { + setForm(prev => ({ + ...prev, + [field]: value + })) + } + + const validate = () => { + + const errs: Record = {} + + if (!form.name.trim()) + errs.name = 'Nome do evento é obrigatório' + + if (!form.dateTime) + errs.dateTime = 'Data e hora são obrigatórios' + else if (new Date(form.dateTime) <= new Date()) + errs.dateTime = 'Deve ser uma data no futuro' + + if (!form.location.trim()) + errs.location = 'Localização é obrigatória' + + if (!form.description.trim()) + errs.description = 'Descrição é obrigatória' + else if (form.description.length < 50) + errs.description = 'Descrição deve ter no mínimo 50 caractéres' + + if (!form.category) + errs.category = 'Categoria é obrigatória' + + setErrors(errs) + + return Object.keys(errs).length === 0 + + } + + const handleSubmit = (e: React.MouseEvent) => { + + e.preventDefault() + + if (!validate()) return + + onSubmit({ + ...form, + name: form.name.trim(), + location: form.location.trim(), + description: form.description.trim() + }) + + onOpenChange(false) + + } + + const isFormValid = + form.name.trim() && + form.location.trim() && + form.description.trim().length >= 50 && + form.dateTime && + new Date(form.dateTime) > new Date() + + return ( + + onOpenChange(false)} + maxWidth="sm" + fullWidth + > + + + {event ? 'Editar Evento' : 'Criar Evento'} + + + + + + {event + ? 'Atualize os dados do evento abaixo.' + : 'Preencha os detalhes abaixo para criar um novo evento.'} + + + + + updateField('name', e.target.value)} + error={!!errors.name} + helperText={errors.name} + fullWidth + /> + + updateField('dateTime', e.target.value)} + error={!!errors.dateTime} + helperText={errors.dateTime} + slotProps={{ + inputLabel: { shrink: true } + }} + fullWidth + /> + + updateField('location', e.target.value)} + error={!!errors.location} + helperText={errors.location} + fullWidth + /> + + + updateField('category', e.target.value) + } + error={!!errors.category} + helperText={errors.category} + fullWidth + > + {categories.map(c => ( + + {c} + + ))} + + + updateField('description', e.target.value)} + error={!!errors.description} + helperText={ + errors.description || `${form.description.length}/50` + } + fullWidth + /> + + + + + + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/dynamox-event-app/src/context/AuthContext.tsx b/dynamox-event-app/src/context/AuthContext.tsx new file mode 100644 index 0000000000..43d3eb96c6 --- /dev/null +++ b/dynamox-event-app/src/context/AuthContext.tsx @@ -0,0 +1,91 @@ +'use client' + +import React, { createContext, useContext, useState, useCallback, useEffect } from "react"; +import { User } from "@/types/event"; +import api from "@/lib/api"; + +interface AuthContextType { + user: User | null; + token: string | null; + login: (email: string, password: string) => Promise<{ success: boolean; error?: string }>; + logout: () => void; + isAuthenticated: boolean; + isLoading: boolean; +} + +const AuthContext = createContext(null); + +export const useAuth = () => { + const ctx = useContext(AuthContext); + if (!ctx) throw new Error("useAuth deve ser utilizado dentro do AuthProvider"); + return ctx; +}; + +export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [user, setUser] = useState(null); + const [token, setToken] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + const savedToken = localStorage.getItem("auth_token"); + const savedUser = localStorage.getItem("auth_user"); + + if (savedToken && savedUser) { + setToken(savedToken); + setUser(JSON.parse(savedUser)); + } + + setIsLoading(false); + }, []); + + const login = useCallback(async (email: string, password: string) => { + try { + const res = await api.get(`/users`, { + params: { email }, + }); + + const found = res.data[0]; + + if (!found || found.password !== password) { + return { success: false, error: "Email ou senha inválidos" }; + } + + const fakeToken = `fake-jwt-${found.id}-${Date.now()}`; + + const { password: _, ...userData } = found; + + setUser(userData); + setToken(fakeToken); + + localStorage.setItem("auth_token", fakeToken); + localStorage.setItem("auth_user", JSON.stringify(userData)); + + return { success: true }; + } catch (err) { + return { success: false, error: "Erro no servidor" }; + } + }, []); + + const logout = useCallback(() => { + setUser(null); + setToken(null); + + localStorage.removeItem("auth_token"); + localStorage.removeItem("auth_user"); + }, []); + + return ( + + {children} + + ); +}; \ No newline at end of file diff --git a/dynamox-event-app/src/context/ToastProvider.tsx b/dynamox-event-app/src/context/ToastProvider.tsx new file mode 100644 index 0000000000..b593bae0da --- /dev/null +++ b/dynamox-event-app/src/context/ToastProvider.tsx @@ -0,0 +1,56 @@ +'use client' + +import { createContext, useContext, useState } from 'react' +import Snackbar from '@mui/material/Snackbar' +import Alert from '@mui/material/Alert' + +type ToastSeverity = 'success' | 'error' | 'info' | 'warning' + +interface ToastContextType { + showToast: (message: string, severity?: ToastSeverity) => void +} + +const ToastContext = createContext(null) + +export function ToastProvider({ children }: { children: React.ReactNode }) { + + const [open, setOpen] = useState(false) + const [message, setMessage] = useState("") + const [severity, setSeverity] = useState('success') + + const showToast = (msg: string, sev: ToastSeverity = 'success') => { + setMessage(msg) + setSeverity(sev) + setOpen(true) + } + + const handleClose = () => setOpen(false) + + return ( + + {children} + + + + {message} + + + + + ) +} + +export function useToast() { + const context = useContext(ToastContext) + + if (!context) { + throw new Error("useToast must be used inside ToastProvider") + } + + return context +} \ No newline at end of file diff --git a/dynamox-event-app/src/hooks/useFilteredEvents.ts b/dynamox-event-app/src/hooks/useFilteredEvents.ts new file mode 100644 index 0000000000..e1e1316747 --- /dev/null +++ b/dynamox-event-app/src/hooks/useFilteredEvents.ts @@ -0,0 +1,81 @@ +import { useMemo } from 'react'; +import { isPast } from 'date-fns'; +import { Event } from '@/types/event'; + +type SortBy = 'date-asc' | 'date-desc' | 'name-asc' | 'name-desc'; + +interface Params { + events: Event[]; + search: string; + categoryFilter: string; + sortBy: SortBy; + tab: 'upcoming' | 'past'; +} + +export function useFilteredEvents({ + events, + search, + categoryFilter, + sortBy, + tab +}: Params) { + + const filtered = useMemo(() => { + + let result = events.filter(event => { + + const matchSearch = + event.name.toLowerCase().includes(search.toLowerCase()) || + event.location.toLowerCase().includes(search.toLowerCase()) || + event.description.toLowerCase().includes(search.toLowerCase()); + + const matchCategory = + categoryFilter === 'all' || event.category === categoryFilter; + + return matchSearch && matchCategory; + }); + + const sorted = [...result].sort((a, b) => { + + switch (sortBy) { + + case 'date-asc': + return new Date(a.dateTime).getTime() - new Date(b.dateTime).getTime(); + + case 'date-desc': + return new Date(b.dateTime).getTime() - new Date(a.dateTime).getTime(); + + case 'name-asc': + return a.name.localeCompare(b.name); + + case 'name-desc': + return b.name.localeCompare(a.name); + + default: + return 0; + } + }); + + return sorted; + + }, [events, search, categoryFilter, sortBy]); + + const upcoming = useMemo( + () => filtered.filter(e => !isPast(new Date(e.dateTime))), + [filtered] + ); + + const past = useMemo( + () => filtered.filter(e => isPast(new Date(e.dateTime))), + [filtered] + ); + + const list = tab === 'upcoming' ? upcoming : past; + + return { + filtered, + upcoming, + past, + list + }; +} \ No newline at end of file diff --git a/dynamox-event-app/src/lib/api.ts b/dynamox-event-app/src/lib/api.ts new file mode 100644 index 0000000000..6f6503209a --- /dev/null +++ b/dynamox-event-app/src/lib/api.ts @@ -0,0 +1,34 @@ +import axios from "axios"; + +const api = axios.create({ + baseURL: "/api", +}); + + +//intercptor para adicionar o token ao header de todas as reqs +api.interceptors.request.use((config) => { + const token = localStorage.getItem("auth_token"); + + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + + return config; +}); + +// interceptor para validar token. Desloga automaticamente caso token seja inválido +api.interceptors.response.use( + (response) => response, + (error) => { + + if (error.response?.status === 401) { + localStorage.removeItem("auth_token"); + localStorage.removeItem("auth_user"); + window.location.href = "/login"; + } + + return Promise.reject(error); + } +); + +export default api; \ No newline at end of file diff --git a/dynamox-event-app/src/lib/eventsStore.ts b/dynamox-event-app/src/lib/eventsStore.ts new file mode 100644 index 0000000000..0522388af1 --- /dev/null +++ b/dynamox-event-app/src/lib/eventsStore.ts @@ -0,0 +1,3 @@ +import db from "../../db.json" + +export const events = [...db.events] \ No newline at end of file diff --git a/dynamox-event-app/src/redux/StoreProvider.tsx b/dynamox-event-app/src/redux/StoreProvider.tsx new file mode 100644 index 0000000000..f0b4e90114 --- /dev/null +++ b/dynamox-event-app/src/redux/StoreProvider.tsx @@ -0,0 +1,16 @@ +'use client'; + +import { Provider } from 'react-redux'; +import { store } from './store'; + +export default function StoreProvider({ + children +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/dynamox-event-app/src/redux/hooks.ts b/dynamox-event-app/src/redux/hooks.ts new file mode 100644 index 0000000000..ce385c9e2d --- /dev/null +++ b/dynamox-event-app/src/redux/hooks.ts @@ -0,0 +1,6 @@ +import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; +import type { RootState, AppDispatch } from './store'; + +export const useAppDispatch = () => useDispatch(); + +export const useAppSelector: TypedUseSelectorHook = useSelector; \ No newline at end of file diff --git a/dynamox-event-app/src/redux/store.ts b/dynamox-event-app/src/redux/store.ts new file mode 100644 index 0000000000..9fe30ab9c7 --- /dev/null +++ b/dynamox-event-app/src/redux/store.ts @@ -0,0 +1,14 @@ +import { configureStore } from '@reduxjs/toolkit'; +import { eventsApi } from '@/services/eventsApi'; + +export const store = configureStore({ + reducer: { + [eventsApi.reducerPath]: eventsApi.reducer + }, + + middleware: getDefaultMiddleware => + getDefaultMiddleware().concat(eventsApi.middleware) +}); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; \ No newline at end of file diff --git a/dynamox-event-app/src/services/eventsApi.ts b/dynamox-event-app/src/services/eventsApi.ts new file mode 100644 index 0000000000..333af19ffc --- /dev/null +++ b/dynamox-event-app/src/services/eventsApi.ts @@ -0,0 +1,54 @@ +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; +import { Event } from '@/types/event'; + +export const eventsApi = createApi({ + reducerPath: 'eventsApi', + + baseQuery: fetchBaseQuery({ + baseUrl: '/api' + }), + + tagTypes: ['Events'], + + endpoints: builder => ({ + + getEvents: builder.query({ + query: () => '/events', + providesTags: ['Events'] + }), + + createEvent: builder.mutation>({ + query: event => ({ + url: '/events', + method: 'POST', + body: event + }), + invalidatesTags: ['Events'] + }), + + updateEvent: builder.mutation }>({ + query: ({ id, event }) => ({ + url: `/events/${id}`, + method: 'PATCH', + body: event + }), + invalidatesTags: ['Events'] + }), + + deleteEvent: builder.mutation({ + query: id => ({ + url: `/events/${id}`, + method: 'DELETE' + }), + invalidatesTags: ['Events'] + }) + + }) +}); + +export const { + useGetEventsQuery, + useCreateEventMutation, + useUpdateEventMutation, + useDeleteEventMutation +} = eventsApi; \ No newline at end of file diff --git a/dynamox-event-app/src/theme/ThemeRegistry.tsx b/dynamox-event-app/src/theme/ThemeRegistry.tsx new file mode 100644 index 0000000000..282b2f4082 --- /dev/null +++ b/dynamox-event-app/src/theme/ThemeRegistry.tsx @@ -0,0 +1,18 @@ +'use client' + +import { ThemeProvider } from '@mui/material/styles'; +import CssBaseline from '@mui/material/CssBaseline'; +import theme from '@/theme/theme'; + +export default function ThemeRegistry({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + {children} + + ) +} \ No newline at end of file diff --git a/dynamox-event-app/src/theme/theme.ts b/dynamox-event-app/src/theme/theme.ts new file mode 100644 index 0000000000..e0e7afdc84 --- /dev/null +++ b/dynamox-event-app/src/theme/theme.ts @@ -0,0 +1,13 @@ +'use client' + +import { createTheme } from "@mui/material/styles"; + +const theme = createTheme({ + palette: { + background: { + default: '#f6f7f9' + } + } +}); + +export default theme; \ No newline at end of file diff --git a/dynamox-event-app/src/types/event.ts b/dynamox-event-app/src/types/event.ts new file mode 100644 index 0000000000..1f836f973d --- /dev/null +++ b/dynamox-event-app/src/types/event.ts @@ -0,0 +1,20 @@ + +export type UserRole = 'admin' | 'reader'; + +export interface User { + id: string; + email: string; + role: UserRole; + name: string; +} + +export type EventCategory = 'Conference' | 'Workshop' | 'Webinar' | 'Networking' | 'Other'; + +export interface Event { + id: string; + name: string; + dateTime: string; + location: string; + description: string; + category: EventCategory; +} \ No newline at end of file diff --git a/dynamox-event-app/tsconfig.json b/dynamox-event-app/tsconfig.json new file mode 100644 index 0000000000..eb9eea33c0 --- /dev/null +++ b/dynamox-event-app/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "resolveJsonModule": true, + "isolatedModules": true, + "incremental": true, + "esModuleInterop": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/front-end-challenge-v2.md b/front-end-challenge-v2.md deleted file mode 100644 index 900f82a9d1..0000000000 --- a/front-end-challenge-v2.md +++ /dev/null @@ -1,81 +0,0 @@ -# Dynamox Front-end Developer Challenge - -[< back to README](./README.md) - -Dynamox front-end development team presents you with the following challenge: - -**Using React and TypeScript, develop a robust and intuitive dashboard application that allows assessing the data acquired by our sensors.** - ---- - -Keep in mind the challenge aims to reproduce an environment where you could demonstrate your skills. - -In order to help guiding your development process we will provide some requirements. It is not mandatory to fulfill all requirements to submit your implementation. The more requirements you implement, the more resources we will have to assess your skills and knowledge. - -Use your best judgement to prioritize tasks to meet the time you have available. Feel free to make any assumptions you consider necessary to complete the task. - -## Functional Requirements and User Stories - -In maintenance industry, vibration analysis plays a main role: It uses physical quantities like acceleration and velocity to find evidences that help predict occurence of faults or degradations in machines. - -The page that displays this information in DynaPredict, our asset condition monitoring platform, is designed pretty much like [this](https://www.figma.com/file/QxUZkTUIzQA7cvyiMvVyxK/Front-end---Teste?type=design&node-id=1001%3A3&mode=design&t=JLnbGmQJcSlnYYE2-1). - -Use the figma as a reference to build an interface and develop the following user stories: - -1 - User Stories -1. [ ] As an user I want to acess the route */data* of my app and view a screen containing a small header with information about the machine and a couple of time-series charts. - -1. [ ] As an user I want to view 3 time-series charts of the following metrics: *acceleration, velocity and temperature*. Each time series should have a horizontal axis for the time and a vertical axis for the metric magnitude. - -1. [ ] As an user I want that the data that will populate these charts should be fetched each time I access the route */data*. Use the data available in [Responses](./response-challenge-v2.json) as a mock and use a package like [json-server](https://www.npmjs.com/package/json-server) to build an REST API. - -1. [ ] As an user I want to hover over a point of a chart and see a vertical crosshair marking equivalent timestamps in all time-series charts, with a tooltip describing that point. [Check out](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/demo/synchronized-charts) to view a sample of this feature. - - -2 - Technical requirements -1. [ ] Use TypeScript. -1. [ ] Use React. -1. [ ] Use Redux for managing global states. [Check out](https://redux-toolkit.js.org/introduction/getting-started) to get started. -1. [ ] Use Redux Saga for asynchronous side effects. [Check out](https://redux-saga.js.org/docs/introduction/GettingStarted) to get started. -1. [ ] Use Vite for building the app. [Check out](https://vitejs.dev/guide/) to get started. -1. [ ] Use Material UI 5 for styling the application. [Check out](https://mui.com/material-ui/getting-started/) to get started. -1. [ ] Use Highcharts, Plotly, D3 or any similar library to display the plots. [Check out](https://www.highcharts.com/docs/index) to get started. -1. [ ] Ensure correct business logic and behavior with automated unit tests. - -We encourage using our frontend stack tooling to make the challenge resemble our everyday tasks. - -3 - Bonus -1. [ ] Use Storybook for documentation. [Check out](https://storybook.js.org/docs) to get started. -1. [ ] Add e2e tests with Cypress. [Check out](https://learn.cypress.io/) to get started. -1. [ ] Deploy your application to a cloud provider and provide a link for the running app. - -## Evaluation Criteria - -Each one of the itens above will be evaluated as "Not Implemented", "Implemented with Issues", "Implemented", or "Implemented with Excellence". In order to assess different profiles and experiences, we expect candidates applying to more senior levels demonstrate a deeper understanding of the requirements and implement more of them in the same deadline. - -In general we will be looking for the following: -1. [ ] Anyone should be able to follow the instructions and run the application. -1. [ ] Front-end code is successfully integrated with a fake REST API. -1. [ ] Stories were implemented according to the functional requirements. -1. [ ] Problem-solving skills and ability to handle ambiguity. -1. [ ] Code quality, readability, and maintainability. -1. [ ] Code is well-organized and documented. -1. [ ] Application layout is responsive. - -## Ready to Begin the Challenges? - -* Fork this repository to your own Github account. -* Create a new branch using your first name and last name. For example: `caroline-oliveira`. -* After completing the challenge, create a pull request to this repository (https://github.com/dynamox-s-a/js-ts-full-stack-test) pointing to the main branch. -* We will receive a notification about your pull request, review your solution and get in touch with you. -
- -**Good luck! We look forward to reviewing your submission.** 🚀 - -## Frequently Asked Questions - -* Is it necessary to fork the project? - **Yes, this allows us to see how much time you spent on the challenge.** - -* If I have more questions, who can I contact? - **Please reply to the email who sent you this test.** \ No newline at end of file diff --git a/full-stack-challenge.md b/full-stack-challenge.md deleted file mode 100644 index 0ee4a2bc7c..0000000000 --- a/full-stack-challenge.md +++ /dev/null @@ -1,156 +0,0 @@ -# Dynamox Full-Stack Developer Challenge - -[< back to README](./README.md) - -In order to contribute to the enhancement of our Corporate Channels and asset condition monitoring platform, DynaPredict, we present you with the following challenge: - -Build a robust and intuitive full-stack application developed using React and TypeScript for the frontend, and a suitable backend technology. The application should include authentication, machine management, sensor management, time-series data processing, and general user-friendly features. - -To properly address this challenge, you must deliver a fully integrated end‑to‑end flow, with frontend components connected to real backend endpoints and persistent storage. Implementing features only halfway — such as building UI components without backend integration — will not meet the challenge requirements. Complete integration between frontend and backend is more important than implementing isolated or unfinished client‑side features. - -While going through the challenge, you should be able to handle ambiguous situations, adhere to best practices in both front-end and back-end development, and demonstrate excellent problem-solving skills. Effective communication through well-documented code, code quality, readability, and maintainability will also be evaluated. - -## User Stories and Functional Requirements - -Here you have the functional requirements for the application. You are free to make any assumptions you consider necessary to complete the challenge. - ---- - -It is not mandatory to implement all the listed requirements before submitting your implementation. Just keep in mind that the more requirements you implement, the more you will be able to demonstrate your skills and knowledge. - -We will expect candidates applying to more senior levels to demonstrate a deeper understanding of the requirements and to implement more of them for the same deadline. - ---- - -You can use the following user stories as a guide to implement the application features: - -1 - Authentication - -1. [ ] As a user, I want to log in using a fixed email and password so that I can access private routes. -1. [ ] As a user, I want to be able to log out of the system so that I can prevent unauthorized access to my account. -1. [ ] No private routes should be accessible without authentication. - -2 - Machine Management - -1. [ ] As a user, I want to create a new machine with an arbitrary name and with a type selected from a list ["Pump", "Fan"] so that I can manage it later. -1. [ ] As a user, I want to change the attributes (name and type) of a machine after creating it so that I can keep the machine information updated. -1. [ ] As a user, I want to delete a machine when it is no longer in use so that it doesn't clutter the system. - -3 - Monitoring Points and Sensors Management - -1. [ ] As a user, I want to create at least two monitoring points with arbitrary names for an existing machine, so that I can monitor the machine's performance. -1. [ ] As a user, I want to associate a sensor to an existing monitoring point so that I can monitor the machine's performance. The sensor should have a unique ID, and the sensor model name should be one of ["TcAg", "TcAs", "HF+"]. -1. [ ] As a user, I want the system to prevent me from setting up "TcAg" and "TcAs" sensors for machines of the type "Pump". -1. [ ] As a user, I want to see all my monitoring points in a paginated list so that I can manage them. The list should display up to 5 monitoring points per page and should include the following information: "Machine Name", "Machine Type", "Monitoring Point Name", and "Sensor Model". -1. [ ] As a user, I want to sort the monitoring points list by any of its columns in ascending or descending order, so that I can easily find the information I'm looking for. - -4 - Ambiguity Handling - -1. [ ] Make reasonable assumptions and design the application accordingly for any ambiguities in the challenge. -1. [ ] Document your assumptions in the README file. - -5 - Technical requirements - -1. [ ] Use TypeScript. -1. [ ] Use React. -1. [ ] Use Redux for managing global states. -1. [ ] Use Redux Thunks or Redux Saga for managing asynchronous side effects. -1. [ ] Use Next.js or Vite. -1. [ ] Use Material UI 5 for styling the application. -1. [ ] Create reusable components. -1. [ ] The code is well-organized and documented. -1. [ ] The application layout is responsive. -1. [ ] Ensure correct business logic and behavior with automated unit tests. - -6 - Back-end Requirements - -1. [ ] Implement your own back-end code using NodeJS JavaScript runtime (not Java, not PHP...). Although we also work with Python here, we are looking for JavaScript related skills in this test. -1. [ ] Use either PostgreSQL or MongoDB as a persistence layer. -1. [ ] If you choose to use PostgreSQL, use Prisma ORM (or even try Drizzle, or Kysely) to interact with PostgreSQL. -1. [ ] If you choose to use MongoDB, use Mongoose ORM to interact with the database. -1. [ ] Implement RESTful API endpoints for all required functionality (authentication, machine management, sensor management). -1. [ ] Implement time-series data storage and retrieval functionality for sensor data. -1. [ ] Ensure the API has proper error handling and validation. -1. [ ] Implement unit tests for backend code. -1. [ ] The latency between client and the server side should be below 350ms for all requests. - -7 - Time-Series Data Management - -1. [ ] As a user, I want to be able to store raw sensor data as time-series for my monitoring points. -1. [ ] As a user, I want to be able to retrieve metrics about the time-series data for my sensors. -1. [ ] As a user, I want to be able to delete time-series data I've sent to the server. -1. [ ] As a user, I want to be able to retrieve the number of time-series I've stored in the server. -1. [ ] As a user, I want to be able to retrieve a full time-series I've stored. -1. [ ] As a user, I want to be able to visualize time-series data in a chart or graph format. - -8 - Bonus - -1. [ ] Use Nx to manage the whole application as a monorepo (we use that tool a lot here). -1. [ ] Add e2e tests with Cypress (use it to test a full user flow). -1. [ ] If you were provided with a baseline code, identify any areas of bad code or suboptimal implementations and refactor them. -1. [ ] Deploy your application to a cloud provider and provide a link for the running app. -1. [ ] Implement a functionality that gives a future prediction of the time-series data. -1. [ ] Add load balancer to the application. -1. [ ] Add load tests to the application. - -9 - Tips - -1. [ ] There is no need to reinvent the wheel. You can use a Material UI 5 free template like [Devias Kit](https://mui.com/store/items/devias-kit/) to speed up the development process. -1. [ ] Not familiar with Redux? Check out [this tutorial](https://egghead.io/courses/modern-redux-with-redux-toolkit-rtk-and-typescript-64f243c8) to get started. -1. [ ] Not familiar with Cypress? Check out [these tutorials](https://learn.cypress.io/) to get started. -1. [ ] For time-series data visualization, consider using libraries like [Recharts](https://recharts.org/), [Chart.js](https://www.chartjs.org/), or [D3.js](https://d3js.org/). -
- - -## Evaluation Criteria - -The items listed above will have different weights in the evaluation process. Each one of them will be evaluated as "Not Implemented", "Implemented with Issues", "Implemented", or "Implemented with Excellence". Use your judgement to prioritize the requirements you will implement in the time you have available. - -In general we will be looking for the following: - -1. [ ] Anyone should be able to follow the instructions and run the application. -1. [ ] User stories were implemented according to the functional requirements. -1. [ ] Front-end code is successfully integrated with a back-end API. -1. [ ] Back-end code successfully integrates with a persistent storage solution. -1. [ ] Time-series data is properly stored, processed, and visualized. -1. [ ] Ability to refactor existing code (if applicable) and write unit tests for both front-end and back-end code. -1. [ ] Adherence to best practices in both front-end and back-end development. -1. [ ] API performance meets the latency requirements. -1. [ ] Problem-solving skills and ability to handle ambiguity. -1. [ ] Code quality, readability, and maintainability. -1. [ ] Code is well-organized and documented. -1. [ ] Use of atomic and semantic commits following a clear commit message convention (e.g., Conventional Commits). - -## Ready to Begin the Challenges? - -1. [ ] Fork this repository to your own Github account. -1. [ ] Create a new branch using your first name and last name. For example: `caroline-oliveira`. -1. [ ] After completing the challenge, create a pull request to this repository (https://github.com/dynamox-s-a/js-ts-full-stack-test), aimed at the main branch. -1. [ ] We will receive a notification about your pull request, review your solution, and get in touch with you. - -## Frequently Asked Questions - -1. Can I use create-react-app to complete the challenge? - **No, create-react-app is not acceptable for this challenge.** - -1. Can I use Next.js or Vite to complete the challenge? - **Yes, you should use of either Next.js or Vite for this challenge.** - -1. Is it necessary to fork the project? - **Yes, this allows us to see how much time you spent on the challenge.** - -1. Can I use Material UI in the project? - **Yes, the use of Material UI 5 is mandatory for this challenge.** - -1. If I have more questions, who can I contact? - **Please reply to the email who sent you this test.** - -1. Is implementing a back-end API required? - **Yes, implementing your own back-end API is now a core requirement, not a bonus. It needs to use NodeJS.** - -1. Can I use AI to complete the challenge? - **Yes, however, keep in mind you will need to explain your decisions and code.** - -
- -**Good luck! We look forward to reviewing your submission.** 🚀 diff --git a/full-stack-csharp-react-challenge.md b/full-stack-csharp-react-challenge.md deleted file mode 100644 index 64e513308a..0000000000 --- a/full-stack-csharp-react-challenge.md +++ /dev/null @@ -1,77 +0,0 @@ -# Full-Stack Development Challenge - C# and React - -## Overview -To help us evolve our asset condition monitoring platform, **DynaPredict**, we present the following challenge: - -Build a robust and intuitive application (front-end and back-end) for managing industrial machines. With this system, a user should be able to register, view, and manage their industry's machines. - -Throughout the challenge, we expect you to demonstrate familiarity with the proposed technologies, apply development best practices, and showcase your problem-solving skills. **Code quality, clarity, readability, and maintainability** will be the main evaluation points. - ---- - -## User Stories and Functional Requirements -Below are the functional requirements for the application. Feel free to make any assumptions you deem necessary to complete the challenge, documenting them in the README. - -### 1 - Machine Management -- [ ] As a user, I want to register a new machine by providing its **Name**, **Serial Number**, **Description**, and selecting a **Machine Type** from a predefined list (e.g., "Press", "Lathe", "Milling Machine"), so that I can manage it later. -- [ ] As a user, I want to view a list of all registered machines, displaying at least the **Name**, **Serial Number**, and **Type**, to get an overview of my factory floor. -- [ ] As a user, I want to click on a machine in the list to see its full details on a dedicated page. -- [ ] As a user, I want the system to prevent the registration of a machine without the required fields (**Name**, **Serial Number**, **Type**). - ---- - -## Mandatory Technical Requirements - -### 2 - Back-end -- [ ] The application must be written in **C#**, using **.NET 6 (or higher)** and **ASP.NET Core**. -- [ ] Use a data persistence mechanism. File or preferably **SQL Server** or **PostgreSQL** databases. -- [ ] Expose a **RESTful API** with the following endpoints: - - `GET /api/machines` — returns all machines. - - `GET /api/machines/{id}` — returns the machine with the specified ID. - - `POST /api/machines` — creates a new machine. -- [ ] If you use database, provide **Entity Framework Core migrations** or a **SQL script** to create the entire database structure. - -### 3 - Front-end -- [ ] The application must be developed in **React with TypeScript**. -- [ ] Implement the following screens: - - A screen for **machine creation** (form). - - A screen to **display the list of machines**. - - A screen to **display the details of a single machine**. -- [ ] The creation form must have **validation for required fields**. - ---- - -## Bonus Points (Optional Requirements) -These items (4 and 5) are not mandatory, but implementing them will significantly enhance the quality of your evaluation. - -### 4 - Best Practices & Architecture (Back-end) -- [ ] Use **Dependency Injection** to manage the application's dependencies. -- [ ] Divide the solution into **layers of responsibility** (e.g., Api, Application, Domain, Infrastructure). -- [ ] Use **Entity Framework Core** as the ORM. -- [ ] Implement the **Repository Pattern**. -- [ ] Generate API documentation using **Swagger (Swashbuckle)**. -- [ ] Implement **consistent error handling**, with appropriate HTTP status codes (e.g., `400` for validation, `404` for not found, `500` for unexpected errors). - -### 5 - Quality & DevOps -- [ ] Write **unit or integration tests** for the main business logic. -- [ ] Provide **Dockerfile(s)** and a **docker-compose.yml** file to initialize the API, database, and front-end. -- [ ] Create a **README.md** file with clear instructions to run the project locally (either with Docker or manually). - ---- - -## Evaluation Criteria -Your solution will be evaluated based on the following criteria: - -- **Functionality**: The user stories were implemented correctly. -- **Back-end Quality**: Clean, well-structured code, application of design patterns and architecture. -- **Front-end Quality**: Componentization, folder structure, state management, and responsiveness. -- **Best Practices**: Adherence to technical requirements and implementation of optional items. -- **Documentation and Ease of Execution**: Clarity of the README and ease of setting up and running the project. - ---- - -## Submission Instructions -1. **Fork** this repository to your personal GitHub account. -2. Create a new **branch** from `main` with your name (e.g., `firstname-lastname`). -3. After completing the challenge, open a **Pull Request** from your branch to the original repository's `main` branch. -4. Our team will be notified, review your solution, and get in touch with you. diff --git a/ios-challenge.md b/ios-challenge.md deleted file mode 100644 index ea65fb9469..0000000000 --- a/ios-challenge.md +++ /dev/null @@ -1,131 +0,0 @@ -# Dynamox iOS Developer Challenge - -## Overview - -The test consists of developing a robust and intuitive iOS Quiz application in Swift. - -The quiz is composed by a sequence of 10 multiple-choice questions. When the app opens, the user enters their name or nickname and presses a button to start the quiz. Questions must be obtained via HTTP requests and are received in JSON format as shown below. - -```json -{ - "id": "22", - "statement": "What is the name of the coolest company in the world?", - "options": [ - "Google", - "Microsoft", - "Dynamox", - "Spotify", - "Amazon" - ] -} -``` - -The response to each question is checked via an HTTP POST request. The server returns whether the answer was correct or not sending true or false in JSON format as shown below. - -```json -{ - "result": true -} -``` - -The users of the app should know whether they got the question right before moving on to the next one. At the end of the 10 questions, the app should display the user's score and offer an option to restart the quiz. - -Throughout the challenge, we expect you to demonstrate familiarity with the proposed technologies, apply development best practices, and showcase your problem-solving skills. **Code quality, clarity, readability, and maintainability** will be the main evaluation points. - -## User Stories and Functional Requirements -Below are the functional requirements for the application. Feel free to make any assumptions you deem necessary to complete the challenge, documenting them in the README. - -### 1 - Quiz visualization and answer submission -- [ ] As a user, I want to load a question with a set of alternative answers, so that I can choose the one that is right. -- [ ] As a user, I want to choose an answer for a question from a set of alternatives and submit it, so that I can know if I made the right choice. - -### 2 - Quiz navigation -- [ ] As a user, I want to move to the next question once I have received the result of my answer submission, so that I can get to the end of the quiz. -- [ ] As a user, I want to know the final score for the quiz once I have submitted 10 answers, so that I could share it with friends -- [ ] As a user I want to restart the quiz with new questions, so that I could get a new score - -### 3 - User management -- [ ] As a user, I want to register my name or nickname, so that different users could use the app -- [ ] As a user, I want to save the score of every quiz I made, so that I can visualize the score of every user at all times - -## Backend API - -- Backend host: https://quiz-api-bwi5hjqyaq-uc.a.run.app - -### GET /question - -Use this endpoint to obtain a random question from the server. It returns a response in the following format: - -```json -{ - "id": "22", - "statement": "What is the name of the coolest company in the world?", - "options": [ - "Google", - "Microsoft", - "Dynamox", - "Spotify", - "Amazon" - ] -} -``` - -### POST /answer?questionId=$id - -Use this endpoint to check whether the user's answer is correct. The POST body must contain the user's answer in the following format: - -```json -{ - "answer": "Dynamox" -} -``` - -The server will return: - -```json -{ - "result": true -} -``` - -## Mandatory Technical Requirements - -- [ ] The application must be written in **Swift** -- [ ] Use **CocoaPods** for dependency management -- [ ] Use some data persistence mechanism to store players and scores -- [ ] Use **UIKit and SwiftUI** for the views -- [ ] Ensure correct business logic and behavior with automated unit tests. - ---- - -## Bonus Points (Optional Requirements) -These items (1 to 3) are not mandatory, but implementing them will significantly enhance the quality of your evaluation. - -### 1 - Best Practices & Architecture -- [ ] Use **Dependency Injection** to manage the application's dependencies. -- [ ] Use **Async await/Combine** for asynchronous operations. -- [ ] Use consistent design, animations, icons, etc. -- [ ] Divide the solution into **layers of responsibility** (e.g., Api, Application, Domain, Infrastructure). -- [ ] Implement some design pattern. -- [ ] Implement **consistent error handling**, with appropriate HTTP status codes (e.g., `400` for validation, `404` for not found, `500` for unexpected errors). - -### 2 - Quality & DevOps -- [ ] Write **integration tests** for the main business logic. -- [ ] Create a **README.md** file with clear instructions to run the project locally (either with Docker or manually). - ---- - -## Evaluation Criteria - -- Technical capability -- iOS knowledge -- Project and code architecture -- Code reuse -- Code readability -- Commit history - -## Submission Instructions -1. **Fork** this repository to your personal GitHub account. -2. Create a new **branch** from `main` with your name (e.g., `firstname-lastname`). -3. After completing the challenge, open a **Pull Request** from your branch to the original repository's `main` branch. -4. Our team will be notified, review your solution, and get in touch with you. \ No newline at end of file diff --git a/kotlin-multiplatform-challenge.md b/kotlin-multiplatform-challenge.md deleted file mode 100644 index 818eb9b2a1..0000000000 --- a/kotlin-multiplatform-challenge.md +++ /dev/null @@ -1,134 +0,0 @@ -# Dynamox Kotlin Multiplatform Developer Challenge - -## Overview - -The test consists of developing a robust and intuitive multiplatform (Android and iOS) Quiz application in Kotlin. - -The quiz is composed by a sequence of 10 multiple-choice questions. When the app opens, the user enters their name or nickname and presses a button to start the quiz. Questions must be obtained via HTTP requests and are received in JSON format as shown below. - -```json -{ - "id": "22", - "statement": "What is the name of the coolest company in the world?", - "options": [ - "Google", - "Microsoft", - "Dynamox", - "Spotify", - "Amazon" - ] -} -``` - -The response to each question is checked via an HTTP POST request. The server returns whether the answer was correct or not sending true or false in JSON format as shown below. - -```json -{ - "result": true -} -``` - -The users of the app should know whether they got the question right before moving on to the next one. At the end of the 10 questions, the app should display the user's score and offer an option to restart the quiz. - -Throughout the challenge, we expect you to demonstrate familiarity with the proposed technologies, apply development best practices, and showcase your problem-solving skills. **Code quality, clarity, readability, and maintainability** will be the main evaluation points. - -## User Stories and Functional Requirements -Below are the functional requirements for the application. Feel free to make any assumptions you deem necessary to complete the challenge, documenting them in the README. - -### 1 - Quiz visualization and answer submission -- [ ] As a user, I want to load a question with a set of alternative answers, so that I can choose the one that is right. -- [ ] As a user, I want to choose an answer for a question from a set of alternatives and submit it, so that I can know if I made the right choice. - -### 2 - Quiz navigation -- [ ] As a user, I want to move to the next question once I have received the result of my answer submission, so that I can get to the end of the quiz. -- [ ] As a user, I want to know the final score for the quiz once I have submitted 10 answers, so that I could share it with friends -- [ ] As a user I want to restart the quiz with new questions, so that I could get a new score - -### 3 - User management -- [ ] As a user, I want to register my name or nickname, so that different users could use the app -- [ ] As a user, I want to save the score of every quiz I made, so that I can visualize the score of every user at all times - -## Backend API - -- Backend host: https://quiz-api-bwi5hjqyaq-uc.a.run.app - -### GET /question - -Use this endpoint to obtain a random question from the server. It returns a response in the following format: - -```json -{ - "id": "22", - "statement": "What is the name of the coolest company in the world?", - "options": [ - "Google", - "Microsoft", - "Dynamox", - "Spotify", - "Amazon" - ] -} -``` - -### POST /answer?questionId=$id - -Use this endpoint to check whether the user's answer is correct. The POST body must contain the user's answer in the following format: - -```json -{ - "answer": "Dynamox" -} -``` - -The server will return: - -```json -{ - "result": true -} -``` - -## Mandatory Technical Requirements - -- [ ] The application must be written in **Kotlin** using **Kotlin Multiplatform** -- [ ] The application must run for **Android** -- [ ] Use a data persistence mechanism to store players and scores -- [ ] Use Jetpack Compose for the views -- [ ] Ensure correct business logic and behavior with automated unit tests. - ---- - -## Bonus Points (Optional Requirements) -These items (1 to 3) are not mandatory, but implementing them will significantly enhance the quality of your evaluation. - -### 1 - Best Practices & Architecture -- [ ] Use **Dependency Injection** to manage the application's dependencies. -- [ ] Use **Kotlin Flow/Coroutines** for asynchronous operations. -- [ ] Use consistent design, animations, icons, etc. -- [ ] Divide the solution into **layers of responsibility** (e.g., Api, Application, Domain, Infrastructure). -- [ ] Implement some design pattern. -- [ ] Implement **consistent error handling**, with appropriate HTTP status codes (e.g., `400` for validation, `404` for not found, `500` for unexpected errors). - -### 2 - Quality & DevOps -- [ ] Write **integration tests** for the main business logic. -- [ ] Create a **README.md** file with clear instructions to run the project locally (either with Docker or manually). - -### 3 - Multiplatform -- [ ] Application running in both Android and iOS devices - ---- - -## Evaluation Criteria - -- Technical capability -- Android, iOS and KMP knowledge -- Project and code architecture -- Code reuse -- Code readability -- Commit history - -## Submission Instructions -1. **Fork** this repository to your personal GitHub account. -2. Create a new **branch** from `main` with your name (e.g., `firstname-lastname`). -3. After completing the challenge, open a **Pull Request** from your branch to the original repository's `main` branch. -4. Our team will be notified, review your solution, and get in touch with you. diff --git a/qa-challenge.md b/qa-challenge.md deleted file mode 100644 index db517fb8eb..0000000000 --- a/qa-challenge.md +++ /dev/null @@ -1,60 +0,0 @@ -# QA Test for Web Applications - -In this challenge, we will evaluate your ability to develop automated tests for a web application responsible for displaying data from a vibration and temperature sensor. - -Consider the following development flow. The Product team has created the functional requirements and provided the following [file](https://www.figma.com/file/QxUZkTUIzQA7cvyiMvVyxK/Front-end---Teste?type=design&node-id=1001%3A3&mode=design&t=JLnbGmQJcSlnYYE2-1) containing the screen prototype. The product requirements are: - -1. As a user, I want to view a screen containing a small header with machine information and some charts. -2. As a user, I want to view 3 time series charts for RMS Acceleration, RMS Velocity, and Temperature. -3. As a user, I want the data to be refreshed every time I access the page. -4. As a user, when hovering over the time series, I want to see a tooltip displaying the data values. - -To obtain the data, the following requests are made: - -* **GET** request to the */data* route. Contains time series data that will be displayed in the charts. For the purposes of this test, the data is static. -* **GET** request to the */metadata* route. Contains information associated with the monitoring point that will be displayed in the header. - -The web application is available at this [link](https://frontend-test-for-qa.vercel.app/). - -## Test Requirements - -The product requirements represent macro-journeys, so also consider implementation details: - -* Can the user complete this journey? -* Does the implementation meet all specifications of the prototype? -* Are there any strange or unexpected behaviors? - -Implement automated tests for each scenario you find appropriate. Tests are expected to pass where the criteria are met and fail where they are not. - -## Evaluation Criteria - -The following items will be evaluated: - -* Organization and structure of the test repository. -* Code documentation and readability. -* Test quality and coverage. - -Also consider: - -* Found a defect but don’t know how to create an automated test for it? Describe how you would report the issue to the developer. -* Found a product requirement not specified in the prototype? Describe how you would report it to the designer. -* There is no minimum or maximum number of tests. Find a balance between software robustness and test execution time. -* The choice of framework is up to you. - -## Ready to Begin the Challenges? - -* Fork this repository to your own Github account. -* Create a new branch using your first name and last name. For example: `caroline-oliveira`. -* After completing the challenge, create a pull request to this repository (https://github.com/dynamox-s-a) pointing to the main branch. -* We will receive a notification about your pull request, review your solution and get in touch with you. -
- -**Good luck! We look forward to reviewing your submission.** 🚀 - -## Frequently Asked Questions - -* Is it necessary to fork the project? - **Yes, this allows us to see how much time you spent on the challenge.** - -* If I have more questions, who can I contact? - **Please reply to the email who sent you this test.** diff --git a/response-challenge-v2.json b/response-challenge-v2.json deleted file mode 100644 index be6af35a0c..0000000000 --- a/response-challenge-v2.json +++ /dev/null @@ -1,5104 +0,0 @@ -[{ - "name": "accelerationRms/x", - "data": [ - { - "datetime": "2023-11-07T11:53:38.187Z", - "max": 0 - }, - { - "datetime": "2023-11-07T15:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-07T19:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-07T23:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T03:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T07:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T11:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T15:54:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T19:58:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T23:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T03:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T07:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T11:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T14:24:23.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T14:25:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T10:05:53.000Z", - "max": 0.109375 - }, - { - "datetime": "2023-11-16T15:01:15.000Z", - "max": 0.0625 - }, - { - "datetime": "2023-11-16T20:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T00:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T05:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T10:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T15:03:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T10:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T15:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T10:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T15:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T10:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T15:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T20:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T10:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T15:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T20:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T10:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T15:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T20:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T10:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T15:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T20:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T00:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T05:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T10:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T20:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-25T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T20:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T20:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T20:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T00:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T05:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T10:01:57.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-28T15:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T20:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T00:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T05:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T10:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T15:03:34.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-29T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-30T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T10:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-01T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-05T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-07T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T15:02:42.000Z", - "max": 0 - } - ] - }, - { - "name": "accelerationRms/y", - "data": [ - { - "datetime": "2023-11-07T11:53:38.187Z", - "max": 0 - }, - { - "datetime": "2023-11-07T15:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-07T19:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-07T23:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T03:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T07:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T11:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T15:54:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T19:58:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T23:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T03:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T07:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T11:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T14:24:23.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T14:25:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T10:05:53.000Z", - "max": 0.0625 - }, - { - "datetime": "2023-11-16T15:01:15.000Z", - "max": 0.09375 - }, - { - "datetime": "2023-11-16T20:01:13.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-17T00:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T05:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T10:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T15:03:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T10:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T15:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T10:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T15:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T10:00:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-20T15:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T20:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-21T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T10:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T15:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T20:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-22T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T10:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T15:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-22T20:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T10:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-23T15:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T20:03:25.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-24T00:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T05:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T10:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T15:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-24T20:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-25T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T20:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T20:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T15:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-27T20:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T00:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T05:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T10:01:57.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-28T15:03:34.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-28T20:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T00:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T05:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T10:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T15:03:34.000Z", - "max": 0.125 - }, - { - "datetime": "2023-11-29T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-30T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T10:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-01T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-05T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-05T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-06T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-07T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T15:02:42.000Z", - "max": 0 - } - ] - }, - { - "name": "accelerationRms/z", - "data": [ - { - "datetime": "2023-11-07T11:53:38.187Z", - "max": 0 - }, - { - "datetime": "2023-11-07T15:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-07T19:59:08.000Z", - "max": 0.109375 - }, - { - "datetime": "2023-11-07T23:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T03:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T07:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T11:59:08.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T15:54:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T19:58:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-08T23:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T03:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T07:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T11:55:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T14:24:23.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T14:25:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-09T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-10T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-11T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-12T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-13T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-14T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T10:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T15:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-15T20:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T00:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T05:05:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-16T10:05:53.000Z", - "max": 0.109375 - }, - { - "datetime": "2023-11-16T15:01:15.000Z", - "max": 0.109375 - }, - { - "datetime": "2023-11-16T20:01:13.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-11-17T00:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T05:01:13.000Z", - "max": 0 - }, - { - "datetime": "2023-11-17T10:01:13.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-11-17T15:03:57.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-11-17T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T10:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T15:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-18T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T10:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T15:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-19T20:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T00:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T05:00:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-20T10:00:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-20T15:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-20T20:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-21T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-21T10:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-21T15:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-21T20:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-22T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-22T10:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-22T15:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-22T20:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-23T00:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T05:00:15.000Z", - "max": 0 - }, - { - "datetime": "2023-11-23T10:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-23T15:00:15.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-23T20:03:25.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-24T00:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T05:03:25.000Z", - "max": 0 - }, - { - "datetime": "2023-11-24T10:03:25.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-24T15:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-24T20:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-25T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-25T20:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T10:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T15:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-26T20:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T00:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T05:01:53.000Z", - "max": 0 - }, - { - "datetime": "2023-11-27T10:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-27T15:01:53.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-27T20:01:57.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-28T00:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T05:01:57.000Z", - "max": 0 - }, - { - "datetime": "2023-11-28T10:01:57.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-11-28T15:03:34.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-28T20:03:34.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-11-29T00:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T05:03:34.000Z", - "max": 0 - }, - { - "datetime": "2023-11-29T10:03:34.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-11-29T15:03:34.000Z", - "max": 0.0625 - }, - { - "datetime": "2023-11-29T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-30T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-11-30T10:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-30T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-11-30T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-01T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-01T10:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-01T15:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-01T20:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-02T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-02T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-03T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-04T10:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-04T15:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-04T20:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-05T00:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-05T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-05T10:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-05T15:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-05T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-06T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-06T10:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-06T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-06T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-07T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-07T10:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-07T15:02:42.000Z", - "max": 0.03125 - }, - { - "datetime": "2023-12-07T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-08T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-08T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-08T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-09T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T10:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-09T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-09T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T10:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T15:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-10T20:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-11T10:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-11T15:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-11T20:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-12T00:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T05:02:42.000Z", - "max": 0 - }, - { - "datetime": "2023-12-12T10:02:42.000Z", - "max": 0.015625 - }, - { - "datetime": "2023-12-12T15:02:42.000Z", - "max": 0.03125 - } - ] - }, - { - "name": "velocityRms/x", - "data": [ - { - "datetime": "2023-11-07T11:53:38.187Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-07T15:59:08.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-07T19:59:08.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-07T23:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T03:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T07:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T11:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T15:54:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T19:58:25.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T23:55:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T03:55:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-09T07:55:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T11:55:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T14:24:23.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T14:25:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-09T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-10T00:05:53.000Z", - "max": 0.09432692307692307 - }, - { - "datetime": "2023-11-10T05:05:53.000Z", - "max": 0.09432692307692307 - }, - { - "datetime": "2023-11-10T10:05:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-10T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-11T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-11T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-12T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-12T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-12T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-13T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T10:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-13T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-14T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-14T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-15T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-15T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-16T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-16T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-16T10:05:53.000Z", - "max": 15.94125 - }, - { - "datetime": "2023-11-16T15:01:15.000Z", - "max": 9.52701923076923 - }, - { - "datetime": "2023-11-16T20:01:13.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-11-17T00:01:13.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-17T05:01:13.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-17T10:01:13.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-11-17T15:03:57.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-17T20:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-18T00:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-18T05:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-18T10:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-18T15:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-18T20:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-19T00:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-19T05:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-19T10:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-19T15:00:42.000Z", - "max": 0.09432692307692307 - }, - { - "datetime": "2023-11-19T20:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-20T00:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-20T05:00:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-20T10:00:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-11-20T15:00:15.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-11-20T20:00:15.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-11-21T00:00:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-21T05:00:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-21T10:00:15.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-21T15:00:15.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-21T20:00:15.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-22T00:00:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-22T05:00:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-22T10:00:15.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-11-22T15:00:15.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-22T20:00:15.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-11-23T00:00:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-23T05:00:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-23T10:00:15.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-11-23T15:00:15.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-11-23T20:03:25.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-24T00:03:25.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-24T05:03:25.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-24T10:03:25.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-24T15:01:53.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-11-24T20:01:53.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-25T00:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-25T05:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-25T10:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-25T15:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-25T20:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-26T00:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-26T05:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-26T10:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-26T15:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-26T20:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-27T00:01:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-27T05:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-27T10:01:53.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-27T15:01:53.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-27T20:01:57.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-11-28T00:01:57.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-28T05:01:57.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-28T10:01:57.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-28T15:03:34.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-11-28T20:03:34.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-29T00:03:34.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-29T05:03:34.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-29T10:03:34.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-29T15:03:34.000Z", - "max": 2.641153846153846 - }, - { - "datetime": "2023-11-29T20:02:42.000Z", - "max": 1.4149038461538461 - }, - { - "datetime": "2023-11-30T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-30T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-30T10:02:42.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-30T15:02:42.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-30T20:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-01T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-01T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-01T10:02:42.000Z", - "max": 1.5092307692307692 - }, - { - "datetime": "2023-12-01T15:02:42.000Z", - "max": 1.4149038461538461 - }, - { - "datetime": "2023-12-01T20:02:42.000Z", - "max": 1.6035576923076924 - }, - { - "datetime": "2023-12-02T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-02T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-02T10:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-02T15:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-02T20:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-03T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-03T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T10:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T15:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T20:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-04T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-04T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-04T10:02:42.000Z", - "max": 1.5092307692307692 - }, - { - "datetime": "2023-12-04T15:02:42.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-12-04T20:02:42.000Z", - "max": 1.4149038461538461 - }, - { - "datetime": "2023-12-05T00:02:42.000Z", - "max": 1.5092307692307692 - }, - { - "datetime": "2023-12-05T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-05T10:02:42.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-12-05T15:02:42.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-12-05T20:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-06T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-06T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-06T10:02:42.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-12-06T15:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-06T20:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-07T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-07T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-07T10:02:42.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-12-07T15:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-07T20:02:42.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-12-08T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-08T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-08T10:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-08T15:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-08T20:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-09T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-09T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-09T10:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-09T15:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-09T20:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-10T10:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-10T15:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-10T20:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-11T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-11T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-11T10:02:42.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-12-11T15:02:42.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-12-11T20:02:42.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-12-12T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-12T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-12T10:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-12T15:02:42.000Z", - "max": 0.6602884615384615 - } - ] - }, - { - "name": "velocityRms/y", - "data": [ - { - "datetime": "2023-11-07T11:53:38.187Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-07T15:59:08.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-07T19:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-07T23:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T03:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T07:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T11:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T15:54:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T19:58:25.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-08T23:55:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-09T03:55:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-09T07:55:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-09T11:55:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T14:24:23.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T14:25:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-10T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-10T10:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-13T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-15T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-16T00:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-16T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-16T10:05:53.000Z", - "max": 6.13125 - }, - { - "datetime": "2023-11-16T15:01:15.000Z", - "max": 14.715 - }, - { - "datetime": "2023-11-16T20:01:13.000Z", - "max": 1.320576923076923 - }, - { - "datetime": "2023-11-17T00:01:13.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-17T05:01:13.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-17T10:01:13.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-17T15:03:57.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-11-17T20:00:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-18T00:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-18T05:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-18T10:00:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-18T15:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-18T20:00:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-19T00:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T05:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T10:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T15:00:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-19T20:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-20T00:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-20T05:00:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-20T10:00:42.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-20T15:00:15.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-20T20:00:15.000Z", - "max": 1.5092307692307692 - }, - { - "datetime": "2023-11-21T00:00:15.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-21T05:00:15.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-21T10:00:15.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-21T15:00:15.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-21T20:00:15.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-22T00:00:15.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-11-22T05:00:15.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-22T10:00:15.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-22T15:00:15.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-22T20:00:15.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-23T00:00:15.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-23T05:00:15.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-11-23T10:00:15.000Z", - "max": 1.2262499999999998 - }, - { - "datetime": "2023-11-23T15:00:15.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-23T20:03:25.000Z", - "max": 1.320576923076923 - }, - { - "datetime": "2023-11-24T00:03:25.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-24T05:03:25.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-24T10:03:25.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-11-24T15:01:53.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-24T20:01:53.000Z", - "max": 1.2262499999999998 - }, - { - "datetime": "2023-11-25T00:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-25T05:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-25T10:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-25T15:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-25T20:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-26T00:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-26T05:01:53.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-11-26T10:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-26T15:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-26T20:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-27T00:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-27T05:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-27T10:01:53.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-11-27T15:01:53.000Z", - "max": 1.320576923076923 - }, - { - "datetime": "2023-11-27T20:01:57.000Z", - "max": 1.037596153846154 - }, - { - "datetime": "2023-11-28T00:01:57.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-28T05:01:57.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-28T10:01:57.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-28T15:03:34.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-11-28T20:03:34.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-29T00:03:34.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-29T05:03:34.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-29T10:03:34.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-29T15:03:34.000Z", - "max": 19.808653846153845 - }, - { - "datetime": "2023-11-29T20:02:42.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-11-30T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-30T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-30T10:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-11-30T15:02:42.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-30T20:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-01T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-01T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-01T10:02:42.000Z", - "max": 1.6035576923076924 - }, - { - "datetime": "2023-12-01T15:02:42.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-12-01T20:02:42.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-12-02T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-02T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-02T10:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-02T15:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-02T20:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-03T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T10:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-03T15:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-03T20:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-04T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-04T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-04T10:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-04T15:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-04T20:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-05T00:02:42.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-12-05T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-05T10:02:42.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-12-05T15:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-05T20:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-06T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-06T05:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-06T10:02:42.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-12-06T15:02:42.000Z", - "max": 0.7546153846153846 - }, - { - "datetime": "2023-12-06T20:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-07T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-07T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-07T10:02:42.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-12-07T15:02:42.000Z", - "max": 0.8489423076923077 - }, - { - "datetime": "2023-12-07T20:02:42.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-12-08T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-08T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-08T10:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-08T15:02:42.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-12-08T20:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-09T00:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-09T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-09T10:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-09T15:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-09T20:02:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-12-10T00:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-10T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T10:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T15:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T20:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-11T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-11T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-11T10:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-11T15:02:42.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-12-11T20:02:42.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-12-12T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-12T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-12T10:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-12T15:02:42.000Z", - "max": 0.6602884615384615 - } - ] - }, - { - "name": "velocityRms/z", - "data": [ - { - "datetime": "2023-11-07T11:53:38.187Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-07T15:59:08.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-07T19:59:08.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-11-07T23:59:08.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-08T03:59:08.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-08T07:59:08.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T11:59:08.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-08T15:54:15.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-08T19:58:25.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-08T23:55:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T03:55:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-09T07:55:42.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-09T11:55:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T14:24:23.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-11-09T14:25:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-09T15:05:53.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-11-09T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T10:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-10T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-11T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-11T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-11T10:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-11T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-11T20:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-12T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T10:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-12T15:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-12T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-13T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-13T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-13T10:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-13T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-13T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-14T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-14T05:05:53.000Z", - "max": 0.18865384615384614 - }, - { - "datetime": "2023-11-14T10:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-14T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-14T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-15T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-15T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-15T10:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-15T15:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-15T20:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-16T00:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-16T05:05:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-16T10:05:53.000Z", - "max": 15.658269230769232 - }, - { - "datetime": "2023-11-16T15:01:15.000Z", - "max": 14.526346153846154 - }, - { - "datetime": "2023-11-16T20:01:13.000Z", - "max": 6.13125 - }, - { - "datetime": "2023-11-17T00:01:13.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-17T05:01:13.000Z", - "max": 0.5659615384615384 - }, - { - "datetime": "2023-11-17T10:01:13.000Z", - "max": 4.244711538461539 - }, - { - "datetime": "2023-11-17T15:03:57.000Z", - "max": 4.339038461538462 - }, - { - "datetime": "2023-11-17T20:00:42.000Z", - "max": 2.169519230769231 - }, - { - "datetime": "2023-11-18T00:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-18T05:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-18T10:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-18T15:00:42.000Z", - "max": 1.1319230769230768 - }, - { - "datetime": "2023-11-18T20:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T00:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T05:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T10:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T15:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-19T20:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-20T00:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-20T05:00:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-20T10:00:42.000Z", - "max": 3.8674038461538465 - }, - { - "datetime": "2023-11-20T15:00:15.000Z", - "max": 3.584423076923077 - }, - { - "datetime": "2023-11-20T20:00:15.000Z", - "max": 3.8674038461538465 - }, - { - "datetime": "2023-11-21T00:00:15.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-11-21T05:00:15.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-21T10:00:15.000Z", - "max": 3.584423076923077 - }, - { - "datetime": "2023-11-21T15:00:15.000Z", - "max": 3.207115384615385 - }, - { - "datetime": "2023-11-21T20:00:15.000Z", - "max": 3.9617307692307695 - }, - { - "datetime": "2023-11-22T00:00:15.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-22T05:00:15.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-22T10:00:15.000Z", - "max": 3.490096153846154 - }, - { - "datetime": "2023-11-22T15:00:15.000Z", - "max": 3.7730769230769234 - }, - { - "datetime": "2023-11-22T20:00:15.000Z", - "max": 2.641153846153846 - }, - { - "datetime": "2023-11-23T00:00:15.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-23T05:00:15.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-23T10:00:15.000Z", - "max": 2.735480769230769 - }, - { - "datetime": "2023-11-23T15:00:15.000Z", - "max": 4.150384615384616 - }, - { - "datetime": "2023-11-23T20:03:25.000Z", - "max": 3.584423076923077 - }, - { - "datetime": "2023-11-24T00:03:25.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-24T05:03:25.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-24T10:03:25.000Z", - "max": 3.584423076923077 - }, - { - "datetime": "2023-11-24T15:01:53.000Z", - "max": 3.490096153846154 - }, - { - "datetime": "2023-11-24T20:01:53.000Z", - "max": 2.735480769230769 - }, - { - "datetime": "2023-11-25T00:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-25T05:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-25T10:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-25T15:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-25T20:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-26T00:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-26T05:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-26T10:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-26T15:01:53.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-26T20:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-27T00:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-27T05:01:53.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-27T10:01:53.000Z", - "max": 3.395769230769231 - }, - { - "datetime": "2023-11-27T15:01:53.000Z", - "max": 4.056057692307693 - }, - { - "datetime": "2023-11-27T20:01:57.000Z", - "max": 3.9617307692307695 - }, - { - "datetime": "2023-11-28T00:01:57.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-28T05:01:57.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-28T10:01:57.000Z", - "max": 4.339038461538462 - }, - { - "datetime": "2023-11-28T15:03:34.000Z", - "max": 2.641153846153846 - }, - { - "datetime": "2023-11-28T20:03:34.000Z", - "max": 4.244711538461539 - }, - { - "datetime": "2023-11-29T00:03:34.000Z", - "max": 0.47163461538461543 - }, - { - "datetime": "2023-11-29T05:03:34.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-29T10:03:34.000Z", - "max": 5.282307692307692 - }, - { - "datetime": "2023-11-29T15:03:34.000Z", - "max": 9.244038461538462 - }, - { - "datetime": "2023-11-29T20:02:42.000Z", - "max": 3.9617307692307695 - }, - { - "datetime": "2023-11-30T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-11-30T05:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-11-30T10:02:42.000Z", - "max": 3.490096153846154 - }, - { - "datetime": "2023-11-30T15:02:42.000Z", - "max": 3.7730769230769234 - }, - { - "datetime": "2023-11-30T20:02:42.000Z", - "max": 3.9617307692307695 - }, - { - "datetime": "2023-12-01T00:02:42.000Z", - "max": 0.9432692307692309 - }, - { - "datetime": "2023-12-01T05:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-01T10:02:42.000Z", - "max": 4.056057692307693 - }, - { - "datetime": "2023-12-01T15:02:42.000Z", - "max": 5.18798076923077 - }, - { - "datetime": "2023-12-01T20:02:42.000Z", - "max": 4.433365384615385 - }, - { - "datetime": "2023-12-02T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-02T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-02T10:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-02T15:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-02T20:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T10:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-03T15:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-03T20:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-04T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-04T05:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-04T10:02:42.000Z", - "max": 4.904999999999999 - }, - { - "datetime": "2023-12-04T15:02:42.000Z", - "max": 4.244711538461539 - }, - { - "datetime": "2023-12-04T20:02:42.000Z", - "max": 4.622019230769231 - }, - { - "datetime": "2023-12-05T00:02:42.000Z", - "max": 3.490096153846154 - }, - { - "datetime": "2023-12-05T05:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-05T10:02:42.000Z", - "max": 3.207115384615385 - }, - { - "datetime": "2023-12-05T15:02:42.000Z", - "max": 4.999326923076924 - }, - { - "datetime": "2023-12-05T20:02:42.000Z", - "max": 2.735480769230769 - }, - { - "datetime": "2023-12-06T00:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-06T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-06T10:02:42.000Z", - "max": 2.4524999999999997 - }, - { - "datetime": "2023-12-06T15:02:42.000Z", - "max": 3.584423076923077 - }, - { - "datetime": "2023-12-06T20:02:42.000Z", - "max": 2.9241346153846153 - }, - { - "datetime": "2023-12-07T00:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-07T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-07T10:02:42.000Z", - "max": 2.4524999999999997 - }, - { - "datetime": "2023-12-07T15:02:42.000Z", - "max": 4.244711538461539 - }, - { - "datetime": "2023-12-07T20:02:42.000Z", - "max": 3.301442307692308 - }, - { - "datetime": "2023-12-08T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-08T05:02:42.000Z", - "max": 0.6602884615384615 - }, - { - "datetime": "2023-12-08T10:02:42.000Z", - "max": 1.7922115384615385 - }, - { - "datetime": "2023-12-08T15:02:42.000Z", - "max": 2.8298076923076922 - }, - { - "datetime": "2023-12-08T20:02:42.000Z", - "max": 3.8674038461538465 - }, - { - "datetime": "2023-12-09T00:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-09T05:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-09T10:02:42.000Z", - "max": 3.207115384615385 - }, - { - "datetime": "2023-12-09T15:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-09T20:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T00:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-10T05:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T10:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T15:02:42.000Z", - "max": 0.2829807692307692 - }, - { - "datetime": "2023-12-10T20:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-11T00:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-11T05:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-11T10:02:42.000Z", - "max": 3.301442307692308 - }, - { - "datetime": "2023-12-11T15:02:42.000Z", - "max": 3.490096153846154 - }, - { - "datetime": "2023-12-11T20:02:42.000Z", - "max": 2.8298076923076922 - }, - { - "datetime": "2023-12-12T00:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-12T05:02:42.000Z", - "max": 0.3773076923076923 - }, - { - "datetime": "2023-12-12T10:02:42.000Z", - "max": 3.9617307692307695 - }, - { - "datetime": "2023-12-12T15:02:42.000Z", - "max": 4.810673076923077 - } - ] - }, - { - "name": "temperature", - "data": [ - { - "datetime": "2023-11-07T11:53:38.187Z", - "max": 23.849843749999998 - }, - { - "datetime": "2023-11-07T15:59:08.000Z", - "max": 26.220090332031255 - }, - { - "datetime": "2023-11-07T19:59:08.000Z", - "max": 26.541843261718746 - }, - { - "datetime": "2023-11-07T23:59:08.000Z", - "max": 26.402416992187504 - }, - { - "datetime": "2023-11-08T03:59:08.000Z", - "max": 23.66751708984375 - }, - { - "datetime": "2023-11-08T07:59:08.000Z", - "max": 22.90603515624999 - }, - { - "datetime": "2023-11-08T11:59:08.000Z", - "max": 23.903469238281254 - }, - { - "datetime": "2023-11-08T15:54:15.000Z", - "max": 27.035197753906253 - }, - { - "datetime": "2023-11-08T19:58:25.000Z", - "max": 26.756345214843755 - }, - { - "datetime": "2023-11-08T23:55:42.000Z", - "max": 29.07296630859374 - }, - { - "datetime": "2023-11-09T03:55:42.000Z", - "max": 24.257397460937504 - }, - { - "datetime": "2023-11-09T07:55:42.000Z", - "max": 23.44229003906249 - }, - { - "datetime": "2023-11-09T11:55:42.000Z", - "max": 24.257397460937504 - }, - { - "datetime": "2023-11-09T14:24:23.000Z", - "max": 24.8151025390625 - }, - { - "datetime": "2023-11-09T14:25:53.000Z", - "max": 24.986704101562502 - }, - { - "datetime": "2023-11-09T15:05:53.000Z", - "max": 24.975979003906254 - }, - { - "datetime": "2023-11-09T20:05:53.000Z", - "max": 24.890178222656253 - }, - { - "datetime": "2023-11-10T00:05:53.000Z", - "max": 23.21706298828125 - }, - { - "datetime": "2023-11-10T05:05:53.000Z", - "max": 22.541381835937493 - }, - { - "datetime": "2023-11-10T10:05:53.000Z", - "max": 25.008154296875 - }, - { - "datetime": "2023-11-10T15:05:53.000Z", - "max": 25.5444091796875 - }, - { - "datetime": "2023-11-10T20:05:53.000Z", - "max": 26.745620117187492 - }, - { - "datetime": "2023-11-11T00:05:53.000Z", - "max": 24.128696289062496 - }, - { - "datetime": "2023-11-11T05:05:53.000Z", - "max": 23.453015136718754 - }, - { - "datetime": "2023-11-11T10:05:53.000Z", - "max": 24.504074707031243 - }, - { - "datetime": "2023-11-11T15:05:53.000Z", - "max": 28.257858886718743 - }, - { - "datetime": "2023-11-11T20:05:53.000Z", - "max": 28.472360839843752 - }, - { - "datetime": "2023-11-12T00:05:53.000Z", - "max": 25.748186035156245 - }, - { - "datetime": "2023-11-12T05:05:53.000Z", - "max": 24.311022949218746 - }, - { - "datetime": "2023-11-12T10:05:53.000Z", - "max": 25.866162109375004 - }, - { - "datetime": "2023-11-12T15:05:53.000Z", - "max": 34.11376220703125 - }, - { - "datetime": "2023-11-12T20:05:53.000Z", - "max": 34.145937499999995 - }, - { - "datetime": "2023-11-13T00:05:53.000Z", - "max": 28.04335693359375 - }, - { - "datetime": "2023-11-13T05:05:53.000Z", - "max": 25.876887207031253 - }, - { - "datetime": "2023-11-13T10:05:53.000Z", - "max": 25.791086425781252 - }, - { - "datetime": "2023-11-13T15:05:53.000Z", - "max": 26.209365234374992 - }, - { - "datetime": "2023-11-13T20:05:53.000Z", - "max": 25.029604492187495 - }, - { - "datetime": "2023-11-14T00:05:53.000Z", - "max": 24.353923339843753 - }, - { - "datetime": "2023-11-14T05:05:53.000Z", - "max": 24.09652099609375 - }, - { - "datetime": "2023-11-14T10:05:53.000Z", - "max": 24.27884765625 - }, - { - "datetime": "2023-11-14T15:05:53.000Z", - "max": 24.268122558593753 - }, - { - "datetime": "2023-11-14T20:05:53.000Z", - "max": 24.117971191406248 - }, - { - "datetime": "2023-11-15T00:05:53.000Z", - "max": 23.034736328125 - }, - { - "datetime": "2023-11-15T05:05:53.000Z", - "max": 22.616457519531245 - }, - { - "datetime": "2023-11-15T10:05:53.000Z", - "max": 25.265556640625 - }, - { - "datetime": "2023-11-15T15:05:53.000Z", - "max": 25.27628173828125 - }, - { - "datetime": "2023-11-15T20:05:53.000Z", - "max": 24.82582763671875 - }, - { - "datetime": "2023-11-16T00:05:53.000Z", - "max": 24.268122558593753 - }, - { - "datetime": "2023-11-16T05:05:53.000Z", - "max": 23.882019042968743 - }, - { - "datetime": "2023-11-16T10:05:53.000Z", - "max": 24.117971191406248 - }, - { - "datetime": "2023-11-16T15:01:15.000Z", - "max": 26.863596191406252 - }, - { - "datetime": "2023-11-16T20:01:13.000Z", - "max": 23.17416259765624 - }, - { - "datetime": "2023-11-17T00:01:13.000Z", - "max": 23.195612792968753 - }, - { - "datetime": "2023-11-17T05:01:13.000Z", - "max": 23.002561035156255 - }, - { - "datetime": "2023-11-17T10:01:13.000Z", - "max": 23.152712402343745 - }, - { - "datetime": "2023-11-17T15:03:57.000Z", - "max": 25.5444091796875 - }, - { - "datetime": "2023-11-17T20:00:42.000Z", - "max": 25.061779785156254 - }, - { - "datetime": "2023-11-18T00:00:42.000Z", - "max": 23.367214355468754 - }, - { - "datetime": "2023-11-18T05:00:42.000Z", - "max": 23.35648925781249 - }, - { - "datetime": "2023-11-18T10:00:42.000Z", - "max": 25.941237792968742 - }, - { - "datetime": "2023-11-18T15:00:42.000Z", - "max": 27.560727539062505 - }, - { - "datetime": "2023-11-18T20:00:42.000Z", - "max": 27.22824951171875 - }, - { - "datetime": "2023-11-19T00:00:42.000Z", - "max": 24.986704101562502 - }, - { - "datetime": "2023-11-19T05:00:42.000Z", - "max": 24.032170410156247 - }, - { - "datetime": "2023-11-19T10:00:42.000Z", - "max": 25.748186035156245 - }, - { - "datetime": "2023-11-19T15:00:42.000Z", - "max": 30.435053710937503 - }, - { - "datetime": "2023-11-19T20:00:42.000Z", - "max": 29.99532470703125 - }, - { - "datetime": "2023-11-20T00:00:42.000Z", - "max": 25.608759765625003 - }, - { - "datetime": "2023-11-20T05:00:42.000Z", - "max": 24.407548828124995 - }, - { - "datetime": "2023-11-20T10:00:42.000Z", - "max": 24.386098632812498 - }, - { - "datetime": "2023-11-20T15:00:15.000Z", - "max": 20.921892089843745 - }, - { - "datetime": "2023-11-20T20:00:15.000Z", - "max": 23.184887695312504 - }, - { - "datetime": "2023-11-21T00:00:15.000Z", - "max": 23.89274414062499 - }, - { - "datetime": "2023-11-21T05:00:15.000Z", - "max": 23.56026611328125 - }, - { - "datetime": "2023-11-21T10:00:15.000Z", - "max": 25.329907226562504 - }, - { - "datetime": "2023-11-21T15:00:15.000Z", - "max": 18.186992187500003 - }, - { - "datetime": "2023-11-21T20:00:15.000Z", - "max": 24.504074707031243 - }, - { - "datetime": "2023-11-22T00:00:15.000Z", - "max": 24.750751953124997 - }, - { - "datetime": "2023-11-22T05:00:15.000Z", - "max": 24.654226074218748 - }, - { - "datetime": "2023-11-22T10:00:15.000Z", - "max": 25.598034667968754 - }, - { - "datetime": "2023-11-22T15:00:15.000Z", - "max": 23.184887695312504 - }, - { - "datetime": "2023-11-22T20:00:15.000Z", - "max": 23.860568847656246 - }, - { - "datetime": "2023-11-23T00:00:15.000Z", - "max": 23.849843749999998 - }, - { - "datetime": "2023-11-23T05:00:15.000Z", - "max": 23.8283935546875 - }, - { - "datetime": "2023-11-23T10:00:15.000Z", - "max": 24.085795898437503 - }, - { - "datetime": "2023-11-23T15:00:15.000Z", - "max": 23.002561035156255 - }, - { - "datetime": "2023-11-23T20:03:25.000Z", - "max": 23.292138671875 - }, - { - "datetime": "2023-11-24T00:03:25.000Z", - "max": 22.970385742187496 - }, - { - "datetime": "2023-11-24T05:03:25.000Z", - "max": 22.519931640624996 - }, - { - "datetime": "2023-11-24T10:03:25.000Z", - "max": 25.08322998046875 - }, - { - "datetime": "2023-11-24T15:01:53.000Z", - "max": 26.992297363281246 - }, - { - "datetime": "2023-11-24T20:01:53.000Z", - "max": 24.37537353515625 - }, - { - "datetime": "2023-11-25T00:01:53.000Z", - "max": 24.28957275390625 - }, - { - "datetime": "2023-11-25T05:01:53.000Z", - "max": 23.4851904296875 - }, - { - "datetime": "2023-11-25T10:01:53.000Z", - "max": 24.075070800781255 - }, - { - "datetime": "2023-11-25T15:01:53.000Z", - "max": 31.904392089843746 - }, - { - "datetime": "2023-11-25T20:01:53.000Z", - "max": 29.008615722656252 - }, - { - "datetime": "2023-11-26T00:01:53.000Z", - "max": 25.522958984375002 - }, - { - "datetime": "2023-11-26T05:01:53.000Z", - "max": 24.37537353515625 - }, - { - "datetime": "2023-11-26T10:01:53.000Z", - "max": 25.7160107421875 - }, - { - "datetime": "2023-11-26T15:01:53.000Z", - "max": 26.9601220703125 - }, - { - "datetime": "2023-11-26T20:01:53.000Z", - "max": 26.831420898437493 - }, - { - "datetime": "2023-11-27T00:01:53.000Z", - "max": 25.061779785156254 - }, - { - "datetime": "2023-11-27T05:01:53.000Z", - "max": 24.27884765625 - }, - { - "datetime": "2023-11-27T10:01:53.000Z", - "max": 24.51479980468749 - }, - { - "datetime": "2023-11-27T15:01:53.000Z", - "max": 23.75331787109375 - }, - { - "datetime": "2023-11-27T20:01:57.000Z", - "max": 23.62461669921874 - }, - { - "datetime": "2023-11-28T00:01:57.000Z", - "max": 23.495915527343747 - }, - { - "datetime": "2023-11-28T05:01:57.000Z", - "max": 23.35648925781249 - }, - { - "datetime": "2023-11-28T10:01:57.000Z", - "max": 25.126130371093744 - }, - { - "datetime": "2023-11-28T15:03:34.000Z", - "max": 26.03776367187499 - }, - { - "datetime": "2023-11-28T20:03:34.000Z", - "max": 26.005588378906246 - }, - { - "datetime": "2023-11-29T00:03:34.000Z", - "max": 23.66751708984375 - }, - { - "datetime": "2023-11-29T05:03:34.000Z", - "max": 22.841684570312502 - }, - { - "datetime": "2023-11-29T10:03:34.000Z", - "max": 25.909062499999997 - }, - { - "datetime": "2023-11-29T15:03:34.000Z", - "max": 20.417812500000004 - }, - { - "datetime": "2023-11-29T20:02:42.000Z", - "max": 23.860568847656246 - }, - { - "datetime": "2023-11-30T00:02:42.000Z", - "max": 23.871293945312495 - }, - { - "datetime": "2023-11-30T05:02:42.000Z", - "max": 23.538815917968755 - }, - { - "datetime": "2023-11-30T10:02:42.000Z", - "max": 24.225222167968745 - }, - { - "datetime": "2023-11-30T15:02:42.000Z", - "max": 22.4126806640625 - }, - { - "datetime": "2023-11-30T20:02:42.000Z", - "max": 22.659357910156253 - }, - { - "datetime": "2023-12-01T00:02:42.000Z", - "max": 23.431564941406243 - }, - { - "datetime": "2023-12-01T05:02:42.000Z", - "max": 23.453015136718754 - }, - { - "datetime": "2023-12-01T10:02:42.000Z", - "max": 24.99742919921875 - }, - { - "datetime": "2023-12-01T15:02:42.000Z", - "max": 23.785493164062494 - }, - { - "datetime": "2023-12-01T20:02:42.000Z", - "max": 24.16087158203124 - }, - { - "datetime": "2023-12-02T00:02:42.000Z", - "max": 23.989270019531254 - }, - { - "datetime": "2023-12-02T05:02:42.000Z", - "max": 23.8283935546875 - }, - { - "datetime": "2023-12-02T10:02:42.000Z", - "max": 25.844711914062493 - }, - { - "datetime": "2023-12-02T15:02:42.000Z", - "max": 35.52947509765625 - }, - { - "datetime": "2023-12-02T20:02:42.000Z", - "max": 35.23989746093749 - }, - { - "datetime": "2023-12-03T00:02:42.000Z", - "max": 28.290034179687503 - }, - { - "datetime": "2023-12-03T05:02:42.000Z", - "max": 26.809970703124996 - }, - { - "datetime": "2023-12-03T10:02:42.000Z", - "max": 28.054082031249997 - }, - { - "datetime": "2023-12-03T15:02:42.000Z", - "max": 32.27977050781249 - }, - { - "datetime": "2023-12-03T20:02:42.000Z", - "max": 28.49381103515625 - }, - { - "datetime": "2023-12-04T00:02:42.000Z", - "max": 27.003022460937494 - }, - { - "datetime": "2023-12-04T05:02:42.000Z", - "max": 26.134289550781254 - }, - { - "datetime": "2023-12-04T10:02:42.000Z", - "max": 25.76963623046874 - }, - { - "datetime": "2023-12-04T15:02:42.000Z", - "max": 20.49288818359374 - }, - { - "datetime": "2023-12-04T20:02:42.000Z", - "max": 22.76660888671875 - }, - { - "datetime": "2023-12-05T00:02:42.000Z", - "max": 23.731867675781253 - }, - { - "datetime": "2023-12-05T05:02:42.000Z", - "max": 23.764042968749997 - }, - { - "datetime": "2023-12-05T10:02:42.000Z", - "max": 26.756345214843755 - }, - { - "datetime": "2023-12-05T15:02:42.000Z", - "max": 21.844250488281254 - }, - { - "datetime": "2023-12-05T20:02:42.000Z", - "max": 23.163437499999993 - }, - { - "datetime": "2023-12-06T00:02:42.000Z", - "max": 23.721142578125004 - }, - { - "datetime": "2023-12-06T05:02:42.000Z", - "max": 23.678242187499997 - }, - { - "datetime": "2023-12-06T10:02:42.000Z", - "max": 23.774768066406246 - }, - { - "datetime": "2023-12-06T15:02:42.000Z", - "max": 16.792729492187497 - }, - { - "datetime": "2023-12-06T20:02:42.000Z", - "max": 23.678242187499997 - }, - { - "datetime": "2023-12-07T00:02:42.000Z", - "max": 24.750751953124997 - }, - { - "datetime": "2023-12-07T05:02:42.000Z", - "max": 25.08322998046875 - }, - { - "datetime": "2023-12-07T10:02:42.000Z", - "max": 25.179755859375 - }, - { - "datetime": "2023-12-07T15:02:42.000Z", - "max": 19.09862548828125 - }, - { - "datetime": "2023-12-07T20:02:42.000Z", - "max": 23.335039062499995 - }, - { - "datetime": "2023-12-08T00:02:42.000Z", - "max": 23.678242187499997 - }, - { - "datetime": "2023-12-08T05:02:42.000Z", - "max": 23.66751708984375 - }, - { - "datetime": "2023-12-08T10:02:42.000Z", - "max": 26.284440917968745 - }, - { - "datetime": "2023-12-08T15:02:42.000Z", - "max": 27.120998535156254 - }, - { - "datetime": "2023-12-08T20:02:42.000Z", - "max": 22.04802734375 - }, - { - "datetime": "2023-12-09T00:02:42.000Z", - "max": 23.13126220703125 - }, - { - "datetime": "2023-12-09T05:02:42.000Z", - "max": 22.948935546875 - }, - { - "datetime": "2023-12-09T10:02:42.000Z", - "max": 25.372807617187497 - }, - { - "datetime": "2023-12-09T15:02:42.000Z", - "max": 24.943803710937495 - }, - { - "datetime": "2023-12-09T20:02:42.000Z", - "max": 24.193046875 - }, - { - "datetime": "2023-12-10T00:02:42.000Z", - "max": 23.431564941406243 - }, - { - "datetime": "2023-12-10T05:02:42.000Z", - "max": 22.90603515624999 - }, - { - "datetime": "2023-12-10T10:02:42.000Z", - "max": 23.410114746093747 - }, - { - "datetime": "2023-12-10T15:02:42.000Z", - "max": 23.699692382812493 - }, - { - "datetime": "2023-12-10T20:02:42.000Z", - "max": 23.603166503906245 - }, - { - "datetime": "2023-12-11T00:02:42.000Z", - "max": 23.195612792968753 - }, - { - "datetime": "2023-12-11T05:02:42.000Z", - "max": 22.745158691406253 - }, - { - "datetime": "2023-12-11T10:02:42.000Z", - "max": 26.756345214843755 - }, - { - "datetime": "2023-12-11T15:02:42.000Z", - "max": 27.260424804687496 - }, - { - "datetime": "2023-12-11T20:02:42.000Z", - "max": 23.66751708984375 - }, - { - "datetime": "2023-12-12T00:02:42.000Z", - "max": 23.66751708984375 - }, - { - "datetime": "2023-12-12T05:02:42.000Z", - "max": 23.324313964843746 - }, - { - "datetime": "2023-12-12T10:02:42.000Z", - "max": 23.077636718749993 - }, - { - "datetime": "2023-12-12T15:02:42.000Z", - "max": 25.093955078125 - } - ] - } -] \ No newline at end of file