diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml new file mode 100644 index 0000000..846de2f --- /dev/null +++ b/.github/workflows/verify.yml @@ -0,0 +1,33 @@ +name: verify + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +jobs: + verify: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22.x + cache: npm + cache-dependency-path: | + package-lock.json + client/package-lock.json + - run: npm ci + - run: npm --prefix client ci + - run: npm run test:backend + - run: npm run test:frontend + - run: npm run build + env: + # CRA promotes the documented legacy warnings to errors under CI=true. + # Compilation errors still fail while warning cleanup remains incremental. + CI: "false" diff --git a/.gitignore b/.gitignore index e9c5313..ec66536 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,8 @@ yarn-debug.log* yarn-error.log* /public +/uploads /client/public/plantspic /client/public/compressed /client/public -/node_modules \ No newline at end of file +/node_modules diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4c09dbe --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,27 @@ +# Contributing + +Keep changes incremental and compatible with the current React, Express, MongoDB, Redis, and filesystem media stack. A refactor should preserve existing URLs, request bodies, response shapes, and MongoDB field names unless a separate compatibility plan is documented. + +## Local workflow + +1. Create a short-lived branch from the current baseline. +2. Install both npm dependency trees with `npm ci` and `npm --prefix client ci`. +3. Use local MongoDB/Redis and an ignored `.env`; never copy production credentials, accounts, logs, or media. +4. Add or update only focused characterization tests for the behavior being changed. +5. Run `npm run verify` before committing. + +The root `verify` command runs backend tests, frontend tests, and the production client build. If a check cannot run locally, record the exact reason and do not replace it with an unverified claim. + +## Code boundaries + +- Put new HTTP composition in the relevant router or service rather than expanding unrelated legacy handlers. +- Use the shared client API and URL helpers; keep media fallback and loading behavior explicit. +- Keep authentication and authorization checks at the route boundary. +- Do not write secrets, raw request data, raw search text, or production identifiers to logs or telemetry. +- Preserve original media and database compatibility. New derived media must use a separate path and be reversible. + +## Commits and review + +Use ordinary Conventional Commit messages such as `test: add catalog contract coverage` or `refactor: isolate media service`. Branch names and commit metadata must not contain assistant, tool, or generated-by labels. Do not push, open a pull request, deploy, modify Nginx, restart production processes, run migrations, or backfill production media without explicit authorization. + +Describe the behavior changed, tests run, production impact, unresolved risks, and rollback steps in the phase report or change description. Keep generated files, build output, dependency caches, dumps, and large media out of Git. diff --git a/README.md b/README.md index eb51ce8..a20567a 100644 --- a/README.md +++ b/README.md @@ -1,914 +1,94 @@ -# BIPH FLORA 🌿 +# BiphFlora -A modern full-stack plant identification web application dedicated to providing users with a comprehensive platform for plant identification, sharing, and learning. +BiphFlora is a React and Express application for browsing, searching, contributing to, and reviewing plant and bird records. This repository is maintained for private, non-commercial use under the terms in [LICENSE](LICENSE). -**⚠️ Important Notice: This project is for personal and private use only. Commercial use is prohibited. For commercial licensing, please contact the project maintainers.** +## Architecture -## 📋 Table of Contents - -- [Project Overview](#project-overview) -- [Technology Stack](#technology-stack) -- [Features](#features) -- [Project Structure](#project-structure) -- [Installation & Deployment](#installation--deployment) -- [API Documentation](#api-documentation) -- [Technical Implementation](#technical-implementation) -- [Development Guide](#development-guide) -- [Performance Optimization](#performance-optimization) -- [Security Features](#security-features) -- [Contributing](#contributing) -- [License](#license) - -## 🚀 Project Overview - -BIPH FLORA is a modern plant identification platform built with React and Node.js, offering plant search, image upload, and community sharing features. The project uses a frontend-backend separation architecture, supporting user registration/login, plant data management, image compression processing, and other advanced features. - -### 🎯 Core Features - -- **Smart Search**: Fuzzy search algorithm based on Fuse.js, supporting multi-language search in Latin, Chinese, and English names -- **Image Management**: Integrated Sharp image processing with automatic compression and format optimization -- **User System**: Secure user management system with JWT authentication + Redis caching -- **Content Management**: Complete CRUD operations with administrator review mechanism -- **Responsive Design**: Modern UI based on PrimeReact + Tailwind CSS - -## 🏗️ Technology Stack - -### Frontend Technologies - -- **Framework**: React 18.3.1 + React Router DOM v6 -- **UI Library**: PrimeReact 10.8.4 + PrimeFlex -- **Styling**: Tailwind CSS + CSS Modules -- **State Management**: React Context API -- **HTTP Client**: Axios -- **Image Processing**: browser-image-compression - -### Backend Technologies - -- **Runtime**: Node.js -- **Web Framework**: Express 4.21.1 -- **Database**: MongoDB (Mongoose ODM) -- **Caching**: Redis -- **Authentication**: JWT + bcrypt -- **File Upload**: Multer -- **Image Processing**: Sharp -- **Compression**: gzip compression - -### Database Design - -``` -MongoDB Collections: -├── users (user information) -├── posts (plant articles) -├── pics (plant images) -├── arts (artwork) -├── activities (activity information) -├── editTextRequests (edit requests) -├── featureHomes (featured homepage content) -└── codes (flora/fauna codes) -``` - -## ✨ Features - -### 🔍 Search Functionality -- Support for fuzzy search of plant Latin names, Chinese names, and English names -- Real-time search suggestions -- URL parameterized search results - -### 👤 User Management -- Secure user registration/login system -- JWT Token authentication + Redis caching -- Administrator permission control -- Encrypted password storage - -### 📸 Image Processing -- Automatic image compression and format optimization -- Support for multiple image format uploads -- Image caching and CDN acceleration -- Responsive image display - -### 📝 Content Management -- CRUD operations for plant information -- Rich text editor support -- Administrator review mechanism -- Version control and history tracking - -### 🏠 Homepage Display -- Carousel display of featured plants -- Dynamic content loading -- Quick search access -- Responsive layout - -## 📁 Project Structure - -``` -biphflora/ -├── client/ # React frontend application -│ ├── public/ -│ ├── src/ -│ │ ├── components/ # Reusable components -│ │ ├── pages/ # Page components -│ │ ├── styles/ # Style files -│ │ ├── tools/ # Utility functions -│ │ ├── App.js # Main application component -│ │ ├── UserContext.js # User state management -│ │ └── index.js # Application entry point -│ ├── package.json -│ └── tailwind.config.js -├── models/ # Data models -│ ├── user.js # User model -│ ├── post.js # Article model -│ ├── pic.js # Image model -│ ├── uploadfile.js # File upload -│ └── compression.js # Image compression -├── public/ # Static resources -│ ├── plantspic/ # Plant images -│ └── uploads/ # Uploaded files -├── app.js # Express server main file -├── package.json -└── README.md -``` - -## 🛠️ Installation & Deployment - -### System Requirements - -- Node.js >= 18.0.0 -- MongoDB >= 5.0 -- Redis >= 6.0 -- npm or pnpm - -### Install Dependencies - -```bash -# Install backend dependencies -npm install - -# Install frontend dependencies -cd client -npm install -``` - -### Environment Configuration - -Create a `.env` file: - -```env -# Server configuration -PORT=3001 - -# Database configuration -MONGODB_URL=mongodb://localhost:27017/biphflora - -# Redis configuration -REDIS_URL=redis://localhost:6379 - -# JWT secret key -SECRET=your-jwt-secret-key - -# Other configurations -REACT_APP_Source_URL=http://localhost:3001 -``` - -### Development Environment - -```bash -# Start backend service (port 3001) -npm start - -# Start frontend service (port 3000) -cd client -npm start -``` - -### Production Deployment - -```bash -# Build frontend -cd client -npm run build - -# Start production server -npm run start -``` - -## 📖 API Documentation - -### Authentication - -```http -POST /login -Content-Type: application/json - -{ - "username": "string", - "password": "string" -} -``` - -```http -POST /register -Content-Type: application/json - -{ - "username": "string", - "password": "string", - "email": "string" -} -``` - -### Plant Data - -```http -GET /searchNames -# Get list of all plant names - -GET /search?query=plantname -# Search plant information - -POST /upload -Content-Type: multipart/form-data -# Upload plant images and information -``` - -### User Information - -```http -GET /userInfo -Authorization: Bearer -# Get user information and featured content - -GET /refresh -Authorization: Bearer -# Refresh user token -``` - -## 🔧 Technical Implementation - -### Authentication System - -```javascript -// JWT + Redis dual authentication -async function verifyToken(req, res, next) { - const token = req.headers["authorization"]; - - // JWT verification - const decoded = jwt.verify(token, process.env.secret); - - // Redis cache verification - const redisToken = await redisClient.get(decoded.username); - - if (redisToken === token) { - req.user = decoded; - next(); - } -} -``` - -### Image Compression Processing - -```javascript -// Image compression using Sharp -const sharp = require('sharp'); - -async function compressImage(inputPath, outputPath) { - await sharp(inputPath) - .resize(800, 600, { fit: 'inside' }) - .jpeg({ quality: 80 }) - .toFile(outputPath); -} -``` - -### Fuzzy Search Implementation - -```javascript -// Smart search based on Fuse.js -const fuse = new Fuse(plants, { - keys: ['latinName', 'commonName', 'chineseName'], - threshold: 0.4, - includeScore: true -}); - -const searchResults = fuse.search(query); -``` - -### React Router Configuration - -```javascript -// Dynamic routing with search parameters -} -/> - -function SearchWithParam() { - const { plantKey } = useParams(); - return ; -} -``` - -## 📈 Performance Optimization - -### Frontend Optimization - -- **Code Splitting**: Component lazy loading with React.lazy() -- **Image Optimization**: Client-side compression with browser-image-compression -- **Caching Strategy**: State caching with React Context -- **Build Optimization**: Production build with Create React App - -### Backend Optimization - -- **Gzip Compression**: Compressed response data transmission -- **Redis Caching**: User token and hot data caching -- **Image Processing**: High-performance image processing with Sharp -- **Database Optimization**: MongoDB index optimization - -### Deployment Optimization - -```javascript -// Enable gzip compression -app.use(compression()); - -// Static resource caching -app.use('/public', express.static('public', { - maxAge: '1d' -})); -``` - -## 🔒 Security Features - -### Password Security -- bcrypt encrypted password storage -- JWT Token expiration control -- Redis Token blacklist mechanism - -### Data Validation -- User input validation and filtering -- File upload type checking -- CORS cross-origin request control - -### Error Handling -```javascript -// Global error handling middleware -app.use(function (err, req, res, next) { - console.error(err.stack); - res.status(500).send('Something broke!'); -}); -``` - -## 🚀 Development Guide - -### Adding New Pages - -1. Create new component in `client/src/pages/` -2. Add route configuration in `App.js` -3. Update navigation menu - -### Adding New API Endpoints - -1. Define route handler in `app.js` -2. Create corresponding data model (if needed) -3. Add authentication middleware (if needed) - -### Database Model Extension - -```javascript -// Create new model in models/ directory -const mongoose = require('mongoose'); - -const newSchema = new mongoose.Schema({ - field1: String, - field2: Number, - createdAt: { type: Date, default: Date.now } -}); - -module.exports = mongoose.model('NewModel', newSchema); -``` - -## 📦 Dependency Management - -### Main Frontend Dependencies - -```bash -npm install react@^18.3.1 react-dom@^18.3.1 -npm install react-router-dom@^6.28.0 -npm install primereact@^10.8.4 -npm install axios@^1.7.7 -``` - -### Main Backend Dependencies - -```bash -npm install express@^4.21.1 -npm install mongoose@^8.8.2 -npm install redis@^4.7.0 -npm install jsonwebtoken@^9.0.2 -npm install bcrypt@^5.1.1 -npm install sharp@^0.33.5 -``` - -## 🤝 Contributing - -1. Fork the project repository -2. Create a feature branch (`git checkout -b feature/AmazingFeature`) -3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) -4. Push to the branch (`git push origin feature/AmazingFeature`) -5. Create a Pull Request - -### Code Standards - -- Use Prettier for code formatting -- Follow ESLint rules -- Use camelCase for component and function naming -- Add necessary code comments - -## 📄 License - -This project uses a custom private use license, allowing only personal and private use. - -### 🟢 Permitted Uses -- ✅ Personal learning and research -- ✅ Private development and testing -- ✅ Non-commercial educational purposes -- ✅ Personal portfolio display (non-commercial) - -### 🔴 Prohibited Uses -- ❌ Any form of commercial use -- ❌ Distribution or redistribution of software -- ❌ Modification and redistribution -- ❌ Use in commercial products or services -- ❌ Sale, licensing, or commercialization -- ❌ Use by commercial organizations or entities -- ❌ Public deployment for commercial purposes - -### 💼 Commercial Licensing -For commercial use, distribution, or other purposes not covered by private use terms, please contact the copyright holder for a separate commercial license. - -See [LICENSE](LICENSE) file for details. - -## 📞 Contact Us - -- Project Repository: [https://github.com/LQ458/biphflora](https://github.com/LQ458/biphflora) -- Issue Reporting: [Issues](https://github.com/LQ458/biphflora/issues) - ---- - -**BIPH FLORA** - Making plant identification simple and fun 🌱 - ---- - -# 中文版本 / Chinese Version - -# BIPH FLORA 识草木 🌿 - -一个现代化的全栈植物图鉴Web应用,致力于为用户提供植物识别、分享和学习的综合平台。 - -**⚠️ 重要提示:本项目仅允许个人和私人使用,禁止商业用途。如需商业使用,请联系项目维护者获取商业许可证。** - -## 📋 目录 - -- [项目概述](#项目概述) -- [技术架构](#技术架构) -- [功能特性](#功能特性) -- [项目结构](#项目结构) -- [安装部署](#安装部署) -- [API文档](#api文档) -- [技术实现](#技术实现) -- [开发指南](#开发指南) -- [性能优化](#性能优化) -- [安全特性](#安全特性) -- [贡献指南](#贡献指南) - -## 🚀 项目概述 - -BIPH FLORA是一个基于React和Node.js构建的现代化植物图鉴平台,提供植物搜索、图片上传、社区分享等功能。该项目采用前后端分离架构,支持用户注册登录、植物数据管理、图片压缩处理等高级功能。 - -### 🎯 核心特性 - -- **智能搜索**: 基于Fuse.js的模糊搜索算法,支持拉丁名、中文名、英文名多语言搜索 -- **图片管理**: 集成Sharp图片处理,支持自动压缩和格式优化 -- **用户系统**: JWT认证 + Redis缓存的安全用户管理系统 -- **内容管理**: 完整的CRUD操作,支持管理员审核机制 -- **响应式设计**: 基于PrimeReact + Tailwind CSS的现代化UI - -## 🏗️ 技术架构 - -### 前端技术栈 - -- **框架**: React 18.3.1 + React Router DOM v6 -- **UI库**: PrimeReact 10.8.4 + PrimeFlex -- **样式**: Tailwind CSS + CSS Modules -- **状态管理**: React Context API -- **HTTP客户端**: Axios -- **图片处理**: browser-image-compression - -### 后端技术栈 - -- **运行环境**: Node.js -- **Web框架**: Express 4.21.1 -- **数据库**: MongoDB (Mongoose ODM) -- **缓存**: Redis -- **认证**: JWT + bcrypt -- **文件上传**: Multer -- **图片处理**: Sharp -- **压缩**: gzip compression - -### 数据库设计 +The application keeps the existing frontend/backend split: +```text +React SPA (client/) ── HTTP/JSON ──> Express (app.js) + ├─ MongoDB/Mongoose: records, users, edits, media metadata + ├─ Redis: login-session token cache + └─ filesystem: original uploads and derived media ``` -MongoDB Collections: -├── users (用户信息) -├── posts (植物文章) -├── pics (植物图片) -├── arts (艺术作品) -├── activities (活动信息) -├── editTextRequests (编辑请求) -├── featureHomes (首页特色内容) -└── codes (动植物编码) -``` - -## ✨ 功能特性 - -### 🔍 搜索功能 -- 支持植物拉丁名、中文名、英文名模糊搜索 -- 实时搜索建议 -- URL参数化搜索结果 - -### 👤 用户管理 -- 安全的用户注册/登录系统 -- JWT Token认证 + Redis缓存 -- 管理员权限控制 -- 密码加密存储 - -### 📸 图片处理 -- 自动图片压缩和格式优化 -- 支持多种图片格式上传 -- 图片缓存和CDN加速 -- 响应式图片显示 -### 📝 内容管理 -- 植物信息的增删改查 -- 富文本编辑器支持 -- 管理员审核机制 -- 版本控制和历史记录 +The production arrangement documented for the current deployment is Nginx in front of the frontend and Express processes, with MongoDB and Redis running on the same host. There is no repository-managed Docker or staging environment. See [the verified baseline](docs/evidence/production-baseline-2026-07-22.md) for dates, counts, and evidence limitations. -### 🏠 主页展示 -- 轮播图展示特色植物 -- 动态加载内容 -- 搜索快捷入口 -- 响应式布局 +### Main modules -## 📁 项目结构 +- `client/`: React pages, route-level loading, shared API and media helpers. +- `app.js`: compatibility-preserving HTTP composition and legacy routes. +- `routes/`: catalog, authentication, content, and optional privacy-safe telemetry routers. +- `middleware/`: authentication/authorization, request context, logging, and audit boundaries. +- `models/`: Mongoose schemas and image/upload policies. +- `services/`: filesystem/media path helpers. +- `docs/`: architecture, operations, evidence methods, and phase reports. -``` -biphflora/ -├── client/ # React前端应用 -│ ├── public/ -│ ├── src/ -│ │ ├── components/ # 可复用组件 -│ │ ├── pages/ # 页面组件 -│ │ ├── styles/ # 样式文件 -│ │ ├── tools/ # 工具函数 -│ │ ├── App.js # 主应用组件 -│ │ ├── UserContext.js # 用户状态管理 -│ │ └── index.js # 应用入口 -│ ├── package.json -│ └── tailwind.config.js -├── models/ # 数据模型 -│ ├── user.js # 用户模型 -│ ├── post.js # 文章模型 -│ ├── pic.js # 图片模型 -│ ├── uploadfile.js # 文件上传 -│ └── compression.js # 图片压缩 -├── public/ # 静态资源 -│ ├── plantspic/ # 植物图片 -│ └── uploads/ # 上传文件 -├── app.js # Express服务器主文件 -├── package.json -└── README.md -``` - -## 🛠️ 安装部署 - -### 环境要求 +The catalog directory (`GET /catalog/names?type=plant|bird`) is a small read-only endpoint for the client Fuse.js index. Legacy name-search endpoints remain available during the migration. -- Node.js >= 18.0.0 -- MongoDB >= 5.0 -- Redis >= 6.0 -- npm 或 pnpm +## Local development -### 安装依赖 +Requirements: Node.js 18.17 or newer, npm, MongoDB, and Redis. Install each dependency tree separately: -```bash -# 安装后端依赖 -npm install - -# 安装前端依赖 -cd client -npm install +```sh +npm ci +npm --prefix client ci ``` -### 环境变量配置 - -创建 `.env` 文件: +Runtime configuration is supplied through an ignored `.env` file. The application reads `MONGODB_URL`, `REDIS_URL`, `PORT`, `HOST`, and the existing lowercase JWT variable `secret`. Optional flags are disabled unless explicitly set to `true`: -```env -# 服务器配置 +```text +MONGODB_URL=mongodb://127.0.0.1:27017/biphflora +REDIS_URL=redis://127.0.0.1:6379 PORT=3001 - -# 数据库配置 -MONGODB_URL=mongodb://localhost:27017/biphflora - -# Redis配置 -REDIS_URL=redis://localhost:6379 - -# JWT密钥 -SECRET=your-jwt-secret-key - -# 其他配置 -REACT_APP_Source_URL=http://localhost:3001 +HOST=127.0.0.1 +secret= +REQUEST_LOG_ENABLED=false +AUDIT_EVENTS_ENABLED=false +AUDIT_HASH_SECRET= +SEARCH_TELEMETRY_ENABLED=false ``` -### 开发环境启动 +The browser uses the existing `REACT_APP_Source_URL` value for the API base URL. Search telemetry has a separate opt-in flag, `REACT_APP_SEARCH_TELEMETRY_ENABLED`, and never sends raw search text. -```bash -# 启动后端服务 (端口3001) -npm start +Useful commands: -# 启动前端服务 (端口3000) -cd client -npm start -``` - -### 生产环境部署 - -```bash -# 构建前端 -cd client +```sh +npm run start # backend with nodemon +npm --prefix client start +npm run test:backend +npm run test:frontend npm run build - -# 启动生产服务器 -npm run start +npm run verify # backend tests, frontend tests, production build ``` -## 📖 API文档 - -### 认证相关 - -```http -POST /login -Content-Type: application/json - -{ - "username": "string", - "password": "string" -} -``` - -```http -POST /register -Content-Type: application/json - -{ - "username": "string", - "password": "string", - "email": "string" -} -``` - -### 植物数据 - -```http -GET /searchNames -# 获取所有植物名称列表 - -GET /search?query=plantname -# 搜索植物信息 - -POST /upload -Content-Type: multipart/form-data -# 上传植物图片和信息 -``` - -### 用户信息 - -```http -GET /userInfo -Authorization: Bearer -# 获取用户信息和特色内容 - -GET /refresh -Authorization: Bearer -# 刷新用户token -``` - -## 🔧 技术实现 - -### 认证系统 - -```javascript -// JWT + Redis 双重验证 -async function verifyToken(req, res, next) { - const token = req.headers["authorization"]; - - // JWT验证 - const decoded = jwt.verify(token, process.env.secret); - - // Redis缓存验证 - const redisToken = await redisClient.get(decoded.username); - - if (redisToken === token) { - req.user = decoded; - next(); - } -} -``` - -### 图片压缩处理 - -```javascript -// 使用Sharp进行图片压缩 -const sharp = require('sharp'); - -async function compressImage(inputPath, outputPath) { - await sharp(inputPath) - .resize(800, 600, { fit: 'inside' }) - .jpeg({ quality: 80 }) - .toFile(outputPath); -} -``` - -### 模糊搜索实现 - -```javascript -// 基于Fuse.js的智能搜索 -const fuse = new Fuse(plants, { - keys: ['latinName', 'commonName', 'chineseName'], - threshold: 0.4, - includeScore: true -}); - -const searchResults = fuse.search(query); -``` - -### React路由配置 - -```javascript -// 动态路由支持搜索参数 -} -/> - -function SearchWithParam() { - const { plantKey } = useParams(); - return ; -} -``` - -## 📈 性能优化 - -### 前端优化 - -- **代码分割**: React.lazy() 实现组件懒加载 -- **图片优化**: browser-image-compression 客户端压缩 -- **缓存策略**: React Context 状态缓存 -- **打包优化**: Create React App 生产构建 - -### 后端优化 - -- **Gzip压缩**: 响应数据压缩传输 -- **Redis缓存**: 用户token和热点数据缓存 -- **图片处理**: Sharp高性能图片处理 -- **数据库优化**: MongoDB索引优化 - -### 部署优化 - -```javascript -// 启用gzip压缩 -app.use(compression()); - -// 静态资源缓存 -app.use('/public', express.static('public', { - maxAge: '1d' -})); -``` - -## 🔒 安全特性 - -### 密码安全 -- bcrypt加密存储用户密码 -- JWT Token时效性控制 -- Redis Token黑名单机制 - -### 数据验证 -- 用户输入验证和过滤 -- 文件上传类型检查 -- CORS跨域请求控制 - -### 错误处理 -```javascript -// 全局错误处理中间件 -app.use(function (err, req, res, next) { - console.error(err.stack); - res.status(500).send('Something broke!'); -}); -``` - -## 🚀 开发指南 - -### 添加新页面 - -1. 在 `client/src/pages/` 创建新组件 -2. 在 `App.js` 中添加路由配置 -3. 更新导航菜单 - -### 添加新API接口 - -1. 在 `app.js` 中定义路由处理函数 -2. 创建对应的数据模型(如需要) -3. 添加认证中间件(如需要) - -### 数据库模型扩展 - -```javascript -// 在models/目录下创建新模型 -const mongoose = require('mongoose'); - -const newSchema = new mongoose.Schema({ - field1: String, - field2: Number, - createdAt: { type: Date, default: Date.now } -}); - -module.exports = mongoose.model('NewModel', newSchema); -``` - -## 📦 依赖包管理 - -### 主要前端依赖 - -```bash -npm install react@^18.3.1 react-dom@^18.3.1 -npm install react-router-dom@^6.28.0 -npm install primereact@^10.8.4 -npm install axios@^1.7.7 -``` - -### 主要后端依赖 - -```bash -npm install express@^4.21.1 -npm install mongoose@^8.8.2 -npm install redis@^4.7.0 -npm install jsonwebtoken@^9.0.2 -npm install bcrypt@^5.1.1 -npm install sharp@^0.33.5 -``` +The backend exposes `GET /health/live` for process liveness and `GET /health/ready` for MongoDB/Redis readiness. Readiness is intentionally distinct from liveness and does not return configuration values. -## 🤝 贡献指南 +## Authentication and data boundaries -1. Fork 项目仓库 -2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) -3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) -4. 推送到分支 (`git push origin feature/AmazingFeature`) -5. 创建 Pull Request +JWT requests may use the existing bare token form or the standard `Authorization: Bearer ` form. Authenticated operations return `401` when no valid session is available; administrator-only operations return `403` for authenticated non-admin users. User projections exclude password fields and `originalPassword` is no longer written by registration code. -### 代码规范 +Images are accepted as JPEG, PNG, or WebP, up to the current per-file and batch limits in [`models/uploadPolicy.js`](models/uploadPolicy.js). Original files are retained; derived files are written separately and are not generated by Git deployment. Do not run media backfills or database migrations against production from this repository. -- 使用Prettier进行代码格式化 -- 遵循ESLint规则 -- 组件和函数命名使用驼峰命名法 -- 添加必要的代码注释 +## API surface -## 📄 许可证 +The compatibility surface includes authentication (`/login`, `/register`, `/refresh`, `/logout`), catalog and legacy search routes, plant/bird browsing and detail routes, contribution/edit/review routes, media uploads, and administrator routes. Exact request and response contracts are covered by focused tests and the existing client API helpers. New health and optional telemetry endpoints are additive. -本项目采用自定义私人使用许可证,仅允许个人和私人使用。 +## Image and search delivery -### 🟢 允许的使用 -- ✅ 个人学习和研究 -- ✅ 私人开发和测试 -- ✅ 非商业教育目的 -- ✅ 个人作品集展示(非商业) +Lists use small derived media with lazy loading and a bounded fallback to the original. Detail media is loaded on demand, and the client no longer preloads an original before requesting its derived counterpart. Fuse indexes are cached per catalog snapshot and support Chinese, English, Latin, aliases, and fuzzy matching. Design constraints, source links, and measurement rules are in [the image-delivery design](docs/architecture/image-delivery-design.md); no compression percentage or latency claim is made without a reproducible sample. -### 🔴 禁止的使用 -- ❌ 任何形式的商业使用 -- ❌ 分发或再分发软件 -- ❌ 修改并重新分发 -- ❌ 用于商业产品或服务 -- ❌ 销售、许可或商业化 -- ❌ 商业组织或实体使用 -- ❌ 公开部署用于商业目的 +## Evidence and operations -### 💼 商业许可 -如需商业使用、分发或其他不在私人使用条款范围内的用途,请联系版权所有者获取单独的商业许可证。 +Metrics distinguish HTTP requests, pageviews, sessions, and visitors. Raw IPs, user agents, credentials, tokens, request bodies, and raw search text stay in their source systems. Aggregated methods and limitations live in [the metric catalog](docs/evidence/metric-catalog.md) and [the collection method](docs/evidence/collection-method.md). Historical uptime, unique visitors, active users, backups, and restore capability are reported as unavailable when no reliable evidence exists. -详见 [LICENSE](LICENSE) 文件 +Before any production deployment, follow the staged checklist in [deployment readiness](docs/operations/deployment-readiness.md). The safe rollback order is code/build first, then (only with separate approval) Nginx configuration, MongoDB data, or media references. This repository does not push, deploy, restart services, alter firewalls, or write production data automatically. -## 📞 联系我们 +## Repository policy -- 项目地址: [https://github.com/LQ458/biphflora](https://github.com/LQ458/biphflora) -- 问题反馈: [Issues](https://github.com/LQ458/biphflora/issues) +Please read [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md) before making changes. Do not commit `.env` files, credentials, raw logs, production media, build output, or database dumps. Keep branch names and commit messages descriptive and free of tool or assistant labels. ---- +## License -**BIPH FLORA** - 让植物识别变得简单有趣 🌱 \ No newline at end of file +The project uses the private-use license in [LICENSE](LICENSE). It is not an open-source commercial license. diff --git a/SECURITY.md b/SECURITY.md index 034e848..69841ac 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,21 +1,28 @@ -# Security Policy +# Security policy -## Supported Versions +BiphFlora is a private, non-commercial project. The repository is not a promise of a supported public service or a guarantee of historical availability. The private-use terms are in [LICENSE](LICENSE). -Use this section to tell people about which versions of your project are -currently being supported with security updates. +## Reporting a vulnerability -| Version | Supported | -| ------- | ------------------ | -| 5.1.x | :white_check_mark: | -| 5.0.x | :x: | -| 4.0.x | :white_check_mark: | -| < 4.0 | :x: | +Do not open a public issue with exploit details, credentials, personal data, raw logs, IP addresses, or production configuration. Send a concise report through the project maintainer's private channel, including: -## Reporting a Vulnerability +- the affected commit or deployment version; +- a minimal reproduction that does not use production data; +- impact and any safe mitigation; +- whether the report can be shared with other maintainers. -Use this section to tell people how to report a vulnerability. +If no private channel is available, stop at a high-level description in a private repository discussion rather than publishing proof-of-concept material. Response and remediation time are handled case by case; do not assume a service-level target. -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. +## Repository and runtime rules + +- Never commit `.env` files, JWT secrets, database URLs with credentials, Redis URLs with credentials, tokens, dumps, raw logs, or production media. +- Keep production credentials in the server's existing secret store or environment configuration. Documentation records only the configuration name and storage location. +- Authentication accepts the legacy bare JWT form and `Bearer` form during migration. Protected routes return `401`; administrator-only routes return `403` to authenticated non-admin users. +- User responses use explicit projections and must not expose password hashes or `originalPassword`. +- Uploads are restricted to JPEG, PNG, and WebP with the limits in `models/uploadPolicy.js`. Validate both metadata and decoded image data. +- Request logging, audit events, and aggregate search telemetry are disabled by default. When enabled, they must not record tokens, passwords, request bodies, IPs, user agents, or raw search text. +- Do not run database migrations, media backfills, destructive cleanup, service restarts, or firewall changes from a normal code review. + +## Verification + +Run `npm run verify` in a clean local environment before proposing a change. Review the focused authorization, upload, observability, and media tests when touching those boundaries. Report dependency or secret scans as evidence with their exact scope; do not claim that a clean local scan proves the production host is clean. diff --git a/app.js b/app.js index 8ce2bab..d483c8a 100644 --- a/app.js +++ b/app.js @@ -11,7 +11,7 @@ const EditTextRequest = require("./models/editTextRequest"); const Pic = require("./models/pic"); const Art = require("./models/art"); const Activity = require("./models/activity"); -const BirdEditTextRequest = require("./models/birdEditTextRequest") +const BirdEditTextRequest = require("./models/birdEditTextRequest"); const dotenv = require("dotenv"); const jwt = require("jsonwebtoken"); const Time = require("./models/time"); @@ -24,21 +24,131 @@ const path = require("path"); const fs = require("fs").promises; // Node.js file system module with promise support const bcrypt = require("bcrypt"); const multer = require("multer"); +const { + MAX_IMAGE_FILE_SIZE, + createImageFilename, + ensureUploadTempDirectory, + imageFileFilter, + getUploadErrorResponse, + validateImageFiles, +} = require("./models/uploadPolicy"); const featureList = require("./models/featureList"); const creationBottom = require("./models/creationBottom"); const FeatureHome = require("./models/featureHome"); -const redis = require("redis"); +const AuditEvent = require("./models/auditEvent"); +const SearchEvent = require("./models/searchEvent"); +const { createRuntime } = require("./runtime"); +const { createAuthMiddleware } = require("./middleware/auth"); +const { + createAuditMiddleware, + createRequestContext, + createRequestLogger, +} = require("./middleware/observability"); +const { createAuthRouter } = require("./routes/auth"); +const catalogRouter = require("./routes/catalog"); +const { createContentRouter } = require("./routes/content"); +const { createTelemetryRouter } = require("./routes/telemetry"); +const { + assertDerivativeCleanupSucceeded, + cleanupFiles, + cleanupPlantMediaDerivatives, + getCompressedPlantMediaDirectory, + getCompressedPlantMediaPath, + getPlantMediaDirectory, + getPlantMediaPath, + getUploadedFiles, + renamePlantMediaDerivatives, +} = require("./services/mediaFiles"); +const { + PUBLIC_DIRECTORY, + VARIANT_VERSION, + createSerialTaskQueue, + generateImageVariants, + getVariantFallbackFilePaths, + getVariantFilePath, + parseVariantRequestPath, +} = require("./services/imageVariants"); const Code = require("./models/code"); -const birdPost = require('./models/birdPost') +const birdPost = require("./models/birdPost"); const crypto = require("crypto"); -const { log } = require("console"); dotenv.config(); +const runtime = createRuntime({ + mongoose, + redis: require("redis"), + env: process.env, + logger: console, +}); +const { + getAuthorizationToken, + requireAdmin, + requireAuth, + sessionStoreUnavailable, + verifyToken, +} = createAuthMiddleware({ User, jwt, runtime }); +app.use(createRequestContext()); +if (process.env.REQUEST_LOG_ENABLED === "true") { + app.use(createRequestLogger({ logger: console })); +} +app.use( + createAuditMiddleware({ + enabled: process.env.AUDIT_EVENTS_ENABLED === "true", + actorHashSecret: process.env.AUDIT_HASH_SECRET, + writeEvent: (event) => AuditEvent.create(event), + logger: console, + }), +); app.use(compression()); //gzip compression for faster speed app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); +app.use( + `/public/variants/${VARIANT_VERSION}`, + express.static(path.join(PUBLIC_DIRECTORY, "variants", VARIANT_VERSION), { + immutable: true, + maxAge: "1y", + fallthrough: true, + }), +); +app.get("/public/variants/:version/:width/plantspic/*", async (req, res) => { + try { + const { mediaPath, width } = parseVariantRequestPath(req.path); + const variantPath = getVariantFilePath(mediaPath, width); + + try { + await fs.access(variantPath); + res.set("Cache-Control", "public, max-age=31536000, immutable"); + return res.sendFile(variantPath); + } catch (error) { + if (error.code !== "ENOENT") { + throw error; + } + } + + const fallbackFiles = getVariantFallbackFilePaths(mediaPath); + const fallbackPaths = [fallbackFiles.compressed, fallbackFiles.original]; + for (const fallbackPath of fallbackPaths) { + try { + await fs.access(fallbackPath); + res.set("Cache-Control", "public, max-age=300"); + res.set("X-Media-Variant", "legacy-fallback"); + return res.sendFile(fallbackPath); + } catch (error) { + if (error.code !== "ENOENT") { + throw error; + } + } + } + + return res.status(404).end(); + } catch (_) { + return res.status(404).end(); + } +}); app.use("/public/plantspic", express.static("public/plantspic")); -app.use("/public/compressed/plantspic", express.static("public/compressed/plantspic")); +app.use( + "/public/compressed/plantspic", + express.static("public/compressed/plantspic"), +); app.use("/public", express.static("public")); app.use( @@ -52,182 +162,177 @@ app.use( }), ); //cors for cross-origin requests -app.use(function (err, req, res, next) { - console.error(err.stack); // Log error stack to console - res.status(500).send("Something broke!"); -}); // Error handling middleware - -const storage = multer.diskStorage({ - destination: function (req, file, cb) { - cb(null, "./public/uploads/"); // Set the destination folder for uploaded files - }, - filename: function (req, file, cb) { - const fileExtension = file.originalname.split(".").pop().toLowerCase(); - const filename = - req.body.plant.replace(/\s+/g, "") + - "-" + - crypto.randomBytes(16).toString("hex").slice(0, 16) + - "." + - fileExtension; // Generate a unique filename - cb(null, filename); - }, -}); // Set up multer storage - -const upload = multer({ - storage: storage, -}).fields([ - { name: "pic", maxCount: 1 }, - { name: "art", maxCount: 1 }, -]); // Set up multer upload +app.use( + createTelemetryRouter({ + enabled: process.env.SEARCH_TELEMETRY_ENABLED === "true", + SearchEvent, + logger: console, + }), +); -const globalUpload = multer({}); +const imageVariantTasks = createSerialTaskQueue(); -app.listen(process.env.PORT, "0.0.0.0", () => { - console.log("Server is running on port 3001"); -}); // Start the server +async function generateQueuedVariants(filePaths) { + let failed = 0; -const redisClient = redis.createClient({ - url: process.env.REDIS_URL, - pingInterval: 1000, -}); + for (const filePath of filePaths) { + try { + const results = await generateImageVariants(filePath); + failed += results.filter((result) => result.status === "failed").length; + } catch (_) { + failed += 1; + } + } -async function connectToRedis() { - try { - await redisClient.connect(); - console.log("Connected to Redis"); - } catch (err) { - console.error("Failed to connect to Redis:", err); + if (failed > 0) { + console.warn(`Unable to create ${failed} responsive image variants`); } } -connectToRedis(); - -process.on("uncaughtException", function (err) { - console.log("Caught Exception:" + err); //直接捕获method()未定义函数,Node进程未被退出。 -}); - -mongoose.connect(process.env.MONGODB_URL).then(() => { - console.log("connected to mongodb"); -}); // Connect to MongoDB - -async function verifyToken(req, res, next) { - const token = req.headers["authorization"]; +function enqueueImageVariants(filePaths) { + const pendingPaths = filePaths.map((filePath) => String(filePath)); + return imageVariantTasks.enqueue(() => generateQueuedVariants(pendingPaths)); +} - if (!token || token === "undefined") { - req.user = null; - return next(); - } +function scheduleUploadedVariants(uploadedFiles) { + void enqueueImageVariants( + uploadedFiles.map(({ filename }) => getPlantMediaPath(filename)), + ); +} - try { - const decoded = await new Promise((resolve, reject) => { - jwt.verify(token, process.env.secret, (err, decoded) => { - if (err) { - if (err.message === "jwt expired") { - // If the JWT is expired, delete it from Redis - redisClient.del(decoded.username); - } - return reject(err); - } - resolve(decoded); - }); - }); +async function drainImageVariantQueue() { + await imageVariantTasks.drain(); +} - req.user = decoded; +async function removeStoredMedia(mediaPath) { + await imageVariantTasks.enqueue(async () => { + const cleanupResult = await cleanupPlantMediaDerivatives( + path.basename(mediaPath), + ); + assertDerivativeCleanupSucceeded(cleanupResult); + await fs.unlink(path.join(__dirname, "public", mediaPath)); + }); +} - const redisToken = await redisClient.get(req.user.username); +function moveStoredMediaDerivatives(oldPath, newPath, newFullPath) { + void imageVariantTasks.enqueue(async () => { + try { + const result = await renamePlantMediaDerivatives( + path.basename(oldPath), + path.basename(newPath), + ); + const failed = result.variants.filter( + (variant) => variant.status === "failed", + ).length; - if (redisToken === token) { - req.token = token; - } else if (redisToken) { - req.token = redisToken; + if (result.compressed === "failed" || failed > 0) { + console.warn("Unable to rename one or more image derivatives"); + } + } catch (_) { + console.warn("Unable to rename one or more image derivatives"); } - return next(); - } catch (err) { - req.user = null; - return next(); - } -} - -app.post("/login", verifyToken, async (req, res) => { - var passwordMatch = false; - if (req.user) { - return res.json({ - success: true, - message: "Already logged in", - user: req.user, - token: req.token, + await generateImageVariants(newFullPath).catch(() => { + console.warn("Unable to refresh responsive image variants"); }); - } - - const { username, password } = req.body; - const user = await User.findOne({ username }); + }); +} - if (user) { - passwordMatch = await bcrypt.compare(password, user.password); - } else { - return res.json({ success: false, message: "User not found" }); - } +app.get("/health/live", (req, res) => { + res.status(200).json({ status: "live" }); +}); - if (passwordMatch) { - var token = jwt.sign( - { username: user.username, admin: user.admin }, - process.env.secret, - { expiresIn: "180d" }, - ); +app.get("/health/ready", (req, res) => { + const readiness = runtime.getReadiness(); - const redisToken = await redisClient.get(username); + res.status(readiness.ready ? 200 : 503).json({ + status: readiness.ready ? "ready" : "not_ready", + dependencies: readiness.dependencies, + }); +}); - if (redisToken) { - token = redisToken; - } else { - await redisClient.set(username, token, redis.print); +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + try { + cb(null, ensureUploadTempDirectory()); + } catch (error) { + cb(error); + } + }, + filename: function (req, file, cb) { + try { + cb(null, createImageFilename(file.mimetype)); + } catch (error) { + cb(error); } + }, +}); // Set up multer storage - return res.json({ - success: true, - message: "Login successful", - user: (({ username, admin }) => ({ username, admin }))(user), - token, - }); - } else { - return res.json({ - success: false, - message: "Invalid username or password", - }); - } -}); +const upload = multer({ + storage: storage, + limits: { + fileSize: MAX_IMAGE_FILE_SIZE, + files: 2, + }, + fileFilter: imageFileFilter, +}).fields([ + { name: "pic", maxCount: 1 }, + { name: "art", maxCount: 1 }, +]); // Set up multer upload -app.get("/refresh", verifyToken, async (req, res) => { - if (!req.user) { - return res.json({ success: false, message: "Token not valid" }); - } +const globalUpload = multer({}); - return res.json({ - success: true, - message: "Token refreshed", - user: req.user, +function uploadWithCleanup(req, res, next) { + upload(req, res, async (error) => { + if (error) { + await cleanupFiles(getUploadedFiles(req.files).map((file) => file.path)); + return next(error); + } + + return next(); }); -}); +} -app.post("/logout", verifyToken, async (req, res) => { - if (!req.user) { - return res.json({ success: true, message: "Logout successful" }); - } +async function cleanupRecords(model, records) { + await Promise.all( + records.map((record) => + model.deleteOne({ _id: record._id }).catch(() => { + console.warn("Unable to roll back uploaded record"); + }), + ), + ); +} - await redisClient.del(req.user?.username); +const USER_PUBLIC_PROJECTION = { username: 1, admin: 1 }; - return res.json({ success: true, message: "Logout successful" }); -}); +function toPublicUser(user) { + return { + _id: user._id, + username: user.username, + admin: Boolean(user.admin), + }; +} + +app.use( + createAuthRouter({ + User, + bcrypt, + getAuthorizationToken, + jwt, + runtime, + sessionStoreUnavailable, + verifyToken, + }), +); -app.post("/adminView", async (req, res) => { +app.post("/adminView", requireAdmin, async (req, res) => { const resultPlant = await Post.findOne({ latinName: req.body.search }); const resultPics = await Pic.find({ plant: req.body.search }); const resultArts = await Art.find({ plant: req.body.search }); res.json({ success: true, resultPlant, resultPics, resultArts }); }); -app.post("/makeFeatured", async (req, res) => { +app.post("/makeFeatured", requireAdmin, async (req, res) => { var homeScreenFeatureList = await featureList.findOne({ name: "homescreenFeature", }); @@ -239,174 +344,74 @@ app.post("/makeFeatured", async (req, res) => { if (req.body.pic != "Pic " && req.body.art != "+ Art") { homeScreenFeatureList.plant.push(req.body); await homeScreenFeatureList.save(); - console.log("Feature status saved"); - } else { - console.log("failed (no id)"); } res.json({ success: true }); }); -app.get("/creationDocumentary", async (req, res) => { - const allDisplays = await creationBottom.find({ auth: true }); - - res.json({ success: true, allDisplays }); -}); - -app.post("/register", async (req, res) => { - const { username } = req.body; - const password = await bcrypt.hash(req.body.password, 10); - try { - await User.create({ - username, - password: password, - originalPassword: req.body.password, - admin: false, - }); - return res.json({ success: true, message: "Register successful" }); - } catch (error) { - if (error.code === 11000) { - return res.json({ success: false, message: "Username already exists" }); - } - return res.json({ success: false, message: error.message }); - } -}); +app.use( + createContentRouter({ + Art, + BirdPost, + FeatureHome, + Pic, + Post, + creationBottom, + verifyToken, + }), +); -app.get("/adminDataGet", async (req, res) => { +app.get("/adminDataGet", requireAdmin, async (req, res) => { const plants = await Post.find({ authorization: true }); - const users = await User.find(); - console.log("message recieved"); - res.json({ success: true, plants, users }); + const users = await User.find({}, USER_PUBLIC_PROJECTION); + res.json({ success: true, plants, users: users.map(toPublicUser) }); }); -app.post("/adminToggle", async (req, res) => { +app.post("/adminToggle", requireAdmin, async (req, res) => { const user = await User.findOne({ username: req.body.username }); user.admin = !user.admin; await user.save(); res.json({ success: true }); }); -app.get("/userInfo", verifyToken, async (req, res) => { - const featureLists = await FeatureHome.find().lean(); - if (req.user) { - res.json({ - success: true, - username: req.user?.username, - admin: req.user?.admin, - featureLists, - }); - } else { - res.json({ success: false, featureLists }); - } +app.post("/edit", requireAuth, async function (req, res) { + res.json({ success: true }); }); -app.get("/userInfoGlossary", verifyToken, async (req, res) => { - const posts = await Post.find({ authorization: true }); - const letters = "abcdefghijklmnopqrstuvwxyz".split(""); - const glossary = {}; - const cnNames = {}; - - // Initialize an array for each letter - letters.forEach((letter) => { - glossary[letter] = []; - cnNames[letter] = []; - }); - - posts.forEach((post) => { - const firstLetter = post.latinName[0].toLowerCase(); - if (glossary[firstLetter]) { - glossary[firstLetter].push(post.latinName); - cnNames[firstLetter].push(post.chineseName); +app.post( + "/newPostAuth", + requireAdmin, + uploadWithCleanup, + async (req, res, type) => { + if (req.body.decision) { + const post = await Post.findOne({ _id: req.body.id }); + post.authorization = true; + await post.save(); + } else { + await Post.deleteOne({ _id: req.body.id }); } - }); - const response = req.user - ? { - success: true, - username: req.user?.username, - admin: req.user?.admin, - glossary, - cnNames, - } - : { - success: false, - glossary, - cnNames, - }; - - res.json(response); -}); - -app.get("/userInfoGlossaryBird", verifyToken, async (req, res) => { - const posts = await BirdPost.find({ authorization: true }); - const letters = "abcdefghijklmnopqrstuvwxyz".split(""); - const glossary = {}; - const cnNames = {}; - - // Initialize an array for each letter - letters.forEach((letter) => { - glossary[letter] = []; - cnNames[letter] = []; - }); + res.json({ success: true }); + }, +); - posts.forEach((post) => { - const firstLetter = post.latinName[0].toLowerCase(); - if (glossary[firstLetter]) { - glossary[firstLetter].push(post.latinName); - cnNames[firstLetter].push(post.chineseName); +app.post( + "/newBirdPostAuth", + requireAdmin, + uploadWithCleanup, + async (req, res, type) => { + if (req.body.decision) { + const post = await BirdPost.findOne({ _id: req.body.id }); + post.authorization = true; + await post.save(); + } else { + await BirdPost.deleteOne({ _id: req.body.id }); } - }); - - const response = req.user - ? { - success: true, - username: req.user?.username, - admin: req.user?.admin, - glossary, - cnNames, - } - : { - success: false, - glossary, - cnNames, - }; - - res.json(response); - console.log("123") -}); - -app.post("/edit", async function (req, res) { - try { res.json({ success: true }); - } catch (error) { - console.log(error); - } -}); - -app.post("/newPostAuth", verifyToken, upload, async (req, res, type) => { - if (req.body.decision) { - const post = await Post.findOne({ _id: req.body.id }); - post.authorization = true; - await post.save(); - } else { - await Post.deleteOne({ _id: req.body.id }); - } - - res.json({ success: true }); -}); - -app.post("/newBirdPostAuth", verifyToken, upload, async (req, res, type) => { - if (req.body.decision) { - const post = await BirdPost.findOne({ _id: req.body.id }); - post.authorization = true; - await post.save(); - } else { - await BirdPost.deleteOne({ _id: req.body.id }); - } - res.json({ success: true }); -}); + }, +); -app.post("/featureToHome", verifyToken, async (req, res) => { +app.post("/featureToHome", requireAdmin, async (req, res) => { try { const { picId, artId, isCreation } = req.body; @@ -473,141 +478,157 @@ app.post("/featureToHome", verifyToken, async (req, res) => { const entries = await FeatureHome.find(); res.json({ success: true, entries }); - } catch (error) { - res.status(500).json({ success: false, message: error.message }); + } catch (_) { + console.warn("Unable to update featured content"); + res.status(500).json({ + success: false, + message: "Unable to update featured content", + }); } }); -app.post("/uploadCreation", verifyToken, upload, async (req, res) => { - try { - const { body, files } = req; +app.post( + "/uploadCreation", + requireAuth, + uploadWithCleanup, + async (req, res) => { const inputFiles = []; - const outputFolderPath = "public/plantspic/"; - const plant = await Post.findOne({ latinName: body.plant }); + const outputFiles = []; + let creation; - if (!plant) { - return res.status(404).json({ - success: false, - message: "Plant not found", - }); - } + try { + const { body, files } = req; + const uploadedFiles = getUploadedFiles(files); + inputFiles.push(...uploadedFiles.map((file) => file.path)); + outputFiles.push( + ...uploadedFiles.map((file) => getPlantMediaPath(file.filename)), + ); + const outputFolderPath = getPlantMediaDirectory(); + const plant = await Post.findOne({ latinName: body.plant }); - if (!files || !files.pic || !files.art) { - return res.status(400).json({ - success: false, - message: "Both picture and artwork files are required", - }); - } + if (!plant) { + return res.status(404).json({ + success: false, + message: "Plant not found", + }); + } - // Get or create pic code - var picCode = await Code.findOne({ type: "crePic" }); - if (!picCode) { - picCode = new Code({ type: "crePic", count: 0 }); - await picCode.save(); - } + if (!files || !files.pic || !files.art) { + return res.status(400).json({ + success: false, + message: "Both picture and artwork files are required", + }); + } - // Get or create art code - var artCode = await Code.findOne({ type: "creArt" }); - if (!artCode) { - artCode = new Code({ type: "creArt", count: 0 }); - await artCode.save(); - } + await validateImageFiles([files.pic[0], files.art[0]]); - // Add files to compression queue - inputFiles.push("./public/uploads/" + files.pic[0].filename); - inputFiles.push("./public/uploads/" + files.art[0].filename); + // Get or create pic code + var picCode = await Code.findOne({ type: "crePic" }); + if (!picCode) { + picCode = new Code({ type: "crePic", count: 0 }); + await picCode.save(); + } - // Compress images and wait for results - const compressionResults = await imageCompressor.compressImages( - inputFiles, - outputFolderPath, - ); + // Get or create art code + var artCode = await Code.findOne({ type: "creArt" }); + if (!artCode) { + artCode = new Code({ type: "creArt", count: 0 }); + await artCode.save(); + } - // Check if any compression failed - const failedFiles = compressionResults.filter((result) => !result.success); - if (failedFiles.length > 0) { - throw new Error( - `Failed to compress files: ${failedFiles.map((f) => f.file).join(", ")}`, + // Compress images and wait for results + const compressionResults = await imageCompressor.compressImages( + inputFiles, + outputFolderPath, ); - } - const picPath = path.join("/plantspic/", files.pic[0].filename); - const artPath = path.join("/plantspic/", files.art[0].filename); - - // Create creation entry - const creation = new creationBottom({ - auth: false, - plant: body.plant, - art: artPath, - pic: picPath, - date: new Date().toISOString(), - creator: req.user?.username || "admin", - artist: body.artist, - photographer: body.photographer, - photoDate: body.photoDate, - artDate: body.artDate, - location: plant.location, - name: plant.latinName, - commonName: plant.commonName, - chineseName: plant.chineseName, - picCode: (picCode.count + 1).toString().padStart(4, "0"), - artCode: (artCode.count + 1).toString().padStart(4, "0"), - }); + // Check if any compression failed + const failedFiles = compressionResults.filter( + (result) => !result.success, + ); + if (failedFiles.length > 0) { + throw new Error( + `Failed to compress files: ${failedFiles.map((f) => f.file).join(", ")}`, + ); + } - await creation.save(); + const picPath = path.join("/plantspic/", files.pic[0].filename); + const artPath = path.join("/plantspic/", files.art[0].filename); + + // Create creation entry + creation = new creationBottom({ + auth: false, + plant: body.plant, + art: artPath, + pic: picPath, + date: new Date().toISOString(), + creator: req.authenticatedUser.username, + artist: body.artist, + photographer: body.photographer, + photoDate: body.photoDate, + artDate: body.artDate, + location: plant.location, + name: plant.latinName, + commonName: plant.commonName, + chineseName: plant.chineseName, + picCode: (picCode.count + 1).toString().padStart(4, "0"), + artCode: (artCode.count + 1).toString().padStart(4, "0"), + }); - // Update codes - await Promise.all([ - Code.findOneAndUpdate( - { type: "crePic" }, - { $inc: { count: 1 } }, - { new: true }, - ), - Code.findOneAndUpdate( - { type: "creArt" }, - { $inc: { count: 1 } }, - { new: true }, - ), - ]); + await creation.save(); - // Clean up original files after successful compression - await Promise.all( - inputFiles.map((file) => - fs.unlink(file).catch((err) => { - console.warn( - `Warning: Could not delete temporary file ${file}:`, - err, - ); - }), - ), - ); + // Update codes + await Promise.all([ + Code.findOneAndUpdate( + { type: "crePic" }, + { $inc: { count: 1 } }, + { new: true }, + ), + Code.findOneAndUpdate( + { type: "creArt" }, + { $inc: { count: 1 } }, + { new: true }, + ), + ]); - res.json({ - success: true, - message: "Creation uploaded successfully", - creation, - }); - } catch (error) { - console.error("Error in uploadCreation:", error); - res.status(500).json({ - success: false, - message: error.message || "Failed to upload creation", - }); - } -}); + scheduleUploadedVariants(uploadedFiles); + + return res.json({ + success: true, + message: "Creation uploaded successfully", + creation, + }); + } catch (error) { + if (creation?._id) { + await cleanupRecords(creationBottom, [creation]); + } + await cleanupFiles(outputFiles); + + const uploadError = getUploadErrorResponse(error); + if (uploadError) { + return res.status(uploadError.status).json(uploadError.body); + } + + console.error("Creation upload failed"); + return res.status(500).json({ + success: false, + message: "Unable to process creation upload", + }); + } finally { + await cleanupFiles(inputFiles); + } + }, +); app.post( "/uploadPlant", + requireAuth, globalUpload.none(), - verifyToken, async function (req, res) { try { var username = "admin"; - if (req.user?.admin) { - authorization = true; - } else if (req.user) { + if (!req.user?.admin && req.user) { username = req.user?.username; - authorization = false; } const post = new Post({ @@ -622,7 +643,7 @@ app.post( username: username, otherNames: req.body.otherNames, authorization: false, - dbType: "plant" + dbType: "plant", }); // 确保链接数据格式一致性 @@ -644,34 +665,32 @@ app.post( await post.save(); - console.log("123123123123"); - - res.json({ success: true }); + return res.json({ success: true }); } catch (error) { if (error.code === 11000) { - res + return res .status(400) .json({ success: false, message: "Plant already exists" }); - } else { - console.log(error, "uploading problems"); } + console.warn("Unable to create plant submission"); + return res.status(500).json({ + success: false, + message: "Unable to create plant submission", + }); } }, ); app.post( "/uploadBird", + requireAuth, globalUpload.none(), - verifyToken, async function (req, res) { try { var username = "admin"; - if (req.user?.admin) { - authorization = true; - } else if (req.user) { + if (!req.user?.admin && req.user) { username = req.user?.username; - authorization = false; } const post = new BirdPost({ @@ -686,7 +705,7 @@ app.post( username: username, otherNames: req.body.otherNames, authorization: false, - + appearance: req.body.appearance, habitat: req.body.habitat, breeding: req.body.breeding, @@ -697,7 +716,7 @@ app.post( juvChar: req.body.juvChar, subChar: req.body.subChar, mAdultChar: req.body.mAdultChar, - fAdultChar: req.body.fAdultChar + fAdultChar: req.body.fAdultChar, }); // 确保链接数据格式一致性 @@ -718,52 +737,70 @@ app.post( ); await post.save(); - res.json({ success: true }); + return res.json({ success: true }); } catch (error) { - res + if (error.code === 11000) { + return res .status(400) .json({ success: false, message: "Bird already exists" }); + } + console.warn("Unable to create bird submission"); + return res.status(500).json({ + success: false, + message: "Unable to create bird submission", + }); } }, ); -app.post("/newCreationAuth", verifyToken, upload, async (req, res) => { - try { - if (req.body.decision) { - const post = await creationBottom.findOne({ _id: req.body.id }); - if (!post) { - return res - .status(404) - .json({ success: false, message: "Post not found" }); - } - post.auth = true; - await post.save(); - console.log("creation saved"); - } else { - const post = await creationBottom.findOne({ _id: req.body.id }); - if (!post) { - return res - .status(404) - .json({ success: false, message: "Post not found" }); +app.post( + "/newCreationAuth", + requireAdmin, + uploadWithCleanup, + async (req, res) => { + try { + if (req.body.decision) { + const post = await creationBottom.findOne({ _id: req.body.id }); + if (!post) { + return res + .status(404) + .json({ success: false, message: "Post not found" }); + } + post.auth = true; + await post.save(); + } else { + const post = await creationBottom.findOne({ _id: req.body.id }); + if (!post) { + return res + .status(404) + .json({ success: false, message: "Post not found" }); + } + // Delete the files + await Promise.all([ + removeStoredMedia(post.art), + removeStoredMedia(post.pic), + ]); + await creationBottom.deleteOne({ _id: req.body.id }); } - // Delete the files - await Promise.all([ - fs.unlink(path.join(__dirname, "/public", post.art)), - fs.unlink(path.join(__dirname, "/public", post.pic)), - ]); - await creationBottom.deleteOne({ _id: req.body.id }); + res.json({ success: true, message: "creation saved" }); + } catch (_) { + console.warn("Unable to review creation submission"); + res.status(500).json({ success: false, message: "An error occurred" }); } - res.json({ success: true, message: "creation saved" }); - } catch (error) { - console.error(error); - res.status(500).json({ success: false, message: "An error occurred" }); - } -}); + }, +); -app.post("/uploadArt", artmiddleware, verifyToken, async function (req, res) { +app.post("/uploadArt", requireAuth, artmiddleware, async function (req, res) { const inputFiles = []; - const outputFolderPath = "public/plantspic/"; - const compressedOutputFolderPath = "public/plantspic/"; + const outputFiles = []; + const createdArts = []; + const uploadedFiles = getUploadedFiles(req.files); + const outputFolderPath = getPlantMediaDirectory(); + + inputFiles.push(...uploadedFiles.map((file) => file.path)); + outputFiles.push( + ...uploadedFiles.map((file) => getPlantMediaPath(file.filename)), + ); try { const plant = await Post.findOne({ latinName: req.body.plant }); @@ -773,37 +810,8 @@ app.post("/uploadArt", artmiddleware, verifyToken, async function (req, res) { .json({ success: false, message: "Plant not found" }); } - var code = await Code.findOne({ type: "art" }); - if (!code) { - console.log("No code found, creating a new one with count 0"); - code = new Code({ type: "art", count: 0 }); - await code.save(); - } - - var username = req.user?.username || "admin"; - - if (req.files && req.files.length >= 1) { - for (const file of req.files) { - const filePath = "./public/uploads/" + file.filename; - inputFiles.push(filePath); - let newCount = (code.count + 1).toString().padStart(4, "0"); - const art = new Art({ - plant: req.body.plant, - location: req.body.artLocation, - artist: req.body.artist, - path: "/plantspic/" + file.filename, - code: newCount, - }); - - await art.save(); - console.log("Art saved with code:", newCount); - - code = await Code.findOneAndUpdate( - { type: "art" }, - { $inc: { count: 1 } }, - { new: true }, - ); - } + if (uploadedFiles.length >= 1) { + await validateImageFiles(uploadedFiles); // Compress images and wait for results const compressionResults = await imageCompressor.compressImages( @@ -815,44 +823,84 @@ app.post("/uploadArt", artmiddleware, verifyToken, async function (req, res) { const failedFiles = compressionResults.filter( (result) => !result.success, ); - if (failedFiles.length > 0) { - throw new Error( - `Failed to compress files: ${failedFiles.map((f) => f.file).join(", ")}`, + if ( + compressionResults.length !== inputFiles.length || + failedFiles.length > 0 + ) { + throw new Error("Image compression failed"); + } + + var code = await Code.findOne({ type: "art" }); + if (!code) { + code = new Code({ type: "art", count: 0 }); + await code.save(); + } + + for (const file of uploadedFiles) { + const newCount = (code.count + 1).toString().padStart(4, "0"); + const art = new Art({ + plant: req.body.plant, + location: req.body.artLocation, + artist: req.body.artist, + path: "/plantspic/" + file.filename, + code: newCount, + }); + + await art.save(); + createdArts.push(art); + code = await Code.findOneAndUpdate( + { type: "art" }, + { $inc: { count: 1 } }, + { new: true }, ); } - // Clean up original files after successful compression - await Promise.all( - inputFiles.map((file) => - fs.unlink(file).catch((err) => { - console.warn( - `Warning: Could not delete temporary file ${file}:`, - err, - ); - }), - ), - ); + scheduleUploadedVariants(uploadedFiles); - res.json({ success: true, message: "Art uploaded successfully" }); + return res.json({ success: true, message: "Art uploaded successfully" }); } else { - res.status(400).json({ success: false, message: "No files uploaded" }); + return res + .status(400) + .json({ success: false, message: "No files uploaded" }); } } catch (error) { - console.error("An error occurred:", error); - res + await cleanupRecords(Art, createdArts); + await cleanupFiles(outputFiles); + + const uploadError = getUploadErrorResponse(error); + if (uploadError) { + return res.status(uploadError.status).json(uploadError.body); + } + + console.error("Artwork upload failed"); + return res .status(500) - .json({ success: false, message: "Error processing request" }); + .json({ success: false, message: "Unable to process image upload" }); + } finally { + await cleanupFiles(inputFiles); } }); app.post( "/uploadPic", + requireAuth, uploadmiddleware, - verifyToken, async function (req, res) { const inputFiles = []; - const outputFolderPath = "public/plantspic/"; - const smallerCompressedFolderPath = "public/compressed/plantspic/"; + const outputFiles = []; + const createdPics = []; + const uploadedFiles = getUploadedFiles(req.files); + const outputFolderPath = getPlantMediaDirectory(); + const smallerCompressedFolderPath = getCompressedPlantMediaDirectory(); + + inputFiles.push(...uploadedFiles.map((file) => file.path)); + outputFiles.push( + ...uploadedFiles.flatMap((file) => [ + getPlantMediaPath(file.filename), + getCompressedPlantMediaPath(file.filename), + ]), + ); + try { const plant = await Post.findOne({ latinName: req.body.picEnglishName }); @@ -860,378 +908,261 @@ app.post( return res.status(404).send("Plant not found"); } - var code = await Code.findOne({ type: "pic" }); - if (!code) { - console.log("No pic code found, creating a new one with count 0"); - code = new Code({ type: "pic", count: 0 }); - await code.save(); - } - - var username = "admin"; - if (req.user) { - username = req.user?.username; - } - - if (req.files && req.files.length >= 1) { - for (const file of req.files) { - const filePath = "./public/uploads/" + file.filename; - inputFiles.push(filePath); - let newCount = (code.count + 1).toString().padStart(4, "0"); - const pic = new Pic({ - plant: req.body.picEnglishName, - art: req.body.picArt, - modifiedBy: username, - season: req.body.picSeason, - takenBy: req.body.picPhotographer, - location: req.body.picSetting, - path: "/plantspic/" + file.filename, - time: req.body.month, - featured: false, - code: newCount, - }); - - await pic.save(); - code = await Code.findOneAndUpdate( - { type: "pic" }, - { $inc: { count: 1 } }, - { new: true }, - ); - console.log("pic saved with code: " + newCount); - } + if (uploadedFiles.length >= 1) { + await validateImageFiles(uploadedFiles); - // for (const file of req.files) { - // const filePath = "./public/uploads/" + file.filename; - // inputFiles.push(filePath); - // let newCount = (code.count + 1).toString().padStart(4, "0"); - // const pic = new Pic({ - // plant: req.body.picEnglishName, - // art: req.body.picArt, - // modifiedBy: username, - // season: req.body.picSeason, - // takenBy: req.body.picPhotographer, - // location: req.body.picSetting, - // path: "/compressed/plantspic/" + file.filename, - // time: req.body.month, - // featured: false, - // code: newCount, - // }); - - // await pic.save(); - // code = await Code.findOneAndUpdate( - // { type: "pic" }, - // { $inc: { count: 1 } }, - // { new: true }, - // ); - // console.log("pic saved with code: " + newCount); - // } - - // Compress images and wait for results const compressionResults = await imageCompressor.compressImages( inputFiles, outputFolderPath, 5, - 90 + 90, ); - - - - // Check if any compression failed - var failedFiles = compressionResults.filter( + let failedFiles = compressionResults.filter( (result) => !result.success, ); - if (failedFiles.length > 0) { - throw new Error( - `Failed to compress files: ${failedFiles.map((f) => f.file).join(", ")}`, - ); + if ( + compressionResults.length !== inputFiles.length || + failedFiles.length > 0 + ) { + throw new Error("Image compression failed"); } - const smallerCompressionResults = await imageCompressor.compressImages( inputFiles, smallerCompressedFolderPath, 9, - 70 + 70, ); - // Check if any compression failed failedFiles = smallerCompressionResults.filter( (result) => !result.success, ); + if ( + smallerCompressionResults.length !== inputFiles.length || + failedFiles.length > 0 + ) { + throw new Error("Image compression failed"); + } + + var code = await Code.findOne({ type: "pic" }); + if (!code) { + code = new Code({ type: "pic", count: 0 }); + await code.save(); + } + + for (const file of uploadedFiles) { + const newCount = (code.count + 1).toString().padStart(4, "0"); + const pic = new Pic({ + plant: req.body.picEnglishName, + art: req.body.picArt, + modifiedBy: req.authenticatedUser.username, + season: req.body.picSeason, + takenBy: req.body.picPhotographer, + location: req.body.picSetting, + path: "/plantspic/" + file.filename, + time: req.body.month, + featured: false, + code: newCount, + }); - if (failedFiles.length > 0) { - throw new Error( - `Failed to compress files: ${failedFiles.map((f) => f.file).join(", ")}`, + await pic.save(); + createdPics.push(pic); + code = await Code.findOneAndUpdate( + { type: "pic" }, + { $inc: { count: 1 } }, + { new: true }, ); } - // Clean up original files after successful compression - await Promise.all( - inputFiles.map((file) => - fs.unlink(file).catch((err) => { - console.warn( - `Warning: Could not delete temporary file ${file}:`, - err, - ); - }), - ), - ); + scheduleUploadedVariants(uploadedFiles); - res.json({ success: true, message: "Picture uploaded successfully" }); + return res.json({ + success: true, + message: "Picture uploaded successfully", + }); } else { - res.status(400).json({ success: false, message: "No files uploaded" }); + return res + .status(400) + .json({ success: false, message: "No files uploaded" }); } } catch (error) { - console.error("Error in uploadPic:", error); - res + await cleanupRecords(Pic, createdPics); + await cleanupFiles(outputFiles); + + const uploadError = getUploadErrorResponse(error); + if (uploadError) { + return res.status(uploadError.status).json(uploadError.body); + } + + console.error("Picture upload failed"); + return res .status(500) - .json({ success: false, message: "Error processing request" }); + .json({ success: false, message: "Unable to process image upload" }); + } finally { + await cleanupFiles(inputFiles); } }, ); app.post( "/uploadBirdPic", + requireAuth, uploadmiddleware, - verifyToken, async function (req, res) { const inputFiles = []; - const outputFolderPath = "public/plantspic/"; - const smallerCompressedFolderPath = "public/compressed/plantspic/"; + const outputFiles = []; + const createdPics = []; + const uploadedFiles = getUploadedFiles(req.files); + const outputFolderPath = getPlantMediaDirectory(); + const smallerCompressedFolderPath = getCompressedPlantMediaDirectory(); + + inputFiles.push(...uploadedFiles.map((file) => file.path)); + outputFiles.push( + ...uploadedFiles.flatMap((file) => [ + getPlantMediaPath(file.filename), + getCompressedPlantMediaPath(file.filename), + ]), + ); + try { - const plant = await BirdPost.findOne({ latinName: req.body.picEnglishName }); + const plant = await BirdPost.findOne({ + latinName: req.body.picEnglishName, + }); if (!plant) { return res.status(404).send("Plant not found"); } - var code = await Code.findOne({ type: "pic" }); - if (!code) { - console.log("No pic code found, creating a new one with count 0"); - code = new Code({ type: "pic", count: 0 }); - await code.save(); - } - - var username = "admin"; - if (req.user) { - username = req.user?.username; - } - - if (req.files && req.files.length >= 1) { - for (const file of req.files) { - const filePath = "./public/uploads/" + file.filename; - inputFiles.push(filePath); - let newCount = (code.count + 1).toString().padStart(4, "0"); - const pic = new Pic({ - plant: req.body.picEnglishName, - art: req.body.picArt, - modifiedBy: username, - season: req.body.picSeason.replace("-","").replace(" ",""), - takenBy: req.body.picPhotographer, - location: req.body.picSetting, - path: "/plantspic/" + file.filename, - time: req.body.month, - featured: false, - code: newCount, - dbType: 'bird' - }); - - await pic.save(); - code = await Code.findOneAndUpdate( - { type: "pic" }, - { $inc: { count: 1 } }, - { new: true }, - ); - console.log("pic saved with code: " + newCount); - } + if (uploadedFiles.length >= 1) { + await validateImageFiles(uploadedFiles); - // for (const file of req.files) { - // const filePath = "./public/uploads/" + file.filename; - // inputFiles.push(filePath); - // let newCount = (code.count + 1).toString().padStart(4, "0"); - // const pic = new Pic({ - // plant: req.body.picEnglishName, - // art: req.body.picArt, - // modifiedBy: username, - // season: req.body.picSeason, - // takenBy: req.body.picPhotographer, - // location: req.body.picSetting, - // path: "/compressed/plantspic/" + file.filename, - // time: req.body.month, - // featured: false, - // code: newCount, - // }); - - // await pic.save(); - // code = await Code.findOneAndUpdate( - // { type: "pic" }, - // { $inc: { count: 1 } }, - // { new: true }, - // ); - // console.log("pic saved with code: " + newCount); - // } - - // Compress images and wait for results const compressionResults = await imageCompressor.compressImages( inputFiles, outputFolderPath, 5, - 90 + 90, ); - - - - // Check if any compression failed - var failedFiles = compressionResults.filter( + let failedFiles = compressionResults.filter( (result) => !result.success, ); - if (failedFiles.length > 0) { - throw new Error( - `Failed to compress files: ${failedFiles.map((f) => f.file).join(", ")}`, - ); + if ( + compressionResults.length !== inputFiles.length || + failedFiles.length > 0 + ) { + throw new Error("Image compression failed"); } - const smallerCompressionResults = await imageCompressor.compressImages( inputFiles, smallerCompressedFolderPath, 9, - 70 + 70, ); - // Check if any compression failed failedFiles = smallerCompressionResults.filter( (result) => !result.success, ); + if ( + smallerCompressionResults.length !== inputFiles.length || + failedFiles.length > 0 + ) { + throw new Error("Image compression failed"); + } - if (failedFiles.length > 0) { - throw new Error( - `Failed to compress files: ${failedFiles.map((f) => f.file).join(", ")}`, + var code = await Code.findOne({ type: "pic" }); + if (!code) { + code = new Code({ type: "pic", count: 0 }); + await code.save(); + } + + for (const file of uploadedFiles) { + const newCount = (code.count + 1).toString().padStart(4, "0"); + const pic = new Pic({ + plant: req.body.picEnglishName, + art: req.body.picArt, + modifiedBy: req.authenticatedUser.username, + season: req.body.picSeason.replace("-", "").replace(" ", ""), + takenBy: req.body.picPhotographer, + location: req.body.picSetting, + path: "/plantspic/" + file.filename, + time: req.body.month, + featured: false, + code: newCount, + dbType: "bird", + }); + + await pic.save(); + createdPics.push(pic); + code = await Code.findOneAndUpdate( + { type: "pic" }, + { $inc: { count: 1 } }, + { new: true }, ); } - // Clean up original files after successful compression - await Promise.all( - inputFiles.map((file) => - fs.unlink(file).catch((err) => { - console.warn( - `Warning: Could not delete temporary file ${file}:`, - err, - ); - }), - ), - ); + scheduleUploadedVariants(uploadedFiles); - res.json({ success: true, message: "Picture uploaded successfully" }); + return res.json({ + success: true, + message: "Picture uploaded successfully", + }); } else { - res.status(400).json({ success: false, message: "No files uploaded" }); + return res + .status(400) + .json({ success: false, message: "No files uploaded" }); } } catch (error) { - console.error("Error in uploadPic:", error); - res + await cleanupRecords(Pic, createdPics); + await cleanupFiles(outputFiles); + + const uploadError = getUploadErrorResponse(error); + if (uploadError) { + return res.status(uploadError.status).json(uploadError.body); + } + + console.error("Bird picture upload failed"); + return res .status(500) - .json({ success: false, message: "Error processing request" }); + .json({ success: false, message: "Unable to process image upload" }); + } finally { + await cleanupFiles(inputFiles); } }, ); -app.get("/searchNames", async (req, res) => { - const posts = await Post.find({ authorization: true }); - if (!posts) { - res.json({ success: false, returnNames: [], numOfPlants: 0 }); - } - res.json({ success: true, returnNames: posts, numOfPlants: posts.length }); -}); - - - -app.get("/searchBirdNames", async (req, res) => { - const birdPosts = await BirdPost.find({ authorization: true }); - if (!birdPosts) { - res.json({ success: false, returnNames: [], numOfPlants: 0 }); - } - res.json({ success: true, returnNames: birdPosts, numOfPlants: birdPosts.length }); -}); - -app.post("/syncPlantInfo", async (req, res) => { - const resultPost = await Post.find({ - latinName: req.body.postName, - authorization: true, - }); - const photographs = await Pic.find({ - art: "photography", - plant: req.body.postName, - }); - const arts = await Art.find({ plant: req.body.postName }); - res.json({ resultPost: resultPost, photographs: photographs, arts: arts }); -}); - -app.post("/syncBirdInfo", async (req, res) => { - const resultPost = await BirdPost.find({ - latinName: req.body.postName, - authorization: true, - }); - const photographs = await Pic.find({ - art: "photography", - plant: req.body.postName, - }); - const arts = await Art.find({ plant: req.body.postName }); - res.json({ resultPost: resultPost, photographs: photographs, arts: arts }); -}); +app.use(catalogRouter); -app.get("/numOfPlants", async (req, res) => { +app.get("/adminInfo", requireAdmin, async (req, res) => { + const users = await User.find({}, USER_PUBLIC_PROJECTION); const posts = await Post.find({ authorization: true }); - var numOfPlants = 0; - - posts.forEach((post) => { - numOfPlants++; - }); - - res.json({ numOfPlants }); -}); - -app.get("/numOfBirds", async (req, res) => { - const posts = await BirdPost.find({ authorization: true }); - var numOfPlants = 0; - - posts.forEach((post) => { - numOfPlants++; + const pics = await Pic.find(); + res.json({ + success: true, + users: users.map(toPublicUser), + posts, + username: req.authenticatedUser.username, + admin: true, + pics, }); - - res.json({ numOfPlants }); -}); - -app.get("/adminInfo", verifyToken, async (req, res) => { - if (req.user) { - const users = await User.find(); - const posts = await Post.find({ authorization: true }); - const pics = await Pic.find(); - res.json({ - success: true, - users, - posts, - username: req.user?.username, - admin: req.user?.admin, - pics, - }); - } else { - res.json({ admin: false, success: true }); - } }); -app.post("/adminDeleteUser", async (req, res) => { +app.post("/adminDeleteUser", requireAdmin, async (req, res) => { try { const userToDelete = await User.findById(req.body.id); await User.deleteOne({ _id: userToDelete._id }); + await runtime.deleteSession(userToDelete.username).catch(() => { + console.warn("Unable to remove deleted user session"); + }); res.status(200).json({ message: "User deleted successfully" }); - } catch (error) { - console.log(error); + } catch (_) { + console.warn("Unable to delete user"); res.status(500).json({ message: "Server error" }); } }); -app.post("/adminMakeAdminUser", async (req, res) => { +app.post("/adminMakeAdminUser", requireAdmin, async (req, res) => { try { var user = await User.findById(req.body.id); @@ -1240,47 +1171,13 @@ app.post("/adminMakeAdminUser", async (req, res) => { await user.save(); res.json({ success: true }); - } catch (error) { - console.log(error); - } -}); - -app.post("/getPics", async (req, res) => { - try { - const pics = await Pic.find({ plant: req.body.plant }); - - var springPics = []; - var summerPics = []; - var autumnPics = []; - var winterPics = []; - - if (Array.isArray(pics) && pics.length > 0) { - pics.forEach((pic) => { - if (pic.season == "spring") { - springPics.push(pic); - } else if (pic.season == "summer") { - summerPics.push(pic); - } else if (pic.season == "autumn") { - autumnPics.push(pic); - } else if (pic.season == "winter") { - winterPics.push(pic); - } - }); - } - - res.json({ - success: true, - springPics: springPics, - summerPics: summerPics, - autumnPics: autumnPics, - winterPics: winterPics, - }); - } catch (error) { - console.log(error); + } catch (_) { + console.warn("Unable to change user role"); + res.status(500).json({ success: false, message: "Server error" }); } }); -app.post("/makePicFeatured", async (req, res) => { +app.post("/makePicFeatured", requireAdmin, async (req, res) => { const pic = await Pic.findById(req.body.id); pic.featured = !pic.featured; await pic.save(); @@ -1305,7 +1202,7 @@ app.post("/makePicFeatured", async (req, res) => { // // res.sendFile(path.join(__dirname, "/guide.html")); // }); -app.post("/updateText", verifyToken, async function (req, res) { +app.post("/updateText", requireAuth, async function (req, res) { const editTextRequest = new EditTextRequest({ latinName: req.body.latinName, chineseName: req.body.chineseName, @@ -1325,10 +1222,10 @@ app.post("/updateText", verifyToken, async function (req, res) { await editTextRequest.save(); res.json({ success: true }); - console.log("updated plant successfully") + console.log("updated plant successfully"); }); -app.post("/birdUpdateText", verifyToken, async function (req, res) { +app.post("/birdUpdateText", requireAuth, async function (req, res) { const editTextRequest = new BirdEditTextRequest({ latinName: req.body.latinName, chineseName: req.body.chineseName, @@ -1345,33 +1242,24 @@ app.post("/birdUpdateText", verifyToken, async function (req, res) { editor: req.body.editor, dbType: "bird", - appearance:req.body.appearance, - songs:req.body.songs, - diet:req.body.diet, - habitat:req.body.habitat, - migration:req.body.migration, - breeding:req.body.breeding, - - - juvChar:req.body.juvChar, - subChar:req.body.subChar, - mAdultChar:req.body.madultChar, - fAdultChar:req.body.fadultChar + appearance: req.body.appearance, + songs: req.body.songs, + diet: req.body.diet, + habitat: req.body.habitat, + migration: req.body.migration, + breeding: req.body.breeding, + + juvChar: req.body.juvChar, + subChar: req.body.subChar, + mAdultChar: req.body.madultChar, + fAdultChar: req.body.fadultChar, }); await editTextRequest.save(); res.json({ success: true }); }); -app.get("/adminAuth", verifyToken, async function (req, res) { - var admin; - - if (req.user?.admin) { - admin = req.user?.admin; - } else { - admin = null; - } - +app.get("/adminAuth", requireAdmin, async function (req, res) { const plantAuthPosts = await EditTextRequest.find(); const birdAuthPosts = await BirdEditTextRequest.find(); const authPosts = plantAuthPosts.concat(birdAuthPosts); @@ -1384,14 +1272,14 @@ app.get("/adminAuth", verifyToken, async function (req, res) { res.json({ success: true, - admin: admin, + admin: true, authPosts, newAuthPosts, newCreationEntries, }); }); -app.put("/handleBirdEditDecision", verifyToken, async function (req, res) { +app.put("/handleBirdEditDecision", requireAdmin, async function (req, res) { try { // await BirdEditTextRequest.findByIdAndDelete("6864f3e21f4a1cd7556aabc1") // await EditTextRequest.findByIdAndDelete("6864f3e21f4a1cd7556aabc1") @@ -1413,7 +1301,6 @@ app.put("/handleBirdEditDecision", verifyToken, async function (req, res) { } // Update the post first const postToEdit = await BirdPost.findOneAndUpdate( - { latinName: originalLatin }, { $set: { @@ -1435,7 +1322,7 @@ app.put("/handleBirdEditDecision", verifyToken, async function (req, res) { habitat: request.habitat, migration: request.migration, breeding: request.breeding, - + juvChar: request.juvChar, subChar: request.subChar, mAdultChar: request.mAdultChar, @@ -1472,13 +1359,18 @@ app.put("/handleBirdEditDecision", verifyToken, async function (req, res) { // Move and rename file await fs.rename(oldPath, newFullPath); + await moveStoredMediaDerivatives( + pic.path, + newRelativePath, + newFullPath, + ); // Update database record pic.plant = newLatin; pic.path = newRelativePath; await pic.save(); - } catch (error) { - console.error(`Error processing pic ${pic._id}:`, error); + } catch (_) { + console.warn("Unable to rename related picture"); } } @@ -1500,47 +1392,45 @@ app.put("/handleBirdEditDecision", verifyToken, async function (req, res) { // Move and rename file await fs.rename(oldPath, newFullPath); + await moveStoredMediaDerivatives( + art.path, + newRelativePath, + newFullPath, + ); // Update database record art.plant = newLatin; art.path = newRelativePath; await art.save(); - } catch (error) { - console.error(`Error processing art ${art._id}:`, error); + } catch (_) { + console.warn("Unable to rename related artwork"); } } await BirdEditTextRequest.deleteOne({ _id: request._id }); return res.json({ success: true, message: "request accepted" }); - } catch (error) { - console.error("Error in handleEditDecision:", error); + } catch (_) { + console.warn("Unable to review bird edit request"); return res.status(500).json({ success: false, message: "Internal server error", - error: error.message, }); } }); -app.put("/handleEditDecision", verifyToken, async function (req, res) { +app.put("/handleEditDecision", requireAdmin, async function (req, res) { try { const request = await EditTextRequest.findById(req.body.id); - + if (!request) { return res .status(404) .json({ success: false, message: "Request not found" }); } - console.log(request); - const originalLatin = request.originalLatin; const newLatin = request.latinName; - console.log("latins:") - console.log(originalLatin) - console.log(newLatin) - if (!req.body.decision) { await EditTextRequest.deleteOne({ _id: request._id }); return res.json({ success: true, message: "request denied" }); @@ -1570,17 +1460,12 @@ app.put("/handleEditDecision", verifyToken, async function (req, res) { }, ); - console.log("sending edit request") - // console.log("finished sending edit request") - if (!postToEdit) { return res .status(404) .json({ success: false, message: "Post not found" }); } - - // Handle pics const pics = await Pic.find({ plant: originalLatin }); for (const pic of pics) { @@ -1599,13 +1484,18 @@ app.put("/handleEditDecision", verifyToken, async function (req, res) { // Move and rename file await fs.rename(oldPath, newFullPath); + await moveStoredMediaDerivatives( + pic.path, + newRelativePath, + newFullPath, + ); // Update database record pic.plant = newLatin; pic.path = newRelativePath; await pic.save(); - } catch (error) { - console.error(`Error processing pic ${pic._id}:`, error); + } catch (_) { + console.warn("Unable to rename related picture"); } } @@ -1627,32 +1517,36 @@ app.put("/handleEditDecision", verifyToken, async function (req, res) { // Move and rename file await fs.rename(oldPath, newFullPath); + await moveStoredMediaDerivatives( + art.path, + newRelativePath, + newFullPath, + ); // Update database record art.plant = newLatin; art.path = newRelativePath; await art.save(); - } catch (error) { - console.error(`Error processing art ${art._id}:`, error); + } catch (_) { + console.warn("Unable to rename related artwork"); } } await EditTextRequest.deleteOne({ _id: request._id }); return res.json({ success: true, message: "request accepted" }); - } catch (error) { - console.error("Error in handleEditDecision:", error); + } catch (_) { + console.warn("Unable to review plant edit request"); return res.status(500).json({ success: false, message: "Internal server error", - error: error.message, }); } }); app.post( "/uploadFeatureSingle", - verifyToken, - upload, + requireAdmin, + uploadWithCleanup, async function (req, res) { const plant = req.body.plant.substring(1); const temp = await Pic.findOne({ path: req.body.path }); @@ -1674,8 +1568,8 @@ app.post( app.post( "/uploadFeatureArtSingle", - verifyToken, - upload, + requireAdmin, + uploadWithCleanup, async function (req, res) { const plant = req.body.plant.substring(1); const temp = await Art.findOne({ path: req.body.path }); @@ -1695,100 +1589,72 @@ app.post( }, ); -app.get("/uploadHome", upload, async (req, res) => { - +app.get("/uploadHome", uploadWithCleanup, async (req, res) => { const entries = await FeatureHome.find(); res.json({ success: true, entries }); }); -app.post("/unFeatureHome", upload, async (req, res) => { - try { - // 使用 _id 来精确删除特定的 feature - await FeatureHome.deleteOne({ _id: req.body.id }); - const entries = await FeatureHome.find(); - res.json({ success: true, entries }); - } catch (error) { - console.error("Error in unFeatureHome:", error); - res.status(500).json({ success: false, message: error.message }); - } -}); +app.post( + "/unFeatureHome", + requireAdmin, + uploadWithCleanup, + async (req, res) => { + try { + // 使用 _id 来精确删除特定的 feature + await FeatureHome.deleteOne({ _id: req.body.id }); + const entries = await FeatureHome.find(); + res.json({ success: true, entries }); + } catch (_) { + console.warn("Unable to remove featured content"); + res.status(500).json({ + success: false, + message: "Unable to remove featured content", + }); + } + }, +); -app.get("/uploadCreation", upload, async (req, res) => { +app.get("/uploadCreation", uploadWithCleanup, async (req, res) => { const temp = await creationBottom.find({ auth: true }); res.json({ temp, success: true }); }); -app.post("/unFeatureCreation", upload, async (req, res) => { - try { - const art = await creationBottom.findOne({ _id: req.body.temp }); - const artPath = art.art; - const picPath = art.pic; - await Promise.all([ - fs.unlink(path.join(__dirname, "public", artPath)), - fs.unlink(path.join(__dirname, "public", picPath)), - ]); - await creationBottom.deleteOne({ _id: req.body.temp }); - const temp = await creationBottom.find({ auth: true }); - res.json({ success: true, temp }); - } catch (error) { - console.log(error); - res.json({ success: false, message: "plant not deleted" }); - } -}); - -app.get("/getDb2Pic", async (req, res) => { - const pics = await Pic.aggregate([ - { $sample: { size: 3 } }, - { $project: { path: 1, _id: 0 } }, - ]); - res.json({ success: true, pics }); -}); - -app.get("/getDb2PicBird", async (req, res) => { - const pics = await Pic.aggregate([ - { $match: {dbType: 'bird' }}, - { $sample: { size: 3 } }, - { $project: { path: 1, _id: 0} }, - ]); - res.json({ success: true, pics }); -}); - -app.get("/db2Alt", async (req, res) => { - const pic = await Pic.aggregate([ - { $sample: { size: 1 } }, - { $project: { path: 1, _id: 0 } }, - ]); - if (!pic) { - res.json({ success: false }); - } - res.json({ success: true, pic }); -}); - -app.get("/db2AltBird", async (req, res) => { - const pic = await Pic.aggregate([ - { $match: {dbType: 'bird' }}, - { $sample: { size: 1 } }, - { $project: { path: 1, _id: 0} }, - ]); - if (!pic) { - res.json({ success: false }); - } - res.json({ success: true, pic }); -}); +app.post( + "/unFeatureCreation", + requireAdmin, + uploadWithCleanup, + async (req, res) => { + try { + const art = await creationBottom.findOne({ _id: req.body.temp }); + const artPath = art.art; + const picPath = art.pic; + await Promise.all([ + removeStoredMedia(artPath), + removeStoredMedia(picPath), + ]); + await creationBottom.deleteOne({ _id: req.body.temp }); + const temp = await creationBottom.find({ auth: true }); + res.json({ success: true, temp }); + } catch (_) { + console.warn("Unable to delete creation"); + res.status(500).json({ success: false, message: "plant not deleted" }); + } + }, +); -app.post("/editPageDelete", async (req, res) => { +app.post("/editPageDelete", requireAdmin, async (req, res) => { try { const pic = await Pic.findOne({ _id: req.body.id }); - await fs.unlink(path.join(__dirname, "public", pic.path)); + await removeStoredMedia(pic.path); await Pic.deleteOne({ _id: req.body.id }); res.json({ success: true, message: "pic deleted" }); - } catch (error) { - console.log(error); - res.json({ success: false, message: "pic not deleted" }); + } catch (_) { + console.warn("Unable to delete picture"); + res.status(500).json({ success: false, message: "pic not deleted" }); } }); -app.delete("/editPageDeletePlant", async (req, res) => { +app.delete("/editPageDeletePlant", requireAdmin, async (req, res) => { try { const plant = (await Post.findOne({ _id: req.body.id })).latinName; @@ -1802,18 +1668,18 @@ app.delete("/editPageDeletePlant", async (req, res) => { await Promise.all([ ...pics.map(async (pic) => { try { - await fs.unlink(path.join(__dirname, "public", pic.path)); + await removeStoredMedia(pic.path); await Pic.deleteOne({ _id: pic._id }); - } catch (error) { - console.log("Error deleting pic:", error); + } catch (_) { + console.warn("Unable to delete related picture"); } }), ...arts.map(async (art) => { try { - await fs.unlink(path.join(__dirname, "public", art.path)); + await removeStoredMedia(art.path); await Art.deleteOne({ _id: art._id }); - } catch (error) { - console.log("Error deleting art:", error); + } catch (_) { + console.warn("Unable to delete related artwork"); } }), Post.deleteOne({ _id: req.body.id }), @@ -1823,18 +1689,28 @@ app.delete("/editPageDeletePlant", async (req, res) => { success: true, message: "plant and related data(including pics and arts) deleted", }); - } catch (error) { - console.error("Error in editPageDeletePlant:", error); + } catch (_) { + console.warn("Unable to delete plant and related media"); res.status(500).json({ success: false, message: "plant not deleted" }); } }); -app.post("/getPicsAndArts", async (req, res) => { - try { - const pics = await Pic.find({ plant: req.body.plant }); - const arts = await Art.find({ plant: req.body.plant }); - res.json({ success: true, pics, arts }); - } catch (error) { - res.status(500).json({ success: false, message: error.message }); +app.use(function (err, req, res, next) { + if (res.headersSent) { + return next(err); + } + + const uploadError = getUploadErrorResponse(err); + if (uploadError) { + return res.status(uploadError.status).json(uploadError.body); } + + console.error("Unhandled request error"); + return res.status(500).send("Something broke!"); }); + +module.exports = { app, drainImageVariantQueue, runtime }; + +if (require.main === module) { + require("./server").startServer(); +} diff --git a/client/README.md b/client/README.md index 58beeac..c74ba1e 100644 --- a/client/README.md +++ b/client/README.md @@ -1,70 +1,28 @@ -# Getting Started with Create React App +# BiphFlora client -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +This directory contains the React single-page application. It talks to the Express API through the shared helpers in `src/api/` and `src/tools/`; pages should not construct ad-hoc media URLs or duplicate request error handling. -## Available Scripts +## Local development -In the project directory, you can run: +From the repository root: -### `npm start` +```sh +npm ci +npm --prefix client ci +npm --prefix client start +``` -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in your browser. +The API base URL is read from the existing CRA variable `REACT_APP_Source_URL`. Keep local values in an ignored `.env.local` file. Search telemetry is opt-in with `REACT_APP_SEARCH_TELEMETRY_ENABLED=true`; its payload contains only a language category, result count, selection flag, and record type. -The page will reload when you make changes.\ -You may also see any lint errors in the console. +## Checks -### `npm test` +```sh +npm --prefix client test -- --watchAll=false --runInBand +npm --prefix client run build +``` -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +`npm run verify` at the repository root runs the backend tests, these frontend tests, and a production build together. -### `npm run build` +## Delivery behavior -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can't go back!** - -If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. - -You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). - -### Code Splitting - -This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) - -### Analyzing the Bundle Size - -This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) - -### Making a Progressive Web App - -This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) - -### Advanced Configuration - -This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) - -### Deployment - -This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) - -### `npm run build` fails to minify - -This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) +The client uses route-level loading for larger pages, cached catalog data for Fuse search, and lazy derived media with a bounded original-image fallback. Do not remove the fallback or change media path conventions without checking the compatibility tests and [the image delivery design](../docs/architecture/image-delivery-design.md). diff --git a/client/package-lock.json b/client/package-lock.json index 4998229..7d81b9f 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,16 +8,18 @@ "name": "client", "version": "0.1.0", "dependencies": { - "axios": "^1.7.7", + "axios": "^1.18.1", "browser-image-compression": "^2.0.2", - "cssnano": "^7.0.6", - "immutable": "^5.0.3", + "immutable": "^5.1.9", "primereact": "^10.8.4", "react": "^18.3.1", "react-dom": "^18.3.1", "react-loader-spinner": "^6.1.6", "react-player": "^3.3.3", - "react-router-dom": "^6.28.0", + "react-router-dom": "^6.30.4" + }, + "devDependencies": { + "cssnano": "^7.0.6", "react-scripts": "5.0.1" } }, @@ -25,6 +27,7 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -33,6 +36,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, "engines": { "node": ">=10" }, @@ -44,6 +48,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -56,6 +61,7 @@ "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -68,6 +74,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -76,6 +83,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", @@ -105,6 +113,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -113,6 +122,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", + "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -130,6 +140,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, "engines": { "node": ">=10" } @@ -138,6 +149,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -146,6 +158,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, "dependencies": { "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", @@ -160,6 +173,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -171,6 +185,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -182,6 +197,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.15", @@ -197,6 +213,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -205,6 +222,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", @@ -227,6 +245,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -235,6 +254,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", @@ -251,6 +271,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -259,6 +280,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -274,6 +296,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -282,6 +305,7 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -294,6 +318,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -305,6 +330,7 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, "dependencies": { "@babel/types": "^7.23.0" }, @@ -316,6 +342,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -327,6 +354,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -345,6 +373,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -356,6 +385,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -364,6 +394,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", @@ -380,6 +411,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-member-expression-to-functions": "^7.22.15", @@ -396,6 +428,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -407,6 +440,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -418,6 +452,7 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -429,6 +464,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -437,6 +473,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -445,6 +482,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -453,6 +491,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", @@ -466,6 +505,7 @@ "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/traverse": "^7.23.2", @@ -479,6 +519,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -492,6 +533,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -503,6 +545,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -517,6 +560,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -533,6 +577,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5" @@ -549,6 +594,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -564,6 +610,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.3.tgz", "integrity": "sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -583,6 +630,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -599,6 +647,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -615,6 +664,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -632,6 +682,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -647,6 +698,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, "engines": { "node": ">=6.9.0" }, @@ -658,6 +710,7 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -669,6 +722,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -680,6 +734,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -691,6 +746,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -705,6 +761,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -719,6 +776,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -730,6 +788,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -741,6 +800,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -755,6 +815,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -769,6 +830,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -783,6 +845,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -794,6 +857,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -805,6 +869,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -819,6 +884,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -830,6 +896,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -841,6 +908,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -852,6 +920,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -863,6 +932,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -874,6 +944,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -885,6 +956,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -899,6 +971,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -913,6 +986,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -927,6 +1001,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -942,6 +1017,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -956,6 +1032,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", @@ -973,6 +1050,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -989,6 +1067,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1003,6 +1082,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1017,6 +1097,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1032,6 +1113,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -1048,6 +1130,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", @@ -1070,6 +1153,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/template": "^7.22.15" @@ -1085,6 +1169,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1099,6 +1184,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1114,6 +1200,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1128,6 +1215,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1143,6 +1231,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1158,6 +1247,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1173,6 +1263,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-flow": "^7.23.3" @@ -1188,6 +1279,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1202,6 +1294,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-function-name": "^7.23.0", @@ -1218,6 +1311,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1233,6 +1327,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1247,6 +1342,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1262,6 +1358,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1276,6 +1373,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" @@ -1291,6 +1389,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", @@ -1307,6 +1406,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", @@ -1324,6 +1424,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" @@ -1339,6 +1440,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1354,6 +1456,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1368,6 +1471,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1383,6 +1487,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1398,6 +1503,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", @@ -1416,6 +1522,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20" @@ -1431,6 +1538,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1446,6 +1554,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -1462,6 +1571,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1476,6 +1586,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1491,6 +1602,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -1508,6 +1620,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1522,6 +1635,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1536,6 +1650,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1550,6 +1665,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -1568,6 +1684,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.22.5" }, @@ -1582,6 +1699,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -1597,6 +1715,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.2" @@ -1612,6 +1731,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1626,6 +1746,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz", "integrity": "sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==", + "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -1645,6 +1766,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -1653,6 +1775,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1667,6 +1790,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" @@ -1682,6 +1806,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1696,6 +1821,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1710,6 +1836,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1724,6 +1851,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -1741,6 +1869,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1755,6 +1884,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1770,6 +1900,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1785,6 +1916,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1800,6 +1932,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", @@ -1893,6 +2026,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -1901,6 +2035,7 @@ "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -1914,6 +2049,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -1933,6 +2069,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -1950,12 +2087,14 @@ "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1967,6 +2106,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1980,6 +2120,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.3", @@ -2000,6 +2141,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -2012,17 +2154,20 @@ "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, "node_modules/@csstools/normalize.css": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==", + "dev": true }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "dev": true, "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" @@ -2042,6 +2187,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dev": true, "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2061,6 +2207,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2079,6 +2226,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2097,6 +2245,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dev": true, "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2116,6 +2265,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dev": true, "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -2135,6 +2285,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2153,6 +2304,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2171,6 +2323,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dev": true, "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2190,6 +2343,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2204,6 +2358,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2222,6 +2377,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2240,6 +2396,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2258,6 +2415,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "dev": true, "engines": { "node": "^12 || ^14 || >=16" }, @@ -2273,6 +2431,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "dev": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -2284,31 +2443,11 @@ "postcss-selector-parser": "^6.0.10" } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -2323,6 +2462,7 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2331,6 +2471,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2352,12 +2493,14 @@ "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.23.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -2372,6 +2515,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -2383,6 +2527,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -2394,6 +2539,7 @@ "version": "8.54.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2402,6 +2548,7 @@ "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", @@ -2415,6 +2562,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, "engines": { "node": ">=12.22" }, @@ -2426,12 +2574,14 @@ "node_modules/@humanwhocodes/object-schema": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -2447,6 +2597,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "engines": { "node": ">=6" } @@ -2455,6 +2606,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2467,6 +2619,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -2478,6 +2631,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -2492,6 +2646,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -2503,6 +2658,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, "engines": { "node": ">=8" } @@ -2511,6 +2667,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -2527,6 +2684,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -2541,6 +2699,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2556,6 +2715,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2566,12 +2726,14 @@ "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2580,6 +2742,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -2591,6 +2754,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, "dependencies": { "@jest/console": "^27.5.1", "@jest/reporters": "^27.5.1", @@ -2637,6 +2801,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -2651,6 +2816,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2666,6 +2832,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2676,12 +2843,14 @@ "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2690,6 +2859,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -2701,6 +2871,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", @@ -2715,6 +2886,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", @@ -2731,6 +2903,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", @@ -2744,6 +2917,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.5.1", @@ -2787,6 +2961,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -2801,6 +2976,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2816,6 +2992,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2826,12 +3003,14 @@ "node_modules/@jest/reporters/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2840,6 +3019,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2848,6 +3028,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -2859,6 +3040,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, "dependencies": { "@sinclair/typebox": "^0.24.1" }, @@ -2870,6 +3052,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", @@ -2883,6 +3066,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2891,6 +3075,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", @@ -2905,6 +3090,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, "dependencies": { "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", @@ -2919,6 +3105,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", @@ -2944,6 +3131,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -2958,6 +3146,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2973,6 +3162,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2983,17 +3173,20 @@ "node_modules/@jest/transform/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@jest/transform/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==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3002,6 +3195,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3010,6 +3204,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3021,6 +3216,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -3036,6 +3232,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3050,6 +3247,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3065,6 +3263,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3075,12 +3274,14 @@ "node_modules/@jest/types/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3089,6 +3290,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3100,6 +3302,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3113,6 +3316,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -3121,6 +3325,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -3129,6 +3334,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3137,12 +3343,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3151,7 +3359,8 @@ "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true }, "node_modules/@mux/mux-data-google-ima": { "version": "0.2.8", @@ -3225,6 +3434,7 @@ "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, "dependencies": { "eslint-scope": "5.1.1" } @@ -3233,6 +3443,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -3245,6 +3456,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -3253,6 +3465,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3265,6 +3478,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -3273,6 +3487,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3285,6 +3500,7 @@ "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "dev": true, "dependencies": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -3331,9 +3547,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", - "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -3343,6 +3559,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -3365,6 +3582,7 @@ "version": "11.2.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -3384,6 +3602,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -3396,6 +3615,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -3411,22 +3631,26 @@ "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true }, "node_modules/@rushstack/eslint-patch": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==" + "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==", + "dev": true }, "node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, "dependencies": { "type-detect": "4.0.8" } @@ -3435,6 +3659,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" } @@ -3443,6 +3668,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -3454,6 +3680,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "dev": true, "engines": { "node": ">=10" }, @@ -3466,6 +3693,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "dev": true, "engines": { "node": ">=10" }, @@ -3478,6 +3706,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "dev": true, "engines": { "node": ">=10" }, @@ -3490,6 +3719,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -3502,6 +3732,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "dev": true, "engines": { "node": ">=10" }, @@ -3514,6 +3745,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "dev": true, "engines": { "node": ">=10" }, @@ -3526,6 +3758,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "dev": true, "engines": { "node": ">=10" }, @@ -3538,6 +3771,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -3550,6 +3784,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dev": true, "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", @@ -3572,6 +3807,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dev": true, "dependencies": { "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", @@ -3589,6 +3825,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dev": true, "dependencies": { "@babel/types": "^7.12.6" }, @@ -3604,6 +3841,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@svgr/babel-preset": "^5.5.0", @@ -3622,6 +3860,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dev": true, "dependencies": { "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", @@ -3639,6 +3878,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/plugin-transform-react-constant-elements": "^7.12.1", @@ -3667,6 +3907,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, "engines": { "node": ">= 6" } @@ -3675,6 +3916,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, "engines": { "node": ">=10.13.0" } @@ -3683,6 +3925,7 @@ "version": "7.20.4", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -3695,6 +3938,7 @@ "version": "7.6.7", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -3703,6 +3947,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -3712,6 +3957,7 @@ "version": "7.20.4", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -3720,6 +3966,7 @@ "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3729,6 +3976,7 @@ "version": "3.5.13", "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3737,6 +3985,7 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3745,6 +3994,7 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", + "dev": true, "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -3754,6 +4004,7 @@ "version": "8.44.7", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", + "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3762,12 +4013,14 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3779,6 +4032,7 @@ "version": "4.17.41", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3790,6 +4044,7 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3797,17 +4052,20 @@ "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true }, "node_modules/@types/http-proxy": { "version": "1.17.14", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3815,12 +4073,14 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -3829,6 +4089,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } @@ -3836,22 +4097,26 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true }, "node_modules/@types/node": { "version": "20.9.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -3860,6 +4125,7 @@ "version": "1.3.9", "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3867,12 +4133,14 @@ "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==" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true }, "node_modules/@types/prettier": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.10", @@ -3882,17 +4150,20 @@ "node_modules/@types/q": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", - "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "dev": true }, "node_modules/@types/qs": { "version": "6.9.10", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true }, "node_modules/@types/react": { "version": "18.2.37", @@ -3917,6 +4188,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3924,7 +4196,8 @@ "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true }, "node_modules/@types/scheduler": { "version": "0.16.6", @@ -3934,12 +4207,14 @@ "node_modules/@types/semver": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==" + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "dev": true }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -3949,6 +4224,7 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, "dependencies": { "@types/express": "*" } @@ -3957,6 +4233,7 @@ "version": "1.15.5", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -3967,6 +4244,7 @@ "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3974,23 +4252,20 @@ "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" - }, - "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true }, "node_modules/@types/trusted-types": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", - "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==" + "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", + "dev": true }, "node_modules/@types/ws": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -3999,6 +4274,7 @@ "version": "16.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -4006,12 +4282,14 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -4045,6 +4323,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "dev": true, "dependencies": { "@typescript-eslint/utils": "5.62.0" }, @@ -4063,6 +4342,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4089,6 +4369,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -4105,6 +4386,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -4131,6 +4413,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4143,6 +4426,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -4169,6 +4453,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -4194,6 +4479,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -4206,6 +4492,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -4214,6 +4501,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -4229,7 +4517,8 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "node_modules/@vimeo/player": { "version": "2.29.0", @@ -4245,6 +4534,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -4255,24 +4545,28 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", @@ -4284,12 +4578,14 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -4302,6 +4598,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -4311,6 +4608,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -4320,12 +4618,14 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -4342,6 +4642,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -4355,6 +4656,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -4367,6 +4669,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -4381,6 +4684,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -4391,23 +4695,27 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -4420,6 +4728,7 @@ "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -4431,6 +4740,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -4440,6 +4750,7 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -4451,6 +4762,7 @@ "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -4460,6 +4772,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -4468,6 +4781,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -4476,6 +4790,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -4484,6 +4799,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -4507,6 +4823,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4522,6 +4839,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -4538,6 +4856,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4553,6 +4872,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -4560,12 +4880,14 @@ "node_modules/ajv/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -4580,6 +4902,7 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, "engines": [ "node >= 0.8.0" ], @@ -4591,6 +4914,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -4599,6 +4923,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -4609,12 +4934,14 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4626,12 +4953,14 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -4640,6 +4969,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "dependencies": { "dequal": "^2.0.3" } @@ -4648,6 +4978,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -4659,12 +4990,14 @@ "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4683,6 +5016,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { "node": ">=8" } @@ -4691,6 +5025,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4709,6 +5044,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4726,6 +5062,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4743,6 +5080,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4761,6 +5099,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4773,6 +5112,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -4792,22 +5132,26 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, "dependencies": { "has-symbols": "^1.0.3" } @@ -4821,6 +5165,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, "engines": { "node": ">= 4.0.0" } @@ -4829,6 +5174,7 @@ "version": "10.4.16", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -4865,6 +5211,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -4876,29 +5223,34 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "dev": true, "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -4908,6 +5260,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, "dependencies": { "dequal": "^2.0.3" } @@ -4916,6 +5269,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, "dependencies": { "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", @@ -4937,6 +5291,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4951,6 +5306,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4966,6 +5322,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4976,12 +5333,14 @@ "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -4990,6 +5349,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5001,6 +5361,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -5019,6 +5380,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -5036,6 +5398,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -5051,6 +5414,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -5065,6 +5429,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -5079,6 +5444,7 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "dev": true, "peerDependencies": { "@babel/core": "^7.1.0" } @@ -5087,6 +5453,7 @@ "version": "0.4.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.4.3", @@ -5100,6 +5467,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -5108,6 +5476,7 @@ "version": "0.8.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3", "core-js-compat": "^3.33.1" @@ -5120,6 +5489,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3" }, @@ -5130,12 +5500,14 @@ "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "dev": true }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -5158,6 +5530,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" @@ -5173,6 +5546,7 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "dev": true, "dependencies": { "@babel/core": "^7.16.0", "@babel/plugin-proposal-class-properties": "^7.16.0", @@ -5195,12 +5569,14 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true }, "node_modules/bcp-47": { "version": "2.1.0", @@ -5245,6 +5621,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "dev": true, "dependencies": { "bluebird": "^3.7.2", "check-types": "^11.2.3", @@ -5260,6 +5637,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, "engines": { "node": "*" } @@ -5268,6 +5646,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, "engines": { "node": ">=8" } @@ -5275,12 +5654,14 @@ "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -5305,6 +5686,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -5314,6 +5696,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -5323,6 +5706,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -5335,12 +5719,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -5351,12 +5737,14 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5366,6 +5754,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -5386,12 +5775,14 @@ "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true }, "node_modules/browserslist": { "version": "4.24.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -5424,6 +5815,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, "dependencies": { "node-int64": "^0.4.0" } @@ -5431,12 +5823,14 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, "engines": { "node": ">=6" }, @@ -5448,6 +5842,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -5456,6 +5851,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -5471,10 +5867,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "dev": true, "engines": { "node": ">=6" } @@ -5483,6 +5893,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -5492,6 +5903,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "engines": { "node": ">=10" }, @@ -5503,6 +5915,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, "engines": { "node": ">= 6" } @@ -5520,6 +5933,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -5531,6 +5945,7 @@ "version": "1.0.30001718", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -5551,6 +5966,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true, "engines": { "node": ">=4" } @@ -5577,6 +5993,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -5590,6 +6007,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, "engines": { "node": ">=10" } @@ -5597,12 +6015,14 @@ "node_modules/check-types": { "version": "11.2.3", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "dev": true }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "funding": [ { "type": "individual", @@ -5629,6 +6049,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5640,6 +6061,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, "engines": { "node": ">=6.0" } @@ -5648,6 +6070,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -5661,12 +6084,14 @@ "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true }, "node_modules/clean-css": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, "dependencies": { "source-map": "~0.6.0" }, @@ -5678,6 +6103,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5686,6 +6112,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -5702,6 +6129,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -5711,6 +6139,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -5729,12 +6158,14 @@ "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -5742,17 +6173,20 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -5769,6 +6203,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, "engines": { "node": ">= 12" } @@ -5776,12 +6211,14 @@ "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, "engines": { "node": ">=4.0.0" } @@ -5789,12 +6226,14 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -5806,6 +6245,7 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -5823,6 +6263,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -5830,27 +6271,32 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, "engines": { "node": ">=0.8" } @@ -5859,6 +6305,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -5870,6 +6317,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -5878,12 +6326,14 @@ "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -5892,12 +6342,14 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true }, "node_modules/core-js": { "version": "3.33.2", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", + "dev": true, "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5908,6 +6360,7 @@ "version": "3.33.2", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "dev": true, "dependencies": { "browserslist": "^4.22.1" }, @@ -5920,6 +6373,7 @@ "version": "3.33.2", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", + "dev": true, "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5929,12 +6383,14 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -5950,6 +6406,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5963,6 +6420,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, "engines": { "node": ">=8" } @@ -5971,6 +6429,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -5997,6 +6456,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" @@ -6009,6 +6469,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -6026,6 +6487,7 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.21", @@ -6051,6 +6513,7 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dev": true, "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", @@ -6088,6 +6551,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -6103,6 +6567,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -6114,6 +6579,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, "engines": { "node": ">= 10" } @@ -6122,6 +6588,7 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "dev": true, "engines": { "node": "^10 || ^12 || >=14" }, @@ -6133,6 +6600,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -6145,6 +6613,7 @@ "version": "5.1.15", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, "dependencies": { "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", @@ -6165,6 +6634,7 @@ "version": "5.2.14", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", @@ -6207,6 +6677,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6217,12 +6688,14 @@ "node_modules/css-minimizer-webpack-plugin/node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true }, "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-calc": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" @@ -6235,6 +6708,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -6252,6 +6726,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -6267,6 +6742,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6278,6 +6754,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6289,6 +6766,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6300,6 +6778,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6311,6 +6790,7 @@ "version": "5.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" @@ -6326,6 +6806,7 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -6343,6 +6824,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6357,6 +6839,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", @@ -6373,6 +6856,7 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", @@ -6389,6 +6873,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -6403,6 +6888,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -6414,6 +6900,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6428,6 +6915,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6442,6 +6930,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6456,6 +6945,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6470,6 +6960,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6484,6 +6975,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -6499,6 +6991,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -6514,6 +7007,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6528,6 +7022,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -6543,6 +7038,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" @@ -6558,6 +7054,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6572,6 +7069,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" @@ -6587,6 +7085,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -6601,6 +7100,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -6619,6 +7119,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6627,6 +7128,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" @@ -6642,6 +7144,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -6662,6 +7165,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, @@ -6676,6 +7180,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -6690,7 +7195,8 @@ "node_modules/css-select-base-adapter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true }, "node_modules/css-to-react-native": { "version": "3.2.0", @@ -6707,6 +7213,7 @@ "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, "dependencies": { "mdn-data": "2.0.4", "source-map": "^0.6.1" @@ -6719,6 +7226,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6727,6 +7235,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, "engines": { "node": ">= 6" }, @@ -6738,6 +7247,7 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.0.tgz", "integrity": "sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -6753,6 +7263,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -6764,6 +7275,7 @@ "version": "7.0.7", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.7.tgz", "integrity": "sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==", + "dev": true, "license": "MIT", "dependencies": { "cssnano-preset-default": "^7.0.7", @@ -6784,6 +7296,7 @@ "version": "7.0.7", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.7.tgz", "integrity": "sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -6828,6 +7341,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -6840,6 +7354,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -6852,6 +7367,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, "dependencies": { "css-tree": "^1.1.2" }, @@ -6863,6 +7379,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -6874,12 +7391,14 @@ "node_modules/csso/node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true }, "node_modules/csso/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6887,12 +7406,14 @@ "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true }, "node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, "dependencies": { "cssom": "~0.3.6" }, @@ -6903,7 +7424,8 @@ "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true }, "node_modules/csstype": { "version": "3.1.3", @@ -6920,7 +7442,8 @@ "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true }, "node_modules/dash-video-element": { "version": "0.2.0", @@ -6955,6 +7478,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -6983,22 +7507,26 @@ "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -7007,6 +7535,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, "dependencies": { "execa": "^5.0.0" }, @@ -7018,6 +7547,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -7035,6 +7565,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, "engines": { "node": ">=8" } @@ -7043,6 +7574,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -7067,6 +7599,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -7076,6 +7609,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "engines": { "node": ">=6" } @@ -7084,6 +7618,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8", @@ -7094,6 +7629,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, "engines": { "node": ">=8" } @@ -7101,12 +7637,14 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true }, "node_modules/detect-port-alt": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dev": true, "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" @@ -7123,6 +7661,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -7130,17 +7669,20 @@ "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -7149,6 +7691,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -7159,17 +7702,20 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7181,6 +7727,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -7192,6 +7739,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, "dependencies": { "utila": "~0.4" } @@ -7210,6 +7758,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -7223,6 +7772,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, "funding": [ { "type": "github", @@ -7234,6 +7784,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -7245,6 +7796,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, "engines": { "node": ">=8" } @@ -7253,6 +7805,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, "dependencies": { "domelementtype": "^2.2.0" }, @@ -7267,6 +7820,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -7280,6 +7834,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -7289,6 +7844,7 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, "engines": { "node": ">=10" } @@ -7296,22 +7852,40 @@ "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "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/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" @@ -7327,12 +7901,14 @@ "version": "1.5.157", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.157.tgz", "integrity": "sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==", + "dev": true, "license": "ISC" }, "node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, "engines": { "node": ">=10" }, @@ -7343,12 +7919,14 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, "engines": { "node": ">= 4" } @@ -7357,6 +7935,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -7365,6 +7944,7 @@ "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -7378,6 +7958,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -7386,6 +7967,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -7394,6 +7976,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, "dependencies": { "stackframe": "^1.3.4" } @@ -7402,6 +7985,7 @@ "version": "1.22.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", @@ -7453,16 +8037,14 @@ "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "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", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -7480,6 +8062,7 @@ "version": "1.0.15", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", @@ -7500,16 +8083,31 @@ "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "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": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -7519,6 +8117,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" } @@ -7527,6 +8126,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -7543,6 +8143,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7551,12 +8152,14 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -7565,6 +8168,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -7585,6 +8189,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -7594,6 +8199,7 @@ "version": "8.54.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7648,6 +8254,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "dev": true, "dependencies": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", @@ -7675,6 +8282,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -7685,6 +8293,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -7693,6 +8302,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, "dependencies": { "debug": "^3.2.7" }, @@ -7709,6 +8319,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -7717,6 +8328,7 @@ "version": "8.0.3", "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "dev": true, "dependencies": { "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" @@ -7734,6 +8346,7 @@ "version": "2.29.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "dev": true, "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -7764,6 +8377,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -7772,6 +8386,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -7783,6 +8398,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -7791,6 +8407,7 @@ "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "dev": true, "dependencies": { "@typescript-eslint/experimental-utils": "^5.0.0" }, @@ -7814,6 +8431,7 @@ "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dev": true, "dependencies": { "@babel/runtime": "^7.23.2", "aria-query": "^5.3.0", @@ -7843,6 +8461,7 @@ "version": "7.33.2", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", @@ -7872,6 +8491,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, "engines": { "node": ">=10" }, @@ -7883,6 +8503,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -7894,6 +8515,7 @@ "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7910,6 +8532,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -7918,6 +8541,7 @@ "version": "5.11.1", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.58.0" }, @@ -7933,6 +8557,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7948,6 +8573,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7959,6 +8585,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, "dependencies": { "@types/eslint": "^7.29.0 || ^8.4.1", "jest-worker": "^28.0.2", @@ -7982,6 +8609,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -7997,6 +8625,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -8008,6 +8637,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -8016,6 +8646,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8029,6 +8660,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -8047,6 +8679,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8061,6 +8694,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8074,12 +8708,14 @@ "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8095,6 +8731,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8105,12 +8742,14 @@ "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/eslint/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==", + "dev": true, "engines": { "node": ">=10" }, @@ -8122,6 +8761,7 @@ "version": "13.23.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -8136,6 +8776,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -8144,6 +8785,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -8155,6 +8797,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8166,6 +8809,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -8177,6 +8821,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -8193,6 +8838,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8205,6 +8851,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -8216,6 +8863,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -8227,6 +8875,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -8234,12 +8883,14 @@ "node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8248,6 +8899,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -8255,12 +8907,14 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "engines": { "node": ">=0.8.x" } @@ -8269,6 +8923,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -8291,6 +8946,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -8299,6 +8955,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -8313,6 +8970,7 @@ "version": "4.21.1", "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -8354,12 +9012,14 @@ "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -8368,6 +9028,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -8377,6 +9038,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8385,12 +9047,14 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true, "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -8402,6 +9066,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -8417,6 +9082,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -8427,12 +9093,14 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -8441,6 +9109,7 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -8452,6 +9121,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, "dependencies": { "bser": "2.1.1" } @@ -8460,6 +9130,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -8471,6 +9142,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -8490,6 +9162,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, "dependencies": { "minimatch": "^5.0.1" } @@ -8498,6 +9171,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8506,6 +9180,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8517,6 +9192,7 @@ "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -8525,6 +9201,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -8537,6 +9214,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -8555,6 +9233,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -8564,6 +9243,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -8573,12 +9253,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -8595,6 +9277,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8610,6 +9293,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -8622,12 +9306,13 @@ "node_modules/flatted": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -8648,6 +9333,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -8656,6 +9342,7 @@ "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -8694,6 +9381,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8708,6 +9396,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8723,6 +9412,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8733,12 +9423,14 @@ "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -8754,6 +9446,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -8768,6 +9461,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -8776,6 +9470,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -8793,6 +9488,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8804,6 +9500,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, "engines": { "node": ">=6" } @@ -8812,6 +9509,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8825,6 +9523,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -8833,6 +9532,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, "engines": { "node": "*" }, @@ -8845,6 +9545,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -8853,6 +9554,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -8865,17 +9567,20 @@ "node_modules/fs-monkey": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -8897,6 +9602,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -8914,6 +9620,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8922,6 +9629,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -8930,21 +9638,27 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "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", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "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" @@ -8956,20 +9670,36 @@ "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, "engines": { "node": ">=8.0.0" } }, + "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/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { "node": ">=10" }, @@ -8981,6 +9711,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -8996,6 +9727,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9015,6 +9747,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -9026,12 +9759,14 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, "dependencies": { "global-prefix": "^3.0.0" }, @@ -9043,6 +9778,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -9055,12 +9791,14 @@ "node_modules/global-prefix/node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -9072,6 +9810,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } @@ -9080,6 +9819,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -9094,6 +9834,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -9110,11 +9851,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "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" @@ -9123,17 +9865,20 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, "dependencies": { "duplexer": "^0.1.2" }, @@ -9147,17 +9892,20 @@ "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9166,6 +9914,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -9174,6 +9923,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -9186,6 +9936,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -9194,9 +9945,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "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" }, @@ -9205,11 +9957,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "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.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9219,9 +9972,10 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -9233,6 +9987,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, "bin": { "he": "bin/he" } @@ -9258,6 +10013,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true, "engines": { "node": ">= 6.0.0" } @@ -9266,6 +10022,7 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9276,12 +10033,14 @@ "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9295,12 +10054,14 @@ "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -9309,6 +10070,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -9335,12 +10097,14 @@ "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -9361,6 +10125,7 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -9383,6 +10148,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -9400,12 +10166,14 @@ "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -9421,12 +10189,14 @@ "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9440,6 +10210,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -9453,6 +10224,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -9488,6 +10260,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, "engines": { "node": ">=10.17.0" } @@ -9496,6 +10269,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9507,6 +10281,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -9517,12 +10292,14 @@ "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, "dependencies": { "harmony-reflect": "^1.4.6" }, @@ -9534,6 +10311,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, "engines": { "node": ">= 4" } @@ -9548,21 +10326,23 @@ "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" } }, "node_modules/immutable": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", - "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9578,6 +10358,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -9586,6 +10367,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -9619,6 +10401,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -9627,6 +10410,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9635,17 +10419,20 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, "dependencies": { "get-intrinsic": "^1.2.2", "hasown": "^2.0.0", @@ -9659,6 +10446,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, "engines": { "node": ">= 10" } @@ -9691,6 +10479,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -9703,12 +10492,14 @@ "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==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9723,6 +10514,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -9734,6 +10526,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -9745,6 +10538,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9760,6 +10554,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -9771,6 +10566,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -9782,6 +10578,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9806,6 +10603,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "bin": { "is-docker": "cli.js" }, @@ -9820,6 +10618,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9828,6 +10627,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -9839,6 +10639,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -9847,6 +10648,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, "engines": { "node": ">=6" } @@ -9855,6 +10657,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9869,6 +10672,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -9880,6 +10684,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9887,12 +10692,14 @@ "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -9904,6 +10711,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -9913,6 +10721,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9927,6 +10736,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9935,6 +10745,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -9943,6 +10754,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, "engines": { "node": ">=10" }, @@ -9953,12 +10765,14 @@ "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9974,6 +10788,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9982,6 +10797,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "dev": true, "engines": { "node": ">=6" } @@ -9990,6 +10806,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9998,6 +10815,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -10009,6 +10827,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "engines": { "node": ">=8" }, @@ -10020,6 +10839,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10034,6 +10854,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -10048,6 +10869,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, "dependencies": { "which-typed-array": "^1.1.11" }, @@ -10061,12 +10883,14 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10075,6 +10899,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -10086,6 +10911,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -10098,6 +10924,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -10108,12 +10935,14 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, "engines": { "node": ">=8" } @@ -10122,6 +10951,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -10137,6 +10967,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -10145,6 +10976,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -10158,6 +10990,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10166,6 +10999,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, "dependencies": { "semver": "^7.5.3" }, @@ -10180,6 +11014,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10191,6 +11026,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -10204,6 +11040,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10212,6 +11049,7 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -10224,6 +11062,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -10236,6 +11075,7 @@ "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -10253,6 +11093,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10267,6 +11108,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10282,6 +11124,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10292,12 +11135,14 @@ "node_modules/jake/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10306,6 +11151,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10317,6 +11163,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -10341,6 +11188,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "execa": "^5.0.0", @@ -10354,6 +11202,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -10383,6 +11232,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10397,6 +11247,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10412,6 +11263,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10422,12 +11274,14 @@ "node_modules/jest-circus/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10436,6 +11290,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10447,6 +11302,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, "dependencies": { "@jest/core": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -10480,6 +11336,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10494,6 +11351,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10509,6 +11367,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10519,12 +11378,14 @@ "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10533,6 +11394,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10544,6 +11406,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, "dependencies": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", @@ -10586,6 +11449,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10600,6 +11464,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10615,6 +11480,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10625,12 +11491,14 @@ "node_modules/jest-config/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10639,6 +11507,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10650,6 +11519,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.5.1", @@ -10664,6 +11534,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10678,6 +11549,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10693,6 +11565,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10703,12 +11576,14 @@ "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10717,6 +11592,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10728,6 +11604,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -10739,6 +11616,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -10754,6 +11632,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10768,6 +11647,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10783,6 +11663,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10793,12 +11674,14 @@ "node_modules/jest-each/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10807,6 +11690,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10818,6 +11702,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -10835,6 +11720,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -10851,6 +11737,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -10859,6 +11746,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -10884,6 +11772,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/source-map": "^27.5.1", @@ -10911,6 +11800,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10925,6 +11815,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10940,6 +11831,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10950,12 +11842,14 @@ "node_modules/jest-jasmine2/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-jasmine2/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -10964,6 +11858,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10975,6 +11870,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, "dependencies": { "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" @@ -10987,6 +11883,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^27.5.1", @@ -11001,6 +11898,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11015,6 +11913,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11030,6 +11929,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11040,12 +11940,14 @@ "node_modules/jest-matcher-utils/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11054,6 +11956,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11065,6 +11968,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -11084,6 +11988,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11098,6 +12003,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11113,6 +12019,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11123,12 +12030,14 @@ "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11137,6 +12046,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11148,6 +12058,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -11160,6 +12071,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, "engines": { "node": ">=6" }, @@ -11176,6 +12088,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -11184,6 +12097,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -11204,6 +12118,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "jest-regex-util": "^27.5.1", @@ -11217,6 +12132,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11231,6 +12147,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11246,6 +12163,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11256,12 +12174,14 @@ "node_modules/jest-resolve/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11270,6 +12190,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11281,6 +12202,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, "dependencies": { "@jest/console": "^27.5.1", "@jest/environment": "^27.5.1", @@ -11312,6 +12234,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11326,6 +12249,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11341,6 +12265,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11351,12 +12276,14 @@ "node_modules/jest-runner/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11365,6 +12292,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11376,6 +12304,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -11408,6 +12337,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11422,6 +12352,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11437,6 +12368,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11447,12 +12379,14 @@ "node_modules/jest-runtime/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11461,6 +12395,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11472,6 +12407,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -11484,6 +12420,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", @@ -11516,6 +12453,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11530,6 +12468,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11545,6 +12484,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11555,12 +12495,14 @@ "node_modules/jest-snapshot/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11569,6 +12511,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11580,6 +12523,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -11596,6 +12540,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11610,6 +12555,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11625,6 +12571,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11635,12 +12582,14 @@ "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11649,6 +12598,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11660,6 +12610,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", @@ -11676,6 +12627,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11690,6 +12642,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11705,6 +12658,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11715,12 +12669,14 @@ "node_modules/jest-validate/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11729,6 +12685,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11740,6 +12697,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dev": true, "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -11760,6 +12718,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -11776,6 +12735,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -11784,6 +12744,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, "dependencies": { "@jest/console": "^28.1.3", "@jest/types": "^28.1.3", @@ -11798,6 +12759,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -11814,6 +12776,7 @@ "version": "17.0.31", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -11822,6 +12785,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11836,6 +12800,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11851,6 +12816,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11861,12 +12827,14 @@ "node_modules/jest-watch-typeahead/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-watch-typeahead/node_modules/emittery": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, "engines": { "node": ">=12" }, @@ -11878,6 +12846,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -11886,6 +12855,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^28.1.3", @@ -11905,6 +12875,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -11913,6 +12884,7 @@ "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } @@ -11921,6 +12893,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -11937,6 +12910,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, "dependencies": { "@jest/test-result": "^28.1.3", "@jest/types": "^28.1.3", @@ -11955,6 +12929,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -11967,6 +12942,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11978,6 +12954,7 @@ "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -11992,6 +12969,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -12002,12 +12980,14 @@ "node_modules/jest-watch-typeahead/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true }, "node_modules/jest-watch-typeahead/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, "engines": { "node": ">=12" }, @@ -12019,6 +12999,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, "dependencies": { "char-regex": "^2.0.0", "strip-ansi": "^7.0.1" @@ -12034,6 +13015,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "dev": true, "engines": { "node": ">=12.20" } @@ -12042,6 +13024,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12056,6 +13039,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { "node": ">=12" }, @@ -12067,6 +13051,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12078,6 +13063,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, "dependencies": { "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", @@ -12095,6 +13081,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12109,6 +13096,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12124,6 +13112,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12134,12 +13123,14 @@ "node_modules/jest-watcher/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -12148,6 +13139,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12159,6 +13151,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -12172,6 +13165,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -12180,6 +13174,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12194,6 +13189,7 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -12207,6 +13203,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -12219,6 +13216,7 @@ "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -12264,6 +13262,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -12274,32 +13273,38 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "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==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -12311,6 +13316,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -12322,6 +13328,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dev": true, "dependencies": { "esprima": "1.2.2", "static-eval": "2.0.2", @@ -12332,6 +13339,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -12344,6 +13352,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12352,6 +13361,7 @@ "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -12366,6 +13376,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -12374,6 +13385,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12382,6 +13394,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, "engines": { "node": ">=6" } @@ -12390,6 +13403,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, "engines": { "node": ">= 8" } @@ -12397,12 +13411,14 @@ "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -12414,6 +13430,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -12423,6 +13440,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, "engines": { "node": ">=6" } @@ -12431,6 +13449,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -12452,6 +13471,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, "engines": { "node": ">=10" } @@ -12459,12 +13479,14 @@ "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==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, "engines": { "node": ">=6.11.5" } @@ -12473,6 +13495,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -12495,6 +13518,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -12508,32 +13532,38 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", @@ -12550,6 +13580,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -12558,6 +13589,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -12566,6 +13598,7 @@ "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, "dependencies": { "sourcemap-codec": "^1.4.8" } @@ -12574,6 +13607,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -12588,6 +13622,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -12596,14 +13631,25 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, "dependencies": { "tmpl": "1.0.5" } }, + "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/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true }, "node_modules/media-chrome": { "version": "4.14.0", @@ -12624,6 +13670,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -12632,6 +13679,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, "dependencies": { "fs-monkey": "^1.0.4" }, @@ -12642,12 +13690,14 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -12656,6 +13706,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -12664,6 +13715,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -12677,6 +13729,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -12708,6 +13761,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -12716,6 +13770,7 @@ "version": "2.7.6", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, "dependencies": { "schema-utils": "^4.0.0" }, @@ -12734,6 +13789,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -12749,6 +13805,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -12760,6 +13817,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -12777,12 +13835,14 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12794,6 +13854,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12802,6 +13863,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -12818,6 +13880,7 @@ "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -12836,6 +13899,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -12843,15 +13907,17 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12868,17 +13934,20 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -12886,12 +13955,14 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -12901,6 +13972,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, "engines": { "node": ">= 6.13.0" } @@ -12908,18 +13980,21 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12928,6 +14003,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12936,6 +14012,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, "engines": { "node": ">=10" }, @@ -12947,6 +14024,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -12958,6 +14036,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -12968,7 +14047,8 @@ "node_modules/nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true }, "node_modules/object-assign": { "version": "4.1.1", @@ -12982,6 +14062,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, "engines": { "node": ">= 6" } @@ -12990,6 +14071,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12998,6 +14080,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -13006,6 +14089,7 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -13023,6 +14107,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -13036,6 +14121,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -13052,6 +14138,7 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dev": true, "dependencies": { "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.2", @@ -13070,6 +14157,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -13081,6 +14169,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, "dependencies": { "define-properties": "^1.2.0", "es-abstract": "^1.22.1" @@ -13093,6 +14182,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -13108,12 +14198,14 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -13126,6 +14218,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -13134,6 +14227,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -13142,6 +14236,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -13156,6 +14251,7 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -13172,6 +14268,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -13187,12 +14284,14 @@ "node_modules/optionator/node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -13207,6 +14306,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -13221,6 +14321,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -13233,6 +14334,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -13241,6 +14343,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -13250,6 +14353,7 @@ "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==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -13261,6 +14365,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13277,12 +14382,14 @@ "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -13291,6 +14398,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -13306,6 +14414,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -13314,6 +14423,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13322,6 +14432,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -13329,12 +14440,14 @@ "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==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "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==", + "dev": true, "engines": { "node": ">=8" } @@ -13342,18 +14455,21 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -13365,6 +14481,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13373,6 +14490,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "engines": { "node": ">= 6" } @@ -13381,6 +14499,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -13392,6 +14511,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -13404,6 +14524,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -13415,6 +14536,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -13429,6 +14551,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -13440,6 +14563,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -13451,6 +14575,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -13462,6 +14587,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -13474,6 +14600,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -13488,6 +14615,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -13499,6 +14627,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, "engines": { "node": ">=4" } @@ -13529,9 +14658,10 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -13548,7 +14678,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -13560,6 +14690,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -13578,6 +14709,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "dev": true, "engines": { "node": ">=8" }, @@ -13590,6 +14722,7 @@ "version": "10.1.1", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^7.0.0", @@ -13606,6 +14739,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13619,6 +14753,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13633,6 +14768,7 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13651,6 +14787,7 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13669,6 +14806,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13687,6 +14825,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.3.tgz", "integrity": "sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -13705,6 +14844,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.5.tgz", "integrity": "sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -13721,6 +14861,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13739,6 +14880,7 @@ "version": "12.1.11", "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13757,6 +14899,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -13775,6 +14918,7 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -13793,6 +14937,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", + "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^7.1.0" @@ -13808,6 +14953,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13821,6 +14967,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", + "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -13833,6 +14980,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -13845,6 +14993,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", + "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -13857,6 +15006,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dev": true, "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -13876,6 +15026,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13890,6 +15041,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "dev": true, "peerDependencies": { "postcss": "^8.1.4" } @@ -13898,6 +15050,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -13912,6 +15065,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -13926,6 +15080,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, "peerDependencies": { "postcss": "^8.1.0" } @@ -13934,6 +15089,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "dev": true, "engines": { "node": "^12 || ^14 || >=16" }, @@ -13949,6 +15105,7 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -13967,6 +15124,7 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -13983,6 +15141,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, "peerDependencies": { "postcss": "^8.0.0" } @@ -13991,6 +15150,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -14009,6 +15169,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dev": true, "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -14028,6 +15189,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -14056,6 +15218,7 @@ "version": "2.3.4", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, "engines": { "node": ">= 14" } @@ -14064,6 +15227,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -14085,6 +15249,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, "engines": { "node": "^12 || ^14 || >=16" }, @@ -14096,6 +15261,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, "engines": { "node": ">=10.0.0" }, @@ -14107,6 +15273,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", @@ -14123,6 +15290,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.5.tgz", "integrity": "sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -14141,6 +15309,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14154,6 +15323,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14169,6 +15339,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "dev": true, "license": "MIT", "dependencies": { "colord": "^2.9.3", @@ -14186,6 +15357,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.3.tgz", "integrity": "sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -14203,6 +15375,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14219,6 +15392,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14232,6 +15406,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -14243,6 +15418,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -14259,6 +15435,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -14273,6 +15450,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, "dependencies": { "icss-utils": "^5.0.0" }, @@ -14287,6 +15465,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -14305,6 +15484,7 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dev": true, "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -14324,6 +15504,7 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "dev": true, "dependencies": { "@csstools/normalize.css": "*", "postcss-browser-comments": "^4", @@ -14341,6 +15522,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", + "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -14353,6 +15535,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14368,6 +15551,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14383,6 +15567,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14398,6 +15583,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14413,6 +15599,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14428,6 +15615,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.3.tgz", "integrity": "sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -14444,6 +15632,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14459,6 +15648,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14474,6 +15664,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "dev": true, "funding": [ { "type": "kofi", @@ -14495,6 +15686,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "dev": true, "license": "MIT", "dependencies": { "cssnano-utils": "^5.0.1", @@ -14511,6 +15703,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14529,6 +15722,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, "peerDependencies": { "postcss": "^8" } @@ -14537,6 +15731,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -14555,6 +15750,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "dev": true, "dependencies": { "@csstools/postcss-cascade-layers": "^1.1.1", "@csstools/postcss-color-function": "^1.1.1", @@ -14621,6 +15817,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14639,6 +15836,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.3.tgz", "integrity": "sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -14655,6 +15853,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -14670,6 +15869,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, "peerDependencies": { "postcss": "^8.0.3" } @@ -14678,6 +15878,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -14696,6 +15897,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14708,6 +15910,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.2.tgz", "integrity": "sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==", + "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", @@ -14724,6 +15927,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10" @@ -14733,6 +15937,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -14749,6 +15954,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, "license": "MIT", "dependencies": { "mdn-data": "2.0.30", @@ -14762,6 +15968,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, "license": "MIT", "dependencies": { "css-tree": "~2.2.0" @@ -14775,6 +15982,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, "license": "MIT", "dependencies": { "mdn-data": "2.0.28", @@ -14789,12 +15997,14 @@ "version": "2.0.28", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, "license": "CC0-1.0" }, "node_modules/postcss-svgo/node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -14809,6 +16019,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -14824,6 +16035,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -14838,6 +16050,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -14850,12 +16063,14 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, "license": "CC0-1.0" }, "node_modules/postcss-svgo/node_modules/svgo": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", @@ -14881,6 +16096,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^7.1.0" @@ -14896,6 +16112,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -14914,6 +16131,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -14922,6 +16140,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, "engines": { "node": ">=6" }, @@ -14933,6 +16152,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -14942,6 +16162,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -14955,6 +16176,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -14988,12 +16210,14 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, "dependencies": { "asap": "~2.0.6" } @@ -15002,6 +16226,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -15029,6 +16254,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -15041,24 +16267,31 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, "engines": { "node": ">= 0.10" } }, "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==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -15067,6 +16300,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" @@ -15076,6 +16310,7 @@ "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" @@ -15090,12 +16325,14 @@ "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -15115,6 +16352,7 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, "dependencies": { "performance-now": "^2.1.0" } @@ -15123,6 +16361,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -15131,6 +16370,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -15139,6 +16379,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -15154,6 +16395,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -15163,6 +16405,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -15187,6 +16430,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "dev": true, "dependencies": { "core-js": "^3.19.2", "object-assign": "^4.1.1", @@ -15202,12 +16446,14 @@ "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -15242,6 +16488,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -15256,6 +16503,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15271,6 +16519,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -15281,12 +16530,14 @@ "node_modules/react-dev-utils/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/react-dev-utils/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==", + "dev": true, "engines": { "node": ">=10" }, @@ -15298,6 +16549,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -15306,6 +16558,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, "engines": { "node": ">= 12.13.0" } @@ -15314,6 +16567,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15337,12 +16591,14 @@ "node_modules/react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", + "dev": true }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/react-loader-spinner": { "version": "6.1.6", @@ -15361,11 +16617,74 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-loader-spinner/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/react-loader-spinner/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/react-loader-spinner/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/react-loader-spinner/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "node_modules/react-loader-spinner/node_modules/styled-components": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.4.4.tgz", + "integrity": "sha512-tJk5CmKUPMDoTsZQ8m0hHInBk9HFKUPSusqmbBuefDX+yUbMBWea2Ob/wdXFyHW8XZqXkprJscysAdKeGWNqlA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "stylis": "4.3.6" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "css-to-react-native": ">= 3.2.0", + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-native": ">= 0.68.0" + }, + "peerDependenciesMeta": { + "css-to-react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-loader-spinner/node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, "node_modules/react-player": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/react-player/-/react-player-3.3.3.tgz", @@ -15393,17 +16712,18 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { - "version": "6.30.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", - "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0" + "@remix-run/router": "1.23.3" }, "engines": { "node": ">=14.0.0" @@ -15413,13 +16733,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", - "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.0", - "react-router": "6.30.1" + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" }, "engines": { "node": ">=14.0.0" @@ -15433,6 +16753,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "dev": true, "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -15521,6 +16842,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -15529,6 +16851,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15542,6 +16865,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -15553,6 +16877,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, "dependencies": { "minimatch": "^3.0.5" }, @@ -15564,6 +16889,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -15582,12 +16908,14 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, "dependencies": { "regenerate": "^1.4.2" }, @@ -15604,6 +16932,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } @@ -15611,12 +16940,14 @@ "node_modules/regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -15633,6 +16964,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -15649,6 +16981,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, "dependencies": { "jsesc": "~0.5.0" }, @@ -15660,6 +16993,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" } @@ -15668,6 +17002,7 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -15676,6 +17011,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -15688,6 +17024,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15696,6 +17033,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15703,12 +17041,14 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -15725,6 +17065,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -15736,6 +17077,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } @@ -15744,6 +17086,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dev": true, "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -15770,33 +17113,14 @@ "node_modules/resolve-url-loader/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==" - }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15805,6 +17129,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, "engines": { "node": ">=10" } @@ -15813,6 +17138,7 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, "engines": { "node": ">= 4" } @@ -15821,6 +17147,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -15830,6 +17157,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -15844,6 +17172,7 @@ "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, "license": "MIT", "bin": { "rollup": "dist/bin/rollup" @@ -15860,6 +17189,7 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -15874,6 +17204,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -15882,6 +17213,7 @@ "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -15895,6 +17227,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -15903,6 +17236,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15914,6 +17248,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -15936,6 +17271,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -15953,6 +17289,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -15972,6 +17309,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -15984,17 +17322,20 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/sanitize.css": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "dev": true }, "node_modules/sass-loader": { "version": "12.6.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -16031,12 +17372,14 @@ "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -16057,6 +17400,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16073,12 +17417,14 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -16091,6 +17437,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -16105,6 +17452,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -16115,12 +17463,14 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -16145,6 +17495,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -16154,18 +17505,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, "license": "MIT" }, "node_modules/send/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==", + "dev": true, "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -16174,6 +17528,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -16191,6 +17546,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -16199,6 +17555,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -16207,6 +17564,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -16220,22 +17578,26 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -16244,6 +17606,7 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", @@ -16259,6 +17622,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -16268,6 +17632,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -16285,6 +17650,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, "dependencies": { "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", @@ -16298,18 +17664,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, "license": "ISC" }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -16321,6 +17683,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -16329,6 +17692,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16337,6 +17701,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -16354,17 +17719,20 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -16373,6 +17741,7 @@ "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -16382,12 +17751,14 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, "engines": { "node": ">= 8" } @@ -16396,6 +17767,7 @@ "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==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -16405,6 +17777,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "dev": true, "dependencies": { "abab": "^2.0.5", "iconv-lite": "^0.6.3", @@ -16425,6 +17798,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -16434,6 +17808,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -16442,12 +17817,14 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -16463,6 +17840,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -16481,18 +17859,21 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -16504,6 +17885,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, "engines": { "node": ">=8" } @@ -16511,12 +17893,14 @@ "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true }, "node_modules/static-eval": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dev": true, "dependencies": { "escodegen": "^1.8.1" } @@ -16525,6 +17909,7 @@ "version": "1.14.3", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -16546,6 +17931,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -16553,12 +17939,14 @@ "node_modules/static-eval/node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/static-eval/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -16571,6 +17959,7 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -16587,6 +17976,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -16595,6 +17985,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -16604,6 +17995,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, "dependencies": { "prelude-ls": "~1.1.2" }, @@ -16615,6 +18007,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -16624,6 +18017,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -16632,6 +18026,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -16643,12 +18038,14 @@ "node_modules/string-natural-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "dev": true }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16661,12 +18058,14 @@ "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16686,6 +18085,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16702,6 +18102,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16715,6 +18116,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16728,6 +18130,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -16741,6 +18144,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16752,6 +18156,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, "engines": { "node": ">=8" } @@ -16760,6 +18165,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, "engines": { "node": ">=10" } @@ -16768,6 +18174,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, "engines": { "node": ">=6" } @@ -16776,6 +18183,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { "node": ">=8" }, @@ -16787,6 +18195,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "dev": true, "engines": { "node": ">= 12.13.0" }, @@ -16798,38 +18207,11 @@ "webpack": "^5.0.0" } }, - "node_modules/styled-components": { - "version": "6.1.18", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.18.tgz", - "integrity": "sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw==", - "license": "MIT", - "dependencies": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", - "css-to-react-native": "3.2.0", - "csstype": "3.1.3", - "postcss": "8.4.49", - "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - } - }, "node_modules/stylehacks": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.5.tgz", "integrity": "sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==", + "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.24.5", @@ -16846,6 +18228,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -16855,16 +18238,11 @@ "node": ">=4" } }, - "node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" - }, "node_modules/sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -16886,6 +18264,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, "engines": { "node": ">= 6" } @@ -16894,6 +18273,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -16919,6 +18299,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -16930,6 +18311,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -16942,6 +18324,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -16950,6 +18333,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -16961,6 +18345,7 @@ "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==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -16971,13 +18356,15 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true }, "node_modules/svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -17004,6 +18391,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -17015,6 +18403,7 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, "engines": { "node": ">= 6" }, @@ -17026,6 +18415,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -17035,6 +18425,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -17043,12 +18434,14 @@ "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true }, "node_modules/svgo/node_modules/nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, "dependencies": { "boolbase": "~1.0.0" } @@ -17056,12 +18449,14 @@ "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true }, "node_modules/tailwindcss": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -17098,6 +18493,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -17106,6 +18502,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, "engines": { "node": ">=8" } @@ -17114,6 +18511,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", @@ -17131,6 +18529,7 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, "engines": { "node": ">=10" }, @@ -17142,6 +18541,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -17157,6 +18557,7 @@ "version": "5.36.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -17175,6 +18576,7 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", @@ -17208,12 +18610,14 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -17226,12 +18630,14 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -17240,6 +18646,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -17250,12 +18657,14 @@ "node_modules/throat": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "dev": true }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true }, "node_modules/tiktok-video-element": { "version": "0.1.1", @@ -17266,12 +18675,14 @@ "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { "node": ">=4" } @@ -17280,6 +18691,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -17292,6 +18704,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.6" @@ -17301,6 +18714,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -17315,6 +18729,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, "engines": { "node": ">= 4.0.0" } @@ -17323,6 +18738,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, "dependencies": { "punycode": "^2.1.1" }, @@ -17333,17 +18749,20 @@ "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -17355,6 +18774,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -17366,6 +18786,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { "node": ">=4" } @@ -17373,12 +18794,14 @@ "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, "dependencies": { "tslib": "^1.8.1" }, @@ -17392,7 +18815,8 @@ "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/twitch-video-element": { "version": "0.1.4", @@ -17404,6 +18828,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -17415,6 +18840,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, "engines": { "node": ">=4" } @@ -17423,6 +18849,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { "node": ">=10" }, @@ -17434,6 +18861,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17446,6 +18874,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -17459,6 +18888,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -17476,6 +18906,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -17494,6 +18925,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -17507,6 +18939,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "dependencies": { "is-typedarray": "^1.0.0" } @@ -17515,6 +18948,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -17554,6 +18988,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -17567,17 +19002,20 @@ "node_modules/underscore": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, "engines": { "node": ">=4" } @@ -17586,6 +19024,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -17598,6 +19037,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, "engines": { "node": ">=4" } @@ -17606,6 +19046,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, "engines": { "node": ">=4" } @@ -17614,6 +19055,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -17625,6 +19067,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -17633,6 +19076,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -17640,12 +19084,14 @@ "node_modules/unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "dev": true }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, "engines": { "node": ">=4", "yarn": "*" @@ -17655,6 +19101,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -17685,6 +19132,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -17693,6 +19141,7 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -17701,12 +19150,14 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", @@ -17720,12 +19171,14 @@ "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -17734,6 +19187,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -17748,6 +19202,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", @@ -17760,12 +19215,14 @@ "node_modules/v8-to-istanbul/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==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -17784,6 +19241,7 @@ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, "dependencies": { "browser-process-hrtime": "^1.0.0" } @@ -17792,6 +19250,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -17803,6 +19262,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, "dependencies": { "makeerror": "1.0.12" } @@ -17811,6 +19271,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -17824,6 +19285,7 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -17841,6 +19303,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, "engines": { "node": ">=10.4" } @@ -17849,6 +19312,7 @@ "version": "5.95.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", @@ -17895,6 +19359,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", @@ -17918,6 +19383,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17933,6 +19399,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -17944,6 +19411,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -17962,6 +19430,7 @@ "version": "4.15.1", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -18020,6 +19489,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -18035,6 +19505,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -18046,6 +19517,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -18064,6 +19536,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -18085,6 +19558,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "dev": true, "dependencies": { "tapable": "^2.0.0", "webpack-sources": "^2.2.0" @@ -18100,6 +19574,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18108,6 +19583,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, "dependencies": { "source-list-map": "^2.0.1", "source-map": "^0.6.1" @@ -18120,6 +19596,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, "engines": { "node": ">=10.13.0" } @@ -18128,6 +19605,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -18140,6 +19618,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -18148,6 +19627,7 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -18161,6 +19641,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -18169,6 +19650,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, "dependencies": { "iconv-lite": "0.4.24" } @@ -18177,6 +19659,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -18187,17 +19670,20 @@ "node_modules/whatwg-fetch": { "version": "3.6.19", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", + "dev": true }, "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true }, "node_modules/whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, "dependencies": { "lodash": "^4.7.0", "tr46": "^2.1.0", @@ -18211,6 +19697,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -18225,6 +19712,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -18240,6 +19728,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, "dependencies": { "function.prototype.name": "^1.1.5", "has-tostringtag": "^1.0.0", @@ -18265,6 +19754,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, "dependencies": { "is-map": "^2.0.1", "is-set": "^2.0.1", @@ -18279,6 +19769,7 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.4", @@ -18296,7 +19787,8 @@ "node_modules/which/node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/wistia-video-element": { "version": "1.3.4", @@ -18311,6 +19803,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18319,6 +19812,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "dev": true, "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" @@ -18328,6 +19822,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "dev": true, "dependencies": { "workbox-core": "6.6.0" } @@ -18336,6 +19831,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "dev": true, "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -18383,6 +19879,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -18399,6 +19896,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -18414,6 +19912,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -18428,6 +19927,7 @@ "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, "dependencies": { "whatwg-url": "^7.0.0" }, @@ -18439,6 +19939,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -18446,12 +19947,14 @@ "node_modules/workbox-build/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/workbox-build/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -18463,6 +19966,7 @@ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", "deprecated": "workbox-background-sync@6.6.0", + "dev": true, "dependencies": { "workbox-core": "6.6.0" } @@ -18470,12 +19974,14 @@ "node_modules/workbox-core": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "dev": true }, "node_modules/workbox-expiration": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "dev": true, "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" @@ -18485,6 +19991,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "dev": true, "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", @@ -18496,6 +20003,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "dev": true, "dependencies": { "workbox-core": "6.6.0" } @@ -18504,6 +20012,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "dev": true, "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0", @@ -18514,6 +20023,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "dev": true, "dependencies": { "workbox-core": "6.6.0" } @@ -18522,6 +20032,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "dev": true, "dependencies": { "workbox-cacheable-response": "6.6.0", "workbox-core": "6.6.0", @@ -18535,6 +20046,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "dev": true, "dependencies": { "workbox-core": "6.6.0" } @@ -18543,6 +20055,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "dev": true, "dependencies": { "workbox-core": "6.6.0" } @@ -18551,6 +20064,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "dev": true, "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0" @@ -18559,12 +20073,14 @@ "node_modules/workbox-sw": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "dev": true }, "node_modules/workbox-webpack-plugin": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "dev": true, "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", @@ -18583,6 +20099,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18591,6 +20108,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -18600,6 +20118,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "dev": true, "dependencies": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.6.0" @@ -18609,6 +20128,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -18625,6 +20145,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18639,6 +20160,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -18649,17 +20171,20 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -18671,6 +20196,7 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.3.0" @@ -18691,17 +20217,20 @@ "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "engines": { "node": ">=10" } @@ -18709,12 +20238,14 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, "engines": { "node": ">= 6" } @@ -18723,6 +20254,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -18740,6 +20272,7 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, "engines": { "node": ">=10" } @@ -18748,6 +20281,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, diff --git a/client/package.json b/client/package.json index 7014171..babfe43 100644 --- a/client/package.json +++ b/client/package.json @@ -3,17 +3,15 @@ "version": "0.1.0", "private": true, "dependencies": { - "axios": "^1.7.7", + "axios": "^1.18.1", "browser-image-compression": "^2.0.2", - "cssnano": "^7.0.6", - "immutable": "^5.0.3", + "immutable": "^5.1.9", "primereact": "^10.8.4", "react": "^18.3.1", "react-dom": "^18.3.1", "react-loader-spinner": "^6.1.6", "react-player": "^3.3.3", - "react-router-dom": "^6.28.0", - "react-scripts": "5.0.1" + "react-router-dom": "^6.30.4" }, "scripts": { "start": "react-scripts start", @@ -22,6 +20,16 @@ "eject": "react-scripts eject", "deploy": "serve -s build" }, + "devDependencies": { + "cssnano": "^7.0.6", + "react-scripts": "5.0.1" + }, + "overrides": { + "@babel/runtime": "7.26.10", + "nanoid": "3.3.8", + "postcss": "8.5.10", + "styled-components": "6.4.4" + }, "eslintConfig": { "extends": [ "react-app", diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml deleted file mode 100644 index b45a7a2..0000000 --- a/client/pnpm-lock.yaml +++ /dev/null @@ -1,16485 +0,0 @@ -lockfileVersion: "9.0" - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - .: - dependencies: - axios: - specifier: ^1.7.7 - version: 1.7.7 - browser-image-compression: - specifier: ^2.0.2 - version: 2.0.2 - cssnano: - specifier: ^7.0.6 - version: 7.0.6(postcss@8.4.49) - immutable: - specifier: ^5.0.3 - version: 5.0.3 - primereact: - specifier: ^10.8.4 - version: 10.8.4(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - react-loader-spinner: - specifier: ^6.1.6 - version: 6.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router-dom: - specifier: ^6.28.0 - version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-scripts: - specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(type-fest@0.21.3)(typescript@4.9.5) - -packages: - "@alloc/quick-lru@5.2.0": - resolution: - { - integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, - } - engines: { node: ">=10" } - - "@ampproject/remapping@2.3.0": - resolution: - { - integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, - } - engines: { node: ">=6.0.0" } - - "@apideck/better-ajv-errors@0.3.6": - resolution: - { - integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, - } - engines: { node: ">=10" } - peerDependencies: - ajv: ">=8" - - "@babel/code-frame@7.26.2": - resolution: - { - integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/compat-data@7.26.2": - resolution: - { - integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==, - } - engines: { node: ">=6.9.0" } - - "@babel/core@7.26.0": - resolution: - { - integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==, - } - engines: { node: ">=6.9.0" } - - "@babel/eslint-parser@7.25.9": - resolution: - { - integrity: sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || >=14.0.0 } - peerDependencies: - "@babel/core": ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - - "@babel/generator@7.26.2": - resolution: - { - integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-annotate-as-pure@7.25.9": - resolution: - { - integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-builder-binary-assignment-operator-visitor@7.25.9": - resolution: - { - integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-compilation-targets@7.25.9": - resolution: - { - integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-create-class-features-plugin@7.25.9": - resolution: - { - integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-create-regexp-features-plugin@7.25.9": - resolution: - { - integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-define-polyfill-provider@0.6.3": - resolution: - { - integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - - "@babel/helper-member-expression-to-functions@7.25.9": - resolution: - { - integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-imports@7.25.9": - resolution: - { - integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-transforms@7.26.0": - resolution: - { - integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-optimise-call-expression@7.25.9": - resolution: - { - integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-plugin-utils@7.25.9": - resolution: - { - integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-remap-async-to-generator@7.25.9": - resolution: - { - integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-replace-supers@7.25.9": - resolution: - { - integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-simple-access@7.25.9": - resolution: - { - integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-skip-transparent-expression-wrappers@7.25.9": - resolution: - { - integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.25.9": - resolution: - { - integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.25.9": - resolution: - { - integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-option@7.25.9": - resolution: - { - integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-wrap-function@7.25.9": - resolution: - { - integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==, - } - engines: { node: ">=6.9.0" } - - "@babel/helpers@7.26.0": - resolution: - { - integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==, - } - engines: { node: ">=6.9.0" } - - "@babel/parser@7.26.2": - resolution: - { - integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==, - } - engines: { node: ">=6.0.0" } - hasBin: true - - "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9": - resolution: - { - integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9": - resolution: - { - integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9": - resolution: - { - integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9": - resolution: - { - integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.13.0 - - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9": - resolution: - { - integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-proposal-class-properties@7.18.6": - resolution: - { - integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==, - } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-proposal-decorators@7.25.9": - resolution: - { - integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-proposal-nullish-coalescing-operator@7.18.6": - resolution: - { - integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==, - } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-proposal-numeric-separator@7.18.6": - resolution: - { - integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==, - } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-proposal-optional-chaining@7.21.0": - resolution: - { - integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==, - } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-proposal-private-methods@7.18.6": - resolution: - { - integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==, - } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - resolution: - { - integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-proposal-private-property-in-object@7.21.11": - resolution: - { - integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==, - } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-async-generators@7.8.4": - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-bigint@7.8.3": - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-class-properties@7.12.13": - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-class-static-block@7.14.5": - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-decorators@7.25.9": - resolution: - { - integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-flow@7.26.0": - resolution: - { - integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-import-assertions@7.26.0": - resolution: - { - integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-import-attributes@7.26.0": - resolution: - { - integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-import-meta@7.10.4": - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-json-strings@7.8.3": - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-jsx@7.25.9": - resolution: - { - integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-logical-assignment-operators@7.10.4": - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3": - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-numeric-separator@7.10.4": - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-object-rest-spread@7.8.3": - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-optional-catch-binding@7.8.3": - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-optional-chaining@7.8.3": - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-private-property-in-object@7.14.5": - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-top-level-await@7.14.5": - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-typescript@7.25.9": - resolution: - { - integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-unicode-sets-regex@7.18.6": - resolution: - { - integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-transform-arrow-functions@7.25.9": - resolution: - { - integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-async-generator-functions@7.25.9": - resolution: - { - integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-async-to-generator@7.25.9": - resolution: - { - integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-block-scoped-functions@7.25.9": - resolution: - { - integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-block-scoping@7.25.9": - resolution: - { - integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-class-properties@7.25.9": - resolution: - { - integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-class-static-block@7.26.0": - resolution: - { - integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.12.0 - - "@babel/plugin-transform-classes@7.25.9": - resolution: - { - integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-computed-properties@7.25.9": - resolution: - { - integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-destructuring@7.25.9": - resolution: - { - integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-dotall-regex@7.25.9": - resolution: - { - integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-duplicate-keys@7.25.9": - resolution: - { - integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9": - resolution: - { - integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-transform-dynamic-import@7.25.9": - resolution: - { - integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-exponentiation-operator@7.25.9": - resolution: - { - integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-export-namespace-from@7.25.9": - resolution: - { - integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-flow-strip-types@7.25.9": - resolution: - { - integrity: sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-for-of@7.25.9": - resolution: - { - integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-function-name@7.25.9": - resolution: - { - integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-json-strings@7.25.9": - resolution: - { - integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-literals@7.25.9": - resolution: - { - integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-logical-assignment-operators@7.25.9": - resolution: - { - integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-member-expression-literals@7.25.9": - resolution: - { - integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-amd@7.25.9": - resolution: - { - integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-commonjs@7.25.9": - resolution: - { - integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-systemjs@7.25.9": - resolution: - { - integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-umd@7.25.9": - resolution: - { - integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-named-capturing-groups-regex@7.25.9": - resolution: - { - integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-transform-new-target@7.25.9": - resolution: - { - integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-nullish-coalescing-operator@7.25.9": - resolution: - { - integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-numeric-separator@7.25.9": - resolution: - { - integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-object-rest-spread@7.25.9": - resolution: - { - integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-object-super@7.25.9": - resolution: - { - integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-optional-catch-binding@7.25.9": - resolution: - { - integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-optional-chaining@7.25.9": - resolution: - { - integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-parameters@7.25.9": - resolution: - { - integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-private-methods@7.25.9": - resolution: - { - integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-private-property-in-object@7.25.9": - resolution: - { - integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-property-literals@7.25.9": - resolution: - { - integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-constant-elements@7.25.9": - resolution: - { - integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-display-name@7.25.9": - resolution: - { - integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-jsx-development@7.25.9": - resolution: - { - integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-jsx@7.25.9": - resolution: - { - integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-pure-annotations@7.25.9": - resolution: - { - integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-regenerator@7.25.9": - resolution: - { - integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-regexp-modifiers@7.26.0": - resolution: - { - integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/plugin-transform-reserved-words@7.25.9": - resolution: - { - integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-runtime@7.25.9": - resolution: - { - integrity: sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-shorthand-properties@7.25.9": - resolution: - { - integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-spread@7.25.9": - resolution: - { - integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-sticky-regex@7.25.9": - resolution: - { - integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-template-literals@7.25.9": - resolution: - { - integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-typeof-symbol@7.25.9": - resolution: - { - integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-typescript@7.25.9": - resolution: - { - integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-escapes@7.25.9": - resolution: - { - integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-property-regex@7.25.9": - resolution: - { - integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-regex@7.25.9": - resolution: - { - integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-sets-regex@7.25.9": - resolution: - { - integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/preset-env@7.26.0": - resolution: - { - integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/preset-modules@0.1.6-no-external-plugins": - resolution: - { - integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - "@babel/preset-react@7.25.9": - resolution: - { - integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/preset-typescript@7.26.0": - resolution: - { - integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/runtime@7.26.0": - resolution: - { - integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==, - } - engines: { node: ">=6.9.0" } - - "@babel/template@7.25.9": - resolution: - { - integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==, - } - engines: { node: ">=6.9.0" } - - "@babel/traverse@7.25.9": - resolution: - { - integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.26.0": - resolution: - { - integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==, - } - engines: { node: ">=6.9.0" } - - "@bcoe/v8-coverage@0.2.3": - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } - - "@csstools/normalize.css@12.1.1": - resolution: - { - integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==, - } - - "@csstools/postcss-cascade-layers@1.1.1": - resolution: - { - integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-color-function@1.1.1": - resolution: - { - integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-font-format-keywords@1.0.1": - resolution: - { - integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-hwb-function@1.0.2": - resolution: - { - integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-ic-unit@1.0.1": - resolution: - { - integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-is-pseudo-class@2.0.7": - resolution: - { - integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-nested-calc@1.0.0": - resolution: - { - integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-normalize-display-values@1.0.1": - resolution: - { - integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-oklab-function@1.1.1": - resolution: - { - integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-progressive-custom-properties@1.3.0": - resolution: - { - integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.3 - - "@csstools/postcss-stepped-value-functions@1.0.1": - resolution: - { - integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-text-decoration-shorthand@1.0.0": - resolution: - { - integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-trigonometric-functions@1.0.2": - resolution: - { - integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==, - } - engines: { node: ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/postcss-unset-value@1.0.2": - resolution: - { - integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - "@csstools/selector-specificity@2.2.0": - resolution: - { - integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss-selector-parser: ^6.0.10 - - "@emotion/is-prop-valid@1.2.2": - resolution: - { - integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==, - } - - "@emotion/memoize@0.8.1": - resolution: - { - integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==, - } - - "@emotion/unitless@0.8.1": - resolution: - { - integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==, - } - - "@eslint-community/eslint-utils@4.4.1": - resolution: - { - integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - "@eslint-community/regexpp@4.12.1": - resolution: - { - integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - "@eslint/eslintrc@2.1.4": - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - "@eslint/js@8.57.1": - resolution: - { - integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - "@humanwhocodes/config-array@0.13.0": - resolution: - { - integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==, - } - engines: { node: ">=10.10.0" } - deprecated: Use @eslint/config-array instead - - "@humanwhocodes/module-importer@1.0.1": - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - "@humanwhocodes/object-schema@2.0.3": - resolution: - { - integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==, - } - deprecated: Use @eslint/object-schema instead - - "@isaacs/cliui@8.0.2": - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: ">=12" } - - "@istanbuljs/load-nyc-config@1.1.0": - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - } - engines: { node: ">=8" } - - "@istanbuljs/schema@0.1.3": - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: ">=8" } - - "@jest/console@27.5.1": - resolution: - { - integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/console@28.1.3": - resolution: - { - integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - "@jest/core@27.5.1": - resolution: - { - integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - "@jest/environment@27.5.1": - resolution: - { - integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/fake-timers@27.5.1": - resolution: - { - integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/globals@27.5.1": - resolution: - { - integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/reporters@27.5.1": - resolution: - { - integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - "@jest/schemas@28.1.3": - resolution: - { - integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - "@jest/source-map@27.5.1": - resolution: - { - integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/test-result@27.5.1": - resolution: - { - integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/test-result@28.1.3": - resolution: - { - integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - "@jest/test-sequencer@27.5.1": - resolution: - { - integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/transform@27.5.1": - resolution: - { - integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/types@27.5.1": - resolution: - { - integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - "@jest/types@28.1.3": - resolution: - { - integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - "@jridgewell/gen-mapping@0.3.5": - resolution: - { - integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/resolve-uri@3.1.2": - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/set-array@1.2.1": - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/source-map@0.3.6": - resolution: - { - integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, - } - - "@jridgewell/sourcemap-codec@1.5.0": - resolution: - { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, - } - - "@jridgewell/trace-mapping@0.3.25": - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, - } - - "@leichtgewicht/ip-codec@2.0.5": - resolution: - { - integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, - } - - "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - resolution: - { - integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==, - } - - "@nodelib/fs.scandir@2.1.5": - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.stat@2.0.5": - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.walk@1.2.8": - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - - "@pkgjs/parseargs@0.11.0": - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: ">=14" } - - "@pmmmwh/react-refresh-webpack-plugin@0.5.15": - resolution: - { - integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==, - } - engines: { node: ">= 10.13" } - peerDependencies: - "@types/webpack": 4.x || 5.x - react-refresh: ">=0.10.0 <1.0.0" - sockjs-client: ^1.4.0 - type-fest: ">=0.17.0 <5.0.0" - webpack: ">=4.43.0 <6.0.0" - webpack-dev-server: 3.x || 4.x || 5.x - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x - peerDependenciesMeta: - "@types/webpack": - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: - optional: true - - "@remix-run/router@1.21.0": - resolution: - { - integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==, - } - engines: { node: ">=14.0.0" } - - "@rollup/plugin-babel@5.3.1": - resolution: - { - integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, - } - engines: { node: ">= 10.0.0" } - peerDependencies: - "@babel/core": ^7.0.0 - "@types/babel__core": ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - "@types/babel__core": - optional: true - - "@rollup/plugin-node-resolve@11.2.1": - resolution: - { - integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, - } - engines: { node: ">= 10.0.0" } - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - "@rollup/plugin-replace@2.4.2": - resolution: - { - integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, - } - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - - "@rollup/pluginutils@3.1.0": - resolution: - { - integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, - } - engines: { node: ">= 8.0.0" } - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - "@rtsao/scc@1.1.0": - resolution: - { - integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, - } - - "@rushstack/eslint-patch@1.10.4": - resolution: - { - integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==, - } - - "@sinclair/typebox@0.24.51": - resolution: - { - integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==, - } - - "@sinonjs/commons@1.8.6": - resolution: - { - integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, - } - - "@sinonjs/fake-timers@8.1.0": - resolution: - { - integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==, - } - - "@surma/rollup-plugin-off-main-thread@2.2.3": - resolution: - { - integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, - } - - "@svgr/babel-plugin-add-jsx-attribute@5.4.0": - resolution: - { - integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==, - } - engines: { node: ">=10" } - - "@svgr/babel-plugin-remove-jsx-attribute@5.4.0": - resolution: - { - integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==, - } - engines: { node: ">=10" } - - "@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1": - resolution: - { - integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==, - } - engines: { node: ">=10" } - - "@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1": - resolution: - { - integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==, - } - engines: { node: ">=10" } - - "@svgr/babel-plugin-svg-dynamic-title@5.4.0": - resolution: - { - integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==, - } - engines: { node: ">=10" } - - "@svgr/babel-plugin-svg-em-dimensions@5.4.0": - resolution: - { - integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==, - } - engines: { node: ">=10" } - - "@svgr/babel-plugin-transform-react-native-svg@5.4.0": - resolution: - { - integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==, - } - engines: { node: ">=10" } - - "@svgr/babel-plugin-transform-svg-component@5.5.0": - resolution: - { - integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==, - } - engines: { node: ">=10" } - - "@svgr/babel-preset@5.5.0": - resolution: - { - integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==, - } - engines: { node: ">=10" } - - "@svgr/core@5.5.0": - resolution: - { - integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==, - } - engines: { node: ">=10" } - - "@svgr/hast-util-to-babel-ast@5.5.0": - resolution: - { - integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==, - } - engines: { node: ">=10" } - - "@svgr/plugin-jsx@5.5.0": - resolution: - { - integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==, - } - engines: { node: ">=10" } - - "@svgr/plugin-svgo@5.5.0": - resolution: - { - integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==, - } - engines: { node: ">=10" } - - "@svgr/webpack@5.5.0": - resolution: - { - integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==, - } - engines: { node: ">=10" } - - "@tootallnate/once@1.1.2": - resolution: - { - integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, - } - engines: { node: ">= 6" } - - "@trysound/sax@0.2.0": - resolution: - { - integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, - } - engines: { node: ">=10.13.0" } - - "@types/babel__core@7.20.5": - resolution: - { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, - } - - "@types/babel__generator@7.6.8": - resolution: - { - integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, - } - - "@types/babel__template@7.4.4": - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } - - "@types/babel__traverse@7.20.6": - resolution: - { - integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==, - } - - "@types/body-parser@1.19.5": - resolution: - { - integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, - } - - "@types/bonjour@3.5.13": - resolution: - { - integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==, - } - - "@types/connect-history-api-fallback@1.5.4": - resolution: - { - integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==, - } - - "@types/connect@3.4.38": - resolution: - { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, - } - - "@types/eslint-scope@3.7.7": - resolution: - { - integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, - } - - "@types/eslint@8.56.12": - resolution: - { - integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==, - } - - "@types/eslint@9.6.1": - resolution: - { - integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==, - } - - "@types/estree@0.0.39": - resolution: - { - integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, - } - - "@types/estree@1.0.6": - resolution: - { - integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, - } - - "@types/express-serve-static-core@4.19.6": - resolution: - { - integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==, - } - - "@types/express-serve-static-core@5.0.2": - resolution: - { - integrity: sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==, - } - - "@types/express@4.17.21": - resolution: - { - integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, - } - - "@types/graceful-fs@4.1.9": - resolution: - { - integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, - } - - "@types/html-minifier-terser@6.1.0": - resolution: - { - integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==, - } - - "@types/http-errors@2.0.4": - resolution: - { - integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, - } - - "@types/http-proxy@1.17.15": - resolution: - { - integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==, - } - - "@types/istanbul-lib-coverage@2.0.6": - resolution: - { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, - } - - "@types/istanbul-lib-report@3.0.3": - resolution: - { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, - } - - "@types/istanbul-reports@3.0.4": - resolution: - { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, - } - - "@types/json-schema@7.0.15": - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - - "@types/json5@0.0.29": - resolution: - { - integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, - } - - "@types/mime@1.3.5": - resolution: - { - integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, - } - - "@types/node-forge@1.3.11": - resolution: - { - integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, - } - - "@types/node@22.9.3": - resolution: - { - integrity: sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==, - } - - "@types/parse-json@4.0.2": - resolution: - { - integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, - } - - "@types/prettier@2.7.3": - resolution: - { - integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, - } - - "@types/prop-types@15.7.13": - resolution: - { - integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==, - } - - "@types/q@1.5.8": - resolution: - { - integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==, - } - - "@types/qs@6.9.17": - resolution: - { - integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==, - } - - "@types/range-parser@1.2.7": - resolution: - { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, - } - - "@types/react-transition-group@4.4.11": - resolution: - { - integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==, - } - - "@types/react@18.3.12": - resolution: - { - integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==, - } - - "@types/resolve@1.17.1": - resolution: - { - integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, - } - - "@types/retry@0.12.0": - resolution: - { - integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, - } - - "@types/semver@7.5.8": - resolution: - { - integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, - } - - "@types/send@0.17.4": - resolution: - { - integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, - } - - "@types/serve-index@1.9.4": - resolution: - { - integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==, - } - - "@types/serve-static@1.15.7": - resolution: - { - integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, - } - - "@types/sockjs@0.3.36": - resolution: - { - integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==, - } - - "@types/stack-utils@2.0.3": - resolution: - { - integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, - } - - "@types/stylis@4.2.5": - resolution: - { - integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==, - } - - "@types/trusted-types@2.0.7": - resolution: - { - integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, - } - - "@types/ws@8.5.13": - resolution: - { - integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==, - } - - "@types/yargs-parser@21.0.3": - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - } - - "@types/yargs@16.0.9": - resolution: - { - integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==, - } - - "@types/yargs@17.0.33": - resolution: - { - integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==, - } - - "@typescript-eslint/eslint-plugin@5.62.0": - resolution: - { - integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - - "@typescript-eslint/experimental-utils@5.62.0": - resolution: - { - integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - "@typescript-eslint/parser@5.62.0": - resolution: - { - integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - - "@typescript-eslint/scope-manager@5.62.0": - resolution: - { - integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - "@typescript-eslint/type-utils@5.62.0": - resolution: - { - integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: "*" - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - - "@typescript-eslint/types@5.62.0": - resolution: - { - integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - "@typescript-eslint/typescript-estree@5.62.0": - resolution: - { - integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - - "@typescript-eslint/utils@5.62.0": - resolution: - { - integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - "@typescript-eslint/visitor-keys@5.62.0": - resolution: - { - integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - "@ungap/structured-clone@1.2.0": - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - } - - "@webassemblyjs/ast@1.14.1": - resolution: - { - integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==, - } - - "@webassemblyjs/floating-point-hex-parser@1.13.2": - resolution: - { - integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==, - } - - "@webassemblyjs/helper-api-error@1.13.2": - resolution: - { - integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==, - } - - "@webassemblyjs/helper-buffer@1.14.1": - resolution: - { - integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==, - } - - "@webassemblyjs/helper-numbers@1.13.2": - resolution: - { - integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==, - } - - "@webassemblyjs/helper-wasm-bytecode@1.13.2": - resolution: - { - integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==, - } - - "@webassemblyjs/helper-wasm-section@1.14.1": - resolution: - { - integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==, - } - - "@webassemblyjs/ieee754@1.13.2": - resolution: - { - integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==, - } - - "@webassemblyjs/leb128@1.13.2": - resolution: - { - integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==, - } - - "@webassemblyjs/utf8@1.13.2": - resolution: - { - integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==, - } - - "@webassemblyjs/wasm-edit@1.14.1": - resolution: - { - integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==, - } - - "@webassemblyjs/wasm-gen@1.14.1": - resolution: - { - integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==, - } - - "@webassemblyjs/wasm-opt@1.14.1": - resolution: - { - integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==, - } - - "@webassemblyjs/wasm-parser@1.14.1": - resolution: - { - integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==, - } - - "@webassemblyjs/wast-printer@1.14.1": - resolution: - { - integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==, - } - - "@xtuc/ieee754@1.2.0": - resolution: - { - integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, - } - - "@xtuc/long@4.2.2": - resolution: - { - integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, - } - - abab@2.0.6: - resolution: - { - integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, - } - deprecated: Use your platform's native atob() and btoa() methods instead - - accepts@1.3.8: - resolution: - { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, - } - engines: { node: ">= 0.6" } - - acorn-globals@6.0.0: - resolution: - { - integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==, - } - - acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@7.2.0: - resolution: - { - integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, - } - engines: { node: ">=0.4.0" } - - acorn@7.4.1: - resolution: - { - integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - acorn@8.14.0: - resolution: - { - integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - address@1.2.2: - resolution: - { - integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==, - } - engines: { node: ">= 10.0.0" } - - adjust-sourcemap-loader@4.0.0: - resolution: - { - integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==, - } - engines: { node: ">=8.9" } - - agent-base@6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - } - engines: { node: ">= 6.0.0" } - - ajv-formats@2.1.1: - resolution: - { - integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, - } - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: - { - integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, - } - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: - { - integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==, - } - peerDependencies: - ajv: ^8.8.2 - - ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - - ajv@8.17.1: - resolution: - { - integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, - } - - ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: ">=8" } - - ansi-html-community@0.0.8: - resolution: - { - integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==, - } - engines: { "0": node >= 0.8.0 } - hasBin: true - - ansi-html@0.0.9: - resolution: - { - integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==, - } - engines: { "0": node >= 0.8.0 } - hasBin: true - - ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - ansi-regex@6.1.0: - resolution: - { - integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, - } - engines: { node: ">=12" } - - ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: ">=4" } - - ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - - ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: ">=10" } - - ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: ">=12" } - - any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } - - anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - - arg@5.0.2: - resolution: - { - integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, - } - - argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } - - argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - aria-query@5.3.2: - resolution: - { - integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, - } - engines: { node: ">= 0.4" } - - array-buffer-byte-length@1.0.1: - resolution: - { - integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==, - } - engines: { node: ">= 0.4" } - - array-flatten@1.1.1: - resolution: - { - integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, - } - - array-includes@3.1.8: - resolution: - { - integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, - } - engines: { node: ">= 0.4" } - - array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - - array.prototype.findlast@1.2.5: - resolution: - { - integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, - } - engines: { node: ">= 0.4" } - - array.prototype.findlastindex@1.2.5: - resolution: - { - integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==, - } - engines: { node: ">= 0.4" } - - array.prototype.flat@1.3.2: - resolution: - { - integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==, - } - engines: { node: ">= 0.4" } - - array.prototype.flatmap@1.3.2: - resolution: - { - integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==, - } - engines: { node: ">= 0.4" } - - array.prototype.reduce@1.0.7: - resolution: - { - integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==, - } - engines: { node: ">= 0.4" } - - array.prototype.tosorted@1.1.4: - resolution: - { - integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, - } - engines: { node: ">= 0.4" } - - arraybuffer.prototype.slice@1.0.3: - resolution: - { - integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==, - } - engines: { node: ">= 0.4" } - - asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } - - ast-types-flow@0.0.8: - resolution: - { - integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, - } - - async@3.2.6: - resolution: - { - integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, - } - - asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - - at-least-node@1.0.0: - resolution: - { - integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, - } - engines: { node: ">= 4.0.0" } - - autoprefixer@10.4.20: - resolution: - { - integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==, - } - engines: { node: ^10 || ^12 || >=14 } - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - available-typed-arrays@1.0.7: - resolution: - { - integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, - } - engines: { node: ">= 0.4" } - - axe-core@4.10.2: - resolution: - { - integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==, - } - engines: { node: ">=4" } - - axios@1.7.7: - resolution: - { - integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==, - } - - axobject-query@4.1.0: - resolution: - { - integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, - } - engines: { node: ">= 0.4" } - - babel-jest@27.5.1: - resolution: - { - integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - peerDependencies: - "@babel/core": ^7.8.0 - - babel-loader@8.4.1: - resolution: - { - integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==, - } - engines: { node: ">= 8.9" } - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - - babel-plugin-istanbul@6.1.1: - resolution: - { - integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, - } - engines: { node: ">=8" } - - babel-plugin-jest-hoist@27.5.1: - resolution: - { - integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - babel-plugin-macros@3.1.0: - resolution: - { - integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, - } - engines: { node: ">=10", npm: ">=6" } - - babel-plugin-named-asset-import@0.3.8: - resolution: - { - integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==, - } - peerDependencies: - "@babel/core": ^7.1.0 - - babel-plugin-polyfill-corejs2@0.4.12: - resolution: - { - integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.10.6: - resolution: - { - integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.3: - resolution: - { - integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: - { - integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==, - } - - babel-preset-current-node-syntax@1.1.0: - resolution: - { - integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==, - } - peerDependencies: - "@babel/core": ^7.0.0 - - babel-preset-jest@27.5.1: - resolution: - { - integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - peerDependencies: - "@babel/core": ^7.0.0 - - babel-preset-react-app@10.0.1: - resolution: - { - integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==, - } - - balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - batch@0.6.1: - resolution: - { - integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==, - } - - bfj@7.1.0: - resolution: - { - integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==, - } - engines: { node: ">= 8.0.0" } - - big.js@5.2.2: - resolution: - { - integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, - } - - binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: ">=8" } - - bluebird@3.7.2: - resolution: - { - integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, - } - - body-parser@1.20.3: - resolution: - { - integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - - bonjour-service@1.3.0: - resolution: - { - integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==, - } - - boolbase@1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } - - brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - - brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } - - braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: ">=8" } - - browser-image-compression@2.0.2: - resolution: - { - integrity: sha512-pBLlQyUf6yB8SmmngrcOw3EoS4RpQ1BcylI3T9Yqn7+4nrQTXJD4sJDe5ODnJdrvNMaio5OicFo75rDyJD2Ucw==, - } - - browser-process-hrtime@1.0.0: - resolution: - { - integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==, - } - - browserslist@4.24.2: - resolution: - { - integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - - bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - } - - buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - - builtin-modules@3.3.0: - resolution: - { - integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, - } - engines: { node: ">=6" } - - bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: ">= 0.8" } - - call-bind@1.0.7: - resolution: - { - integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, - } - engines: { node: ">= 0.4" } - - callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - camel-case@4.1.2: - resolution: - { - integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, - } - - camelcase-css@2.0.1: - resolution: - { - integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, - } - engines: { node: ">= 6" } - - camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: ">=6" } - - camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: ">=10" } - - camelize@1.0.1: - resolution: - { - integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==, - } - - caniuse-api@3.0.0: - resolution: - { - integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, - } - - caniuse-lite@1.0.30001684: - resolution: - { - integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==, - } - - case-sensitive-paths-webpack-plugin@2.4.0: - resolution: - { - integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==, - } - engines: { node: ">=4" } - - chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: ">=4" } - - chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - - char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: ">=10" } - - char-regex@2.0.2: - resolution: - { - integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==, - } - engines: { node: ">=12.20" } - - check-types@11.2.3: - resolution: - { - integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==, - } - - chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: ">= 8.10.0" } - - chrome-trace-event@1.0.4: - resolution: - { - integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==, - } - engines: { node: ">=6.0" } - - ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: ">=8" } - - cjs-module-lexer@1.4.1: - resolution: - { - integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==, - } - - clean-css@5.3.3: - resolution: - { - integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==, - } - engines: { node: ">= 10.0" } - - cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } - - co@4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - } - engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } - - coa@2.0.2: - resolution: - { - integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==, - } - engines: { node: ">= 4.0" } - - collect-v8-coverage@1.0.2: - resolution: - { - integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, - } - - color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } - - color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - - color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } - - color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - colord@2.9.3: - resolution: - { - integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, - } - - colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } - - combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - - commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } - - commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: ">= 6" } - - commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: ">= 10" } - - commander@8.3.0: - resolution: - { - integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, - } - engines: { node: ">= 12" } - - common-tags@1.8.2: - resolution: - { - integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, - } - engines: { node: ">=4.0.0" } - - commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } - - compressible@2.0.18: - resolution: - { - integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, - } - engines: { node: ">= 0.6" } - - compression@1.7.5: - resolution: - { - integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==, - } - engines: { node: ">= 0.8.0" } - - concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - confusing-browser-globals@1.0.11: - resolution: - { - integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==, - } - - connect-history-api-fallback@2.0.0: - resolution: - { - integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==, - } - engines: { node: ">=0.8" } - - content-disposition@0.5.4: - resolution: - { - integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, - } - engines: { node: ">= 0.6" } - - content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } - - convert-source-map@1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } - - convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } - - cookie-signature@1.0.6: - resolution: - { - integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, - } - - cookie@0.7.1: - resolution: - { - integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==, - } - engines: { node: ">= 0.6" } - - core-js-compat@3.39.0: - resolution: - { - integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==, - } - - core-js-pure@3.39.0: - resolution: - { - integrity: sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==, - } - - core-js@3.39.0: - resolution: - { - integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==, - } - - core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } - - cosmiconfig@6.0.0: - resolution: - { - integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==, - } - engines: { node: ">=8" } - - cosmiconfig@7.1.0: - resolution: - { - integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, - } - engines: { node: ">=10" } - - cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: ">= 8" } - - crypto-random-string@2.0.0: - resolution: - { - integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, - } - engines: { node: ">=8" } - - css-blank-pseudo@3.0.3: - resolution: - { - integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==, - } - engines: { node: ^12 || ^14 || >=16 } - hasBin: true - peerDependencies: - postcss: ^8.4 - - css-color-keywords@1.0.0: - resolution: - { - integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==, - } - engines: { node: ">=4" } - - css-declaration-sorter@6.4.1: - resolution: - { - integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==, - } - engines: { node: ^10 || ^12 || >=14 } - peerDependencies: - postcss: ^8.0.9 - - css-declaration-sorter@7.2.0: - resolution: - { - integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.0.9 - - css-has-pseudo@3.0.4: - resolution: - { - integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==, - } - engines: { node: ^12 || ^14 || >=16 } - hasBin: true - peerDependencies: - postcss: ^8.4 - - css-loader@6.11.0: - resolution: - { - integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - - css-minimizer-webpack-plugin@3.4.1: - resolution: - { - integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - "@parcel/css": "*" - clean-css: "*" - csso: "*" - esbuild: "*" - webpack: ^5.0.0 - peerDependenciesMeta: - "@parcel/css": - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - - css-prefers-color-scheme@6.0.3: - resolution: - { - integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==, - } - engines: { node: ^12 || ^14 || >=16 } - hasBin: true - peerDependencies: - postcss: ^8.4 - - css-select-base-adapter@0.1.1: - resolution: - { - integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==, - } - - css-select@2.1.0: - resolution: - { - integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==, - } - - css-select@4.3.0: - resolution: - { - integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, - } - - css-select@5.1.0: - resolution: - { - integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, - } - - css-to-react-native@3.2.0: - resolution: - { - integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==, - } - - css-tree@1.0.0-alpha.37: - resolution: - { - integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==, - } - engines: { node: ">=8.0.0" } - - css-tree@1.1.3: - resolution: - { - integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, - } - engines: { node: ">=8.0.0" } - - css-tree@2.2.1: - resolution: - { - integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } - - css-tree@2.3.1: - resolution: - { - integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } - - css-what@3.4.2: - resolution: - { - integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==, - } - engines: { node: ">= 6" } - - css-what@6.1.0: - resolution: - { - integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, - } - engines: { node: ">= 6" } - - cssdb@7.11.2: - resolution: - { - integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==, - } - - cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: ">=4" } - hasBin: true - - cssnano-preset-default@5.2.14: - resolution: - { - integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - cssnano-preset-default@7.0.6: - resolution: - { - integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - cssnano-utils@3.1.0: - resolution: - { - integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - cssnano-utils@5.0.0: - resolution: - { - integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - cssnano@5.1.15: - resolution: - { - integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - cssnano@7.0.6: - resolution: - { - integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - csso@4.2.0: - resolution: - { - integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, - } - engines: { node: ">=8.0.0" } - - csso@5.0.5: - resolution: - { - integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } - - cssom@0.3.8: - resolution: - { - integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, - } - - cssom@0.4.4: - resolution: - { - integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==, - } - - cssstyle@2.3.0: - resolution: - { - integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, - } - engines: { node: ">=8" } - - csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } - - damerau-levenshtein@1.0.8: - resolution: - { - integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, - } - - data-urls@2.0.0: - resolution: - { - integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==, - } - engines: { node: ">=10" } - - data-view-buffer@1.0.1: - resolution: - { - integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==, - } - engines: { node: ">= 0.4" } - - data-view-byte-length@1.0.1: - resolution: - { - integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==, - } - engines: { node: ">= 0.4" } - - data-view-byte-offset@1.0.0: - resolution: - { - integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==, - } - engines: { node: ">= 0.4" } - - debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: - { - integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - - decimal.js@10.4.3: - resolution: - { - integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, - } - - dedent@0.7.0: - resolution: - { - integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, - } - - deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } - - deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: ">=0.10.0" } - - default-gateway@6.0.3: - resolution: - { - integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, - } - engines: { node: ">= 10" } - - define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: ">= 0.4" } - - define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: ">=8" } - - define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: ">= 0.4" } - - delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - - depd@1.1.2: - resolution: - { - integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, - } - engines: { node: ">= 0.6" } - - depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: ">= 0.8" } - - destroy@1.2.0: - resolution: - { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - - detect-newline@3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - } - engines: { node: ">=8" } - - detect-node@2.1.0: - resolution: - { - integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, - } - - detect-port-alt@1.1.6: - resolution: - { - integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==, - } - engines: { node: ">= 4.2.1" } - hasBin: true - - didyoumean@1.2.2: - resolution: - { - integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, - } - - diff-sequences@27.5.1: - resolution: - { - integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - - dlv@1.1.3: - resolution: - { - integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, - } - - dns-packet@5.6.1: - resolution: - { - integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==, - } - engines: { node: ">=6" } - - doctrine@2.1.0: - resolution: - { - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, - } - engines: { node: ">=0.10.0" } - - doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - - dom-converter@0.2.0: - resolution: - { - integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==, - } - - dom-helpers@5.2.1: - resolution: - { - integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==, - } - - dom-serializer@0.2.2: - resolution: - { - integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==, - } - - dom-serializer@1.4.1: - resolution: - { - integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, - } - - dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } - - domelementtype@1.3.1: - resolution: - { - integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==, - } - - domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - - domexception@2.0.1: - resolution: - { - integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==, - } - engines: { node: ">=8" } - deprecated: Use your platform's native DOMException instead - - domhandler@4.3.1: - resolution: - { - integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, - } - engines: { node: ">= 4" } - - domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: ">= 4" } - - domutils@1.7.0: - resolution: - { - integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==, - } - - domutils@2.8.0: - resolution: - { - integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, - } - - domutils@3.1.0: - resolution: - { - integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, - } - - dot-case@3.0.4: - resolution: - { - integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, - } - - dotenv-expand@5.1.0: - resolution: - { - integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==, - } - - dotenv@10.0.0: - resolution: - { - integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==, - } - engines: { node: ">=10" } - - duplexer@0.1.2: - resolution: - { - integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, - } - - eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } - - ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } - - ejs@3.1.10: - resolution: - { - integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==, - } - engines: { node: ">=0.10.0" } - hasBin: true - - electron-to-chromium@1.5.64: - resolution: - { - integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==, - } - - emittery@0.10.2: - resolution: - { - integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==, - } - engines: { node: ">=12" } - - emittery@0.8.1: - resolution: - { - integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==, - } - engines: { node: ">=10" } - - emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - - emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } - - emojis-list@3.0.0: - resolution: - { - integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, - } - engines: { node: ">= 4" } - - encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: ">= 0.8" } - - encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: ">= 0.8" } - - enhanced-resolve@5.17.1: - resolution: - { - integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==, - } - engines: { node: ">=10.13.0" } - - entities@2.2.0: - resolution: - { - integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, - } - - entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } - - error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } - - error-stack-parser@2.1.4: - resolution: - { - integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==, - } - - es-abstract@1.23.5: - resolution: - { - integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==, - } - engines: { node: ">= 0.4" } - - es-array-method-boxes-properly@1.0.0: - resolution: - { - integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==, - } - - es-define-property@1.0.0: - resolution: - { - integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, - } - engines: { node: ">= 0.4" } - - es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: ">= 0.4" } - - es-iterator-helpers@1.2.0: - resolution: - { - integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==, - } - engines: { node: ">= 0.4" } - - es-module-lexer@1.5.4: - resolution: - { - integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==, - } - - es-object-atoms@1.0.0: - resolution: - { - integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, - } - engines: { node: ">= 0.4" } - - es-set-tostringtag@2.0.3: - resolution: - { - integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==, - } - engines: { node: ">= 0.4" } - - es-shim-unscopables@1.0.2: - resolution: - { - integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==, - } - - es-to-primitive@1.2.1: - resolution: - { - integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, - } - engines: { node: ">= 0.4" } - - escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: ">=6" } - - escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } - - escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: ">=0.8.0" } - - escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - } - engines: { node: ">=8" } - - escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - escodegen@1.14.3: - resolution: - { - integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, - } - engines: { node: ">=4.0" } - hasBin: true - - escodegen@2.1.0: - resolution: - { - integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, - } - engines: { node: ">=6.0" } - hasBin: true - - eslint-config-react-app@7.0.1: - resolution: - { - integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - eslint: ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: - { - integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, - } - - eslint-module-utils@2.12.0: - resolution: - { - integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==, - } - engines: { node: ">=4" } - peerDependencies: - "@typescript-eslint/parser": "*" - eslint: "*" - eslint-import-resolver-node: "*" - eslint-import-resolver-typescript: "*" - eslint-import-resolver-webpack: "*" - peerDependenciesMeta: - "@typescript-eslint/parser": - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-flowtype@8.0.3: - resolution: - { - integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==, - } - engines: { node: ">=12.0.0" } - peerDependencies: - "@babel/plugin-syntax-flow": ^7.14.5 - "@babel/plugin-transform-react-jsx": ^7.14.9 - eslint: ^8.1.0 - - eslint-plugin-import@2.31.0: - resolution: - { - integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==, - } - engines: { node: ">=4" } - peerDependencies: - "@typescript-eslint/parser": "*" - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - "@typescript-eslint/parser": - optional: true - - eslint-plugin-jest@25.7.0: - resolution: - { - integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - peerDependencies: - "@typescript-eslint/eslint-plugin": ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: "*" - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: - { - integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, - } - engines: { node: ">=4.0" } - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-react-hooks@4.6.2: - resolution: - { - integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==, - } - engines: { node: ">=10" } - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.37.2: - resolution: - { - integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==, - } - engines: { node: ">=4" } - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-plugin-testing-library@5.11.1: - resolution: - { - integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: ">=6" } - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - - eslint-scope@5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: ">=8.0.0" } - - eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - eslint-visitor-keys@2.1.0: - resolution: - { - integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, - } - engines: { node: ">=10" } - - eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - eslint-webpack-plugin@3.2.0: - resolution: - { - integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - webpack: ^5.0.0 - - eslint@8.57.1: - resolution: - { - integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - esprima@1.2.2: - resolution: - { - integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: ">=4" } - hasBin: true - - esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: ">=0.10" } - - esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - - estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: ">=4.0" } - - estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - estree-walker@1.0.1: - resolution: - { - integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, - } - - esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } - - etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: ">= 0.6" } - - eventemitter3@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } - - events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: ">=0.8.x" } - - execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: ">=10" } - - exit@0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - } - engines: { node: ">= 0.8.0" } - - expect@27.5.1: - resolution: - { - integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - express@4.21.1: - resolution: - { - integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==, - } - engines: { node: ">= 0.10.0" } - - fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - - fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - } - engines: { node: ">=8.6.0" } - - fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - fast-uri@3.0.3: - resolution: - { - integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==, - } - - fastq@1.17.1: - resolution: - { - integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, - } - - faye-websocket@0.11.4: - resolution: - { - integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, - } - engines: { node: ">=0.8.0" } - - fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } - - file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - - file-loader@6.2.0: - resolution: - { - integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==, - } - engines: { node: ">= 10.13.0" } - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - } - - filesize@8.0.7: - resolution: - { - integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==, - } - engines: { node: ">= 0.4.0" } - - fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: ">=8" } - - finalhandler@1.3.1: - resolution: - { - integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==, - } - engines: { node: ">= 0.8" } - - find-cache-dir@3.3.2: - resolution: - { - integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==, - } - engines: { node: ">=8" } - - find-up@3.0.0: - resolution: - { - integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, - } - engines: { node: ">=6" } - - find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: ">=8" } - - find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: ">=10" } - - flat-cache@3.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - - flatted@3.3.2: - resolution: - { - integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==, - } - - follow-redirects@1.15.9: - resolution: - { - integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, - } - engines: { node: ">=4.0" } - peerDependencies: - debug: "*" - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.3: - resolution: - { - integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, - } - - foreground-child@3.3.0: - resolution: - { - integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, - } - engines: { node: ">=14" } - - fork-ts-checker-webpack-plugin@6.5.3: - resolution: - { - integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==, - } - engines: { node: ">=10", yarn: ">=1.0.0" } - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - - form-data@3.0.2: - resolution: - { - integrity: sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==, - } - engines: { node: ">= 6" } - - form-data@4.0.1: - resolution: - { - integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==, - } - engines: { node: ">= 6" } - - forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: ">= 0.6" } - - fraction.js@4.3.7: - resolution: - { - integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, - } - - fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: ">= 0.6" } - - fs-extra@10.1.0: - resolution: - { - integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, - } - engines: { node: ">=12" } - - fs-extra@9.1.0: - resolution: - { - integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, - } - engines: { node: ">=10" } - - fs-monkey@1.0.6: - resolution: - { - integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==, - } - - fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - - function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } - - function.prototype.name@1.1.6: - resolution: - { - integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, - } - engines: { node: ">= 0.4" } - - functions-have-names@1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - } - - gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: ">=6.9.0" } - - get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } - - get-intrinsic@1.2.4: - resolution: - { - integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, - } - engines: { node: ">= 0.4" } - - get-own-enumerable-property-symbols@3.0.2: - resolution: - { - integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, - } - - get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: ">=8.0.0" } - - get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } - - get-symbol-description@1.0.2: - resolution: - { - integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==, - } - engines: { node: ">= 0.4" } - - glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - - glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - - glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - - glob@10.4.5: - resolution: - { - integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, - } - hasBin: true - - glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - deprecated: Glob versions prior to v9 are no longer supported - - global-modules@2.0.0: - resolution: - { - integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, - } - engines: { node: ">=6" } - - global-prefix@3.0.0: - resolution: - { - integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, - } - engines: { node: ">=6" } - - globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: ">=4" } - - globals@13.24.0: - resolution: - { - integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, - } - engines: { node: ">=8" } - - globalthis@1.0.4: - resolution: - { - integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, - } - engines: { node: ">= 0.4" } - - globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - - gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } - - graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - - graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - gzip-size@6.0.0: - resolution: - { - integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==, - } - engines: { node: ">=10" } - - handle-thing@2.0.1: - resolution: - { - integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==, - } - - harmony-reflect@1.6.2: - resolution: - { - integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==, - } - - has-bigints@1.0.2: - resolution: - { - integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, - } - - has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: ">=4" } - - has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } - - has-proto@1.0.3: - resolution: - { - integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, - } - engines: { node: ">= 0.4" } - - has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: ">= 0.4" } - - has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: ">= 0.4" } - - hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } - - he@1.2.0: - resolution: - { - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, - } - hasBin: true - - hoopy@0.1.4: - resolution: - { - integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==, - } - engines: { node: ">= 6.0.0" } - - hpack.js@2.1.6: - resolution: - { - integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==, - } - - html-encoding-sniffer@2.0.1: - resolution: - { - integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==, - } - engines: { node: ">=10" } - - html-entities@2.5.2: - resolution: - { - integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==, - } - - html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } - - html-minifier-terser@6.1.0: - resolution: - { - integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, - } - engines: { node: ">=12" } - hasBin: true - - html-webpack-plugin@5.6.3: - resolution: - { - integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==, - } - engines: { node: ">=10.13.0" } - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - - htmlparser2@6.1.0: - resolution: - { - integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==, - } - - http-deceiver@1.2.7: - resolution: - { - integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==, - } - - http-errors@1.6.3: - resolution: - { - integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==, - } - engines: { node: ">= 0.6" } - - http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: ">= 0.8" } - - http-parser-js@0.5.8: - resolution: - { - integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, - } - - http-proxy-agent@4.0.1: - resolution: - { - integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, - } - engines: { node: ">= 6" } - - http-proxy-middleware@2.0.7: - resolution: - { - integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==, - } - engines: { node: ">=12.0.0" } - peerDependencies: - "@types/express": ^4.17.13 - peerDependenciesMeta: - "@types/express": - optional: true - - http-proxy@1.18.1: - resolution: - { - integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, - } - engines: { node: ">=8.0.0" } - - https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: ">= 6" } - - human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } - - iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: ">=0.10.0" } - - iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } - - icss-utils@5.1.0: - resolution: - { - integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - - idb@7.1.1: - resolution: - { - integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, - } - - identity-obj-proxy@3.0.0: - resolution: - { - integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==, - } - engines: { node: ">=4" } - - ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: ">= 4" } - - immer@9.0.21: - resolution: - { - integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==, - } - - immutable@5.0.3: - resolution: - { - integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==, - } - - import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - - import-local@3.2.0: - resolution: - { - integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==, - } - engines: { node: ">=8" } - hasBin: true - - imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.3: - resolution: - { - integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, - } - - inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - - internal-slot@1.0.7: - resolution: - { - integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==, - } - engines: { node: ">= 0.4" } - - ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: ">= 0.10" } - - ipaddr.js@2.2.0: - resolution: - { - integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==, - } - engines: { node: ">= 10" } - - is-array-buffer@3.0.4: - resolution: - { - integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==, - } - engines: { node: ">= 0.4" } - - is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } - - is-async-function@2.0.0: - resolution: - { - integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==, - } - engines: { node: ">= 0.4" } - - is-bigint@1.0.4: - resolution: - { - integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, - } - - is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - - is-boolean-object@1.1.2: - resolution: - { - integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, - } - engines: { node: ">= 0.4" } - - is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: ">= 0.4" } - - is-core-module@2.15.1: - resolution: - { - integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==, - } - engines: { node: ">= 0.4" } - - is-data-view@1.0.1: - resolution: - { - integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==, - } - engines: { node: ">= 0.4" } - - is-date-object@1.0.5: - resolution: - { - integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, - } - engines: { node: ">= 0.4" } - - is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } - hasBin: true - - is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - is-finalizationregistry@1.1.0: - resolution: - { - integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==, - } - engines: { node: ">= 0.4" } - - is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: ">=8" } - - is-generator-fn@2.1.0: - resolution: - { - integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, - } - engines: { node: ">=6" } - - is-generator-function@1.0.10: - resolution: - { - integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, - } - engines: { node: ">= 0.4" } - - is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - - is-map@2.0.3: - resolution: - { - integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, - } - engines: { node: ">= 0.4" } - - is-module@1.0.0: - resolution: - { - integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, - } - - is-negative-zero@2.0.3: - resolution: - { - integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, - } - engines: { node: ">= 0.4" } - - is-number-object@1.0.7: - resolution: - { - integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, - } - engines: { node: ">= 0.4" } - - is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - is-obj@1.0.1: - resolution: - { - integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, - } - engines: { node: ">=0.10.0" } - - is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - is-plain-obj@3.0.0: - resolution: - { - integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==, - } - engines: { node: ">=10" } - - is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } - - is-regex@1.1.4: - resolution: - { - integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, - } - engines: { node: ">= 0.4" } - - is-regexp@1.0.0: - resolution: - { - integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, - } - engines: { node: ">=0.10.0" } - - is-root@2.1.0: - resolution: - { - integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==, - } - engines: { node: ">=6" } - - is-set@2.0.3: - resolution: - { - integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, - } - engines: { node: ">= 0.4" } - - is-shared-array-buffer@1.0.3: - resolution: - { - integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==, - } - engines: { node: ">= 0.4" } - - is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } - - is-string@1.0.7: - resolution: - { - integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, - } - engines: { node: ">= 0.4" } - - is-symbol@1.0.4: - resolution: - { - integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, - } - engines: { node: ">= 0.4" } - - is-typed-array@1.1.13: - resolution: - { - integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==, - } - engines: { node: ">= 0.4" } - - is-typedarray@1.0.0: - resolution: - { - integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, - } - - is-weakmap@2.0.2: - resolution: - { - integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, - } - engines: { node: ">= 0.4" } - - is-weakref@1.0.2: - resolution: - { - integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, - } - - is-weakset@2.0.3: - resolution: - { - integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==, - } - engines: { node: ">= 0.4" } - - is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: ">=8" } - - isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } - - isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - } - - isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: ">=8" } - - istanbul-lib-instrument@5.2.1: - resolution: - { - integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, - } - engines: { node: ">=8" } - - istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: ">=10" } - - istanbul-lib-source-maps@4.0.1: - resolution: - { - integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, - } - engines: { node: ">=10" } - - istanbul-reports@3.1.7: - resolution: - { - integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, - } - engines: { node: ">=8" } - - iterator.prototype@1.1.3: - resolution: - { - integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==, - } - engines: { node: ">= 0.4" } - - jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } - - jake@10.9.2: - resolution: - { - integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==, - } - engines: { node: ">=10" } - hasBin: true - - jest-changed-files@27.5.1: - resolution: - { - integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-circus@27.5.1: - resolution: - { - integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-cli@27.5.1: - resolution: - { - integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@27.5.1: - resolution: - { - integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - peerDependencies: - ts-node: ">=9.0.0" - peerDependenciesMeta: - ts-node: - optional: true - - jest-diff@27.5.1: - resolution: - { - integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-docblock@27.5.1: - resolution: - { - integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-each@27.5.1: - resolution: - { - integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-environment-jsdom@27.5.1: - resolution: - { - integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-environment-node@27.5.1: - resolution: - { - integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-get-type@27.5.1: - resolution: - { - integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-haste-map@27.5.1: - resolution: - { - integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-jasmine2@27.5.1: - resolution: - { - integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-leak-detector@27.5.1: - resolution: - { - integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-matcher-utils@27.5.1: - resolution: - { - integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-message-util@27.5.1: - resolution: - { - integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-message-util@28.1.3: - resolution: - { - integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - jest-mock@27.5.1: - resolution: - { - integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-pnp-resolver@1.2.3: - resolution: - { - integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, - } - engines: { node: ">=6" } - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@27.5.1: - resolution: - { - integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-regex-util@28.0.2: - resolution: - { - integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - jest-resolve-dependencies@27.5.1: - resolution: - { - integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-resolve@27.5.1: - resolution: - { - integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-runner@27.5.1: - resolution: - { - integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-runtime@27.5.1: - resolution: - { - integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-serializer@27.5.1: - resolution: - { - integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-snapshot@27.5.1: - resolution: - { - integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-util@27.5.1: - resolution: - { - integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-util@28.1.3: - resolution: - { - integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - jest-validate@27.5.1: - resolution: - { - integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-watch-typeahead@1.1.0: - resolution: - { - integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - jest: ^27.0.0 || ^28.0.0 - - jest-watcher@27.5.1: - resolution: - { - integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - jest-watcher@28.1.3: - resolution: - { - integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - jest-worker@26.6.2: - resolution: - { - integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, - } - engines: { node: ">= 10.13.0" } - - jest-worker@27.5.1: - resolution: - { - integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, - } - engines: { node: ">= 10.13.0" } - - jest-worker@28.1.3: - resolution: - { - integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - jest@27.5.1: - resolution: - { - integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jiti@1.21.6: - resolution: - { - integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==, - } - hasBin: true - - js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - - js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } - hasBin: true - - js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - - jsdom@16.7.0: - resolution: - { - integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==, - } - engines: { node: ">=10" } - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@3.0.2: - resolution: - { - integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, - } - engines: { node: ">=6" } - hasBin: true - - json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } - - json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } - - json-schema@0.4.0: - resolution: - { - integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, - } - - json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - json5@1.0.2: - resolution: - { - integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, - } - hasBin: true - - json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } - hasBin: true - - jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } - - jsonpath@1.1.1: - resolution: - { - integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==, - } - - jsonpointer@5.0.1: - resolution: - { - integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, - } - engines: { node: ">=0.10.0" } - - jsx-ast-utils@3.3.5: - resolution: - { - integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, - } - engines: { node: ">=4.0" } - - keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } - - kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: ">=0.10.0" } - - kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: ">=6" } - - klona@2.0.6: - resolution: - { - integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, - } - engines: { node: ">= 8" } - - language-subtag-registry@0.3.23: - resolution: - { - integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, - } - - language-tags@1.0.9: - resolution: - { - integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, - } - engines: { node: ">=0.10" } - - launch-editor@2.9.1: - resolution: - { - integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==, - } - - leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: ">=6" } - - levn@0.3.0: - resolution: - { - integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, - } - engines: { node: ">= 0.8.0" } - - levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - - lilconfig@2.1.0: - resolution: - { - integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, - } - engines: { node: ">=10" } - - lilconfig@3.1.2: - resolution: - { - integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==, - } - engines: { node: ">=14" } - - lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } - - loader-runner@4.3.0: - resolution: - { - integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, - } - engines: { node: ">=6.11.5" } - - loader-utils@2.0.4: - resolution: - { - integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==, - } - engines: { node: ">=8.9.0" } - - loader-utils@3.3.1: - resolution: - { - integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==, - } - engines: { node: ">= 12.13.0" } - - locate-path@3.0.0: - resolution: - { - integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, - } - engines: { node: ">=6" } - - locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: ">=8" } - - locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - - lodash.debounce@4.0.8: - resolution: - { - integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, - } - - lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } - - lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } - - lodash.uniq@4.5.0: - resolution: - { - integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, - } - - lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - - loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } - hasBin: true - - lower-case@2.0.2: - resolution: - { - integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, - } - - lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } - - lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } - - magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - - make-dir@3.1.0: - resolution: - { - integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, - } - engines: { node: ">=8" } - - make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: ">=10" } - - makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } - - mdn-data@2.0.14: - resolution: - { - integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, - } - - mdn-data@2.0.28: - resolution: - { - integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, - } - - mdn-data@2.0.30: - resolution: - { - integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, - } - - mdn-data@2.0.4: - resolution: - { - integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==, - } - - media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: ">= 0.6" } - - memfs@3.5.3: - resolution: - { - integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, - } - engines: { node: ">= 4.0.0" } - - merge-descriptors@1.0.3: - resolution: - { - integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, - } - - merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - - merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - - methods@1.1.2: - resolution: - { - integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, - } - engines: { node: ">= 0.6" } - - micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: ">=8.6" } - - mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - - mime-db@1.53.0: - resolution: - { - integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==, - } - engines: { node: ">= 0.6" } - - mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - - mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: ">=4" } - hasBin: true - - mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: ">=6" } - - mini-css-extract-plugin@2.9.2: - resolution: - { - integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^5.0.0 - - minimalistic-assert@1.0.1: - resolution: - { - integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, - } - - minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - - minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } - - minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: ">=16 || 14 >=14.17" } - - minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - - minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: ">=16 || 14 >=14.17" } - - mkdirp@0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - } - hasBin: true - - ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } - - ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } - - multicast-dns@7.2.5: - resolution: - { - integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==, - } - hasBin: true - - mz@2.7.0: - resolution: - { - integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, - } - - nanoid@3.3.7: - resolution: - { - integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - - natural-compare-lite@1.4.0: - resolution: - { - integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, - } - - natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: ">= 0.6" } - - negotiator@0.6.4: - resolution: - { - integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, - } - engines: { node: ">= 0.6" } - - neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } - - no-case@3.0.4: - resolution: - { - integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, - } - - node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - - node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } - - node-releases@2.0.18: - resolution: - { - integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==, - } - - normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - - normalize-range@0.1.2: - resolution: - { - integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, - } - engines: { node: ">=0.10.0" } - - normalize-url@6.1.0: - resolution: - { - integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, - } - engines: { node: ">=10" } - - npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: ">=8" } - - nth-check@1.0.2: - resolution: - { - integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==, - } - - nth-check@2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } - - nwsapi@2.2.13: - resolution: - { - integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==, - } - - object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: ">=0.10.0" } - - object-hash@3.0.0: - resolution: - { - integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, - } - engines: { node: ">= 6" } - - object-inspect@1.13.3: - resolution: - { - integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==, - } - engines: { node: ">= 0.4" } - - object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: ">= 0.4" } - - object.assign@4.1.5: - resolution: - { - integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, - } - engines: { node: ">= 0.4" } - - object.entries@1.1.8: - resolution: - { - integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==, - } - engines: { node: ">= 0.4" } - - object.fromentries@2.0.8: - resolution: - { - integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, - } - engines: { node: ">= 0.4" } - - object.getownpropertydescriptors@2.1.8: - resolution: - { - integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==, - } - engines: { node: ">= 0.8" } - - object.groupby@1.0.3: - resolution: - { - integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, - } - engines: { node: ">= 0.4" } - - object.values@1.2.0: - resolution: - { - integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==, - } - engines: { node: ">= 0.4" } - - obuf@1.1.2: - resolution: - { - integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==, - } - - on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: ">= 0.8" } - - on-headers@1.0.2: - resolution: - { - integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, - } - engines: { node: ">= 0.8" } - - once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - - onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } - - open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: ">=12" } - - optionator@0.8.3: - resolution: - { - integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, - } - engines: { node: ">= 0.8.0" } - - optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: ">= 0.8.0" } - - p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: ">=6" } - - p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - - p-locate@3.0.0: - resolution: - { - integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, - } - engines: { node: ">=6" } - - p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: ">=8" } - - p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - - p-retry@4.6.2: - resolution: - { - integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, - } - engines: { node: ">=8" } - - p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } - - package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } - - param-case@3.0.4: - resolution: - { - integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, - } - - parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - - parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: ">=8" } - - parse5@6.0.1: - resolution: - { - integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, - } - - parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } - - pascal-case@3.1.2: - resolution: - { - integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, - } - - path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: ">=4" } - - path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - - path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: ">=16 || 14 >=14.18" } - - path-to-regexp@0.1.10: - resolution: - { - integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==, - } - - path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: ">=8" } - - performance-now@2.1.0: - resolution: - { - integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, - } - - picocolors@0.2.1: - resolution: - { - integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==, - } - - picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } - - picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: ">=0.10.0" } - - pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: ">= 6" } - - pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: ">=8" } - - pkg-up@3.1.0: - resolution: - { - integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==, - } - engines: { node: ">=8" } - - possible-typed-array-names@1.0.0: - resolution: - { - integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, - } - engines: { node: ">= 0.4" } - - postcss-attribute-case-insensitive@5.0.2: - resolution: - { - integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-browser-comments@4.0.0: - resolution: - { - integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==, - } - engines: { node: ">=8" } - peerDependencies: - browserslist: ">=4" - postcss: ">=8" - - postcss-calc@10.0.2: - resolution: - { - integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==, - } - engines: { node: ^18.12 || ^20.9 || >=22.0 } - peerDependencies: - postcss: ^8.4.38 - - postcss-calc@8.2.4: - resolution: - { - integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==, - } - peerDependencies: - postcss: ^8.2.2 - - postcss-clamp@4.1.0: - resolution: - { - integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, - } - engines: { node: ">=7.6.0" } - peerDependencies: - postcss: ^8.4.6 - - postcss-color-functional-notation@4.2.4: - resolution: - { - integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-color-hex-alpha@8.0.4: - resolution: - { - integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.4 - - postcss-color-rebeccapurple@7.1.1: - resolution: - { - integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-colormin@5.3.1: - resolution: - { - integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-colormin@7.0.2: - resolution: - { - integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-convert-values@5.1.3: - resolution: - { - integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-convert-values@7.0.4: - resolution: - { - integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-custom-media@8.0.2: - resolution: - { - integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.3 - - postcss-custom-properties@12.1.11: - resolution: - { - integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-custom-selectors@6.0.3: - resolution: - { - integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.3 - - postcss-dir-pseudo-class@6.0.5: - resolution: - { - integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-discard-comments@5.1.2: - resolution: - { - integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-comments@7.0.3: - resolution: - { - integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-duplicates@5.1.0: - resolution: - { - integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-duplicates@7.0.1: - resolution: - { - integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-empty@5.1.1: - resolution: - { - integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-empty@7.0.0: - resolution: - { - integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-overridden@5.1.0: - resolution: - { - integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-overridden@7.0.0: - resolution: - { - integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-double-position-gradients@3.1.2: - resolution: - { - integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-env-function@4.0.6: - resolution: - { - integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.4 - - postcss-flexbugs-fixes@5.0.2: - resolution: - { - integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==, - } - peerDependencies: - postcss: ^8.1.4 - - postcss-focus-visible@6.0.4: - resolution: - { - integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.4 - - postcss-focus-within@5.0.4: - resolution: - { - integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.4 - - postcss-font-variant@5.0.0: - resolution: - { - integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, - } - peerDependencies: - postcss: ^8.1.0 - - postcss-gap-properties@3.0.5: - resolution: - { - integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-image-set-function@4.0.7: - resolution: - { - integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-import@15.1.0: - resolution: - { - integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - postcss: ^8.0.0 - - postcss-initial@4.0.1: - resolution: - { - integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==, - } - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: - { - integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, - } - engines: { node: ^12 || ^14 || >= 16 } - peerDependencies: - postcss: ^8.4.21 - - postcss-lab-function@4.2.1: - resolution: - { - integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-load-config@4.0.2: - resolution: - { - integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, - } - engines: { node: ">= 14" } - peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-loader@6.2.1: - resolution: - { - integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - - postcss-logical@5.0.4: - resolution: - { - integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.4 - - postcss-media-minmax@5.0.0: - resolution: - { - integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - postcss: ^8.1.0 - - postcss-merge-longhand@5.1.7: - resolution: - { - integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-merge-longhand@7.0.4: - resolution: - { - integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-merge-rules@5.1.4: - resolution: - { - integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-merge-rules@7.0.4: - resolution: - { - integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-font-values@5.1.0: - resolution: - { - integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-font-values@7.0.0: - resolution: - { - integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-gradients@5.1.1: - resolution: - { - integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-gradients@7.0.0: - resolution: - { - integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-params@5.1.4: - resolution: - { - integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-params@7.0.2: - resolution: - { - integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-selectors@5.2.1: - resolution: - { - integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-selectors@7.0.4: - resolution: - { - integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-modules-extract-imports@3.1.0: - resolution: - { - integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@4.1.0: - resolution: - { - integrity: sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-scope@3.2.1: - resolution: - { - integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-values@4.0.0: - resolution: - { - integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - - postcss-nested@6.2.0: - resolution: - { - integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, - } - engines: { node: ">=12.0" } - peerDependencies: - postcss: ^8.2.14 - - postcss-nesting@10.2.0: - resolution: - { - integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-normalize-charset@5.1.0: - resolution: - { - integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-charset@7.0.0: - resolution: - { - integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-display-values@5.1.0: - resolution: - { - integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-display-values@7.0.0: - resolution: - { - integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-positions@5.1.1: - resolution: - { - integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-positions@7.0.0: - resolution: - { - integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-repeat-style@5.1.1: - resolution: - { - integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-repeat-style@7.0.0: - resolution: - { - integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-string@5.1.0: - resolution: - { - integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-string@7.0.0: - resolution: - { - integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-timing-functions@5.1.0: - resolution: - { - integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-timing-functions@7.0.0: - resolution: - { - integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-unicode@5.1.1: - resolution: - { - integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-unicode@7.0.2: - resolution: - { - integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-url@5.1.0: - resolution: - { - integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-url@7.0.0: - resolution: - { - integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-whitespace@5.1.1: - resolution: - { - integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-whitespace@7.0.0: - resolution: - { - integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize@10.0.1: - resolution: - { - integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==, - } - engines: { node: ">= 12" } - peerDependencies: - browserslist: ">= 4" - postcss: ">= 8" - - postcss-opacity-percentage@1.1.3: - resolution: - { - integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-ordered-values@5.1.3: - resolution: - { - integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-ordered-values@7.0.1: - resolution: - { - integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-overflow-shorthand@3.0.4: - resolution: - { - integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-page-break@3.0.4: - resolution: - { - integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, - } - peerDependencies: - postcss: ^8 - - postcss-place@7.0.5: - resolution: - { - integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-preset-env@7.8.3: - resolution: - { - integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-pseudo-class-any-link@7.1.6: - resolution: - { - integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-reduce-initial@5.1.2: - resolution: - { - integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-reduce-initial@7.0.2: - resolution: - { - integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-reduce-transforms@5.1.0: - resolution: - { - integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-reduce-transforms@7.0.0: - resolution: - { - integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-replace-overflow-wrap@4.0.0: - resolution: - { - integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, - } - peerDependencies: - postcss: ^8.0.3 - - postcss-selector-not@6.0.1: - resolution: - { - integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==, - } - engines: { node: ^12 || ^14 || >=16 } - peerDependencies: - postcss: ^8.2 - - postcss-selector-parser@6.1.2: - resolution: - { - integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, - } - engines: { node: ">=4" } - - postcss-selector-parser@7.0.0: - resolution: - { - integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==, - } - engines: { node: ">=4" } - - postcss-svgo@5.1.0: - resolution: - { - integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-svgo@7.0.1: - resolution: - { - integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >= 18 } - peerDependencies: - postcss: ^8.4.31 - - postcss-unique-selectors@5.1.1: - resolution: - { - integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - postcss-unique-selectors@7.0.3: - resolution: - { - integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } - - postcss@7.0.39: - resolution: - { - integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==, - } - engines: { node: ">=6.0.0" } - - postcss@8.4.38: - resolution: - { - integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, - } - engines: { node: ^10 || ^12 || >=14 } - - postcss@8.4.49: - resolution: - { - integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==, - } - engines: { node: ^10 || ^12 || >=14 } - - prelude-ls@1.1.2: - resolution: - { - integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, - } - engines: { node: ">= 0.8.0" } - - prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - pretty-bytes@5.6.0: - resolution: - { - integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, - } - engines: { node: ">=6" } - - pretty-error@4.0.0: - resolution: - { - integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==, - } - - pretty-format@27.5.1: - resolution: - { - integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } - - pretty-format@28.1.3: - resolution: - { - integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } - - primereact@10.8.4: - resolution: - { - integrity: sha512-jwkSzq6pOHayzEh+9dgk2M71gEZtoQakwPKVo3FUJO3eEX3SoAOchON+Xm1tGCNqtd66ca8RgOWQcpv3AQoMvg==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - "@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: - "@types/react": - optional: true - - process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } - - promise@8.3.0: - resolution: - { - integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==, - } - - prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: ">= 6" } - - prop-types@15.8.1: - resolution: - { - integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, - } - - proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: ">= 0.10" } - - proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } - - psl@1.13.0: - resolution: - { - integrity: sha512-BFwmFXiJoFqlUpZ5Qssolv15DMyc84gTBds1BjsV1BfXEo1UyyD7GsmN67n7J77uRhoSNW1AXtXKPLcBFQn9Aw==, - } - - punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } - - q@1.5.1: - resolution: - { - integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, - } - engines: { node: ">=0.6.0", teleport: ">=0.2.0" } - deprecated: |- - You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - - qs@6.13.0: - resolution: - { - integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, - } - engines: { node: ">=0.6" } - - querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } - - queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - raf@3.4.1: - resolution: - { - integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, - } - - randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } - - range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } - - raw-body@2.5.2: - resolution: - { - integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, - } - engines: { node: ">= 0.8" } - - react-app-polyfill@3.0.0: - resolution: - { - integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==, - } - engines: { node: ">=14" } - - react-dev-utils@12.0.1: - resolution: - { - integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==, - } - engines: { node: ">=14" } - peerDependencies: - typescript: ">=2.7" - webpack: ">=4" - peerDependenciesMeta: - typescript: - optional: true - - react-dom@18.3.1: - resolution: - { - integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, - } - peerDependencies: - react: ^18.3.1 - - react-error-overlay@6.0.11: - resolution: - { - integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==, - } - - react-is@16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } - - react-is@17.0.2: - resolution: - { - integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, - } - - react-is@18.3.1: - resolution: - { - integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, - } - - react-loader-spinner@6.1.6: - resolution: - { - integrity: sha512-x5h1Jcit7Qn03MuKlrWcMG9o12cp9SNDVHVJTNRi9TgtGPKcjKiXkou4NRfLAtXaFB3+Z8yZsVzONmPzhv2ErA==, - } - engines: { node: ">= 12" } - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - - react-refresh@0.11.0: - resolution: - { - integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==, - } - engines: { node: ">=0.10.0" } - - react-router-dom@6.28.0: - resolution: - { - integrity: sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - react: ">=16.8" - react-dom: ">=16.8" - - react-router@6.28.0: - resolution: - { - integrity: sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - react: ">=16.8" - - react-scripts@5.0.1: - resolution: - { - integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==, - } - engines: { node: ">=14.0.0" } - hasBin: true - peerDependencies: - eslint: "*" - react: ">= 16" - typescript: ^3.2.1 || ^4 - peerDependenciesMeta: - typescript: - optional: true - - react-transition-group@4.4.5: - resolution: - { - integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==, - } - peerDependencies: - react: ">=16.6.0" - react-dom: ">=16.6.0" - - react@18.3.1: - resolution: - { - integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, - } - engines: { node: ">=0.10.0" } - - read-cache@1.0.0: - resolution: - { - integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, - } - - readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } - - readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - - readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - - recursive-readdir@2.2.3: - resolution: - { - integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, - } - engines: { node: ">=6.0.0" } - - reflect.getprototypeof@1.0.7: - resolution: - { - integrity: sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==, - } - engines: { node: ">= 0.4" } - - regenerate-unicode-properties@10.2.0: - resolution: - { - integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==, - } - engines: { node: ">=4" } - - regenerate@1.4.2: - resolution: - { - integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, - } - - regenerator-runtime@0.13.11: - resolution: - { - integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, - } - - regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } - - regenerator-transform@0.15.2: - resolution: - { - integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, - } - - regex-parser@2.3.0: - resolution: - { - integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==, - } - - regexp.prototype.flags@1.5.3: - resolution: - { - integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==, - } - engines: { node: ">= 0.4" } - - regexpu-core@6.2.0: - resolution: - { - integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==, - } - engines: { node: ">=4" } - - regjsgen@0.8.0: - resolution: - { - integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==, - } - - regjsparser@0.12.0: - resolution: - { - integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==, - } - hasBin: true - - relateurl@0.2.7: - resolution: - { - integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, - } - engines: { node: ">= 0.10" } - - renderkid@3.0.0: - resolution: - { - integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==, - } - - require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: ">=0.10.0" } - - require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } - - requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } - - resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: ">=8" } - - resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } - - resolve-url-loader@4.0.0: - resolution: - { - integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==, - } - engines: { node: ">=8.9" } - peerDependencies: - rework: 1.0.1 - rework-visit: 1.0.0 - peerDependenciesMeta: - rework: - optional: true - rework-visit: - optional: true - - resolve.exports@1.1.1: - resolution: - { - integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==, - } - engines: { node: ">=10" } - - resolve@1.22.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - } - hasBin: true - - resolve@2.0.0-next.5: - resolution: - { - integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, - } - hasBin: true - - retry@0.13.1: - resolution: - { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, - } - engines: { node: ">= 4" } - - reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rollup-plugin-terser@7.0.2: - resolution: - { - integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==, - } - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: ^2.0.0 - - rollup@2.79.2: - resolution: - { - integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==, - } - engines: { node: ">=10.0.0" } - hasBin: true - - run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - - safe-array-concat@1.1.2: - resolution: - { - integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==, - } - engines: { node: ">=0.4" } - - safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } - - safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - - safe-regex-test@1.0.3: - resolution: - { - integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==, - } - engines: { node: ">= 0.4" } - - safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - - sanitize.css@13.0.0: - resolution: - { - integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==, - } - - sass-loader@12.6.0: - resolution: - { - integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - fibers: ">= 3.1.0" - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - sass: ^1.3.0 - sass-embedded: "*" - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - - sax@1.2.4: - resolution: - { - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, - } - - saxes@5.0.1: - resolution: - { - integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==, - } - engines: { node: ">=10" } - - scheduler@0.23.2: - resolution: - { - integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, - } - - schema-utils@2.7.0: - resolution: - { - integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==, - } - engines: { node: ">= 8.9.0" } - - schema-utils@2.7.1: - resolution: - { - integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==, - } - engines: { node: ">= 8.9.0" } - - schema-utils@3.3.0: - resolution: - { - integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, - } - engines: { node: ">= 10.13.0" } - - schema-utils@4.2.0: - resolution: - { - integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==, - } - engines: { node: ">= 12.13.0" } - - select-hose@2.0.0: - resolution: - { - integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==, - } - - selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: ">=10" } - - semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } - hasBin: true - - semver@7.6.3: - resolution: - { - integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, - } - engines: { node: ">=10" } - hasBin: true - - send@0.19.0: - resolution: - { - integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, - } - engines: { node: ">= 0.8.0" } - - serialize-javascript@4.0.0: - resolution: - { - integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, - } - - serialize-javascript@6.0.2: - resolution: - { - integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, - } - - serve-index@1.9.1: - resolution: - { - integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==, - } - engines: { node: ">= 0.8.0" } - - serve-static@1.16.2: - resolution: - { - integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, - } - engines: { node: ">= 0.8.0" } - - set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: ">= 0.4" } - - set-function-name@2.0.2: - resolution: - { - integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, - } - engines: { node: ">= 0.4" } - - setprototypeof@1.1.0: - resolution: - { - integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==, - } - - setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } - - shallowequal@1.1.0: - resolution: - { - integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==, - } - - shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - - shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - shell-quote@1.8.1: - resolution: - { - integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, - } - - side-channel@1.0.6: - resolution: - { - integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, - } - engines: { node: ">= 0.4" } - - signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - - signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: ">=14" } - - sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } - - slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: ">=8" } - - slash@4.0.0: - resolution: - { - integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==, - } - engines: { node: ">=12" } - - sockjs@0.3.24: - resolution: - { - integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==, - } - - source-list-map@2.0.1: - resolution: - { - integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==, - } - - source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: ">=0.10.0" } - - source-map-loader@3.0.2: - resolution: - { - integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^5.0.0 - - source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - - source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - - source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: ">= 8" } - - source-map@0.8.0-beta.0: - resolution: - { - integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, - } - engines: { node: ">= 8" } - - sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - - spdy-transport@3.0.0: - resolution: - { - integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==, - } - - spdy@4.0.2: - resolution: - { - integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==, - } - engines: { node: ">=6.0.0" } - - sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } - - stable@0.1.8: - resolution: - { - integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==, - } - deprecated: "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - - stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - } - engines: { node: ">=10" } - - stackframe@1.3.4: - resolution: - { - integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==, - } - - static-eval@2.0.2: - resolution: - { - integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==, - } - - statuses@1.5.0: - resolution: - { - integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, - } - engines: { node: ">= 0.6" } - - statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: ">= 0.8" } - - string-length@4.0.2: - resolution: - { - integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, - } - engines: { node: ">=10" } - - string-length@5.0.1: - resolution: - { - integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==, - } - engines: { node: ">=12.20" } - - string-natural-compare@3.0.1: - resolution: - { - integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==, - } - - string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: ">=8" } - - string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: ">=12" } - - string.prototype.includes@2.0.1: - resolution: - { - integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, - } - engines: { node: ">= 0.4" } - - string.prototype.matchall@4.0.11: - resolution: - { - integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==, - } - engines: { node: ">= 0.4" } - - string.prototype.repeat@1.0.0: - resolution: - { - integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, - } - - string.prototype.trim@1.2.9: - resolution: - { - integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==, - } - engines: { node: ">= 0.4" } - - string.prototype.trimend@1.0.8: - resolution: - { - integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==, - } - - string.prototype.trimstart@1.0.8: - resolution: - { - integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, - } - engines: { node: ">= 0.4" } - - string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } - - string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - - stringify-object@3.3.0: - resolution: - { - integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, - } - engines: { node: ">=4" } - - strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - - strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: ">=12" } - - strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: ">=4" } - - strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: ">=8" } - - strip-comments@2.0.1: - resolution: - { - integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, - } - engines: { node: ">=10" } - - strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: ">=6" } - - strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: ">=8" } - - style-loader@3.3.4: - resolution: - { - integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^5.0.0 - - styled-components@6.1.13: - resolution: - { - integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==, - } - engines: { node: ">= 16" } - peerDependencies: - react: ">= 16.8.0" - react-dom: ">= 16.8.0" - - stylehacks@5.1.1: - resolution: - { - integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==, - } - engines: { node: ^10 || ^12 || >=14.0 } - peerDependencies: - postcss: ^8.2.15 - - stylehacks@7.0.4: - resolution: - { - integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==, - } - engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } - peerDependencies: - postcss: ^8.4.31 - - stylis@4.3.2: - resolution: - { - integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==, - } - - sucrase@3.35.0: - resolution: - { - integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, - } - engines: { node: ">=16 || 14 >=14.17" } - hasBin: true - - supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: ">=4" } - - supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - - supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: ">=10" } - - supports-hyperlinks@2.3.0: - resolution: - { - integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, - } - engines: { node: ">=8" } - - supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } - - svg-parser@2.0.4: - resolution: - { - integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==, - } - - svgo@1.3.2: - resolution: - { - integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==, - } - engines: { node: ">=4.0.0" } - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. - hasBin: true - - svgo@2.8.0: - resolution: - { - integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, - } - engines: { node: ">=10.13.0" } - hasBin: true - - svgo@3.3.2: - resolution: - { - integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==, - } - engines: { node: ">=14.0.0" } - hasBin: true - - symbol-tree@3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - } - - tailwindcss@3.4.15: - resolution: - { - integrity: sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==, - } - engines: { node: ">=14.0.0" } - hasBin: true - - tapable@1.1.3: - resolution: - { - integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==, - } - engines: { node: ">=6" } - - tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: ">=6" } - - temp-dir@2.0.0: - resolution: - { - integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, - } - engines: { node: ">=8" } - - tempy@0.6.0: - resolution: - { - integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, - } - engines: { node: ">=10" } - - terminal-link@2.1.1: - resolution: - { - integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, - } - engines: { node: ">=8" } - - terser-webpack-plugin@5.3.10: - resolution: - { - integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==, - } - engines: { node: ">= 10.13.0" } - peerDependencies: - "@swc/core": "*" - esbuild: "*" - uglify-js: "*" - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.36.0: - resolution: - { - integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==, - } - engines: { node: ">=10" } - hasBin: true - - test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: ">=8" } - - text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: ">=0.8" } - - thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } - - throat@6.0.2: - resolution: - { - integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==, - } - - thunky@1.1.0: - resolution: - { - integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==, - } - - tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } - - to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - - toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: ">=0.6" } - - tough-cookie@4.1.4: - resolution: - { - integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, - } - engines: { node: ">=6" } - - tr46@1.0.1: - resolution: - { - integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, - } - - tr46@2.1.0: - resolution: - { - integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==, - } - engines: { node: ">=8" } - - tryer@1.0.1: - resolution: - { - integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==, - } - - ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } - - tsconfig-paths@3.15.0: - resolution: - { - integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, - } - - tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } - - tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } - - tsutils@3.21.0: - resolution: - { - integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, - } - engines: { node: ">= 6" } - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - - type-check@0.3.2: - resolution: - { - integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, - } - engines: { node: ">= 0.8.0" } - - type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - - type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: ">=4" } - - type-fest@0.16.0: - resolution: - { - integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, - } - engines: { node: ">=10" } - - type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - } - engines: { node: ">=10" } - - type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: ">= 0.6" } - - typed-array-buffer@1.0.2: - resolution: - { - integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==, - } - engines: { node: ">= 0.4" } - - typed-array-byte-length@1.0.1: - resolution: - { - integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==, - } - engines: { node: ">= 0.4" } - - typed-array-byte-offset@1.0.3: - resolution: - { - integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==, - } - engines: { node: ">= 0.4" } - - typed-array-length@1.0.7: - resolution: - { - integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, - } - engines: { node: ">= 0.4" } - - typedarray-to-buffer@3.1.5: - resolution: - { - integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==, - } - - typescript@4.9.5: - resolution: - { - integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, - } - engines: { node: ">=4.2.0" } - hasBin: true - - unbox-primitive@1.0.2: - resolution: - { - integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, - } - - underscore@1.12.1: - resolution: - { - integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==, - } - - undici-types@6.19.8: - resolution: - { - integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==, - } - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: - { - integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==, - } - engines: { node: ">=4" } - - unicode-match-property-ecmascript@2.0.0: - resolution: - { - integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, - } - engines: { node: ">=4" } - - unicode-match-property-value-ecmascript@2.2.0: - resolution: - { - integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==, - } - engines: { node: ">=4" } - - unicode-property-aliases-ecmascript@2.1.0: - resolution: - { - integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, - } - engines: { node: ">=4" } - - unique-string@2.0.0: - resolution: - { - integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, - } - engines: { node: ">=8" } - - universalify@0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - } - engines: { node: ">= 4.0.0" } - - universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } - - unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: ">= 0.8" } - - unquote@1.1.1: - resolution: - { - integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==, - } - - upath@1.2.0: - resolution: - { - integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, - } - engines: { node: ">=4" } - - update-browserslist-db@1.1.1: - resolution: - { - integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==, - } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" - - uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - - url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } - - util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - - util.promisify@1.0.1: - resolution: - { - integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==, - } - - utila@0.4.0: - resolution: - { - integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==, - } - - utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: ">= 0.4.0" } - - uuid@8.3.2: - resolution: - { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, - } - hasBin: true - - uzip@0.20201231.0: - resolution: - { - integrity: sha512-OZeJfZP+R0z9D6TmBgLq2LHzSSptGMGDGigGiEe0pr8UBe/7fdflgHlHBNDASTXB5jnFuxHpNaJywSg8YFeGng==, - } - - v8-to-istanbul@8.1.1: - resolution: - { - integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==, - } - engines: { node: ">=10.12.0" } - - vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: ">= 0.8" } - - w3c-hr-time@1.0.2: - resolution: - { - integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==, - } - deprecated: Use your platform's native performance.now() and performance.timeOrigin. - - w3c-xmlserializer@2.0.0: - resolution: - { - integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==, - } - engines: { node: ">=10" } - - walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } - - watchpack@2.4.2: - resolution: - { - integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==, - } - engines: { node: ">=10.13.0" } - - wbuf@1.7.3: - resolution: - { - integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==, - } - - webidl-conversions@4.0.2: - resolution: - { - integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, - } - - webidl-conversions@5.0.0: - resolution: - { - integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==, - } - engines: { node: ">=8" } - - webidl-conversions@6.1.0: - resolution: - { - integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==, - } - engines: { node: ">=10.4" } - - webpack-dev-middleware@5.3.4: - resolution: - { - integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - webpack-dev-server@4.15.2: - resolution: - { - integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==, - } - engines: { node: ">= 12.13.0" } - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: "*" - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - - webpack-manifest-plugin@4.1.1: - resolution: - { - integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==, - } - engines: { node: ">=12.22.0" } - peerDependencies: - webpack: ^4.44.2 || ^5.47.0 - - webpack-sources@1.4.3: - resolution: - { - integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==, - } - - webpack-sources@2.3.1: - resolution: - { - integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==, - } - engines: { node: ">=10.13.0" } - - webpack-sources@3.2.3: - resolution: - { - integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, - } - engines: { node: ">=10.13.0" } - - webpack@5.96.1: - resolution: - { - integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==, - } - engines: { node: ">=10.13.0" } - hasBin: true - peerDependencies: - webpack-cli: "*" - peerDependenciesMeta: - webpack-cli: - optional: true - - websocket-driver@0.7.4: - resolution: - { - integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, - } - engines: { node: ">=0.8.0" } - - websocket-extensions@0.1.4: - resolution: - { - integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, - } - engines: { node: ">=0.8.0" } - - whatwg-encoding@1.0.5: - resolution: - { - integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==, - } - - whatwg-fetch@3.6.20: - resolution: - { - integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==, - } - - whatwg-mimetype@2.3.0: - resolution: - { - integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==, - } - - whatwg-url@7.1.0: - resolution: - { - integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, - } - - whatwg-url@8.7.0: - resolution: - { - integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==, - } - engines: { node: ">=10" } - - which-boxed-primitive@1.0.2: - resolution: - { - integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, - } - - which-builtin-type@1.2.0: - resolution: - { - integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==, - } - engines: { node: ">= 0.4" } - - which-collection@1.0.2: - resolution: - { - integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, - } - engines: { node: ">= 0.4" } - - which-typed-array@1.1.15: - resolution: - { - integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==, - } - engines: { node: ">= 0.4" } - - which@1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } - hasBin: true - - which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - - word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: ">=0.10.0" } - - workbox-background-sync@6.6.0: - resolution: - { - integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==, - } - - workbox-broadcast-update@6.6.0: - resolution: - { - integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==, - } - - workbox-build@6.6.0: - resolution: - { - integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==, - } - engines: { node: ">=10.0.0" } - - workbox-cacheable-response@6.6.0: - resolution: - { - integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==, - } - deprecated: workbox-background-sync@6.6.0 - - workbox-core@6.6.0: - resolution: - { - integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==, - } - - workbox-expiration@6.6.0: - resolution: - { - integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==, - } - - workbox-google-analytics@6.6.0: - resolution: - { - integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==, - } - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained - - workbox-navigation-preload@6.6.0: - resolution: - { - integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==, - } - - workbox-precaching@6.6.0: - resolution: - { - integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==, - } - - workbox-range-requests@6.6.0: - resolution: - { - integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==, - } - - workbox-recipes@6.6.0: - resolution: - { - integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==, - } - - workbox-routing@6.6.0: - resolution: - { - integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==, - } - - workbox-strategies@6.6.0: - resolution: - { - integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==, - } - - workbox-streams@6.6.0: - resolution: - { - integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==, - } - - workbox-sw@6.6.0: - resolution: - { - integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==, - } - - workbox-webpack-plugin@6.6.0: - resolution: - { - integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - webpack: ^4.4.0 || ^5.9.0 - - workbox-window@6.6.0: - resolution: - { - integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==, - } - - wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: ">=10" } - - wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: ">=12" } - - wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - write-file-atomic@3.0.3: - resolution: - { - integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==, - } - - ws@7.5.10: - resolution: - { - integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, - } - engines: { node: ">=8.3.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.0: - resolution: - { - integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@3.0.0: - resolution: - { - integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==, - } - - xmlchars@2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - } - - y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: ">=10" } - - yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } - - yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: ">= 6" } - - yaml@2.6.1: - resolution: - { - integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==, - } - engines: { node: ">= 14" } - hasBin: true - - yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: ">=10" } - - yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: ">=10" } - - yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - -snapshots: - "@alloc/quick-lru@5.2.0": {} - - "@ampproject/remapping@2.3.0": - dependencies: - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 - - "@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)": - dependencies: - ajv: 8.17.1 - json-schema: 0.4.0 - jsonpointer: 5.0.1 - leven: 3.1.0 - - "@babel/code-frame@7.26.2": - dependencies: - "@babel/helper-validator-identifier": 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - "@babel/compat-data@7.26.2": {} - - "@babel/core@7.26.0": - dependencies: - "@ampproject/remapping": 2.3.0 - "@babel/code-frame": 7.26.2 - "@babel/generator": 7.26.2 - "@babel/helper-compilation-targets": 7.25.9 - "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) - "@babel/helpers": 7.26.0 - "@babel/parser": 7.26.2 - "@babel/template": 7.25.9 - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - convert-source-map: 2.0.0 - debug: 4.3.7 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - "@babel/eslint-parser@7.25.9(@babel/core@7.26.0)(eslint@8.57.1)": - dependencies: - "@babel/core": 7.26.0 - "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 - eslint: 8.57.1 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - - "@babel/generator@7.26.2": - dependencies: - "@babel/parser": 7.26.2 - "@babel/types": 7.26.0 - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 - jsesc: 3.0.2 - - "@babel/helper-annotate-as-pure@7.25.9": - dependencies: - "@babel/types": 7.26.0 - - "@babel/helper-builder-binary-assignment-operator-visitor@7.25.9": - dependencies: - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - transitivePeerDependencies: - - supports-color - - "@babel/helper-compilation-targets@7.25.9": - dependencies: - "@babel/compat-data": 7.26.2 - "@babel/helper-validator-option": 7.25.9 - browserslist: 4.24.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - "@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-member-expression-to-functions": 7.25.9 - "@babel/helper-optimise-call-expression": 7.25.9 - "@babel/helper-replace-supers": 7.25.9(@babel/core@7.26.0) - "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 - "@babel/traverse": 7.25.9 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - "@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - regexpu-core: 6.2.0 - semver: 6.3.1 - - "@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-compilation-targets": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - debug: 4.3.7 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - "@babel/helper-member-expression-to-functions@7.25.9": - dependencies: - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - transitivePeerDependencies: - - supports-color - - "@babel/helper-module-imports@7.25.9": - dependencies: - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - transitivePeerDependencies: - - supports-color - - "@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-imports": 7.25.9 - "@babel/helper-validator-identifier": 7.25.9 - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/helper-optimise-call-expression@7.25.9": - dependencies: - "@babel/types": 7.26.0 - - "@babel/helper-plugin-utils@7.25.9": {} - - "@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-wrap-function": 7.25.9 - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-member-expression-to-functions": 7.25.9 - "@babel/helper-optimise-call-expression": 7.25.9 - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/helper-simple-access@7.25.9": - dependencies: - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - transitivePeerDependencies: - - supports-color - - "@babel/helper-skip-transparent-expression-wrappers@7.25.9": - dependencies: - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - transitivePeerDependencies: - - supports-color - - "@babel/helper-string-parser@7.25.9": {} - - "@babel/helper-validator-identifier@7.25.9": {} - - "@babel/helper-validator-option@7.25.9": {} - - "@babel/helper-wrap-function@7.25.9": - dependencies: - "@babel/template": 7.25.9 - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - transitivePeerDependencies: - - supports-color - - "@babel/helpers@7.26.0": - dependencies: - "@babel/template": 7.25.9 - "@babel/types": 7.26.0 - - "@babel/parser@7.26.2": - dependencies: - "@babel/types": 7.26.0 - - "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 - "@babel/plugin-transform-optional-chaining": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-syntax-decorators": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.26.0) - - "@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.26.0) - - "@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - - "@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-remap-async-to-generator": 7.25.9(@babel/core@7.26.0) - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-imports": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-remap-async-to-generator": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-compilation-targets": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-replace-supers": 7.25.9(@babel/core@7.26.0) - "@babel/traverse": 7.25.9 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/template": 7.25.9 - - "@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-builder-binary-assignment-operator-visitor": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-syntax-flow": 7.26.0(@babel/core@7.26.0) - - "@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-compilation-targets": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-simple-access": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-validator-identifier": 7.25.9 - "@babel/traverse": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-compilation-targets": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-parameters": 7.25.9(@babel/core@7.26.0) - - "@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-replace-supers": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/plugin-transform-react-jsx": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-module-imports": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-syntax-jsx": 7.25.9(@babel/core@7.26.0) - "@babel/types": 7.26.0 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - regenerator-transform: 0.15.2 - - "@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-imports": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-annotate-as-pure": 7.25.9 - "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 - "@babel/plugin-syntax-typescript": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) - "@babel/helper-plugin-utils": 7.25.9 - - "@babel/preset-env@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/compat-data": 7.26.2 - "@babel/core": 7.26.0 - "@babel/helper-compilation-targets": 7.25.9 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-validator-option": 7.25.9 - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-bugfix-safari-class-field-initializer-scope": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) - "@babel/plugin-syntax-import-assertions": 7.26.0(@babel/core@7.26.0) - "@babel/plugin-syntax-import-attributes": 7.26.0(@babel/core@7.26.0) - "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.26.0) - "@babel/plugin-transform-arrow-functions": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-async-generator-functions": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-async-to-generator": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-block-scoped-functions": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-block-scoping": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-class-properties": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-class-static-block": 7.26.0(@babel/core@7.26.0) - "@babel/plugin-transform-classes": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-computed-properties": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-destructuring": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-dotall-regex": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-duplicate-keys": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-dynamic-import": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-exponentiation-operator": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-export-namespace-from": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-for-of": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-function-name": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-json-strings": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-literals": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-logical-assignment-operators": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-member-expression-literals": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-modules-amd": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-modules-commonjs": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-modules-systemjs": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-modules-umd": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-named-capturing-groups-regex": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-new-target": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-nullish-coalescing-operator": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-numeric-separator": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-object-rest-spread": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-object-super": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-optional-catch-binding": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-optional-chaining": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-parameters": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-private-methods": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-private-property-in-object": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-property-literals": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-regenerator": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-regexp-modifiers": 7.26.0(@babel/core@7.26.0) - "@babel/plugin-transform-reserved-words": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-shorthand-properties": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-spread": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-sticky-regex": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-template-literals": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-typeof-symbol": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-unicode-escapes": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-unicode-property-regex": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-unicode-regex": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-unicode-sets-regex": 7.25.9(@babel/core@7.26.0) - "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.26.0) - babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.39.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - "@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/types": 7.26.0 - esutils: 2.0.3 - - "@babel/preset-react@7.25.9(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-validator-option": 7.25.9 - "@babel/plugin-transform-react-display-name": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-react-jsx": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-react-jsx-development": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-react-pure-annotations": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/preset-typescript@7.26.0(@babel/core@7.26.0)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-plugin-utils": 7.25.9 - "@babel/helper-validator-option": 7.25.9 - "@babel/plugin-syntax-jsx": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-modules-commonjs": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-typescript": 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - "@babel/runtime@7.26.0": - dependencies: - regenerator-runtime: 0.14.1 - - "@babel/template@7.25.9": - dependencies: - "@babel/code-frame": 7.26.2 - "@babel/parser": 7.26.2 - "@babel/types": 7.26.0 - - "@babel/traverse@7.25.9": - dependencies: - "@babel/code-frame": 7.26.2 - "@babel/generator": 7.26.2 - "@babel/parser": 7.26.2 - "@babel/template": 7.25.9 - "@babel/types": 7.26.0 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - "@babel/types@7.26.0": - dependencies: - "@babel/helper-string-parser": 7.25.9 - "@babel/helper-validator-identifier": 7.25.9 - - "@bcoe/v8-coverage@0.2.3": {} - - "@csstools/normalize.css@12.1.1": {} - - "@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.49)": - dependencies: - "@csstools/selector-specificity": 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - "@csstools/postcss-color-function@1.1.1(postcss@8.4.49)": - dependencies: - "@csstools/postcss-progressive-custom-properties": 1.3.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-hwb-function@1.0.2(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-ic-unit@1.0.1(postcss@8.4.49)": - dependencies: - "@csstools/postcss-progressive-custom-properties": 1.3.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.49)": - dependencies: - "@csstools/selector-specificity": 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - "@csstools/postcss-nested-calc@1.0.0(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-oklab-function@1.1.1(postcss@8.4.49)": - dependencies: - "@csstools/postcss-progressive-custom-properties": 1.3.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - "@csstools/postcss-unset-value@1.0.2(postcss@8.4.49)": - dependencies: - postcss: 8.4.49 - - "@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)": - dependencies: - postcss-selector-parser: 6.1.2 - - "@emotion/is-prop-valid@1.2.2": - dependencies: - "@emotion/memoize": 0.8.1 - - "@emotion/memoize@0.8.1": {} - - "@emotion/unitless@0.8.1": {} - - "@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)": - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - "@eslint-community/regexpp@4.12.1": {} - - "@eslint/eslintrc@2.1.4": - dependencies: - ajv: 6.12.6 - debug: 4.3.7 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - "@eslint/js@8.57.1": {} - - "@humanwhocodes/config-array@0.13.0": - dependencies: - "@humanwhocodes/object-schema": 2.0.3 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - "@humanwhocodes/module-importer@1.0.1": {} - - "@humanwhocodes/object-schema@2.0.3": {} - - "@isaacs/cliui@8.0.2": - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - "@istanbuljs/load-nyc-config@1.1.0": - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - "@istanbuljs/schema@0.1.3": {} - - "@jest/console@27.5.1": - dependencies: - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - chalk: 4.1.2 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - - "@jest/console@28.1.3": - dependencies: - "@jest/types": 28.1.3 - "@types/node": 22.9.3 - chalk: 4.1.2 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - slash: 3.0.0 - - "@jest/core@27.5.1": - dependencies: - "@jest/console": 27.5.1 - "@jest/reporters": 27.5.1 - "@jest/test-result": 27.5.1 - "@jest/transform": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 27.5.1 - jest-config: 27.5.1 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 - micromatch: 4.0.8 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - - "@jest/environment@27.5.1": - dependencies: - "@jest/fake-timers": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - jest-mock: 27.5.1 - - "@jest/fake-timers@27.5.1": - dependencies: - "@jest/types": 27.5.1 - "@sinonjs/fake-timers": 8.1.0 - "@types/node": 22.9.3 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 - - "@jest/globals@27.5.1": - dependencies: - "@jest/environment": 27.5.1 - "@jest/types": 27.5.1 - expect: 27.5.1 - - "@jest/reporters@27.5.1": - dependencies: - "@bcoe/v8-coverage": 0.2.3 - "@jest/console": 27.5.1 - "@jest/test-result": 27.5.1 - "@jest/transform": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-haste-map: 27.5.1 - jest-resolve: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 4.0.2 - terminal-link: 2.1.1 - v8-to-istanbul: 8.1.1 - transitivePeerDependencies: - - supports-color - - "@jest/schemas@28.1.3": - dependencies: - "@sinclair/typebox": 0.24.51 - - "@jest/source-map@27.5.1": - dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.11 - source-map: 0.6.1 - - "@jest/test-result@27.5.1": - dependencies: - "@jest/console": 27.5.1 - "@jest/types": 27.5.1 - "@types/istanbul-lib-coverage": 2.0.6 - collect-v8-coverage: 1.0.2 - - "@jest/test-result@28.1.3": - dependencies: - "@jest/console": 28.1.3 - "@jest/types": 28.1.3 - "@types/istanbul-lib-coverage": 2.0.6 - collect-v8-coverage: 1.0.2 - - "@jest/test-sequencer@27.5.1": - dependencies: - "@jest/test-result": 27.5.1 - graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-runtime: 27.5.1 - transitivePeerDependencies: - - supports-color - - "@jest/transform@27.5.1": - dependencies: - "@babel/core": 7.26.0 - "@jest/types": 27.5.1 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - micromatch: 4.0.8 - pirates: 4.0.6 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 - transitivePeerDependencies: - - supports-color - - "@jest/types@27.5.1": - dependencies: - "@types/istanbul-lib-coverage": 2.0.6 - "@types/istanbul-reports": 3.0.4 - "@types/node": 22.9.3 - "@types/yargs": 16.0.9 - chalk: 4.1.2 - - "@jest/types@28.1.3": - dependencies: - "@jest/schemas": 28.1.3 - "@types/istanbul-lib-coverage": 2.0.6 - "@types/istanbul-reports": 3.0.4 - "@types/node": 22.9.3 - "@types/yargs": 17.0.33 - chalk: 4.1.2 - - "@jridgewell/gen-mapping@0.3.5": - dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.5.0 - "@jridgewell/trace-mapping": 0.3.25 - - "@jridgewell/resolve-uri@3.1.2": {} - - "@jridgewell/set-array@1.2.1": {} - - "@jridgewell/source-map@0.3.6": - dependencies: - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 - - "@jridgewell/sourcemap-codec@1.5.0": {} - - "@jridgewell/trace-mapping@0.3.25": - dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.0 - - "@leichtgewicht/ip-codec@2.0.5": {} - - "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - dependencies: - eslint-scope: 5.1.1 - - "@nodelib/fs.scandir@2.1.5": - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - "@nodelib/fs.stat@2.0.5": {} - - "@nodelib/fs.walk@1.2.8": - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.17.1 - - "@pkgjs/parseargs@0.11.0": - optional: true - - "@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(webpack@5.96.1))(webpack@5.96.1)": - dependencies: - ansi-html: 0.0.9 - core-js-pure: 3.39.0 - error-stack-parser: 2.1.4 - html-entities: 2.5.2 - loader-utils: 2.0.4 - react-refresh: 0.11.0 - schema-utils: 4.2.0 - source-map: 0.7.4 - webpack: 5.96.1 - optionalDependencies: - type-fest: 0.21.3 - webpack-dev-server: 4.15.2(webpack@5.96.1) - - "@remix-run/router@1.21.0": {} - - "@rollup/plugin-babel@5.3.1(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@2.79.2)": - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-module-imports": 7.25.9 - "@rollup/pluginutils": 3.1.0(rollup@2.79.2) - rollup: 2.79.2 - optionalDependencies: - "@types/babel__core": 7.20.5 - transitivePeerDependencies: - - supports-color - - "@rollup/plugin-node-resolve@11.2.1(rollup@2.79.2)": - dependencies: - "@rollup/pluginutils": 3.1.0(rollup@2.79.2) - "@types/resolve": 1.17.1 - builtin-modules: 3.3.0 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.8 - rollup: 2.79.2 - - "@rollup/plugin-replace@2.4.2(rollup@2.79.2)": - dependencies: - "@rollup/pluginutils": 3.1.0(rollup@2.79.2) - magic-string: 0.25.9 - rollup: 2.79.2 - - "@rollup/pluginutils@3.1.0(rollup@2.79.2)": - dependencies: - "@types/estree": 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.2 - - "@rtsao/scc@1.1.0": {} - - "@rushstack/eslint-patch@1.10.4": {} - - "@sinclair/typebox@0.24.51": {} - - "@sinonjs/commons@1.8.6": - dependencies: - type-detect: 4.0.8 - - "@sinonjs/fake-timers@8.1.0": - dependencies: - "@sinonjs/commons": 1.8.6 - - "@surma/rollup-plugin-off-main-thread@2.2.3": - dependencies: - ejs: 3.1.10 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.11 - - "@svgr/babel-plugin-add-jsx-attribute@5.4.0": {} - - "@svgr/babel-plugin-remove-jsx-attribute@5.4.0": {} - - "@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1": {} - - "@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1": {} - - "@svgr/babel-plugin-svg-dynamic-title@5.4.0": {} - - "@svgr/babel-plugin-svg-em-dimensions@5.4.0": {} - - "@svgr/babel-plugin-transform-react-native-svg@5.4.0": {} - - "@svgr/babel-plugin-transform-svg-component@5.5.0": {} - - "@svgr/babel-preset@5.5.0": - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": 5.4.0 - "@svgr/babel-plugin-remove-jsx-attribute": 5.4.0 - "@svgr/babel-plugin-remove-jsx-empty-expression": 5.0.1 - "@svgr/babel-plugin-replace-jsx-attribute-value": 5.0.1 - "@svgr/babel-plugin-svg-dynamic-title": 5.4.0 - "@svgr/babel-plugin-svg-em-dimensions": 5.4.0 - "@svgr/babel-plugin-transform-react-native-svg": 5.4.0 - "@svgr/babel-plugin-transform-svg-component": 5.5.0 - - "@svgr/core@5.5.0": - dependencies: - "@svgr/plugin-jsx": 5.5.0 - camelcase: 6.3.0 - cosmiconfig: 7.1.0 - transitivePeerDependencies: - - supports-color - - "@svgr/hast-util-to-babel-ast@5.5.0": - dependencies: - "@babel/types": 7.26.0 - - "@svgr/plugin-jsx@5.5.0": - dependencies: - "@babel/core": 7.26.0 - "@svgr/babel-preset": 5.5.0 - "@svgr/hast-util-to-babel-ast": 5.5.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color - - "@svgr/plugin-svgo@5.5.0": - dependencies: - cosmiconfig: 7.1.0 - deepmerge: 4.3.1 - svgo: 1.3.2 - - "@svgr/webpack@5.5.0": - dependencies: - "@babel/core": 7.26.0 - "@babel/plugin-transform-react-constant-elements": 7.25.9(@babel/core@7.26.0) - "@babel/preset-env": 7.26.0(@babel/core@7.26.0) - "@babel/preset-react": 7.25.9(@babel/core@7.26.0) - "@svgr/core": 5.5.0 - "@svgr/plugin-jsx": 5.5.0 - "@svgr/plugin-svgo": 5.5.0 - loader-utils: 2.0.4 - transitivePeerDependencies: - - supports-color - - "@tootallnate/once@1.1.2": {} - - "@trysound/sax@0.2.0": {} - - "@types/babel__core@7.20.5": - dependencies: - "@babel/parser": 7.26.2 - "@babel/types": 7.26.0 - "@types/babel__generator": 7.6.8 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.20.6 - - "@types/babel__generator@7.6.8": - dependencies: - "@babel/types": 7.26.0 - - "@types/babel__template@7.4.4": - dependencies: - "@babel/parser": 7.26.2 - "@babel/types": 7.26.0 - - "@types/babel__traverse@7.20.6": - dependencies: - "@babel/types": 7.26.0 - - "@types/body-parser@1.19.5": - dependencies: - "@types/connect": 3.4.38 - "@types/node": 22.9.3 - - "@types/bonjour@3.5.13": - dependencies: - "@types/node": 22.9.3 - - "@types/connect-history-api-fallback@1.5.4": - dependencies: - "@types/express-serve-static-core": 5.0.2 - "@types/node": 22.9.3 - - "@types/connect@3.4.38": - dependencies: - "@types/node": 22.9.3 - - "@types/eslint-scope@3.7.7": - dependencies: - "@types/eslint": 9.6.1 - "@types/estree": 1.0.6 - - "@types/eslint@8.56.12": - dependencies: - "@types/estree": 1.0.6 - "@types/json-schema": 7.0.15 - - "@types/eslint@9.6.1": - dependencies: - "@types/estree": 1.0.6 - "@types/json-schema": 7.0.15 - - "@types/estree@0.0.39": {} - - "@types/estree@1.0.6": {} - - "@types/express-serve-static-core@4.19.6": - dependencies: - "@types/node": 22.9.3 - "@types/qs": 6.9.17 - "@types/range-parser": 1.2.7 - "@types/send": 0.17.4 - - "@types/express-serve-static-core@5.0.2": - dependencies: - "@types/node": 22.9.3 - "@types/qs": 6.9.17 - "@types/range-parser": 1.2.7 - "@types/send": 0.17.4 - - "@types/express@4.17.21": - dependencies: - "@types/body-parser": 1.19.5 - "@types/express-serve-static-core": 4.19.6 - "@types/qs": 6.9.17 - "@types/serve-static": 1.15.7 - - "@types/graceful-fs@4.1.9": - dependencies: - "@types/node": 22.9.3 - - "@types/html-minifier-terser@6.1.0": {} - - "@types/http-errors@2.0.4": {} - - "@types/http-proxy@1.17.15": - dependencies: - "@types/node": 22.9.3 - - "@types/istanbul-lib-coverage@2.0.6": {} - - "@types/istanbul-lib-report@3.0.3": - dependencies: - "@types/istanbul-lib-coverage": 2.0.6 - - "@types/istanbul-reports@3.0.4": - dependencies: - "@types/istanbul-lib-report": 3.0.3 - - "@types/json-schema@7.0.15": {} - - "@types/json5@0.0.29": {} - - "@types/mime@1.3.5": {} - - "@types/node-forge@1.3.11": - dependencies: - "@types/node": 22.9.3 - - "@types/node@22.9.3": - dependencies: - undici-types: 6.19.8 - - "@types/parse-json@4.0.2": {} - - "@types/prettier@2.7.3": {} - - "@types/prop-types@15.7.13": {} - - "@types/q@1.5.8": {} - - "@types/qs@6.9.17": {} - - "@types/range-parser@1.2.7": {} - - "@types/react-transition-group@4.4.11": - dependencies: - "@types/react": 18.3.12 - - "@types/react@18.3.12": - dependencies: - "@types/prop-types": 15.7.13 - csstype: 3.1.3 - - "@types/resolve@1.17.1": - dependencies: - "@types/node": 22.9.3 - - "@types/retry@0.12.0": {} - - "@types/semver@7.5.8": {} - - "@types/send@0.17.4": - dependencies: - "@types/mime": 1.3.5 - "@types/node": 22.9.3 - - "@types/serve-index@1.9.4": - dependencies: - "@types/express": 4.17.21 - - "@types/serve-static@1.15.7": - dependencies: - "@types/http-errors": 2.0.4 - "@types/node": 22.9.3 - "@types/send": 0.17.4 - - "@types/sockjs@0.3.36": - dependencies: - "@types/node": 22.9.3 - - "@types/stack-utils@2.0.3": {} - - "@types/stylis@4.2.5": {} - - "@types/trusted-types@2.0.7": {} - - "@types/ws@8.5.13": - dependencies: - "@types/node": 22.9.3 - - "@types/yargs-parser@21.0.3": {} - - "@types/yargs@16.0.9": - dependencies: - "@types/yargs-parser": 21.0.3 - - "@types/yargs@17.0.33": - dependencies: - "@types/yargs-parser": 21.0.3 - - "@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)": - dependencies: - "@eslint-community/regexpp": 4.12.1 - "@typescript-eslint/parser": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/type-utils": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - "@typescript-eslint/utils": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.3.7 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - "@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)": - dependencies: - "@typescript-eslint/utils": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - "@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5)": - dependencies: - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0(typescript@4.9.5) - debug: 4.3.7 - eslint: 8.57.1 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - "@typescript-eslint/scope-manager@5.62.0": - dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - - "@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)": - dependencies: - "@typescript-eslint/typescript-estree": 5.62.0(typescript@4.9.5) - "@typescript-eslint/utils": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - debug: 4.3.7 - eslint: 8.57.1 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - "@typescript-eslint/types@5.62.0": {} - - "@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)": - dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - debug: 4.3.7 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - "@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)": - dependencies: - "@eslint-community/eslint-utils": 4.4.1(eslint@8.57.1) - "@types/json-schema": 7.0.15 - "@types/semver": 7.5.8 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0(typescript@4.9.5) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - "@typescript-eslint/visitor-keys@5.62.0": - dependencies: - "@typescript-eslint/types": 5.62.0 - eslint-visitor-keys: 3.4.3 - - "@ungap/structured-clone@1.2.0": {} - - "@webassemblyjs/ast@1.14.1": - dependencies: - "@webassemblyjs/helper-numbers": 1.13.2 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - - "@webassemblyjs/floating-point-hex-parser@1.13.2": {} - - "@webassemblyjs/helper-api-error@1.13.2": {} - - "@webassemblyjs/helper-buffer@1.14.1": {} - - "@webassemblyjs/helper-numbers@1.13.2": - dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.13.2 - "@webassemblyjs/helper-api-error": 1.13.2 - "@xtuc/long": 4.2.2 - - "@webassemblyjs/helper-wasm-bytecode@1.13.2": {} - - "@webassemblyjs/helper-wasm-section@1.14.1": - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-buffer": 1.14.1 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/wasm-gen": 1.14.1 - - "@webassemblyjs/ieee754@1.13.2": - dependencies: - "@xtuc/ieee754": 1.2.0 - - "@webassemblyjs/leb128@1.13.2": - dependencies: - "@xtuc/long": 4.2.2 - - "@webassemblyjs/utf8@1.13.2": {} - - "@webassemblyjs/wasm-edit@1.14.1": - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-buffer": 1.14.1 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/helper-wasm-section": 1.14.1 - "@webassemblyjs/wasm-gen": 1.14.1 - "@webassemblyjs/wasm-opt": 1.14.1 - "@webassemblyjs/wasm-parser": 1.14.1 - "@webassemblyjs/wast-printer": 1.14.1 - - "@webassemblyjs/wasm-gen@1.14.1": - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/ieee754": 1.13.2 - "@webassemblyjs/leb128": 1.13.2 - "@webassemblyjs/utf8": 1.13.2 - - "@webassemblyjs/wasm-opt@1.14.1": - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-buffer": 1.14.1 - "@webassemblyjs/wasm-gen": 1.14.1 - "@webassemblyjs/wasm-parser": 1.14.1 - - "@webassemblyjs/wasm-parser@1.14.1": - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-api-error": 1.13.2 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/ieee754": 1.13.2 - "@webassemblyjs/leb128": 1.13.2 - "@webassemblyjs/utf8": 1.13.2 - - "@webassemblyjs/wast-printer@1.14.1": - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@xtuc/long": 4.2.2 - - "@xtuc/ieee754@1.2.0": {} - - "@xtuc/long@4.2.2": {} - - abab@2.0.6: {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-globals@6.0.0: - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 - - acorn-walk@7.2.0: {} - - acorn@7.4.1: {} - - acorn@8.14.0: {} - - address@1.2.2: {} - - adjust-sourcemap-loader@4.0.0: - dependencies: - loader-utils: 2.0.4 - regex-parser: 2.3.0 - - agent-base@6.0.2: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-html-community@0.0.8: {} - - ansi-html@0.0.9: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@5.0.2: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-query@5.3.2: {} - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-flatten@1.1.1: {} - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-union@2.1.0: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-shim-unscopables: 1.0.2 - - array.prototype.reduce@1.0.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-array-method-boxes-properly: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - is-string: 1.0.7 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - asap@2.0.6: {} - - ast-types-flow@0.0.8: {} - - async@3.2.6: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - - autoprefixer@10.4.20(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001684 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - axe-core@4.10.2: {} - - axios@1.7.7: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - axobject-query@4.1.0: {} - - babel-jest@27.5.1(@babel/core@7.26.0): - dependencies: - "@babel/core": 7.26.0 - "@jest/transform": 27.5.1 - "@jest/types": 27.5.1 - "@types/babel__core": 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.26.0) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-loader@8.4.1(@babel/core@7.26.0)(webpack@5.96.1): - dependencies: - "@babel/core": 7.26.0 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.96.1 - - babel-plugin-istanbul@6.1.1: - dependencies: - "@babel/helper-plugin-utils": 7.25.9 - "@istanbuljs/load-nyc-config": 1.1.0 - "@istanbuljs/schema": 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@27.5.1: - dependencies: - "@babel/template": 7.25.9 - "@babel/types": 7.26.0 - "@types/babel__core": 7.20.5 - "@types/babel__traverse": 7.20.6 - - babel-plugin-macros@3.1.0: - dependencies: - "@babel/runtime": 7.26.0 - cosmiconfig: 7.1.0 - resolve: 1.22.8 - - babel-plugin-named-asset-import@0.3.8(@babel/core@7.26.0): - dependencies: - "@babel/core": 7.26.0 - - babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): - dependencies: - "@babel/compat-data": 7.26.2 - "@babel/core": 7.26.0 - "@babel/helper-define-polyfill-provider": 0.6.3(@babel/core@7.26.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-define-polyfill-provider": 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.39.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): - dependencies: - "@babel/core": 7.26.0 - "@babel/helper-define-polyfill-provider": 0.6.3(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-react-remove-prop-types@0.4.24: {} - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): - dependencies: - "@babel/core": 7.26.0 - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.26.0) - "@babel/plugin-syntax-bigint": 7.8.3(@babel/core@7.26.0) - "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.26.0) - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.26.0) - "@babel/plugin-syntax-import-attributes": 7.26.0(@babel/core@7.26.0) - "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.26.0) - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.26.0) - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.26.0) - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.26.0) - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.26.0) - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.26.0) - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.26.0) - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.26.0) - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.26.0) - "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.26.0) - - babel-preset-jest@27.5.1(@babel/core@7.26.0): - dependencies: - "@babel/core": 7.26.0 - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) - - babel-preset-react-app@10.0.1: - dependencies: - "@babel/core": 7.26.0 - "@babel/plugin-proposal-class-properties": 7.18.6(@babel/core@7.26.0) - "@babel/plugin-proposal-decorators": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-proposal-nullish-coalescing-operator": 7.18.6(@babel/core@7.26.0) - "@babel/plugin-proposal-numeric-separator": 7.18.6(@babel/core@7.26.0) - "@babel/plugin-proposal-optional-chaining": 7.21.0(@babel/core@7.26.0) - "@babel/plugin-proposal-private-methods": 7.18.6(@babel/core@7.26.0) - "@babel/plugin-proposal-private-property-in-object": 7.21.11(@babel/core@7.26.0) - "@babel/plugin-transform-flow-strip-types": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-react-display-name": 7.25.9(@babel/core@7.26.0) - "@babel/plugin-transform-runtime": 7.25.9(@babel/core@7.26.0) - "@babel/preset-env": 7.26.0(@babel/core@7.26.0) - "@babel/preset-react": 7.25.9(@babel/core@7.26.0) - "@babel/preset-typescript": 7.26.0(@babel/core@7.26.0) - "@babel/runtime": 7.26.0 - babel-plugin-macros: 3.1.0 - babel-plugin-transform-react-remove-prop-types: 0.4.24 - transitivePeerDependencies: - - supports-color - - balanced-match@1.0.2: {} - - batch@0.6.1: {} - - bfj@7.1.0: - dependencies: - bluebird: 3.7.2 - check-types: 11.2.3 - hoopy: 0.1.4 - jsonpath: 1.1.1 - tryer: 1.0.1 - - big.js@5.2.2: {} - - binary-extensions@2.3.0: {} - - bluebird@3.7.2: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - bonjour-service@1.3.0: - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - - boolbase@1.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-image-compression@2.0.2: - dependencies: - uzip: 0.20201231.0 - - browser-process-hrtime@1.0.0: {} - - browserslist@4.24.2: - dependencies: - caniuse-lite: 1.0.30001684 - electron-to-chromium: 1.5.64 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - - buffer-from@1.1.2: {} - - builtin-modules@3.3.0: {} - - bytes@3.1.2: {} - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - callsites@3.1.0: {} - - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.8.1 - - camelcase-css@2.0.1: {} - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - camelize@1.0.1: {} - - caniuse-api@3.0.0: - dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001684 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - - caniuse-lite@1.0.30001684: {} - - case-sensitive-paths-webpack-plugin@2.4.0: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - char-regex@1.0.2: {} - - char-regex@2.0.2: {} - - check-types@11.2.3: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chrome-trace-event@1.0.4: {} - - ci-info@3.9.0: {} - - cjs-module-lexer@1.4.1: {} - - clean-css@5.3.3: - dependencies: - source-map: 0.6.1 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - co@4.6.0: {} - - coa@2.0.2: - dependencies: - "@types/q": 1.5.8 - chalk: 2.4.2 - q: 1.5.1 - - collect-v8-coverage@1.0.2: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - colord@2.9.3: {} - - colorette@2.0.20: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@2.20.3: {} - - commander@4.1.1: {} - - commander@7.2.0: {} - - commander@8.3.0: {} - - common-tags@1.8.2: {} - - commondir@1.0.1: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.53.0 - - compression@1.7.5: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.0.2 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-map@0.0.1: {} - - confusing-browser-globals@1.0.11: {} - - connect-history-api-fallback@2.0.0: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.6: {} - - cookie@0.7.1: {} - - core-js-compat@3.39.0: - dependencies: - browserslist: 4.24.2 - - core-js-pure@3.39.0: {} - - core-js@3.39.0: {} - - core-util-is@1.0.3: {} - - cosmiconfig@6.0.0: - dependencies: - "@types/parse-json": 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - cosmiconfig@7.1.0: - dependencies: - "@types/parse-json": 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypto-random-string@2.0.0: {} - - css-blank-pseudo@3.0.3(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - css-color-keywords@1.0.0: {} - - css-declaration-sorter@6.4.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - css-declaration-sorter@7.2.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - css-has-pseudo@3.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - css-loader@6.11.0(webpack@5.96.1): - dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) - postcss-modules-local-by-default: 4.1.0(postcss@8.4.49) - postcss-modules-scope: 3.2.1(postcss@8.4.49) - postcss-modules-values: 4.0.0(postcss@8.4.49) - postcss-value-parser: 4.2.0 - semver: 7.6.3 - optionalDependencies: - webpack: 5.96.1 - - css-minimizer-webpack-plugin@3.4.1(webpack@5.96.1): - dependencies: - cssnano: 5.1.15(postcss@8.4.49) - jest-worker: 27.5.1 - postcss: 8.4.49 - schema-utils: 4.2.0 - serialize-javascript: 6.0.2 - source-map: 0.6.1 - webpack: 5.96.1 - - css-prefers-color-scheme@6.0.3(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - css-select-base-adapter@0.1.1: {} - - css-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-what: 3.4.2 - domutils: 1.7.0 - nth-check: 1.0.2 - - css-select@4.3.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - - css-select@5.1.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 - - css-to-react-native@3.2.0: - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - - css-tree@1.0.0-alpha.37: - dependencies: - mdn-data: 2.0.4 - source-map: 0.6.1 - - css-tree@1.1.3: - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - - css-tree@2.2.1: - dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.1 - - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - - css-what@3.4.2: {} - - css-what@6.1.0: {} - - cssdb@7.11.2: {} - - cssesc@3.0.0: {} - - cssnano-preset-default@5.2.14(postcss@8.4.49): - dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.49) - cssnano-utils: 3.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-calc: 8.2.4(postcss@8.4.49) - postcss-colormin: 5.3.1(postcss@8.4.49) - postcss-convert-values: 5.1.3(postcss@8.4.49) - postcss-discard-comments: 5.1.2(postcss@8.4.49) - postcss-discard-duplicates: 5.1.0(postcss@8.4.49) - postcss-discard-empty: 5.1.1(postcss@8.4.49) - postcss-discard-overridden: 5.1.0(postcss@8.4.49) - postcss-merge-longhand: 5.1.7(postcss@8.4.49) - postcss-merge-rules: 5.1.4(postcss@8.4.49) - postcss-minify-font-values: 5.1.0(postcss@8.4.49) - postcss-minify-gradients: 5.1.1(postcss@8.4.49) - postcss-minify-params: 5.1.4(postcss@8.4.49) - postcss-minify-selectors: 5.2.1(postcss@8.4.49) - postcss-normalize-charset: 5.1.0(postcss@8.4.49) - postcss-normalize-display-values: 5.1.0(postcss@8.4.49) - postcss-normalize-positions: 5.1.1(postcss@8.4.49) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.49) - postcss-normalize-string: 5.1.0(postcss@8.4.49) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.49) - postcss-normalize-unicode: 5.1.1(postcss@8.4.49) - postcss-normalize-url: 5.1.0(postcss@8.4.49) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.49) - postcss-ordered-values: 5.1.3(postcss@8.4.49) - postcss-reduce-initial: 5.1.2(postcss@8.4.49) - postcss-reduce-transforms: 5.1.0(postcss@8.4.49) - postcss-svgo: 5.1.0(postcss@8.4.49) - postcss-unique-selectors: 5.1.1(postcss@8.4.49) - - cssnano-preset-default@7.0.6(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - css-declaration-sorter: 7.2.0(postcss@8.4.49) - cssnano-utils: 5.0.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-calc: 10.0.2(postcss@8.4.49) - postcss-colormin: 7.0.2(postcss@8.4.49) - postcss-convert-values: 7.0.4(postcss@8.4.49) - postcss-discard-comments: 7.0.3(postcss@8.4.49) - postcss-discard-duplicates: 7.0.1(postcss@8.4.49) - postcss-discard-empty: 7.0.0(postcss@8.4.49) - postcss-discard-overridden: 7.0.0(postcss@8.4.49) - postcss-merge-longhand: 7.0.4(postcss@8.4.49) - postcss-merge-rules: 7.0.4(postcss@8.4.49) - postcss-minify-font-values: 7.0.0(postcss@8.4.49) - postcss-minify-gradients: 7.0.0(postcss@8.4.49) - postcss-minify-params: 7.0.2(postcss@8.4.49) - postcss-minify-selectors: 7.0.4(postcss@8.4.49) - postcss-normalize-charset: 7.0.0(postcss@8.4.49) - postcss-normalize-display-values: 7.0.0(postcss@8.4.49) - postcss-normalize-positions: 7.0.0(postcss@8.4.49) - postcss-normalize-repeat-style: 7.0.0(postcss@8.4.49) - postcss-normalize-string: 7.0.0(postcss@8.4.49) - postcss-normalize-timing-functions: 7.0.0(postcss@8.4.49) - postcss-normalize-unicode: 7.0.2(postcss@8.4.49) - postcss-normalize-url: 7.0.0(postcss@8.4.49) - postcss-normalize-whitespace: 7.0.0(postcss@8.4.49) - postcss-ordered-values: 7.0.1(postcss@8.4.49) - postcss-reduce-initial: 7.0.2(postcss@8.4.49) - postcss-reduce-transforms: 7.0.0(postcss@8.4.49) - postcss-svgo: 7.0.1(postcss@8.4.49) - postcss-unique-selectors: 7.0.3(postcss@8.4.49) - - cssnano-utils@3.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - cssnano-utils@5.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - cssnano@5.1.15(postcss@8.4.49): - dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.49) - lilconfig: 2.1.0 - postcss: 8.4.49 - yaml: 1.10.2 - - cssnano@7.0.6(postcss@8.4.49): - dependencies: - cssnano-preset-default: 7.0.6(postcss@8.4.49) - lilconfig: 3.1.2 - postcss: 8.4.49 - - csso@4.2.0: - dependencies: - css-tree: 1.1.3 - - csso@5.0.5: - dependencies: - css-tree: 2.2.1 - - cssom@0.3.8: {} - - cssom@0.4.4: {} - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - - csstype@3.1.3: {} - - damerau-levenshtein@1.0.8: {} - - data-urls@2.0.0: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - decimal.js@10.4.3: {} - - dedent@0.7.0: {} - - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - - default-gateway@6.0.3: - dependencies: - execa: 5.1.1 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-lazy-prop@2.0.0: {} - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delayed-stream@1.0.0: {} - - depd@1.1.2: {} - - depd@2.0.0: {} - - destroy@1.2.0: {} - - detect-newline@3.1.0: {} - - detect-node@2.1.0: {} - - detect-port-alt@1.1.6: - dependencies: - address: 1.2.2 - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - - didyoumean@1.2.2: {} - - diff-sequences@27.5.1: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dlv@1.1.3: {} - - dns-packet@5.6.1: - dependencies: - "@leichtgewicht/ip-codec": 2.0.5 - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-converter@0.2.0: - dependencies: - utila: 0.4.0 - - dom-helpers@5.2.1: - dependencies: - "@babel/runtime": 7.26.0 - csstype: 3.1.3 - - dom-serializer@0.2.2: - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@1.3.1: {} - - domelementtype@2.3.0: {} - - domexception@2.0.1: - dependencies: - webidl-conversions: 5.0.0 - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@1.7.0: - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - domutils@3.1.0: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - dotenv-expand@5.1.0: {} - - dotenv@10.0.0: {} - - duplexer@0.1.2: {} - - eastasianwidth@0.2.0: {} - - ee-first@1.1.1: {} - - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.64: {} - - emittery@0.10.2: {} - - emittery@0.8.1: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - emojis-list@3.0.0: {} - - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - enhanced-resolve@5.17.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - entities@2.2.0: {} - - entities@4.5.0: {} - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - error-stack-parser@2.1.4: - dependencies: - stackframe: 1.3.4 - - es-abstract@1.23.5: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.3 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.3 - typed-array-length: 1.0.7 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-array-method-boxes-properly@1.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-iterator-helpers@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 - - es-module-lexer@1.5.4: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@2.0.0: {} - - escape-string-regexp@4.0.0: {} - - escodegen@1.14.3: - dependencies: - esprima: 4.0.1 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5): - dependencies: - "@babel/core": 7.26.0 - "@babel/eslint-parser": 7.25.9(@babel/core@7.26.0)(eslint@8.57.1) - "@rushstack/eslint-patch": 1.10.4 - "@typescript-eslint/eslint-plugin": 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - "@typescript-eslint/parser": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.57.1 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.2(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - eslint-plugin-testing-library: 5.11.1(eslint@8.57.1)(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - "@babel/plugin-syntax-flow" - - "@babel/plugin-transform-react-jsx" - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - "@typescript-eslint/parser": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1): - dependencies: - "@babel/plugin-syntax-flow": 7.26.0(@babel/core@7.26.0) - "@babel/plugin-transform-react-jsx": 7.25.9(@babel/core@7.26.0) - eslint: 8.57.1 - lodash: 4.17.21 - string-natural-compare: 3.0.1 - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1): - dependencies: - "@rtsao/scc": 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - string.prototype.trimend: 1.0.8 - tsconfig-paths: 3.15.0 - optionalDependencies: - "@typescript-eslint/parser": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5): - dependencies: - "@typescript-eslint/experimental-utils": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - optionalDependencies: - "@typescript-eslint/eslint-plugin": 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) - jest: 27.5.1 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.10.2 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.1 - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react@7.37.2(eslint@8.57.1): - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - string.prototype.repeat: 1.0.0 - - eslint-plugin-testing-library@5.11.1(eslint@8.57.1)(typescript@4.9.5): - dependencies: - "@typescript-eslint/utils": 5.62.0(eslint@8.57.1)(typescript@4.9.5) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@2.1.0: {} - - eslint-visitor-keys@3.4.3: {} - - eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.96.1): - dependencies: - "@types/eslint": 8.56.12 - eslint: 8.57.1 - jest-worker: 28.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - schema-utils: 4.2.0 - webpack: 5.96.1 - - eslint@8.57.1: - dependencies: - "@eslint-community/eslint-utils": 4.4.1(eslint@8.57.1) - "@eslint-community/regexpp": 4.12.1 - "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.57.1 - "@humanwhocodes/config-array": 0.13.0 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - "@ungap/structured-clone": 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.3.7 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 - - esprima@1.2.2: {} - - esprima@4.0.1: {} - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - estree-walker@1.0.1: {} - - esutils@2.0.3: {} - - etag@1.8.1: {} - - eventemitter3@4.0.7: {} - - events@3.3.0: {} - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - exit@0.1.2: {} - - expect@27.5.1: - dependencies: - "@jest/types": 27.5.1 - jest-get-type: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - - express@4.21.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.10 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.2: - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-uri@3.0.3: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - file-loader@6.2.0(webpack@5.96.1): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.96.1 - - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - - filesize@8.0.7: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-cache-dir@3.3.2: - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.2 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.2: {} - - follow-redirects@1.15.9: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.96.1): - dependencies: - "@babel/code-frame": 7.26.2 - "@types/json-schema": 7.0.15 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 6.0.0 - deepmerge: 4.3.1 - fs-extra: 9.1.0 - glob: 7.2.3 - memfs: 3.5.3 - minimatch: 3.1.2 - schema-utils: 2.7.0 - semver: 7.6.3 - tapable: 1.1.3 - typescript: 4.9.5 - webpack: 5.96.1 - optionalDependencies: - eslint: 8.57.1 - - form-data@3.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - fraction.js@4.3.7: {} - - fresh@0.5.2: {} - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-monkey@1.0.6: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - get-own-enumerable-property-symbols@3.0.2: {} - - get-package-type@0.1.0: {} - - get-stream@6.0.1: {} - - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regexp@0.4.1: {} - - glob@10.4.5: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - global-modules@2.0.0: - dependencies: - global-prefix: 3.0.0 - - global-prefix@3.0.0: - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - - globals@11.12.0: {} - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - - handle-thing@2.0.1: {} - - harmony-reflect@1.6.2: {} - - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - hoopy@0.1.4: {} - - hpack.js@2.1.6: - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - - html-encoding-sniffer@2.0.1: - dependencies: - whatwg-encoding: 1.0.5 - - html-entities@2.5.2: {} - - html-escaper@2.0.2: {} - - html-minifier-terser@6.1.0: - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.3 - commander: 8.3.0 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.36.0 - - html-webpack-plugin@5.6.3(webpack@5.96.1): - dependencies: - "@types/html-minifier-terser": 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - optionalDependencies: - webpack: 5.96.1 - - htmlparser2@6.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - - http-deceiver@1.2.7: {} - - http-errors@1.6.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-parser-js@0.5.8: {} - - http-proxy-agent@4.0.1: - dependencies: - "@tootallnate/once": 1.1.2 - agent-base: 6.0.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - http-proxy-middleware@2.0.7(@types/express@4.17.21): - dependencies: - "@types/http-proxy": 1.17.15 - http-proxy: 1.18.1 - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.8 - optionalDependencies: - "@types/express": 4.17.21 - transitivePeerDependencies: - - debug - - http-proxy@1.18.1: - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.9 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - icss-utils@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - idb@7.1.1: {} - - identity-obj-proxy@3.0.0: - dependencies: - harmony-reflect: 1.6.2 - - ignore@5.3.2: {} - - immer@9.0.21: {} - - immutable@5.0.3: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.3: {} - - inherits@2.0.4: {} - - ini@1.3.8: {} - - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - - ipaddr.js@1.9.1: {} - - ipaddr.js@2.2.0: {} - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-arrayish@0.2.1: {} - - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - - is-docker@2.2.1: {} - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.1.0: - dependencies: - call-bind: 1.0.7 - - is-fullwidth-code-point@3.0.0: {} - - is-generator-fn@2.1.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-map@2.0.3: {} - - is-module@1.0.0: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-obj@1.0.1: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@3.0.0: {} - - is-potential-custom-element-name@1.0.1: {} - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-regexp@1.0.0: {} - - is-root@2.1.0: {} - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - - is-stream@2.0.1: {} - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-typedarray@1.0.0: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - isarray@1.0.0: {} - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - "@babel/core": 7.26.0 - "@babel/parser": 7.26.2 - "@istanbuljs/schema": 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.3.7 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - iterator.prototype@1.1.3: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.7 - set-function-name: 2.0.2 - - jackspeak@3.4.3: - dependencies: - "@isaacs/cliui": 8.0.2 - optionalDependencies: - "@pkgjs/parseargs": 0.11.0 - - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - jest-changed-files@27.5.1: - dependencies: - "@jest/types": 27.5.1 - execa: 5.1.1 - throat: 6.0.2 - - jest-circus@27.5.1: - dependencies: - "@jest/environment": 27.5.1 - "@jest/test-result": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.6 - throat: 6.0.2 - transitivePeerDependencies: - - supports-color - - jest-cli@27.5.1: - dependencies: - "@jest/core": 27.5.1 - "@jest/test-result": 27.5.1 - "@jest/types": 27.5.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.2.0 - jest-config: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - prompts: 2.4.2 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - - jest-config@27.5.1: - dependencies: - "@babel/core": 7.26.0 - "@jest/test-sequencer": 27.5.1 - "@jest/types": 27.5.1 - babel-jest: 27.5.1(@babel/core@7.26.0) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-diff@27.5.1: - dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - - jest-docblock@27.5.1: - dependencies: - detect-newline: 3.1.0 - - jest-each@27.5.1: - dependencies: - "@jest/types": 27.5.1 - chalk: 4.1.2 - jest-get-type: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - - jest-environment-jsdom@27.5.1: - dependencies: - "@jest/environment": 27.5.1 - "@jest/fake-timers": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - jest-mock: 27.5.1 - jest-util: 27.5.1 - jsdom: 16.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-environment-node@27.5.1: - dependencies: - "@jest/environment": 27.5.1 - "@jest/fake-timers": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - jest-mock: 27.5.1 - jest-util: 27.5.1 - - jest-get-type@27.5.1: {} - - jest-haste-map@27.5.1: - dependencies: - "@jest/types": 27.5.1 - "@types/graceful-fs": 4.1.9 - "@types/node": 22.9.3 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 27.5.1 - jest-serializer: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-jasmine2@27.5.1: - dependencies: - "@jest/environment": 27.5.1 - "@jest/source-map": 27.5.1 - "@jest/test-result": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - chalk: 4.1.2 - co: 4.6.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - throat: 6.0.2 - transitivePeerDependencies: - - supports-color - - jest-leak-detector@27.5.1: - dependencies: - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - - jest-matcher-utils@27.5.1: - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - - jest-message-util@27.5.1: - dependencies: - "@babel/code-frame": 7.26.2 - "@jest/types": 27.5.1 - "@types/stack-utils": 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-message-util@28.1.3: - dependencies: - "@babel/code-frame": 7.26.2 - "@jest/types": 28.1.3 - "@types/stack-utils": 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@27.5.1: - dependencies: - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - - jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): - optionalDependencies: - jest-resolve: 27.5.1 - - jest-regex-util@27.5.1: {} - - jest-regex-util@28.0.2: {} - - jest-resolve-dependencies@27.5.1: - dependencies: - "@jest/types": 27.5.1 - jest-regex-util: 27.5.1 - jest-snapshot: 27.5.1 - transitivePeerDependencies: - - supports-color - - jest-resolve@27.5.1: - dependencies: - "@jest/types": 27.5.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) - jest-util: 27.5.1 - jest-validate: 27.5.1 - resolve: 1.22.8 - resolve.exports: 1.1.1 - slash: 3.0.0 - - jest-runner@27.5.1: - dependencies: - "@jest/console": 27.5.1 - "@jest/environment": 27.5.1 - "@jest/test-result": 27.5.1 - "@jest/transform": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - chalk: 4.1.2 - emittery: 0.8.1 - graceful-fs: 4.2.11 - jest-docblock: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-haste-map: 27.5.1 - jest-leak-detector: 27.5.1 - jest-message-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runtime: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - source-map-support: 0.5.21 - throat: 6.0.2 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-runtime@27.5.1: - dependencies: - "@jest/environment": 27.5.1 - "@jest/fake-timers": 27.5.1 - "@jest/globals": 27.5.1 - "@jest/source-map": 27.5.1 - "@jest/test-result": 27.5.1 - "@jest/transform": 27.5.1 - "@jest/types": 27.5.1 - chalk: 4.1.2 - cjs-module-lexer: 1.4.1 - collect-v8-coverage: 1.0.2 - execa: 5.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - - jest-serializer@27.5.1: - dependencies: - "@types/node": 22.9.3 - graceful-fs: 4.2.11 - - jest-snapshot@27.5.1: - dependencies: - "@babel/core": 7.26.0 - "@babel/generator": 7.26.2 - "@babel/plugin-syntax-typescript": 7.25.9(@babel/core@7.26.0) - "@babel/traverse": 7.25.9 - "@babel/types": 7.26.0 - "@jest/transform": 27.5.1 - "@jest/types": 27.5.1 - "@types/babel__traverse": 7.20.6 - "@types/prettier": 2.7.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) - chalk: 4.1.2 - expect: 27.5.1 - graceful-fs: 4.2.11 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - jest-haste-map: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - natural-compare: 1.4.0 - pretty-format: 27.5.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - jest-util@27.5.1: - dependencies: - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-util@28.1.3: - dependencies: - "@jest/types": 28.1.3 - "@types/node": 22.9.3 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-validate@27.5.1: - dependencies: - "@jest/types": 27.5.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 27.5.1 - leven: 3.1.0 - pretty-format: 27.5.1 - - jest-watch-typeahead@1.1.0(jest@27.5.1): - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest: 27.5.1 - jest-regex-util: 28.0.2 - jest-watcher: 28.1.3 - slash: 4.0.0 - string-length: 5.0.1 - strip-ansi: 7.1.0 - - jest-watcher@27.5.1: - dependencies: - "@jest/test-result": 27.5.1 - "@jest/types": 27.5.1 - "@types/node": 22.9.3 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest-util: 27.5.1 - string-length: 4.0.2 - - jest-watcher@28.1.3: - dependencies: - "@jest/test-result": 28.1.3 - "@jest/types": 28.1.3 - "@types/node": 22.9.3 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.10.2 - jest-util: 28.1.3 - string-length: 4.0.2 - - jest-worker@26.6.2: - dependencies: - "@types/node": 22.9.3 - merge-stream: 2.0.0 - supports-color: 7.2.0 - - jest-worker@27.5.1: - dependencies: - "@types/node": 22.9.3 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest-worker@28.1.3: - dependencies: - "@types/node": 22.9.3 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest@27.5.1: - dependencies: - "@jest/core": 27.5.1 - import-local: 3.2.0 - jest-cli: 27.5.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - - jiti@1.21.6: {} - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsdom@16.7.0: - dependencies: - abab: 2.0.6 - acorn: 8.14.0 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.4.3 - domexception: 2.0.1 - escodegen: 2.1.0 - form-data: 3.0.2 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.13 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.10 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsesc@3.0.2: {} - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-schema@0.4.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonpath@1.1.1: - dependencies: - esprima: 1.2.2 - static-eval: 2.0.2 - underscore: 1.12.1 - - jsonpointer@5.0.1: {} - - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - klona@2.0.6: {} - - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - - launch-editor@2.9.1: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.1 - - leven@3.1.0: {} - - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@2.1.0: {} - - lilconfig@3.1.2: {} - - lines-and-columns@1.2.4: {} - - loader-runner@4.3.0: {} - - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - - loader-utils@3.3.1: {} - - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.debounce@4.0.8: {} - - lodash.memoize@4.1.2: {} - - lodash.merge@4.6.2: {} - - lodash.sortby@4.7.0: {} - - lodash.uniq@4.5.0: {} - - lodash@4.17.21: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lower-case@2.0.2: - dependencies: - tslib: 2.8.1 - - lru-cache@10.4.3: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - - make-dir@4.0.0: - dependencies: - semver: 7.6.3 - - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - - mdn-data@2.0.14: {} - - mdn-data@2.0.28: {} - - mdn-data@2.0.30: {} - - mdn-data@2.0.4: {} - - media-typer@0.3.0: {} - - memfs@3.5.3: - dependencies: - fs-monkey: 1.0.6 - - merge-descriptors@1.0.3: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-db@1.53.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mimic-fn@2.1.0: {} - - mini-css-extract-plugin@2.9.2(webpack@5.96.1): - dependencies: - schema-utils: 4.2.0 - tapable: 2.2.1 - webpack: 5.96.1 - - minimalistic-assert@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - minipass@7.1.2: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - ms@2.0.0: {} - - ms@2.1.3: {} - - multicast-dns@7.2.5: - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.7: {} - - natural-compare-lite@1.4.0: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - neo-async@2.6.2: {} - - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.8.1 - - node-forge@1.3.1: {} - - node-int64@0.4.0: {} - - node-releases@2.0.18: {} - - normalize-path@3.0.0: {} - - normalize-range@0.1.2: {} - - normalize-url@6.1.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - nth-check@1.0.2: - dependencies: - boolbase: 1.0.0 - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - nwsapi@2.2.13: {} - - object-assign@4.1.1: {} - - object-hash@3.0.0: {} - - object-inspect@1.13.3: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.entries@1.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - - object.getownpropertydescriptors@2.1.8: - dependencies: - array.prototype.reduce: 1.0.7 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - gopd: 1.0.1 - safe-array-concat: 1.1.2 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - obuf@1.1.2: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.0.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@3.0.0: - dependencies: - p-limit: 2.3.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-retry@4.6.2: - dependencies: - "@types/retry": 0.12.0 - retry: 0.13.1 - - p-try@2.2.0: {} - - package-json-from-dist@1.0.1: {} - - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-json@5.2.0: - dependencies: - "@babel/code-frame": 7.26.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse5@6.0.1: {} - - parseurl@1.3.3: {} - - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - path-exists@3.0.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@0.1.10: {} - - path-type@4.0.0: {} - - performance-now@2.1.0: {} - - picocolors@0.2.1: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - pify@2.3.0: {} - - pirates@4.0.6: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - pkg-up@3.1.0: - dependencies: - find-up: 3.0.0 - - possible-typed-array-names@1.0.0: {} - - postcss-attribute-case-insensitive@5.0.2(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-browser-comments@4.0.0(browserslist@4.24.2)(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - postcss: 8.4.49 - - postcss-calc@10.0.2(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - - postcss-calc@8.2.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - - postcss-clamp@4.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-color-functional-notation@4.2.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-color-hex-alpha@8.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-color-rebeccapurple@7.1.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-colormin@5.3.1(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-colormin@7.0.2(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-convert-values@5.1.3(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-convert-values@7.0.4(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-custom-media@8.0.2(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-custom-properties@12.1.11(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-custom-selectors@6.0.3(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-dir-pseudo-class@6.0.5(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-discard-comments@5.1.2(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-discard-comments@7.0.3(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-discard-duplicates@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-discard-duplicates@7.0.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-discard-empty@5.1.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-discard-empty@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-discard-overridden@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-discard-overridden@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-double-position-gradients@3.1.2(postcss@8.4.49): - dependencies: - "@csstools/postcss-progressive-custom-properties": 1.3.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-env-function@4.0.6(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-flexbugs-fixes@5.0.2(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-focus-visible@6.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-focus-within@5.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-font-variant@5.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-gap-properties@3.0.5(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-image-set-function@4.0.7(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-import@15.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - - postcss-initial@4.0.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-js@4.0.1(postcss@8.4.49): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.49 - - postcss-lab-function@4.2.1(postcss@8.4.49): - dependencies: - "@csstools/postcss-progressive-custom-properties": 1.3.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-load-config@4.0.2(postcss@8.4.49): - dependencies: - lilconfig: 3.1.2 - yaml: 2.6.1 - optionalDependencies: - postcss: 8.4.49 - - postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.96.1): - dependencies: - cosmiconfig: 7.1.0 - klona: 2.0.6 - postcss: 8.4.49 - semver: 7.6.3 - webpack: 5.96.1 - - postcss-logical@5.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-media-minmax@5.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-merge-longhand@5.1.7(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.49) - - postcss-merge-longhand@7.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - stylehacks: 7.0.4(postcss@8.4.49) - - postcss-merge-rules@5.1.4(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-merge-rules@7.0.4(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-minify-font-values@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-minify-font-values@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-minify-gradients@5.1.1(postcss@8.4.49): - dependencies: - colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-minify-gradients@7.0.0(postcss@8.4.49): - dependencies: - colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-minify-params@5.1.4(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - cssnano-utils: 3.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-minify-params@7.0.2(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - cssnano-utils: 5.0.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-minify-selectors@5.2.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-minify-selectors@7.0.4(postcss@8.4.49): - dependencies: - cssesc: 3.0.0 - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-modules-extract-imports@3.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-modules-local-by-default@4.1.0(postcss@8.4.49): - dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-selector-parser: 7.0.0 - postcss-value-parser: 4.2.0 - - postcss-modules-scope@3.2.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 7.0.0 - - postcss-modules-values@4.0.0(postcss@8.4.49): - dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - - postcss-nested@6.2.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-nesting@10.2.0(postcss@8.4.49): - dependencies: - "@csstools/selector-specificity": 2.2.0(postcss-selector-parser@6.1.2) - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-normalize-charset@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-normalize-charset@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-normalize-display-values@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-display-values@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-positions@5.1.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-positions@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-repeat-style@5.1.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-repeat-style@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-string@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-string@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-timing-functions@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-timing-functions@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-unicode@5.1.1(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-unicode@7.0.2(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-url@5.1.0(postcss@8.4.49): - dependencies: - normalize-url: 6.1.0 - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-url@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-whitespace@5.1.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize-whitespace@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-normalize@10.0.1(browserslist@4.24.2)(postcss@8.4.49): - dependencies: - "@csstools/normalize.css": 12.1.1 - browserslist: 4.24.2 - postcss: 8.4.49 - postcss-browser-comments: 4.0.0(browserslist@4.24.2)(postcss@8.4.49) - sanitize.css: 13.0.0 - - postcss-opacity-percentage@1.1.3(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-ordered-values@5.1.3(postcss@8.4.49): - dependencies: - cssnano-utils: 3.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-ordered-values@7.0.1(postcss@8.4.49): - dependencies: - cssnano-utils: 5.0.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-overflow-shorthand@3.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-page-break@3.0.4(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-place@7.0.5(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-preset-env@7.8.3(postcss@8.4.49): - dependencies: - "@csstools/postcss-cascade-layers": 1.1.1(postcss@8.4.49) - "@csstools/postcss-color-function": 1.1.1(postcss@8.4.49) - "@csstools/postcss-font-format-keywords": 1.0.1(postcss@8.4.49) - "@csstools/postcss-hwb-function": 1.0.2(postcss@8.4.49) - "@csstools/postcss-ic-unit": 1.0.1(postcss@8.4.49) - "@csstools/postcss-is-pseudo-class": 2.0.7(postcss@8.4.49) - "@csstools/postcss-nested-calc": 1.0.0(postcss@8.4.49) - "@csstools/postcss-normalize-display-values": 1.0.1(postcss@8.4.49) - "@csstools/postcss-oklab-function": 1.1.1(postcss@8.4.49) - "@csstools/postcss-progressive-custom-properties": 1.3.0(postcss@8.4.49) - "@csstools/postcss-stepped-value-functions": 1.0.1(postcss@8.4.49) - "@csstools/postcss-text-decoration-shorthand": 1.0.0(postcss@8.4.49) - "@csstools/postcss-trigonometric-functions": 1.0.2(postcss@8.4.49) - "@csstools/postcss-unset-value": 1.0.2(postcss@8.4.49) - autoprefixer: 10.4.20(postcss@8.4.49) - browserslist: 4.24.2 - css-blank-pseudo: 3.0.3(postcss@8.4.49) - css-has-pseudo: 3.0.4(postcss@8.4.49) - css-prefers-color-scheme: 6.0.3(postcss@8.4.49) - cssdb: 7.11.2 - postcss: 8.4.49 - postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.49) - postcss-clamp: 4.1.0(postcss@8.4.49) - postcss-color-functional-notation: 4.2.4(postcss@8.4.49) - postcss-color-hex-alpha: 8.0.4(postcss@8.4.49) - postcss-color-rebeccapurple: 7.1.1(postcss@8.4.49) - postcss-custom-media: 8.0.2(postcss@8.4.49) - postcss-custom-properties: 12.1.11(postcss@8.4.49) - postcss-custom-selectors: 6.0.3(postcss@8.4.49) - postcss-dir-pseudo-class: 6.0.5(postcss@8.4.49) - postcss-double-position-gradients: 3.1.2(postcss@8.4.49) - postcss-env-function: 4.0.6(postcss@8.4.49) - postcss-focus-visible: 6.0.4(postcss@8.4.49) - postcss-focus-within: 5.0.4(postcss@8.4.49) - postcss-font-variant: 5.0.0(postcss@8.4.49) - postcss-gap-properties: 3.0.5(postcss@8.4.49) - postcss-image-set-function: 4.0.7(postcss@8.4.49) - postcss-initial: 4.0.1(postcss@8.4.49) - postcss-lab-function: 4.2.1(postcss@8.4.49) - postcss-logical: 5.0.4(postcss@8.4.49) - postcss-media-minmax: 5.0.0(postcss@8.4.49) - postcss-nesting: 10.2.0(postcss@8.4.49) - postcss-opacity-percentage: 1.1.3(postcss@8.4.49) - postcss-overflow-shorthand: 3.0.4(postcss@8.4.49) - postcss-page-break: 3.0.4(postcss@8.4.49) - postcss-place: 7.0.5(postcss@8.4.49) - postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.49) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.49) - postcss-selector-not: 6.0.1(postcss@8.4.49) - postcss-value-parser: 4.2.0 - - postcss-pseudo-class-any-link@7.1.6(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-reduce-initial@5.1.2(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - caniuse-api: 3.0.0 - postcss: 8.4.49 - - postcss-reduce-initial@7.0.2(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - caniuse-api: 3.0.0 - postcss: 8.4.49 - - postcss-reduce-transforms@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-reduce-transforms@7.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - - postcss-replace-overflow-wrap@4.0.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - - postcss-selector-not@6.0.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-selector-parser@7.0.0: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-svgo@5.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - svgo: 2.8.0 - - postcss-svgo@7.0.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - svgo: 3.3.2 - - postcss-unique-selectors@5.1.1(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-unique-selectors@7.0.3(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - postcss-value-parser@4.2.0: {} - - postcss@7.0.39: - dependencies: - picocolors: 0.2.1 - source-map: 0.6.1 - - postcss@8.4.38: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postcss@8.4.49: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prelude-ls@1.1.2: {} - - prelude-ls@1.2.1: {} - - pretty-bytes@5.6.0: {} - - pretty-error@4.0.0: - dependencies: - lodash: 4.17.21 - renderkid: 3.0.0 - - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - - pretty-format@28.1.3: - dependencies: - "@jest/schemas": 28.1.3 - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - primereact@10.8.4(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - "@types/react-transition-group": 4.4.11 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - optionalDependencies: - "@types/react": 18.3.12 - - process-nextick-args@2.0.1: {} - - promise@8.3.0: - dependencies: - asap: 2.0.6 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@1.1.0: {} - - psl@1.13.0: - dependencies: - punycode: 2.3.1 - - punycode@2.3.1: {} - - q@1.5.1: {} - - qs@6.13.0: - dependencies: - side-channel: 1.0.6 - - querystringify@2.2.0: {} - - queue-microtask@1.2.3: {} - - raf@3.4.1: - dependencies: - performance-now: 2.1.0 - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - react-app-polyfill@3.0.0: - dependencies: - core-js: 3.39.0 - object-assign: 4.1.1 - promise: 8.3.0 - raf: 3.4.1 - regenerator-runtime: 0.13.11 - whatwg-fetch: 3.6.20 - - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.96.1): - dependencies: - "@babel/code-frame": 7.26.2 - address: 1.2.2 - browserslist: 4.24.2 - chalk: 4.1.2 - cross-spawn: 7.0.6 - detect-port-alt: 1.1.6 - escape-string-regexp: 4.0.0 - filesize: 8.0.7 - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.96.1) - global-modules: 2.0.0 - globby: 11.1.0 - gzip-size: 6.0.0 - immer: 9.0.21 - is-root: 2.1.0 - loader-utils: 3.3.1 - open: 8.4.2 - pkg-up: 3.1.0 - prompts: 2.4.2 - react-error-overlay: 6.0.11 - recursive-readdir: 2.2.3 - shell-quote: 1.8.1 - strip-ansi: 6.0.1 - text-table: 0.2.0 - webpack: 5.96.1 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - eslint - - supports-color - - vue-template-compiler - - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-error-overlay@6.0.11: {} - - react-is@16.13.1: {} - - react-is@17.0.2: {} - - react-is@18.3.1: {} - - react-loader-spinner@6.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 - styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - react-refresh@0.11.0: {} - - react-router-dom@6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - "@remix-run/router": 1.21.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 6.28.0(react@18.3.1) - - react-router@6.28.0(react@18.3.1): - dependencies: - "@remix-run/router": 1.21.0 - react: 18.3.1 - - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(type-fest@0.21.3)(typescript@4.9.5): - dependencies: - "@babel/core": 7.26.0 - "@pmmmwh/react-refresh-webpack-plugin": 0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(webpack@5.96.1))(webpack@5.96.1) - "@svgr/webpack": 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.0) - babel-loader: 8.4.1(@babel/core@7.26.0)(webpack@5.96.1) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.0) - babel-preset-react-app: 10.0.1 - bfj: 7.1.0 - browserslist: 4.24.2 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.11.0(webpack@5.96.1) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.96.1) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 8.57.1 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5) - eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.96.1) - file-loader: 6.2.0(webpack@5.96.1) - fs-extra: 10.1.0 - html-webpack-plugin: 5.6.3(webpack@5.96.1) - identity-obj-proxy: 3.0.0 - jest: 27.5.1 - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1) - mini-css-extract-plugin: 2.9.2(webpack@5.96.1) - postcss: 8.4.49 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.96.1) - postcss-normalize: 10.0.1(browserslist@4.24.2)(postcss@8.4.49) - postcss-preset-env: 7.8.3(postcss@8.4.49) - prompts: 2.4.2 - react: 18.3.1 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.96.1) - react-refresh: 0.11.0 - resolve: 1.22.8 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.96.1) - semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.96.1) - style-loader: 3.3.4(webpack@5.96.1) - tailwindcss: 3.4.15 - terser-webpack-plugin: 5.3.10(webpack@5.96.1) - webpack: 5.96.1 - webpack-dev-server: 4.15.2(webpack@5.96.1) - webpack-manifest-plugin: 4.1.1(webpack@5.96.1) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.96.1) - optionalDependencies: - fsevents: 2.3.3 - typescript: 4.9.5 - transitivePeerDependencies: - - "@babel/plugin-syntax-flow" - - "@babel/plugin-transform-react-jsx" - - "@parcel/css" - - "@rspack/core" - - "@swc/core" - - "@types/babel__core" - - "@types/webpack" - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve - - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - "@babel/runtime": 7.26.0 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - recursive-readdir@2.2.3: - dependencies: - minimatch: 3.1.2 - - reflect.getprototypeof@1.0.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - which-builtin-type: 1.2.0 - - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - - regenerator-runtime@0.13.11: {} - - regenerator-runtime@0.14.1: {} - - regenerator-transform@0.15.2: - dependencies: - "@babel/runtime": 7.26.0 - - regex-parser@2.3.0: {} - - regexp.prototype.flags@1.5.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 - - regjsgen@0.8.0: {} - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - relateurl@0.2.7: {} - - renderkid@3.0.0: - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 6.0.1 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - requires-port@1.0.0: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve-url-loader@4.0.0: - dependencies: - adjust-sourcemap-loader: 4.0.0 - convert-source-map: 1.9.0 - loader-utils: 2.0.4 - postcss: 7.0.39 - source-map: 0.6.1 - - resolve.exports@1.1.1: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - retry@0.13.1: {} - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rollup-plugin-terser@7.0.2(rollup@2.79.2): - dependencies: - "@babel/code-frame": 7.26.2 - jest-worker: 26.6.2 - rollup: 2.79.2 - serialize-javascript: 4.0.0 - terser: 5.36.0 - - rollup@2.79.2: - optionalDependencies: - fsevents: 2.3.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - - safer-buffer@2.1.2: {} - - sanitize.css@13.0.0: {} - - sass-loader@12.6.0(webpack@5.96.1): - dependencies: - klona: 2.0.6 - neo-async: 2.6.2 - webpack: 5.96.1 - - sax@1.2.4: {} - - saxes@5.0.1: - dependencies: - xmlchars: 2.2.0 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - schema-utils@2.7.0: - dependencies: - "@types/json-schema": 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@2.7.1: - dependencies: - "@types/json-schema": 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@3.3.0: - dependencies: - "@types/json-schema": 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.2.0: - dependencies: - "@types/json-schema": 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - - select-hose@2.0.0: {} - - selfsigned@2.4.1: - dependencies: - "@types/node-forge": 1.3.11 - node-forge: 1.3.1 - - semver@6.3.1: {} - - semver@7.6.3: {} - - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serialize-javascript@4.0.0: - dependencies: - randombytes: 2.1.0 - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - serve-index@1.9.1: - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - setprototypeof@1.1.0: {} - - setprototypeof@1.2.0: {} - - shallowequal@1.1.0: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shell-quote@1.8.1: {} - - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.3 - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - sisteransi@1.0.5: {} - - slash@3.0.0: {} - - slash@4.0.0: {} - - sockjs@0.3.24: - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - - source-list-map@2.0.1: {} - - source-map-js@1.2.1: {} - - source-map-loader@3.0.2(webpack@5.96.1): - dependencies: - abab: 2.0.6 - iconv-lite: 0.6.3 - source-map-js: 1.2.1 - webpack: 5.96.1 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - source-map@0.7.4: {} - - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - sourcemap-codec@1.4.8: {} - - spdy-transport@3.0.0: - dependencies: - debug: 4.3.7 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - - spdy@4.0.2: - dependencies: - debug: 4.3.7 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - - sprintf-js@1.0.3: {} - - stable@0.1.8: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - - stackframe@1.3.4: {} - - static-eval@2.0.2: - dependencies: - escodegen: 1.14.3 - - statuses@1.5.0: {} - - statuses@2.0.1: {} - - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - - string-length@5.0.1: - dependencies: - char-regex: 2.0.2 - strip-ansi: 7.1.0 - - string-natural-compare@3.0.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - - string.prototype.matchall@4.0.11: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.3 - set-function-name: 2.0.2 - side-channel: 1.0.6 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.5 - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - stringify-object@3.3.0: - dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - - strip-comments@2.0.1: {} - - strip-final-newline@2.0.0: {} - - strip-json-comments@3.1.1: {} - - style-loader@3.3.4(webpack@5.96.1): - dependencies: - webpack: 5.96.1 - - styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - "@emotion/is-prop-valid": 1.2.2 - "@emotion/unitless": 0.8.1 - "@types/stylis": 4.2.5 - css-to-react-native: 3.2.0 - csstype: 3.1.3 - postcss: 8.4.38 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - shallowequal: 1.1.0 - stylis: 4.3.2 - tslib: 2.6.2 - - stylehacks@5.1.1(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - stylehacks@7.0.4(postcss@8.4.49): - dependencies: - browserslist: 4.24.2 - postcss: 8.4.49 - postcss-selector-parser: 6.1.2 - - stylis@4.3.2: {} - - sucrase@3.35.0: - dependencies: - "@jridgewell/gen-mapping": 0.3.5 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - svg-parser@2.0.4: {} - - svgo@1.3.2: - dependencies: - chalk: 2.4.2 - coa: 2.0.2 - css-select: 2.1.0 - css-select-base-adapter: 0.1.1 - css-tree: 1.0.0-alpha.37 - csso: 4.2.0 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - object.values: 1.2.0 - sax: 1.2.4 - stable: 0.1.8 - unquote: 1.1.1 - util.promisify: 1.0.1 - - svgo@2.8.0: - dependencies: - "@trysound/sax": 0.2.0 - commander: 7.2.0 - css-select: 4.3.0 - css-tree: 1.1.3 - csso: 4.2.0 - picocolors: 1.1.1 - stable: 0.1.8 - - svgo@3.3.2: - dependencies: - "@trysound/sax": 0.2.0 - commander: 7.2.0 - css-select: 5.1.0 - css-tree: 2.3.1 - css-what: 6.1.0 - csso: 5.0.5 - picocolors: 1.1.1 - - symbol-tree@3.2.4: {} - - tailwindcss@3.4.15: - dependencies: - "@alloc/quick-lru": 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.6 - lilconfig: 2.1.0 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49) - postcss-nested: 6.2.0(postcss@8.4.49) - postcss-selector-parser: 6.1.2 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - tapable@1.1.3: {} - - tapable@2.2.1: {} - - temp-dir@2.0.0: {} - - tempy@0.6.0: - dependencies: - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 - - terminal-link@2.1.1: - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - - terser-webpack-plugin@5.3.10(webpack@5.96.1): - dependencies: - "@jridgewell/trace-mapping": 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.36.0 - webpack: 5.96.1 - - terser@5.36.0: - dependencies: - "@jridgewell/source-map": 0.3.6 - acorn: 8.14.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - test-exclude@6.0.0: - dependencies: - "@istanbuljs/schema": 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - text-table@0.2.0: {} - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - throat@6.0.2: {} - - thunky@1.1.0: {} - - tmpl@1.0.5: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tough-cookie@4.1.4: - dependencies: - psl: 1.13.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tr46@2.1.0: - dependencies: - punycode: 2.3.1 - - tryer@1.0.1: {} - - ts-interface-checker@0.1.13: {} - - tsconfig-paths@3.15.0: - dependencies: - "@types/json5": 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} - - tslib@2.6.2: {} - - tslib@2.8.1: {} - - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.0.8: {} - - type-fest@0.16.0: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.3: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - reflect.getprototypeof: 1.0.7 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.7 - - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - - typescript@4.9.5: {} - - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - underscore@1.12.1: {} - - undici-types@6.19.8: {} - - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.2.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} - - unique-string@2.0.0: - dependencies: - crypto-random-string: 2.0.0 - - universalify@0.2.0: {} - - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - unquote@1.1.1: {} - - upath@1.2.0: {} - - update-browserslist-db@1.1.1(browserslist@4.24.2): - dependencies: - browserslist: 4.24.2 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - util-deprecate@1.0.2: {} - - util.promisify@1.0.1: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.5 - has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.8 - - utila@0.4.0: {} - - utils-merge@1.0.1: {} - - uuid@8.3.2: {} - - uzip@0.20201231.0: {} - - v8-to-istanbul@8.1.1: - dependencies: - "@types/istanbul-lib-coverage": 2.0.6 - convert-source-map: 1.9.0 - source-map: 0.7.4 - - vary@1.1.2: {} - - w3c-hr-time@1.0.2: - dependencies: - browser-process-hrtime: 1.0.0 - - w3c-xmlserializer@2.0.0: - dependencies: - xml-name-validator: 3.0.0 - - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - - watchpack@2.4.2: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - wbuf@1.7.3: - dependencies: - minimalistic-assert: 1.0.1 - - webidl-conversions@4.0.2: {} - - webidl-conversions@5.0.0: {} - - webidl-conversions@6.1.0: {} - - webpack-dev-middleware@5.3.4(webpack@5.96.1): - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.96.1 - - webpack-dev-server@4.15.2(webpack@5.96.1): - dependencies: - "@types/bonjour": 3.5.13 - "@types/connect-history-api-fallback": 1.5.4 - "@types/express": 4.17.21 - "@types/serve-index": 1.9.4 - "@types/serve-static": 1.15.7 - "@types/sockjs": 0.3.36 - "@types/ws": 8.5.13 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.7.5 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.21.1 - graceful-fs: 4.2.11 - html-entities: 2.5.2 - http-proxy-middleware: 2.0.7(@types/express@4.17.21) - ipaddr.js: 2.2.0 - launch-editor: 2.9.1 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.96.1) - ws: 8.18.0 - optionalDependencies: - webpack: 5.96.1 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-manifest-plugin@4.1.1(webpack@5.96.1): - dependencies: - tapable: 2.2.1 - webpack: 5.96.1 - webpack-sources: 2.3.1 - - webpack-sources@1.4.3: - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - - webpack-sources@2.3.1: - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - - webpack-sources@3.2.3: {} - - webpack@5.96.1: - dependencies: - "@types/eslint-scope": 3.7.7 - "@types/estree": 1.0.6 - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/wasm-edit": 1.14.1 - "@webassemblyjs/wasm-parser": 1.14.1 - acorn: 8.14.0 - browserslist: 4.24.2 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.96.1) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - "@swc/core" - - esbuild - - uglify-js - - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - - whatwg-encoding@1.0.5: - dependencies: - iconv-lite: 0.4.24 - - whatwg-fetch@3.6.20: {} - - whatwg-mimetype@2.3.0: {} - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - whatwg-url@8.7.0: - dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-builtin-type@1.2.0: - dependencies: - call-bind: 1.0.7 - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.1.0 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.5: {} - - workbox-background-sync@6.6.0: - dependencies: - idb: 7.1.1 - workbox-core: 6.6.0 - - workbox-broadcast-update@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-build@6.6.0(@types/babel__core@7.20.5): - dependencies: - "@apideck/better-ajv-errors": 0.3.6(ajv@8.17.1) - "@babel/core": 7.26.0 - "@babel/preset-env": 7.26.0(@babel/core@7.26.0) - "@babel/runtime": 7.26.0 - "@rollup/plugin-babel": 5.3.1(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@2.79.2) - "@rollup/plugin-node-resolve": 11.2.1(rollup@2.79.2) - "@rollup/plugin-replace": 2.4.2(rollup@2.79.2) - "@surma/rollup-plugin-off-main-thread": 2.2.3 - ajv: 8.17.1 - common-tags: 1.8.2 - fast-json-stable-stringify: 2.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - lodash: 4.17.21 - pretty-bytes: 5.6.0 - rollup: 2.79.2 - rollup-plugin-terser: 7.0.2(rollup@2.79.2) - source-map: 0.8.0-beta.0 - stringify-object: 3.3.0 - strip-comments: 2.0.1 - tempy: 0.6.0 - upath: 1.2.0 - workbox-background-sync: 6.6.0 - workbox-broadcast-update: 6.6.0 - workbox-cacheable-response: 6.6.0 - workbox-core: 6.6.0 - workbox-expiration: 6.6.0 - workbox-google-analytics: 6.6.0 - workbox-navigation-preload: 6.6.0 - workbox-precaching: 6.6.0 - workbox-range-requests: 6.6.0 - workbox-recipes: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - workbox-streams: 6.6.0 - workbox-sw: 6.6.0 - workbox-window: 6.6.0 - transitivePeerDependencies: - - "@types/babel__core" - - supports-color - - workbox-cacheable-response@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-core@6.6.0: {} - - workbox-expiration@6.6.0: - dependencies: - idb: 7.1.1 - workbox-core: 6.6.0 - - workbox-google-analytics@6.6.0: - dependencies: - workbox-background-sync: 6.6.0 - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - - workbox-navigation-preload@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-precaching@6.6.0: - dependencies: - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - - workbox-range-requests@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-recipes@6.6.0: - dependencies: - workbox-cacheable-response: 6.6.0 - workbox-core: 6.6.0 - workbox-expiration: 6.6.0 - workbox-precaching: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - - workbox-routing@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-strategies@6.6.0: - dependencies: - workbox-core: 6.6.0 - - workbox-streams@6.6.0: - dependencies: - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - - workbox-sw@6.6.0: {} - - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.96.1): - dependencies: - fast-json-stable-stringify: 2.1.0 - pretty-bytes: 5.6.0 - upath: 1.2.0 - webpack: 5.96.1 - webpack-sources: 1.4.3 - workbox-build: 6.6.0(@types/babel__core@7.20.5) - transitivePeerDependencies: - - "@types/babel__core" - - supports-color - - workbox-window@6.6.0: - dependencies: - "@types/trusted-types": 2.0.7 - workbox-core: 6.6.0 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - - ws@7.5.10: {} - - ws@8.18.0: {} - - xml-name-validator@3.0.0: {} - - xmlchars@2.2.0: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yaml@1.10.2: {} - - yaml@2.6.1: {} - - yargs-parser@20.2.9: {} - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yocto-queue@0.1.0: {} diff --git a/client/src/App.css b/client/src/App.css index be85d8e..0df5c59 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -18,6 +18,13 @@ body::-webkit-scrollbar { --dbImg-height: 8vw; } +button { + background-color: transparent; + border: none; + cursor: pointer; + font-size: 1.5rem; +} + .notFound { width: 100vw; height: 100vh; @@ -51,7 +58,7 @@ section.aboutUs { background: url("../public/idk.jpg") top / 100vw 60rem no-repeat, url("../public/4.jpg") center / 100vw auto no-repeat, - url("../public/new_bg.jpg") bottom / 100vw auto no-repeat; + url("./assets/backgrounds/new-bg.webp") bottom / 100vw auto no-repeat; } .aboutUsContent { diff --git a/client/src/App.js b/client/src/App.js index bc9b29b..67ca3de 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -1,257 +1,148 @@ import "./App.css"; -import Login from "./pages/Login"; -import Register from "./pages/Register"; -import Glossary from "./pages/Glossary"; -import BirdGlossary from "./pages/BirdGlossary"; -import Home from "./pages/Home"; -import Database from "./pages/Database"; -import BirdDatabase from "./pages/BirdDatabase"; -import Upload from "./pages/Upload"; -import Creation from "./pages/Creation"; -import AboutUs from "./pages/AboutUs"; -import Activities from "./pages/Activities"; -import AdminView from "./components/AdminView"; -import EditPage from "./pages/EditPage"; -import AdminAuth from "./components/AdminAuth"; -import BirdEditPage from "./pages/BirdEditPage"; -import NotFound from "./pages/NotFound"; -import { UserProvider } from "./UserContext"; +import React, { lazy, Suspense, useState } from "react"; +import { Route, Routes, useLocation, useParams } from "react-router-dom"; import { PrimeReactProvider } from "primereact/api"; import "primereact/resources/themes/saga-green/theme.css"; import "primeicons/primeicons.css"; -import "primereact/resources/primereact.min.css"; // 核心样式 // 图标 -import "primeflex/primeflex.css"; // 布局 +import "primereact/resources/primereact.min.css"; +import "primeflex/primeflex.css"; +import Database from "./pages/Database"; +import NotFound from "./pages/NotFound"; +import { UserProvider } from "./UserContext"; + +const AboutUs = lazy(() => import("./pages/AboutUs")); +const Activities = lazy(() => import("./pages/Activities")); +const AdminAuth = lazy(() => import("./components/AdminAuth")); +const AdminView = lazy(() => import("./components/AdminView")); +const BirdDatabase = lazy(() => import("./pages/BirdDatabase")); +const BirdEditPage = lazy(() => import("./pages/BirdEditPage")); +const BirdGlossary = lazy(() => import("./pages/BirdGlossary")); +const Creation = lazy(() => import("./pages/Creation")); +const EditPage = lazy(() => import("./pages/EditPage")); +const Glossary = lazy(() => import("./pages/Glossary")); +const Home = lazy(() => import("./pages/Home")); +const Login = lazy(() => import("./pages/Login")); +const Register = lazy(() => import("./pages/Register")); +const Upload = lazy(() => import("./pages/Upload")); +const VideoModal = lazy(() => import("./components/VideoModal")); + +function SearchWithParam({ handleEditPage, dbType }) { + const { plantKey } = useParams(); + const search = plantKey.replaceAll("_", " "); + + if (dbType === "plant") { + return ; + } + + return ; +} -import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; -import React, { useState } from "react"; -import { useParams, useLocation } from 'react-router-dom'; -import VideoModal from "./components/VideoModal"; +function RouteLoading() { + return ( +
+ Loading… +
+ ); +} function App() { const [search, setSearch] = useState(""); - const [previewKey, setPreviewKey] = useState(""); const [editKey, setEditKey] = useState(); const location = useLocation(); - - // This lets the modal open "on top of" the existing page. const background = location.state && location.state.background; - - - // const [CR, setCR] = useState(""); - - const handleGets = (input) => { - setSearch(input); - }; - - //一个搜索植物的Wrapper - function SearchWithParam({ handleEditPage, dbType }) { - const { plantKey } = useParams(); - - if(dbType === "plant"){ - //plantkKey是url中的植物名 - // console.log("searching:"); - // console.log(plantKey.replaceAll("_", " ")); - return ( - - - ); - }else{ - //plantkKey是url中的植物名 - return ( - - ); - } - - } - - // const handleAdminPreview = (input) => { - // setPreviewKey(input); - // }; - const handleEditPage = (plant) => { setEditKey(plant); }; return ( -
- - {/* */} -
+
+ }> - {/* - - - } - /> */} - - - } - /> - - - - } + element={} /> + } /> - - + } /> - - - } - /> - - - + } /> + } /> - - - } + element={} /> } - /> - } + element={ + + } /> + } /> - - - } + element={} /> - - - } + element={} /> - - - } + element={} /> - - + } /> - - + } /> - - - + } - > - {/* }> */} - - - - + /> - - + } /> - } /> - - - - - } - /> - - - - } - /> - } - /> - - - - } - /> - + } /> + } /> + } /> + } /> } /> -
- {/* */} + +
-
); } diff --git a/client/src/App.test.js b/client/src/App.test.js index 9382b9a..fc09002 100644 --- a/client/src/App.test.js +++ b/client/src/App.test.js @@ -1,8 +1,66 @@ -import { render, screen } from "@testing-library/react"; +import { act } from "react"; +import { createRoot } from "react-dom/client"; +import { MemoryRouter } from "react-router-dom"; +import axios from "axios"; import App from "./App"; -test("renders learn react link", () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); +jest.mock("react-player", () => () => null); + +jest.mock("axios", () => ({ + defaults: {}, + interceptors: { + request: { + use: jest.fn(), + }, + }, + get: jest.fn().mockResolvedValue({ data: {} }), + post: jest.fn(), +})); + +let container; +let root; + +beforeEach(() => { + container = document.createElement("div"); + document.body.appendChild(container); + root = createRoot(container); + axios.get.mockReset(); + axios.get.mockResolvedValue({ data: {} }); + axios.post.mockReset(); +}); + +afterEach(async () => { + await act(async () => { + root.unmount(); + await Promise.resolve(); + }); + container.remove(); +}); + +async function renderAt(pathname) { + await act(async () => { + root.render( + + + , + ); + await Promise.resolve(); + await Promise.resolve(); + }); +} + +test("renders the login route without a network dependency", async () => { + await renderAt("/KQsfhwifheKDFJfkdfjdkfjd3q3puod0d0"); + + expect(container.querySelector("h2").textContent).toBe("Login"); + expect(axios.get).toHaveBeenCalled(); +}); + +test("renders the not-found route", async () => { + await renderAt("/route-that-does-not-exist"); + + expect(container.querySelector(".notFoundTitle").textContent).toBe("404"); }); diff --git a/client/src/UserContext.js b/client/src/UserContext.js index ad96f32..686e6e6 100644 --- a/client/src/UserContext.js +++ b/client/src/UserContext.js @@ -1,9 +1,8 @@ // UserContext.js import { createContext, useReducer, useEffect } from "react"; import { Map, fromJS } from "immutable"; -import axios from "axios"; - -axios.defaults.withCredentials = true; +import axios from "./api/http"; +import urls from "./tools/url"; const userReducer = (state, action) => { switch (action.type) { @@ -26,14 +25,11 @@ export const UserProvider = ({ children }) => { const refresh = async () => { try { const token = localStorage.getItem("askanything"); - const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/refresh`, - { - headers: { - authorization: token, - }, + const response = await axios.get(urls.refresh, { + headers: { + authorization: token, }, - ); + }); if (response.data.user) { dispatch({ type: "LOGIN", payload: response.data.user }); } else { @@ -52,10 +48,12 @@ export const UserProvider = ({ children }) => { try { const token = localStorage.getItem("askanything"); const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/login`, + urls.login, { username, password, + }, + { headers: { authorization: token, }, @@ -84,7 +82,8 @@ export const UserProvider = ({ children }) => { const token = localStorage.getItem("askanything"); localStorage.removeItem("askanything"); const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/logout`, + urls.logout, + {}, { headers: { authorization: token, diff --git a/client/src/api/catalog.js b/client/src/api/catalog.js new file mode 100644 index 0000000..a854776 --- /dev/null +++ b/client/src/api/catalog.js @@ -0,0 +1,67 @@ +import http from "./http"; +import urls from "../tools/url"; + +const VALID_CATALOG_TYPES = new Set(["plant", "bird"]); +const CACHE_TTL_MS = 5 * 60 * 1000; +const catalogCache = new Map(); +const pendingRequests = new Map(); +const cacheVersions = new Map(); + +const assertCatalogType = (type) => { + if (!VALID_CATALOG_TYPES.has(type)) { + throw new TypeError("Catalog type must be plant or bird"); + } +}; + +export async function getCatalogNames(type) { + assertCatalogType(type); + + const now = Date.now(); + const cached = catalogCache.get(type); + if (cached && cached.expiresAt > now) { + return cached.names; + } + + const version = cacheVersions.get(type) || 0; + const pending = pendingRequests.get(type); + if (pending?.version === version) { + return pending.promise; + } + + const request = http + .get(urls.catalogNames(type)) + .then((response) => { + const names = Array.isArray(response.data?.names) + ? response.data.names + : []; + if ((cacheVersions.get(type) || 0) === version) { + catalogCache.set(type, { + names, + expiresAt: Date.now() + CACHE_TTL_MS, + }); + } + return names; + }) + .finally(() => { + if (pendingRequests.get(type)?.promise === request) { + pendingRequests.delete(type); + } + }); + + pendingRequests.set(type, { promise: request, version }); + return request; +} + +export function invalidateCatalogNames(type) { + if (type === undefined) { + catalogCache.clear(); + for (const catalogType of VALID_CATALOG_TYPES) { + cacheVersions.set(catalogType, (cacheVersions.get(catalogType) || 0) + 1); + } + return; + } + + assertCatalogType(type); + catalogCache.delete(type); + cacheVersions.set(type, (cacheVersions.get(type) || 0) + 1); +} diff --git a/client/src/api/catalog.test.js b/client/src/api/catalog.test.js new file mode 100644 index 0000000..efae0c8 --- /dev/null +++ b/client/src/api/catalog.test.js @@ -0,0 +1,46 @@ +import http from "./http"; +import { getCatalogNames, invalidateCatalogNames } from "./catalog"; + +jest.mock("./http", () => ({ + get: jest.fn(), +})); + +beforeEach(() => { + invalidateCatalogNames(); + http.get.mockReset(); +}); + +test("deduplicates concurrent requests and reuses the catalog cache", async () => { + const names = [{ latinName: "Acer rubrum" }]; + http.get.mockResolvedValue({ data: { names } }); + + const [first, second] = await Promise.all([ + getCatalogNames("plant"), + getCatalogNames("plant"), + ]); + const cached = await getCatalogNames("plant"); + + expect(first).toBe(names); + expect(second).toBe(names); + expect(cached).toBe(names); + expect(http.get).toHaveBeenCalledTimes(1); +}); + +test("keeps plant and bird caches separate and supports invalidation", async () => { + http.get + .mockResolvedValueOnce({ data: { names: [{ latinName: "Acer rubrum" }] } }) + .mockResolvedValueOnce({ data: { names: [{ latinName: "Corvus corax" }] } }) + .mockResolvedValueOnce({ + data: { names: [{ latinName: "Ginkgo biloba" }] }, + }); + + await getCatalogNames("plant"); + await getCatalogNames("bird"); + invalidateCatalogNames("plant"); + await getCatalogNames("plant"); + + expect(http.get).toHaveBeenCalledTimes(3); + await expect(getCatalogNames("fungi")).rejects.toThrow( + "Catalog type must be plant or bird", + ); +}); diff --git a/client/src/api/http.js b/client/src/api/http.js new file mode 100644 index 0000000..66f53ae --- /dev/null +++ b/client/src/api/http.js @@ -0,0 +1,24 @@ +import axios from "axios"; +import { apiOrigin } from "../tools/url"; + +axios.defaults.withCredentials = true; +axios.interceptors.request.use((config) => { + const token = localStorage.getItem("askanything"); + const isApiRequest = + apiOrigin && + (config.url === apiOrigin || config.url?.startsWith(`${apiOrigin}/`)); + + if (!token || !isApiRequest) { + return config; + } + + const headers = config.headers || {}; + if (!headers.authorization && !headers.Authorization) { + headers.Authorization = `Bearer ${token}`; + } + config.headers = headers; + + return config; +}); + +export default axios; diff --git a/client/src/api/telemetry.js b/client/src/api/telemetry.js new file mode 100644 index 0000000..27b6b18 --- /dev/null +++ b/client/src/api/telemetry.js @@ -0,0 +1,37 @@ +import http from "./http"; +import urls from "../tools/url"; + +const telemetryEnabled = + process.env.REACT_APP_SEARCH_TELEMETRY_ENABLED === "true"; + +export function classifySearchInput(query) { + const value = String(query || "").trim(); + if (/^[\p{Script=Han}\s]+$/u.test(value)) { + return "cjk"; + } + if (/^[\p{Script=Latin}\s.'-]+$/u.test(value)) { + return "latin_script"; + } + return "mixed_or_other"; +} + +export function createSearchEvent({ query, resultCount, selected, catalogType }) { + return { + catalogType: catalogType === "bird" ? "bird" : "plant", + languageCategory: classifySearchInput(query), + resultCount: Math.max( + 0, + Math.min(3, Math.trunc(Number(resultCount) || 0)), + ), + selected: Boolean(selected), + }; +} + +export function recordSearchAttempt(input) { + if (!telemetryEnabled) { + return; + } + + const event = createSearchEvent(input); + void http.post(urls.searchTelemetry, event).catch(() => {}); +} diff --git a/client/src/api/telemetry.test.js b/client/src/api/telemetry.test.js new file mode 100644 index 0000000..f085946 --- /dev/null +++ b/client/src/api/telemetry.test.js @@ -0,0 +1,25 @@ +import { classifySearchInput, createSearchEvent } from "./telemetry"; + +jest.mock("./http", () => ({ + post: jest.fn(), +})); + +test("search telemetry keeps only bounded aggregate categories", () => { + expect(classifySearchInput("红花槭")).toBe("cjk"); + expect(classifySearchInput("Acer rubrum")).toBe("latin_script"); + expect(classifySearchInput("红花槭 Acer")).toBe("mixed_or_other"); + + const event = createSearchEvent({ + query: "Acer rubrum", + resultCount: 12, + selected: true, + catalogType: "plant", + }); + expect(event).toEqual({ + catalogType: "plant", + languageCategory: "latin_script", + resultCount: 3, + selected: true, + }); + expect(JSON.stringify(event)).not.toContain("Acer rubrum"); +}); diff --git a/client/src/assets/backgrounds/bird-bg.webp b/client/src/assets/backgrounds/bird-bg.webp new file mode 100644 index 0000000..1676b53 Binary files /dev/null and b/client/src/assets/backgrounds/bird-bg.webp differ diff --git a/client/src/assets/backgrounds/new-bg.webp b/client/src/assets/backgrounds/new-bg.webp new file mode 100644 index 0000000..68d2cb8 Binary files /dev/null and b/client/src/assets/backgrounds/new-bg.webp differ diff --git a/client/src/components/Admin.js b/client/src/components/Admin.js index 269a678..e8e98e6 100644 --- a/client/src/components/Admin.js +++ b/client/src/components/Admin.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react"; -import axios from "axios"; +import axios from "../api/http"; +import urls from "../tools/url"; import { useNavigate } from "react-router-dom"; import Navbar from "./Navbar.js"; import "../styles/admin.css"; @@ -15,7 +16,7 @@ const Admin = ({ handleAdminPreview }) => { const fetchAdmin = async () => { try { const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/userInfo`, + urls.userInfo, ); setAdmin(response.data.admin); if (!response.data.admin) { @@ -33,7 +34,7 @@ const Admin = ({ handleAdminPreview }) => { try { await fetchAdmin(); const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/adminDataGet`, + urls.adminDataGet, ); setUsers(response.data.users); setPlants(response.data.plants); @@ -60,7 +61,7 @@ const Admin = ({ handleAdminPreview }) => { setUserLoadingState("loading..."); try { const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/adminToggle`, + urls.adminToggle, { username: name }, ); setUserLoadingState("done"); @@ -97,14 +98,12 @@ const Admin = ({ handleAdminPreview }) => { Username - Password {users.map((user) => ( - + {user.username} - {user.password} ))} diff --git a/client/src/components/AdminAuth.js b/client/src/components/AdminAuth.js index 0f7b075..df62ebb 100644 --- a/client/src/components/AdminAuth.js +++ b/client/src/components/AdminAuth.js @@ -1,4 +1,5 @@ -import axios from "axios"; +import axios from "../api/http"; +import urls, { mediaUrl } from "../tools/url"; import { useNavigate } from "react-router-dom"; import React, { useState, useEffect, useRef } from "react"; import { Button } from "primereact/button"; @@ -6,6 +7,7 @@ import { Card } from "primereact/card"; import { Toast } from "primereact/toast"; import { Carousel } from "primereact/carousel"; import "../styles/AdminAuth.css"; +import { invalidateCatalogNames } from "../api/catalog"; const AdminAuth = ({ admin }) => { const navigate = useNavigate(); @@ -24,15 +26,18 @@ const AdminAuth = ({ admin }) => { // console.log(id); // console.log(decision) await axios.put( - `${process.env.REACT_APP_Source_URL}/handleEditDecision`, + urls.handleEditDecision, { id: id, decision: decision }, ); }else{ await axios.put( - `${process.env.REACT_APP_Source_URL}/handleBirdEditDecision`, + urls.handleBirdEditDecision, { id: id, decision: decision }, ); } + if (decision) { + invalidateCatalogNames(dbtype === "bird" ? "bird" : "plant"); + } setUnAuthPosts((prevPosts) => prevPosts.filter((post) => post._id !== id), ); @@ -54,7 +59,7 @@ const AdminAuth = ({ admin }) => { const fetchData = async () => { try { const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/adminAuth`, + urls.adminAuth, ); if (!admin) { toast.current.show({ @@ -82,7 +87,7 @@ const AdminAuth = ({ admin }) => { const handleNewCreationDecision = async (decision, id, dbType) => { try { - await axios.post(`${process.env.REACT_APP_Source_URL}/newCreationAuth`, { + await axios.post(urls.newCreationAuth, { id: id, decision: decision, }); @@ -106,10 +111,13 @@ const AdminAuth = ({ admin }) => { const handleNewPostDecision = async (decision, id, dbType) => { if(dbType === "bird"){ try { - await axios.post(`${process.env.REACT_APP_Source_URL}/newBirdPostAuth`, { + await axios.post(urls.newBirdPostAuth, { id: id, decision: decision, }); + if (decision) { + invalidateCatalogNames("bird"); + } setUnAuthNewPosts((prevPosts) => prevPosts.filter((post) => post._id !== id), ); @@ -127,10 +135,13 @@ const AdminAuth = ({ admin }) => { } }else{ try { - await axios.post(`${process.env.REACT_APP_Source_URL}/newPostAuth`, { + await axios.post(urls.newPostAuth, { id: id, decision: decision, }); + if (decision) { + invalidateCatalogNames("plant"); + } setUnAuthNewPosts((prevPosts) => prevPosts.filter((post) => post._id !== id), ); @@ -417,7 +428,7 @@ const AdminAuth = ({ admin }) => {
{item.pic} @@ -425,7 +436,7 @@ const AdminAuth = ({ admin }) => {
{item.art} diff --git a/client/src/components/AdminView.js b/client/src/components/AdminView.js index fe58500..6cab8c2 100644 --- a/client/src/components/AdminView.js +++ b/client/src/components/AdminView.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react"; -import axios from "axios"; +import axios from "../api/http"; +import urls from "../tools/url"; import { useNavigate } from "react-router-dom"; const AdminView = (previewKey) => { @@ -20,7 +21,7 @@ const AdminView = (previewKey) => { const fetchAdmin = async () => { try { const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/userInfo`, + urls.userInfo, ); setAdmin(response.data.admin); if (!response.data.admin) { @@ -47,7 +48,7 @@ const AdminView = (previewKey) => { setFeatureStatus("Loading...."); try { const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/makeFeatured`, + urls.makeFeatured, { pic: cBT.Pic, art: cBT.Art, plant: search }, ); setFeatureStatus("Done!"); @@ -64,7 +65,7 @@ const AdminView = (previewKey) => { try { await fetchAdmin(); const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/adminView`, + urls.adminView, { search: search }, ); setPlant(response.data.resultPlant); diff --git a/client/src/components/BirdEditPageTextForm.js b/client/src/components/BirdEditPageTextForm.js index 62c99e7..8e3f17c 100644 --- a/client/src/components/BirdEditPageTextForm.js +++ b/client/src/components/BirdEditPageTextForm.js @@ -1,4 +1,5 @@ -import axios from "axios"; +import axios from "../api/http"; +import urls from "../tools/url"; import React, { useState, useEffect, useRef } from "react"; import { InputText } from "primereact/inputtext"; import { InputTextarea } from "primereact/inputtextarea"; @@ -65,7 +66,7 @@ const BirdEditPageTextForm = (prop) => { setLoadingMessage("loading..."); try { - await axios.post(`${process.env.REACT_APP_Source_URL}/birdUpdateText`, { + await axios.post(urls.birdUpdateText, { latinName, chineseName, commonName, diff --git a/client/src/components/BirdGalleryDatabase.js b/client/src/components/BirdGalleryDatabase.js index 07a4545..fb21fb0 100755 --- a/client/src/components/BirdGalleryDatabase.js +++ b/client/src/components/BirdGalleryDatabase.js @@ -1,31 +1,29 @@ -import axios from "axios"; +import axios from "../api/http"; +import urls, { mediaUrl, responsiveMediaProps } from "../tools/url"; import React, { useState, useEffect, useMemo } from "react"; import styles from "../styles/galleryDatabase.module.css"; -import SearchPlant from "./SearchPlant.js"; import ArrowIcon from "../src/buttons/arrow.svg"; +import MediaImage from "./MediaImage.js"; const GalleryDatabase = (props) => { const seasons = useMemo(() => ["spring", "summer", "autumn", "winter"], []); const month2NumMap = { - 'Jan':'01/', - 'Feb':'02/', - 'Mar':'03/', - 'Apr':'04/', - 'May':'05/', - 'Jun':'06/', - 'Jul':'07/', - 'Aug':'08/', - 'Sep':'09/', - 'Oct':'10/', - 'Nov':'11/', - 'Dec':'12/', + Jan: "01/", + Feb: "02/", + Mar: "03/", + Apr: "04/", + May: "05/", + Jun: "06/", + Jul: "07/", + Aug: "08/", + Sep: "09/", + Oct: "10/", + Nov: "11/", + Dec: "12/", }; const [curIndex, setCurIndex] = useState(0); const [username, setUsername] = useState(""); const [admin, setAdmin] = useState(""); - const [query, setQuery] = useState(""); - const [searchResults, setSearchResults] = useState([]); - const [namesArray, setNamesArray] = useState([]); const [pics, setPics] = useState([]); const [displays, setDisplays] = useState([true, false, false, false]); const [zoomPicLink, setZoomPicLink] = useState(""); @@ -41,13 +39,11 @@ const GalleryDatabase = (props) => { // also set allSeasonPics so you can page later const [allSeasonPics, setAllSeasonPics] = useState({}); - // Which season is selected (e.g. "spring", or "" if none yet) const [selectedSeason, setSelectedSeason] = useState(""); // Which month‐year is selected within that season (e.g. "Mar 2025") const [selectedMonth, setSelectedMonth] = useState(""); - useEffect(() => { const springBtn = document.getElementById("springBtn"); if (springBtn) { @@ -113,10 +109,7 @@ const GalleryDatabase = (props) => { const plant = props.customKey; const getPics = async () => { try { - const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/getPics`, - { plant: plant }, - ); + const response = await axios.post(urls.getPics, { plant: plant }); let newArray = []; seasons.forEach((season, index) => { newArray[index] = response.data[`${season}Pics`]; @@ -125,7 +118,7 @@ const GalleryDatabase = (props) => { const seasonMonthMap = seasons.reduce((acc, season, i) => { const pics = newArray[i]; const monthMap = {}; - pics.forEach(pic => { + pics.forEach((pic) => { // assume pic.time === "Day Mon DD YYYY …" const [, mon, , year] = pic.time.split(" "); const key = `${mon} ${year}`; @@ -147,55 +140,21 @@ const GalleryDatabase = (props) => { getPics(); }, [props.customKey, seasons]); - useEffect(() => { - const fetchData = async () => { - try { - const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/searchNames`, - ); - const fetchedNamesArray = response.data.returnNames; - setNamesArray(fetchedNamesArray); - } catch (error) { - console.log(error); - } - }; - - fetchData(); - }, []); - const handleBack = () => { props.handleBack(props.customKey); }; - const handleSearch = (e) => { - const inputValue = e.target.value; - setQuery(inputValue); - const results = SearchPlant(namesArray, inputValue); - const finalResults = results.slice(0, 3).map((result) => { - return [ - result.item.latinName, - result.item.commonName, - result.item.chineseName, - ]; - }); - setSearchResults(finalResults); - }; - const featureSingleHandle = async (input) => { try { const newFeature = { plant: " " + props.customKey, path: zoomPicLink, }; - await axios.post( - `${process.env.REACT_APP_Source_URL}/uploadFeatureSingle`, - newFeature, - { - headers: { - "Content-Type": "multipart/form-data", - }, + await axios.post(urls.uploadFeatureSingle, newFeature, { + headers: { + "Content-Type": "multipart/form-data", }, - ); + }); } catch (error) { console.log(error); } @@ -204,14 +163,11 @@ const GalleryDatabase = (props) => { useEffect(() => { const fetchUserInfo = async () => { try { - const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/userInfo`, - { - headers: { - Authorization: `${localStorage.getItem("askanything")}`, - }, + const response = await axios.get(urls.userInfo, { + headers: { + Authorization: `${localStorage.getItem("askanything")}`, }, - ); + }); setUsername(response.data.username); setAdmin(response.data.admin); } catch (error) { @@ -263,14 +219,14 @@ const GalleryDatabase = (props) => {
*/}
- {seasons.map(s => ( + {seasons.map((s) => ( <> {s != "winter" &&
} - ))}
@@ -298,7 +253,7 @@ const GalleryDatabase = (props) => { setCurIndex(0); }} > - {month2NumMap[m.slice(0,3)]+m.slice(4,8)} + {month2NumMap[m.slice(0, 3)] + m.slice(4, 8)} ))} @@ -337,10 +292,6 @@ const GalleryDatabase = (props) => { }, [])}
*/} - - - - {/* {pics.map( (pic, index) => displays[index] && @@ -352,7 +303,7 @@ const GalleryDatabase = (props) => { .map((p, index) => (
@@ -392,21 +343,28 @@ const GalleryDatabase = (props) => { ), )} */} - {selectedSeason && selectedMonth && (() => { - const picsToShow = seasonMonthMap[selectedSeason][selectedMonth] || []; - const pageSize = 12; - const start = curIndex * pageSize; - const end = start + pageSize; - return ( - // - <> + {selectedSeason && + selectedMonth && + (() => { + const picsToShow = + seasonMonthMap[selectedSeason][selectedMonth] || []; + const pageSize = 12; + const start = curIndex * pageSize; + const end = start + pageSize; + return ( + // + <>
{picsToShow .slice(curIndex * 12, (curIndex + 1) * 12) .map((p, index) => (
- @@ -444,8 +402,8 @@ const GalleryDatabase = (props) => {
)} - ); - })()} + ); + })()} {/* {curMode === "month" && monthPics.map( @@ -458,7 +416,7 @@ const GalleryDatabase = (props) => { .map((pic, picIndex) => (
@@ -509,9 +467,11 @@ const GalleryDatabase = (props) => { {zoomPicLink && (
- {zoomPicLink} -
+
{/* Characteristics: */} -

- Characteristics: -

-
+

Characteristics:

+

{stageChar[index]} {/* placehodler */} @@ -669,7 +626,9 @@ const InfoDatabase = (search) => { alignItems: "center", }} > -

Diet and Foraging 主要食谱与觅食行为:

+

+ Diet and Foraging 主要食谱与觅食行为: +

{diet}

)} @@ -697,7 +656,9 @@ const InfoDatabase = (search) => { alignItems: "center", }} > -

Movements and Migration 迁徙行为:

+

+ Movements and Migration 迁徙行为: +

{migration}

)} @@ -781,32 +742,34 @@ const InfoDatabase = (search) => {

Artwork

- {load ? ( -
- ) : ( -
- handleArtZoom(displayArtPath)} - alt="art" - className={styles.artPic} - /> -
-

Painter: {artInfoArray[artsIndex].painter}

- {/*

Time: {postingtime}

*/} -

Setting: {artInfoArray[artsIndex].setting}

-
+
+ } + loading="lazy" + decoding="async" + id="artPic" + onClick={() => handleArtZoom(displayArtPath)} + alt="art" + className={styles.artPic} + /> +
+

Painter: {artInfoArray[artsIndex].painter}

+ {/*

Time: {postingtime}

*/} +

Setting: {artInfoArray[artsIndex].setting}

+
+ {artPathsArray.length > 1 ? ( + + ) : ( + <> )} - {artPathsArray.length>1? - :<>}
)} @@ -841,7 +804,6 @@ const InfoDatabase = (search) => { index={0} seasonCheck={springCheck} seasonIndex={springPicsArrayIndex} - seasonLeft={springLeftover} seasonInfo={springInfo} /> @@ -884,9 +846,11 @@ const InfoDatabase = (search) => {
{zoomPicLink && (
- {zoomPicLink} - pic
- art @@ -223,22 +235,23 @@ const CreationPaintings = ({ handleGets, handleView, onDataLoad }) => { Oldest -
-
+
+
{numOfPages > 0 && Array.from({ length: numOfPages }, (_, index) => ( - ))}

{Array.from( - { length: itemsPerPage / 2}, + { length: itemsPerPage / 2 }, (_, index) => (displayObjectList[currentDisplayIndexes[2 * index]] || displayObjectList[currentDisplayIndexes[2 * index + 1]]) && ( diff --git a/client/src/components/EditPageTextForm.js b/client/src/components/EditPageTextForm.js index cb34b9d..be93cfc 100644 --- a/client/src/components/EditPageTextForm.js +++ b/client/src/components/EditPageTextForm.js @@ -1,4 +1,5 @@ -import axios from "axios"; +import axios from "../api/http"; +import urls from "../tools/url"; import React, { useState, useEffect, useRef } from "react"; import { InputText } from "primereact/inputtext"; import { InputTextarea } from "primereact/inputtextarea"; @@ -54,7 +55,7 @@ const EditPageTextForm = (prop) => { try { console.log("Original latin22:") console.log(originalLatin) - await axios.post(`${process.env.REACT_APP_Source_URL}/updateText`, { + await axios.post(urls.updateText, { latinName, chineseName, commonName, diff --git a/client/src/components/GalleryDatabase.js b/client/src/components/GalleryDatabase.js index 55c1da7..d50905a 100755 --- a/client/src/components/GalleryDatabase.js +++ b/client/src/components/GalleryDatabase.js @@ -1,33 +1,31 @@ -import axios from "axios"; +import axios from "../api/http"; +import urls, { mediaUrl, responsiveMediaProps } from "../tools/url"; import React, { useState, useEffect, useMemo } from "react"; import styles from "../styles/galleryDatabase.module.css"; -import SearchPlant from "./SearchPlant.js"; import ArrowIcon from "../src/buttons/arrow.svg"; +import MediaImage from "./MediaImage.js"; const GalleryDatabase = (props) => { const seasons = useMemo(() => ["spring", "summer", "autumn", "winter"], []); const month2NumMap = { - 'Jan':'01/', - 'Feb':'02/', - 'Mar':'03/', - 'Apr':'04/', - 'May':'05/', - 'Jun':'06/', - 'Jul':'07/', - 'Aug':'08/', - 'Sep':'09/', - 'Oct':'10/', - 'Nov':'11/', - 'Dec':'12/', + Jan: "01/", + Feb: "02/", + Mar: "03/", + Apr: "04/", + May: "05/", + Jun: "06/", + Jul: "07/", + Aug: "08/", + Sep: "09/", + Oct: "10/", + Nov: "11/", + Dec: "12/", }; // const [availableSeason, setAvailableSeason] = useState(""); var availableSeason = ""; const [curIndex, setCurIndex] = useState(0); const [username, setUsername] = useState(""); const [admin, setAdmin] = useState(""); - const [query, setQuery] = useState(""); - const [searchResults, setSearchResults] = useState([]); - const [namesArray, setNamesArray] = useState([]); const [pics, setPics] = useState([]); const [displays, setDisplays] = useState([true, false, false, false]); const [zoomPicLink, setZoomPicLink] = useState(""); @@ -42,15 +40,12 @@ const GalleryDatabase = (props) => { const [seasonMonthMap, setSeasonMonthMap] = useState({}); // also set allSeasonPics so you can page later const [allSeasonPics, setAllSeasonPics] = useState({}); - - // Which season is selected (e.g. "spring", or "" if none yet) const [selectedSeason, setSelectedSeason] = useState(""); // Which month‐year is selected within that season (e.g. "Mar 2025") const [selectedMonth, setSelectedMonth] = useState(""); - useEffect(() => { const springBtn = document.getElementById("springBtn"); if (springBtn) { @@ -116,14 +111,14 @@ const GalleryDatabase = (props) => { const plant = props.customKey; const getPics = async () => { try { - const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/getPics`, - { plant: plant }, - ); + const response = await axios.post(urls.getPics, { plant: plant }); let newArray = []; seasons.forEach((season, index) => { newArray[index] = response.data[`${season}Pics`]; - if(response.data[`${season}Pics`].length>0 && availableSeason===""){ + if ( + response.data[`${season}Pics`].length > 0 && + availableSeason === "" + ) { availableSeason = season; } }); @@ -131,20 +126,19 @@ const GalleryDatabase = (props) => { const seasonMonthMap = seasons.reduce((acc, season, i) => { const pics = newArray[i]; const monthMap = {}; - pics.forEach(pic => { + pics.forEach((pic) => { // assume pic.time === "Day Mon DD YYYY …" const [, mon, , year] = pic.time.split(" "); const key = `${mon} ${year}`; if (!monthMap[key]) monthMap[key] = []; monthMap[key].push(pic); - }); acc[season] = monthMap; return acc; }, {}); - + setSelectedSeason(availableSeason); - setSelectedMonth((Object.keys(seasonMonthMap[availableSeason])[0] || "")); + setSelectedMonth(Object.keys(seasonMonthMap[availableSeason])[0] || ""); setPics(newArray); sortPicMonth(newArray.flat()); @@ -157,57 +151,21 @@ const GalleryDatabase = (props) => { getPics(); }, [props.customKey, seasons]); - - useEffect(() => { - const fetchData = async () => { - try { - const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/searchNames`, - ); - const fetchedNamesArray = response.data.returnNames; - setNamesArray(fetchedNamesArray); - } catch (error) { - console.log(error); - } - }; - - fetchData(); - // setSelectedSeason(availableSeason); - }, []); - const handleBack = () => { props.handleBack(props.customKey); }; - const handleSearch = (e) => { - const inputValue = e.target.value; - setQuery(inputValue); - const results = SearchPlant(namesArray, inputValue); - const finalResults = results.slice(0, 3).map((result) => { - return [ - result.item.latinName, - result.item.commonName, - result.item.chineseName, - ]; - }); - setSearchResults(finalResults); - }; - const featureSingleHandle = async (input) => { try { const newFeature = { plant: " " + props.customKey, path: zoomPicLink, }; - await axios.post( - `${process.env.REACT_APP_Source_URL}/uploadFeatureSingle`, - newFeature, - { - headers: { - "Content-Type": "multipart/form-data", - }, + await axios.post(urls.uploadFeatureSingle, newFeature, { + headers: { + "Content-Type": "multipart/form-data", }, - ); + }); } catch (error) { console.log(error); } @@ -216,14 +174,11 @@ const GalleryDatabase = (props) => { useEffect(() => { const fetchUserInfo = async () => { try { - const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/userInfo`, - { - headers: { - Authorization: `${localStorage.getItem("askanything")}`, - }, + const response = await axios.get(urls.userInfo, { + headers: { + Authorization: `${localStorage.getItem("askanything")}`, }, - ); + }); setUsername(response.data.username); setAdmin(response.data.admin); } catch (error) { @@ -233,7 +188,6 @@ const GalleryDatabase = (props) => { // setSelectedSeason(availableSeason); fetchUserInfo(); }, []); - // setSelectedMonth((Object.keys([s])[0] || "")); @@ -241,7 +195,6 @@ const GalleryDatabase = (props) => {
-

Image Gallery 图库

*/}
- {seasons.map(s => ( + {seasons.map((s) => ( <> {s != "winter" &&
} - ))}
@@ -314,7 +266,7 @@ const GalleryDatabase = (props) => { setCurIndex(0); }} > - {month2NumMap[m.slice(0,3)]+m.slice(4,8)} + {month2NumMap[m.slice(0, 3)] + m.slice(4, 8)} ))} @@ -353,10 +305,6 @@ const GalleryDatabase = (props) => { }, [])}
*/} - - - - {/* {pics.map( (pic, index) => displays[index] && @@ -368,7 +316,7 @@ const GalleryDatabase = (props) => { .map((p, index) => (
@@ -408,21 +356,28 @@ const GalleryDatabase = (props) => { ), )} */} - {selectedSeason && selectedMonth && (() => { - const picsToShow = seasonMonthMap[selectedSeason][selectedMonth] || []; - const pageSize = 12; - const start = curIndex * pageSize; - const end = start + pageSize; - return ( - // - <> + {selectedSeason && + selectedMonth && + (() => { + const picsToShow = + seasonMonthMap[selectedSeason][selectedMonth] || []; + const pageSize = 12; + const start = curIndex * pageSize; + const end = start + pageSize; + return ( + // + <>
{picsToShow .slice(curIndex * 12, (curIndex + 1) * 12) .map((p, index) => (
- @@ -460,8 +415,8 @@ const GalleryDatabase = (props) => {
)} - ); - })()} + ); + })()} {/* {curMode === "month" && monthPics.map( @@ -474,7 +429,7 @@ const GalleryDatabase = (props) => { .map((pic, picIndex) => (
@@ -525,9 +480,11 @@ const GalleryDatabase = (props) => { {zoomPicLink && (
- {zoomPicLink} + ) : ( + <> )} - {artPathsArray.length>1? - :<>}
)} @@ -737,9 +704,11 @@ const InfoDatabase = (search) => {
{zoomPicLink && (
- {zoomPicLink}
- + ); }; diff --git a/client/src/pages/Register.js b/client/src/pages/Register.js index d96f12a..1e5e36a 100644 --- a/client/src/pages/Register.js +++ b/client/src/pages/Register.js @@ -1,5 +1,6 @@ import React, { useState } from "react"; -import axios from "axios"; +import axios from "../api/http"; +import urls from "../tools/url"; import { Link } from "react-router-dom"; import { useNavigate } from "react-router-dom"; import { TailSpin } from "react-loader-spinner"; @@ -25,7 +26,7 @@ const Register = () => { try { setLoading(true); const response = await axios.post( - `${process.env.REACT_APP_Source_URL}/register`, + urls.register, { username, password, @@ -54,7 +55,7 @@ const Register = () => { const fetchData = async () => { try { const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/userInfo`, + urls.userInfo, ); setAdmin(response.data.admin); } catch (error) { diff --git a/client/src/pages/Upload.js b/client/src/pages/Upload.js index 0f93059..d5ece59 100644 --- a/client/src/pages/Upload.js +++ b/client/src/pages/Upload.js @@ -1,4 +1,3 @@ -import axios from "axios"; import { useNavigate } from "react-router-dom"; import React, { useState, useEffect } from "react"; import { useContext } from "react"; @@ -16,7 +15,6 @@ const Upload = () => { const navigate = useNavigate(); const [links, setLinks] = useState(""); const [chineseLinks, setChineseLinks] = useState(""); - const [namesArray, setNamesArray] = useState(""); const [linkArray, setLinkArray] = useState([]); const [chineseLinkArray, setChineseLinkArray] = useState([]); const [currentSubpage, setCurrentSubpage] = useState("plant"); @@ -64,22 +62,6 @@ const Upload = () => { authUser(); }, [navigate, status]); - useEffect(() => { - const fetchData = async () => { - try { - const response = await axios.get( - `${process.env.REACT_APP_Source_URL}/searchNames`, - ); - const fetchedNamesArray = response.data.returnNames; - setNamesArray(fetchedNamesArray); - } catch (error) { - console.log(error); - } - }; - - fetchData(); - }, []); - useEffect(() => { const splittedLinks = links.split(", "); var linkArray = []; diff --git a/client/src/setupTests.js b/client/src/setupTests.js new file mode 100644 index 0000000..558e30c --- /dev/null +++ b/client/src/setupTests.js @@ -0,0 +1,3 @@ +// CRA loads this file before tests. Keep it dependency-free until a compatible +// testing-library package is deliberately introduced and locked. +globalThis.IS_REACT_ACT_ENVIRONMENT = true; diff --git a/client/src/styles/creation.css b/client/src/styles/creation.css index f899beb..07e8a2c 100644 --- a/client/src/styles/creation.css +++ b/client/src/styles/creation.css @@ -1,6 +1,6 @@ section.creationPart1 { background: - url("../../public/new_bg.jpg") top center / 100vw 60rem no-repeat, + url("../assets/backgrounds/new-bg.webp") top center / 100vw 60rem no-repeat, url("../../public/doc3.jpg") center center / 100vw auto no-repeat, url("../../public/doc2.jpg") bottom center / 100vw auto no-repeat; border: none; diff --git a/client/src/styles/database.css b/client/src/styles/database.css index 605fdf0..6f4ecbc 100644 --- a/client/src/styles/database.css +++ b/client/src/styles/database.css @@ -1,6 +1,6 @@ section.db { color: #ffffff; - background: url("../../public/new_bg.jpg") no-repeat; + background: url("../assets/backgrounds/new-bg.webp") no-repeat; background-size: cover; height: 100vh; background-attachment: fixed; @@ -70,7 +70,7 @@ div.homeDatabase { } div.birdHomeDatabase { - background: url("../../public/bird_bg.jpg") no-repeat; + background: url("../assets/backgrounds/bird-bg.webp") no-repeat; background-attachment: fixed; background-position: center -2rem; background-size: cover; diff --git a/client/src/styles/editPage.css b/client/src/styles/editPage.css index 1719a1f..d6ed538 100644 --- a/client/src/styles/editPage.css +++ b/client/src/styles/editPage.css @@ -1,6 +1,6 @@ section.editPage { background: - url("../../public/new_bg.jpg") top center / 100vw 60rem no-repeat, + url("../assets/backgrounds/new-bg.webp") top center / 100vw 60rem no-repeat, url("../../public/part2.jpg") center center / 100vw auto no-repeat, url("../../public/doc2.jpg") bottom center / 100vw auto no-repeat; } @@ -117,4 +117,4 @@ div.textBtm { .bulk-delete-btn:disabled { background-color: #aaa; cursor: not-allowed; -} \ No newline at end of file +} diff --git a/client/src/styles/glossary.module.css b/client/src/styles/glossary.module.css index af8ed34..95f8a94 100644 --- a/client/src/styles/glossary.module.css +++ b/client/src/styles/glossary.module.css @@ -1,6 +1,6 @@ body.glossary { color: #ffffff; - background: url("../../public/new_bg.jpg") no-repeat; + background: url("../assets/backgrounds/new-bg.webp") no-repeat; background-size: 100% 100%; background-attachment: fixed; background-position: center; diff --git a/client/src/styles/home.module.css b/client/src/styles/home.module.css index fb429bf..cf57766 100644 --- a/client/src/styles/home.module.css +++ b/client/src/styles/home.module.css @@ -34,13 +34,6 @@ section.home { justify-content: center; align-items: center; } -/* Style the buttons */ -button { - background-color: transparent; - border: none; - cursor: pointer; - font-size: 1.5rem; -} /* Style the ionicons */ @@ -69,7 +62,7 @@ h4.plantInBloom { margin: 0; } div.part1 { - background: url("../../public/new_bg.jpg") no-repeat; + background: url("../assets/backgrounds/new-bg.webp") no-repeat; border: none; background-position: top center; position: relative; diff --git a/client/src/styles/upload.css b/client/src/styles/upload.css index 588d97e..f73a72d 100644 --- a/client/src/styles/upload.css +++ b/client/src/styles/upload.css @@ -25,7 +25,7 @@ section.upload { min-height: 100vh; background: - url("../../public/new_bg.jpg") top center / 100vw 60rem no-repeat, + url("../assets/backgrounds/new-bg.webp") top center / 100vw 60rem no-repeat, url("../../public/part2.jpg") center center / 100vw auto no-repeat, url("../../public/doc2.jpg") bottom center / 100vw auto no-repeat; padding-bottom: 1rem; diff --git a/client/src/styles/uploadHome.css b/client/src/styles/uploadHome.css index fd33980..a6aca9d 100644 --- a/client/src/styles/uploadHome.css +++ b/client/src/styles/uploadHome.css @@ -117,8 +117,6 @@ div.homeEntryBox { margin-bottom: 1rem; } -.p-dialog-maximized { - .p-dialog-content { - padding: 0; - } +.p-dialog-maximized .p-dialog-content { + padding: 0; } diff --git a/client/src/tools/url.js b/client/src/tools/url.js index 812622f..e85bf35 100644 --- a/client/src/tools/url.js +++ b/client/src/tools/url.js @@ -1,49 +1,151 @@ -const prefix = process.env.REACT_APP_Source_URL; +export const normalizeApiOrigin = (value) => { + const configuredOrigin = String(value || "") + .trim() + .replace(/\/+$/, ""); + return configuredOrigin || "/api"; +}; + +export const apiOrigin = normalizeApiOrigin( + process.env.REACT_APP_Source_URL, +); + +const withLeadingSlash = (path) => { + const value = String(path ?? ""); + return value.startsWith("/") ? value : `/${value}`; +}; + +export const apiUrl = (path = "") => `${apiOrigin}${withLeadingSlash(path)}`; + +export const mediaUrl = (path, { compressed = false } = {}) => { + if (!path) { + return ""; + } + + const mediaPath = withLeadingSlash(path).replace(/^\/public(?=\/)/, ""); + const normalizedPath = compressed + ? mediaPath.replace(/^\/compressed(?=\/)/, "") + : mediaPath; + + return apiUrl(`/public${compressed ? "/compressed" : ""}${normalizedPath}`); +}; + +export const MEDIA_VARIANT_VERSION = "v1"; +export const MEDIA_VARIANT_WIDTHS = [480, 960, 1600]; + +const normalizeMediaPath = (path) => + withLeadingSlash(path) + .replace(/^\/public(?=\/)/, "") + .replace(/^\/compressed(?=\/)/, ""); + +export const mediaVariantUrl = ( + path, + { width, version = MEDIA_VARIANT_VERSION } = {}, +) => { + if (!path || !MEDIA_VARIANT_WIDTHS.includes(Number(width))) { + return ""; + } + + const mediaPath = normalizeMediaPath(path); + if (!mediaPath.startsWith("/plantspic/")) { + return ""; + } + + return apiUrl( + `/public/variants/${version}/${Number(width)}${mediaPath}.webp`, + ); +}; + +export const responsiveMediaProps = ( + path, + { sizes = "100vw", widths = MEDIA_VARIANT_WIDTHS } = {}, +) => { + if (!path) { + return { src: "", fallbackSrc: [] }; + } + + const validWidths = [...new Set(widths.map(Number))] + .filter((width) => MEDIA_VARIANT_WIDTHS.includes(width)) + .sort((left, right) => left - right); + const candidates = validWidths + .map((width) => [mediaVariantUrl(path, { width }), width]) + .filter(([url]) => url); + + if (candidates.length === 0) { + return { + src: mediaUrl(path, { compressed: true }), + fallbackSrc: mediaUrl(path), + }; + } + + return { + src: candidates[candidates.length - 1][0], + srcSet: candidates.map(([url, width]) => `${url} ${width}w`).join(", "), + sizes, + fallbackSrc: [mediaUrl(path, { compressed: true }), mediaUrl(path)], + }; +}; const urls = { // Admin-related URLs - adminDataGet: `${prefix}/adminDataGet`, - adminToggle: `${prefix}/adminToggle`, - adminAuth: `${prefix}/adminAuth`, - adminView: `${prefix}/adminView`, + adminDataGet: apiUrl("/adminDataGet"), + adminToggle: apiUrl("/adminToggle"), + adminAuth: apiUrl("/adminAuth"), + adminView: apiUrl("/adminView"), + makeFeatured: apiUrl("/makeFeatured"), // User-related URLs - login: `${prefix}/login`, - logout: `${prefix}/logout`, - userInfo: `${prefix}/userInfo`, - userInfoGlossary: `${prefix}/userInfoGlossary`, + login: apiUrl("/login"), + logout: apiUrl("/logout"), + register: apiUrl("/register"), + userInfo: apiUrl("/userInfo"), + userInfoGlossary: apiUrl("/userInfoGlossary"), + userInfoGlossaryBird: apiUrl("/userInfoGlossaryBird"), // Creation-related URLs - newCreationAuth: `${prefix}/newCreationAuth`, - newPostAuth: `${prefix}/newPostAuth`, - uploadCreation: `${prefix}/uploadCreation`, - unFeatureCreation: `${prefix}/unFeatureCreation`, - featureToHome: `${prefix}/featureToHome`, - unFeatureHome: `${prefix}/unFeatureHome`, + newCreationAuth: apiUrl("/newCreationAuth"), + newBirdPostAuth: apiUrl("/newBirdPostAuth"), + newPostAuth: apiUrl("/newPostAuth"), + uploadCreation: apiUrl("/uploadCreation"), + unFeatureCreation: apiUrl("/unFeatureCreation"), + featureToHome: apiUrl("/featureToHome"), + unFeatureHome: apiUrl("/unFeatureHome"), + uploadHome: apiUrl("/uploadHome"), + getPicsAndArts: apiUrl("/getPicsAndArts"), // Media-related URLs - upload: `${prefix}/upload`, - uploadBird: `${prefix}/uploadBird`, - uploadPic: `${prefix}/uploadPic`, - uploadArt: `${prefix}/uploadArt`, - getPics: `${prefix}/getPics`, - uploadFeatureSingle: `${prefix}/uploadFeatureSingle`, - getDb2Pic: `${prefix}/getDb2Pic`, - db2Alt: `${prefix}/db2Alt`, - - // Plant-related URLs - numOFPlants: `${prefix}/numOFPlants`, - syncPlantInfo: `${prefix}/syncPlantInfo`, - editPageDelete: `${prefix}/editPageDelete`, - editPageDeletePlant: `${prefix}/editPageDeletePlant`, + upload: apiUrl("/upload"), + uploadPlant: apiUrl("/uploadPlant"), + uploadBird: apiUrl("/uploadBird"), + uploadPic: apiUrl("/uploadPic"), + uploadBirdPic: apiUrl("/uploadBirdPic"), + uploadArt: apiUrl("/uploadArt"), + getPics: apiUrl("/getPics"), + uploadFeatureSingle: apiUrl("/uploadFeatureSingle"), + uploadFeatureArtSingle: apiUrl("/uploadFeatureArtSingle"), + getDb2Pic: apiUrl("/getDb2Pic"), + getDb2PicBird: apiUrl("/getDb2PicBird"), + db2Alt: apiUrl("/db2Alt"), + db2AltBird: apiUrl("/db2AltBird"), + + // Plant- and bird-related URLs + numOfPlants: apiUrl("/numOfPlants"), + numOfBirds: apiUrl("/numOfBirds"), + syncPlantInfo: apiUrl("/syncPlantInfo"), + syncBirdInfo: apiUrl("/syncBirdInfo"), + editPageDelete: apiUrl("/editPageDelete"), + editPageDeletePlant: apiUrl("/editPageDeletePlant"), + birdUpdateText: apiUrl("/birdUpdateText"), // Miscellaneous URLs - refresh: `${prefix}/refresh`, - handleEditDecision: `${prefix}/handleEditDecision`, - creationDocumentary: `${prefix}/creationDocumentary`, - updateText: `${prefix}/updateText`, - searchNames: `${prefix}/searchNames`, - searchBirdNames: `${prefix}/searchBirdNames`, + refresh: apiUrl("/refresh"), + handleEditDecision: apiUrl("/handleEditDecision"), + handleBirdEditDecision: apiUrl("/handleBirdEditDecision"), + creationDocumentary: apiUrl("/creationDocumentary"), + updateText: apiUrl("/updateText"), + searchNames: apiUrl("/searchNames"), + searchBirdNames: apiUrl("/searchBirdNames"), + catalogNames: (type) => apiUrl(`/catalog/names?type=${type}`), + searchTelemetry: apiUrl("/telemetry/search"), }; export default urls; diff --git a/client/src/tools/url.test.js b/client/src/tools/url.test.js new file mode 100644 index 0000000..95cada5 --- /dev/null +++ b/client/src/tools/url.test.js @@ -0,0 +1,59 @@ +import urls, { + apiOrigin, + apiUrl, + mediaUrl, + mediaVariantUrl, + normalizeApiOrigin, + responsiveMediaProps, +} from "./url"; + +test("defaults missing API configuration to the production proxy", () => { + expect(normalizeApiOrigin(undefined)).toBe("/api"); + expect(normalizeApiOrigin("")).toBe("/api"); + expect(normalizeApiOrigin(" ")).toBe("/api"); + expect(normalizeApiOrigin("http://localhost:3001/")).toBe( + "http://localhost:3001", + ); +}); + +test("normalizes API and media paths without changing the configured origin", () => { + expect(apiUrl("health/live")).toBe(`${apiOrigin}/health/live`); + expect(mediaUrl("plantspic/example.jpg")).toBe( + `${apiOrigin}/public/plantspic/example.jpg`, + ); + expect(mediaUrl("/public/plantspic/example.jpg")).toBe( + `${apiOrigin}/public/plantspic/example.jpg`, + ); + expect( + mediaUrl("/compressed/plantspic/example.jpg", { compressed: true }), + ).toBe(`${apiOrigin}/public/compressed/plantspic/example.jpg`); + expect(mediaUrl(undefined)).toBe(""); +}); + +test("the plant count URL matches the existing backend route", () => { + expect(urls.numOfPlants).toBe(`${apiOrigin}/numOfPlants`); + expect(urls.uploadPlant).toBe(`${apiOrigin}/uploadPlant`); +}); + +test("builds versioned responsive media URLs without changing legacy paths", () => { + expect(mediaVariantUrl("plantspic/example.jpg", { width: 480 })).toBe( + `${apiOrigin}/public/variants/v1/480/plantspic/example.jpg.webp`, + ); + expect(mediaVariantUrl("plantspic/example.jpg", { width: 123 })).toBe(""); + expect(mediaVariantUrl("newAboutUs.jpg", { width: 480 })).toBe(""); + + const props = responsiveMediaProps("plantspic/example.jpg", { + sizes: "(max-width: 700px) 50vw, 20vw", + }); + expect(props.src).toContain( + "/public/variants/v1/1600/plantspic/example.jpg.webp", + ); + expect(props.srcSet).toContain( + "/public/variants/v1/480/plantspic/example.jpg.webp 480w", + ); + expect(props.sizes).toBe("(max-width: 700px) 50vw, 20vw"); + expect(props.fallbackSrc).toEqual([ + `${apiOrigin}/public/compressed/plantspic/example.jpg`, + `${apiOrigin}/public/plantspic/example.jpg`, + ]); +}); diff --git a/docs/architecture/image-delivery-design.md b/docs/architecture/image-delivery-design.md new file mode 100644 index 0000000..6323eb5 --- /dev/null +++ b/docs/architecture/image-delivery-design.md @@ -0,0 +1,150 @@ +# Image delivery and loading design + +Date: 2026-07-23. + +This design is intentionally incremental. It improves how existing images are +requested without changing MongoDB paths or replacing the current media store. + +## Verified current behavior + +- MongoDB stores legacy media paths while the server exposes both + `/public/plantspic` and `/public/compressed/plantspic` trees. +- Existing upload contracts still write their legacy outputs. New uploads also + schedule additive responsive variants after the successful database write; + variant failure does not change the upload response contract. +- Public catalogue, gallery, detail, home, and creation views use the shared + image component instead of preloading one URL and rendering another. +- Grid images are normally rendered at roughly 15.5–18 viewport-width units; + zoomed images can reach 70% of the viewport. One source size is therefore not + appropriate for every context. +- The verified production population contains 1,033 readable originals with a + median width of 1600 px and median height of 900 px. The responsive widths are + 480, 960, and 1600 px. + +## Design decisions + +### 1. Fix request behavior before changing storage + +- Render the intended final URL directly. Do not preload a different source in + JavaScript and then insert a second image element. +- Use one bounded `onError` fallback. A missing compressed derivative may fall + back to the legacy path once; it must not loop between URLs. +- Preserve the original file and every existing database path. + +### 2. Loading priority follows viewport role + +- Known above-the-fold/LCP candidates remain eagerly loaded. Only a confirmed + primary image may use `fetchpriority="high"`. +- Below-the-fold gallery, administration, creation, and zoom-preview images use + native `loading="lazy"` and `decoding="async"`. +- Grid containers reserve space with their existing aspect ratio. Intrinsic + `width` and `height` are added only when the dimensions are known; fabricated + dimensions would trade one layout problem for another. + +The distinction follows the browser guidance that lazy loading saves work for +off-screen images but delays likely LCP images, and that intrinsic dimensions +or an equivalent aspect ratio prevent layout shifts: + +- [web.dev: image performance issues](https://web.dev/learn/images/performance-issues) +- [web.dev: image performance](https://web.dev/learn/performance/image-performance) + +### 3. Responsive variants are explicit and versioned + +- The shared client helper emits `srcset` and `sizes` for 480, 960, and 1600 px + versioned URLs. The browser selects one candidate for the rendered slot. +- The backend serves an existing variant with immutable caching. If a requested + variant is absent, the same URL safely serves the legacy compressed file or + original with a short cache lifetime. The image component also clears + `srcset` and walks compressed/original fallbacks after a network error. +- MongoDB continues to store the original legacy path. No variant metadata or + schema migration is required. + +Responsive source selection and format fallback follow: + +- [MDN: the picture element](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/picture) +- [MDN: responsive images](https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Responsive_images) + +### 4. Derivatives are additive and deterministic + +- New uploads retain the original and current legacy compressed output. +- The derivative pipeline auto-orients, resizes without enlargement, strips + location/camera metadata by default, and write to a separate versioned + directory. A failure must remove every derivative from that attempt while + leaving prior media untouched. +- WebP quality is 78. AVIF is deferred until encoding + time and visual samples justify its additional format and cache variants. +- Sharp processing receives a pixel limit and timeout. Files publish through a + same-directory temporary output and hard link, so an existing destination is + never overwritten. Rename and deletion workflows also handle compressed and + versioned derivatives. + +Relevant implementation behavior is documented by Sharp: + +- [Sharp resize API](https://sharp.pixelplumbing.com/api-resize/) +- [Sharp output API](https://sharp.pixelplumbing.com/api-output/) + +### 5. Cache only immutable URLs as immutable + +- Long-lived `public, max-age, immutable` caching is used only for files whose + URL changes whenever their bytes change. +- HTML, JSON, and any overwriteable legacy media path keep revalidation-based + caching. Nginx changes remain a separately approved operational action. +- Format negotiation at one URL is avoided unless the response also uses a + correct `Vary` strategy. Explicit variant URLs are simpler for the current + deployment. + +See [MDN Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control). + +## Verified production measurements + +The 2026-07-23 full-population calculation measured every readable original +and exact-name derivative: + +| Width | Exact pairs | Derivative bytes | Median bytes | Aggregate reduction versus originals | +| ------- | ----------: | ---------------: | -----------: | -----------------------------------: | +| 480 px | 1,033 | 27,799,366 | 22,712 | 98.68% | +| 960 px | 1,033 | 73,519,304 | 54,176 | 96.52% | +| 1600 px | 1,033 | 135,733,456 | 92,174 | 93.57% | + +All 3,099 planned outputs were created with zero processing failures. Original +bytes remained 2,109,916,481 and total variant storage is 237,052,126 bytes. +These reductions are width-specific; a browser downloads one selected +candidate, and the three percentages must not be added. Human visual review is +not the same as byte measurement. + +A file-size-stratified visual check covered five originals at the minimum, +quartile, median, upper-quartile, and maximum positions together with their 480 +and 1600 px outputs. The sample included photography and artwork and showed no +obvious decode failure, rotation/crop error, severe blocking, or unusable colour +shift at the rendered inspection sizes. This is a representative smoke check, +not an exhaustive perceptual-quality score. + +## Ongoing measurement gates + +For the same route, viewport, cache state, and protocol, record before and +after: + +- image request count, failed/fallback request count, and transferred bytes; +- selected source URL/width and rendered CSS width; +- LCP candidate, LCP, and CLS when the browser tooling can measure them; +- derivative input/output bytes, dimensions, format, processing duration, and + failure result; +- build JavaScript size separately from media transfer size. + +Results from local fixtures are labelled as fixture results. Production-sized +claims use the aggregate in-place population calculation and never infer image +quality from file size alone. + +## Rollout and rollback + +1. Double-request removal and bounded legacy fallback are complete. +2. Reusable responsive image selection and viewport-based priority are + complete for the main public media views. +3. The derivative service passed anonymous local fixture tests. +4. The additive production backfill completed after a 1,033-file dry run and + capacity check; 3,099 outputs were created without overwriting originals. +5. No Nginx configuration change or MongoDB migration was made. + +Rollback first returns clients to existing legacy URLs. New derivative files +are additive and can remain unreferenced; originals are never deleted or +overwritten by this design. diff --git a/docs/evidence/README.md b/docs/evidence/README.md new file mode 100644 index 0000000..e02633b --- /dev/null +++ b/docs/evidence/README.md @@ -0,0 +1,31 @@ +# Evidence and metric records + +This directory contains public, redacted evidence records for BiphFlora. +It is intentionally limited to aggregate values, reproducible methods, and +explicit limitations. It must never contain credentials, server addresses, +raw access logs, raw user agents, account identifiers, media filenames, or +environment-variable values. + +The current baseline is [production-baseline-2026-07-22.md](production-baseline-2026-07-22.md). +The metric register is [metric-catalog.md](metric-catalog.md), the current +redacted traffic report is [traffic-report-2026-07-23.md](traffic-report-2026-07-23.md), +the CV-safe impact record is +[cv-impact-report-2026-07-23.md](cv-impact-report-2026-07-23.md), and collection +rules are in [collection-method.md](collection-method.md). + +## Status vocabulary + +- Direct: measured from the authoritative source at the stated collection time. +- Proxy: useful but not equivalent to the requested business metric. +- Unavailable: no trustworthy source or calculation currently exists. +- Candidate: evidence of an event that still cannot prove the event by itself. + +No metric may be promoted from proxy or unavailable to direct without adding +the source, calculation, filtering rules, collection date, and limitations. + +## Public and private boundary + +The corresponding private evidence register keeps operational source locations, +command/query text, and backup-review notes. It still excludes secret values, +raw logs, personal data, IP addresses, and unredacted user feedback. Git keeps +only this redacted version so the public repository remains safe to share. diff --git a/docs/evidence/collection-method.md b/docs/evidence/collection-method.md new file mode 100644 index 0000000..f1ff8c2 --- /dev/null +++ b/docs/evidence/collection-method.md @@ -0,0 +1,88 @@ +# Evidence collection method + +## Collection principles + +1. Treat MongoDB, filesystem media, Redis, logs, deployment metadata, backups, + TLS/DNS, and qualitative evidence as separate sources of truth. +2. Prefer read-only aggregation on the production host. Do not copy raw access + logs, media files, database dumps, credentials, tokens, or user records to + the repository. +3. Record a source's grain before interpreting it. For example, an Nginx log + entry is a request, not a session or a verified human. +4. Preserve the exact calculation and collection date for every number. +5. Mark missing evidence as unavailable rather than estimating a favorable + value. + +## Current source-to-metric mapping + +| Source class | Safe aggregate use | Not safe to infer | +| --- | --- | --- | +| MongoDB collections | Current document counts, authorization state, ObjectId bounds, logical database size | Deleted historical records, active users, completed workflows without audit events | +| Media filesystem | File count, byte totals, existence of a path referenced by a document | Unique image count, image quality, compression rate, successful upload count | +| Redis | Current key count and persistence mode | Session count, user count, cache-hit rate | +| Nginx access log | Unfiltered request-entry range and later filtered request/session estimates | Verified unique people, client-side SPA behavior, uptime | +| Application logs | Log retention range and aggregated error candidates | Error rate or incident history without a denominator and classification | +| Git/reflog/process metadata | Current deployed commit and deployment candidates | Total deployment count or a successful deployment by itself | +| Backup directories | Presence, age, and aggregate file metadata | Recoverability or coverage until a restore test proves it | +| RDAP, DNS, TLS, Wayback | Registration, certificate, and publicly observable history | Continuous availability or internal launch date | + +## Traffic calculation rule + +Traffic aggregation retains the source log on the server and saves only +aggregates. The strict audience-oriented view keeps fixed recognized product +routes and separately excludes unrecognized routes; the broad view is retained +only as an operational request diagnostic. A candidate session is a sequence +of included requests sharing a privacy-preserving signature with no more than +30 minutes of inactivity. Exclude static assets, health checks, recognized +bots/crawlers, obvious scanners, known internal testing, administration routes, +and anomalous refresh bursts. A signature produced from IP and user-agent is an +estimated visitor signature, never a verified unique visitor. + +If public traffic traverses a proxy/CDN and the origin log does not contain a +verified restored client address, signature and session metrics remain low +confidence even after filtering. Successful fixed endpoint responses may be +reported as HTTP response evidence, but not as people or unique business +actions. Index API responses are not searches. + +## Media calculation rule + +Before a media optimization or cleanup: + +1. Generate a file manifest with relative paths, byte sizes, and checksums. +2. Compare each MongoDB path reference to the original and derivative files. +3. Classify unmatched, duplicated, and unreferenced files without deleting any. +4. Calculate original and derivative size distributions only from a documented + matched sample or full matched population. +5. Require a verified backup, dry-run manifest, and isolated staging sample + before overwriting/deleting media or changing path references. An additive, + no-overwrite derivative job may proceed after local fixture tests, a full + dry run, capacity checks, and an existing media rollback artifact, while the + missing staging/recovery rehearsal remains an explicit risk. + +The 2026-07-23 derivative rollout was additive: it wrote only new versioned +paths, did not overwrite originals or existing derivatives, and retained a +dry-run aggregate plus full post-write pairing metrics. A width-specific byte +reduction compares one derivative population with the same original +population; reductions from multiple widths are never added together. + +## Evidence record template + +Metric: + +Exact definition: + +Value: + +Time window: + +Source: + +Query/calculation: + +Bot/internal-traffic filtering: + +Collected on: + +Confidence: + +Limitations: diff --git a/docs/evidence/cv-impact-report-2026-07-23.md b/docs/evidence/cv-impact-report-2026-07-23.md new file mode 100644 index 0000000..d48dec4 --- /dev/null +++ b/docs/evidence/cv-impact-report-2026-07-23.md @@ -0,0 +1,220 @@ +# BiphFlora CV impact evidence — 2026-07-23 + +This report keeps CV-useful evidence while separating direct facts, operational +proxies, low-confidence audience estimates, and unavailable claims. Raw access +logs, addresses, user agents, account fields, attribution labels, media names, +and credentials remained on the production host. + +## CV-safe summary + +The following wording is supported by the current evidence: + +- Built and operated a bilingual campus biodiversity platform with public + evidence dating to January 2024, currently cataloguing 153 plant records, + 970 picture records, 27 artwork records, and 18 approved creation entries. +- Maintained a 2.11 GB source-media collection of 1,033 readable files and + introduced responsive 480/960/1600 px WebP delivery with complete additive + derivative coverage while retaining every original and legacy URL. +- Reduced aggregate bytes versus the paired originals by 98.68% at 480 px, + 96.52% at 960 px, and 93.57% at 1600 px across all 1,033 media files; browser + `srcset` now selects one size for the rendered slot. +- Analyzed 1.13 million retained Nginx log entries using fixed bot, scanner, + static-asset, health-check, administration, internal/test, burst, duplicate, + and unknown-route filters. The strict result contains 182,149 recognized + product-route requests and 37,409 successful document-load candidates from + 2024-10-31 through 2026-07-22. +- Retained logs contain 964 filtered 2xx responses across upload, edit, review, + and deletion endpoints: 372 media uploads, 24 creation uploads, 75 edit + submissions, 93 edit reviews, 295 catalogue reviews, 28 creation reviews, + 29 catalogue deletions, and 48 media deletions. These are successful endpoint + responses, not people or guaranteed unique actions. +- Maintained a 39-test backend verification suite, added responsive media + fallback, privacy-safe evidence collectors, readiness checks, and an + additive production rollout path without a database schema migration. + +Do not turn these bullets into claims of verified users, uptime, continuous +service, unique uploads, or verified contributors. + +## Lifecycle evidence + +```text +Metric: publicly observable service-history lower bound +Exact definition: interval between the earliest retained successful public HTML snapshot and the latest verified public response +Value: 919 days (more than 30 months) +Time window: 2024-01-15 through 2026-07-22 +Source: Internet Archive CDX and production HTTPS health observation +Query/calculation: calendar-day difference between the two observations +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-23 +Confidence: direct for the two observations +Limitations: does not prove exact launch date, continuous availability, or uptime between observations +``` + +The domain registration event is 2023-10-12. Registration is not a launch +event. The current protected release was deployed on 2026-07-22. Complete +historical deployment count, interruption periods, platform migrations, +incident count, downtime, and recovery time remain unavailable. + +## Traffic and audience evidence + +The reproducible strict calculation uses recognized product routes only. It +excludes unrecognized routes to reduce distributed scanner noise, so it can +also omit a legitimate route missing from the fixed classifier. + +```text +Metric: retained Nginx log entries +Exact definition: physical entries in the retained frontend access log at collection; 83 parsed entries after the reporting cutoff were excluded from window metrics +Value: 1,131,690 entries; 1,081,407 parseable; 50,283 unparseable; 83 parsed entries after the cutoff excluded +Time window: retained log begins 2024-10-31; metric cutoff 2026-07-22T17:10:05Z +Source: production Nginx combined access log +Query/calculation: streaming line count and combined-log parser +Bot/internal-traffic filtering: none for this source-volume metric +Collected on: 2026-07-23 +Confidence: direct for retained log entries +Limitations: HTTP requests are not pageviews, sessions, visits, or people; retention gaps may exist +``` + +```text +Metric: strict recognized product-route traffic +Exact definition: requests to fixed product route categories after bot, scanner, static, protocol, health, administration, known internal/test, burst, rapid-duplicate, and unrecognized-route exclusions +Value: all retained 182,149 requests / 37,409 2xx document-load candidates; last 365 days 126,753 / 23,215; last 90 days 21,989 / 6,398; last 30 days 5,708 / 1,802 +Time window: 2024-10-31 through 2026-07-22T17:10:05Z, plus trailing 365/90/30-day windows at that cutoff +Source: production Nginx combined access log +Query/calculation: scripts/collect-traffic-metrics.js --known-routes-only with 2xx GET/HEAD non-API requests as document-load candidates +Bot/internal-traffic filtering: fixed user-agent/path rules; static and health removal; 120 requests/signature/minute burst removal; same signature/path/method within 2 seconds deduplicated +Collected on: 2026-07-23 +Confidence: medium for filtered request and server-visible document-load candidates +Limitations: SPA navigation, direct 3000/3001 traffic, proxy-cache hits, and omitted legitimate routes can cause undercount; a document-load candidate is not a complete pageview +``` + +The strict all-retained request mix was 87.10% desktop-or-other, 12.70% +mobile, and 0.20% tablet. Source categories were 81.67% +direct-or-unattributed, 14.67% self-referral, 3.17% external referral, 0.45% +search, 0.01% social, and 0.04% invalid-or-unattributed. These are shares of +filtered requests, not shares of people or sessions. + +The highest strict filtered-request day was 2026-02-18 with 1,153 requests; +the highest hour was 2025-09-02T18:00Z with 392 requests. They are operational +request peaks, not visitor peaks. + +```text +Metric: filtered 30-minute session candidates and estimated address/user-agent signatures +Exact definition: strict included requests grouped by an ephemeral HMAC of the log address field plus normalized user agent, split after more than 30 minutes of inactivity; signatures estimated with 4,096-register HyperLogLog +Value: all retained 96,307 session candidates / approximately 35,897 signatures; last 365 days 58,067 / approximately 22,320; last 90 days 15,326 / approximately 6,720; last 30 days 5,010 / approximately 2,619 +Time window: same retained and trailing windows as the strict traffic metric +Source: production Nginx combined access log +Query/calculation: streaming HMAC sessionization; HyperLogLog relative standard error approximately 1.63% +Bot/internal-traffic filtering: same strict filtering as recognized product-route traffic +Collected on: 2026-07-23 +Confidence: low +Limitations: public DNS uses an upstream proxy while origin Nginx does not restore a verified client address; the collector reordered entries within a 24-hour bounded window and observed no later included entry; results can be edge-dependent and must not be called visits, verified unique visitors, or people +``` + +Verified unique visitors, valid visits, new/returning users, geography, bounce +rate, average visit duration, and pages per visit remain unavailable. + +## Product and contribution evidence + +```text +Metric: current product records +Exact definition: current MongoDB documents, split by relevant authorization state +Value: 153 plants (152 approved, 1 pending); 0 birds; 970 Pic documents; 27 Art documents; 18 approved creation entries; 1 pending plant edit request; 3 registered accounts +Time window: point-in-time at 2026-07-22T17:15:44Z +Source: production MongoDB collections +Query/calculation: read-only countDocuments and authorization grouping +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-23 +Confidence: direct current counts +Limitations: current records exclude deleted history; picture/art documents are not proven unique files; registered accounts are not active users +``` + +```text +Metric: successful fixed product-endpoint responses +Exact definition: 2xx Nginx responses from fixed product endpoints after bot, automation, missing-user-agent, and known-internal exclusions +Value: 4,049 total: 1,547 plant-index API responses; 1,538 plant-detail API responses; 372 media-upload responses; 24 creation-upload responses; 75 edit-submission responses; 93 edit-review responses; 295 catalogue-review responses; 28 creation-review responses; 29 catalogue-delete responses; 48 media-delete responses +Time window: 2024-10-31 through 2026-07-22T17:10:05Z +Source: production Nginx combined access log +Query/calculation: exact method/path allow-list and 2xx status aggregation; query strings discarded +Bot/internal-traffic filtering: bot/automation/missing-UA/known-internal exclusions; no identity deduplication +Collected on: 2026-07-23 +Confidence: direct for matching 2xx responses; proxy for completed business actions +Limitations: repeated tests can remain; one upload request can carry multiple files; index responses are not searches; responses are not users or unique actions +``` + +The 964 write/review/delete responses in the CV-safe summary are the sum of +the eight mutating workflow categories above. They are the best retained +historical evidence of real workflow use, but the newer append-only audit and +search collections still contain zero events, so pre-telemetry search counts, +search success, exact upload totals, and actor-level activity cannot be +reconstructed. + +```text +Metric: distinct current attribution labels +Exact definition: distinct non-empty editor, username, photographer, artist, and creator labels attached to current MongoDB documents +Value: 29 labels; 1 label matches a current account username +Time window: point-in-time at 2026-07-22T17:15:44Z +Source: production MongoDB current content collections +Query/calculation: server-side union/group/count; labels never left MongoDB +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-23 +Confidence: direct label count +Limitations: labels can alias, duplicate, or credit non-account contributors; they are not verified people, contributors, active users, or organization members +``` + +The current-document ObjectId cohorts place retained plant records between +2025-02 and 2025-10 and retained picture records between 2025-02 and 2025-11. +These timestamps can reflect imports or batch creation and exclude deleted +documents, so they are not used as historical upload or contributor totals. + +## Media optimization evidence + +```text +Metric: original media population +Exact definition: all regular readable JPEG/PNG files recursively present under public/plantspic +Value: 1,033 files; 2,109,916,481 bytes; average 2,042,513.53 bytes; median 2,199,452 bytes; 57 JPEG and 976 PNG +Time window: point-in-time before and after additive variant backfill +Source: production media filesystem +Query/calculation: full recursive stat plus Sharp metadata inspection +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-23 +Confidence: direct filesystem population +Limitations: files are not proven unique photographs and can include unreferenced or archived media +``` + +```text +Metric: responsive WebP derivative coverage and size reduction +Exact definition: exact basename pairs between every original and each versioned WebP width; reduction is 100 * (sum original bytes - sum derivative bytes) / sum original bytes +Value: 3,099/3,099 derivatives created, 0 failures, 100% coverage at each width. 480 px: 27,799,366 bytes, median 22,712, 98.68% aggregate reduction. 960 px: 73,519,304 bytes, median 54,176, 96.52% reduction. 1600 px: 135,733,456 bytes, median 92,174, 93.57% reduction. Total derivative storage: 237,052,126 bytes +Time window: production backfill completed 2026-07-22T17:22:30Z; post-check 2026-07-22T17:23:32Z +Source: production media filesystem +Query/calculation: full 1,033-file pairing for each width using scripts/collect-media-metrics.js +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-23 +Confidence: direct full-population byte calculation +Limitations: byte reduction is against originals at each width; a browser downloads one selected candidate, so reductions across widths must not be added together; a five-file size-stratified visual smoke check found no obvious rendering defect but is not an exhaustive perceptual-quality score +``` + +Existing legacy compressed media covered only 191 exact pairs (18.49% of +original files). Across those pairs it reduced aggregate bytes by 68.70%. +Responsive variants preserve originals, use deterministic versioned URLs, +resize without enlargement, and are never overwritten by the backfill. + +## Qualitative and unavailable evidence + +The public product description supports the purpose: documenting campus +species, searchable multilingual information cards, seasonal photography, +creative work, and educational material. It does not independently prove a +specific school-club participant count, event attendance, or organization +workflow headcount. + +Still unavailable and excluded from CV claims: + +- verified unique visitors, valid visits, active users, and monthly active + contributors; +- historical search count, search success rate, and zero-result rate before + telemetry; +- exact first launch, continuous service, uptime percentage, downtime, MTTR, + and complete deployment count; +- verified contributor/organization headcount and consented quotations; +- staging parity and successful recovery rehearsal, which were explicitly + deferred for this work. diff --git a/docs/evidence/metric-catalog.md b/docs/evidence/metric-catalog.md new file mode 100644 index 0000000..8dc60f0 --- /dev/null +++ b/docs/evidence/metric-catalog.md @@ -0,0 +1,98 @@ +# Metric catalog and evidence status + +This catalog makes the requested evidence durable before new telemetry changes +the product. Every future measurement must use the evidence-record template in +[collection-method.md](collection-method.md). + +## Six priority metrics + +| Metric | Current value | Evidence status | Limitation | +| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ----------------------- | ------------------------------------------------------------------------- | +| Public operation lower bound | Public snapshot on 2024-01-15; observed again on 2026-07-22 | Direct for observations | Does not prove continuous service or uptime | +| Valid visits/sessions | Unavailable; 96,307 strict session candidates retained as a low-confidence proxy | Unavailable/proxy | Upstream proxy address semantics prevent promotion to valid visits | +| Verified unique visitors | Unavailable | Unavailable | No identity-preserving, consented analytics source exists | +| Current plant records | 152 authorized; 153 total including 1 pending | Direct | Does not include deleted history | +| Current image/works documents | 970 Pic, 27 Art, and 18 approved creation documents | Direct | Not a unique-image or upload count | +| Real searches, edits, uploads, contributor or organization use | 964 filtered 2xx write/review/delete endpoint responses; historical searches and verified people unavailable | Proxy/Unavailable | Responses can include repeated tests and are not people or unique actions | + +## Lifecycle and deployment + +| Metric | Current value | Status | Source and limitation | +| ------------------------------------- | ------------------------------------------------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ | +| First public launch date | Unavailable | Unavailable | Earliest retained public snapshot is only a lower bound | +| Earliest public snapshot | 2024-01-15 | Direct | Internet Archive retained-snapshot record | +| Domain registration date | 2023-10-12 | Direct | Public RDAP registration event | +| Current deployed code commit | c5e348e | Direct | CSS-only style fix; server marker, released CSS hash, public checks, and browser comparison agree | +| Current deployment date | 2026-07-23 | Direct for this cutover | Asset-only CSS/HTML cutover; historical deployment count remains unavailable | +| Continuous service duration | Unavailable | Unavailable | No availability monitor or complete incident history | +| Interrupted-service periods | At least one automatic backend reload observed during the 2026-07-23 guarded style cutover attempt; historical periods unavailable | Partial | Exact interruption duration and public impact were not instrumented | +| Major versions/features | Partially available in Git history | Proxy | Requires a reviewed release timeline | +| Total deployments/recent deployment | Unavailable / candidate above | Unavailable | Git pull and process dates cannot establish all deployments | +| Server/platform migrations | Unavailable | Unavailable | Needs configuration/history evidence | +| Incidents and recovery times | Unavailable | Unavailable | Logs are not classified incidents | +| Production/staging/local relationship | Production style release c5e348e; local branch contains its acceptance report; no independent staging found | Direct/partial | Isolated release checks and live browser comparison passed; staging parity and restore rehearsal remain unavailable | + +## Traffic and audience + +| Metric | Current value | Status | Source and limitation | +| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------- | +| Earlier unfiltered access-log snapshot | 1,131,459 | Direct | Earlier 2026-07-22 snapshot retained for chronology; superseded by the later collection below and not visits | +| Pageviews | Unavailable | Unavailable | SPA navigation and filtering are not captured defensibly | +| Visits/sessions | Unavailable; 96,307 strict 30-minute session candidates are retained as a low-confidence proxy | Unavailable/proxy | Aggregation is chronologically bounded, but upstream proxy address semantics prevent promotion to valid visits | +| Verified unique visitors | Unavailable | Unavailable | No suitable first-party identity source | +| Recent 30/90/365-day traffic | 5,708 / 21,989 / 126,753 strict recognized-route requests; 1,802 / 6,398 / 23,215 2xx document-load candidates | Proxy | Server-visible request proxies, not visits/pageviews | +| Monthly/daily averages and trend | Full monthly strict trend retained; all-period average 289.13 requests and 59.38 document-load candidates per calendar day | Proxy | Retention and SPA/proxy limitations apply | +| Peak daily/hourly traffic | 1,153 strict requests on 2026-02-18; 392 in 2025-09-02T18:00Z | Proxy | Operational request peaks, not visitor peaks | +| New/returning share | Unavailable | Unavailable | No consented visitor identity source | +| Visit duration/pages/bounce rate | Unavailable | Unavailable | Nginx alone cannot observe SPA completion or duration | +| Source and device distribution | Aggregate request-category shares available | Proxy | Request shares only; geography remains unavailable | +| Most visited pages | Home is the highest strict route category | Proxy | Route request count includes redirects and is not a pageview count | +| HTTP request total | 1,131,690 retained frontend access-log entries at collection | Direct | Operational request volume only; never label as visits | + +## Product usage and contribution + +| Metric | Current value | Status | Source and limitation | +| ------------------------------------------------------ | ------------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------------------ | +| Authorized plant records | 152 | Direct | Current MongoDB posts with authorization true | +| Pending plant records | 1 | Direct | Current MongoDB posts not authorized | +| Historical records created | Unavailable; current-document ObjectId month cohorts retained as a proxy | Unavailable/proxy | Deleted records and import semantics are not recoverable | +| Pic documents | 970 | Direct | Current MongoDB Pic collection | +| Art documents | 27 | Direct | Current MongoDB Art collection | +| Media filesystem population | 1,033 readable originals / 2,109,916,481 bytes; 3,099 responsive derivatives / 237,052,126 bytes | Direct | Full original and responsive-derivative population; files are not proven unique photographs | +| Current registered accounts | 3 | Direct | Current MongoDB user documents; not active users | +| Searches, success rate, zero-result rate, language use | Unavailable | Unavailable | Index API responses are not searches; search telemetry contains zero retained events | +| Detail views, uploads, creates, edits, reviews | 1,538 plant-detail API responses and 964 write/review/delete endpoint responses | Proxy | 2xx responses can include repeated tests and are not unique actions | +| Actual contributors and monthly active contributors | Unavailable; 29 current attribution labels | Unavailable/proxy | Labels do not verify distinct people or activity | +| Browser/contributor ratio | Unavailable | Unavailable | Requires both traffic and auditable contribution events | +| Organization workflows and feedback | Unavailable | Unavailable | Needs consented, reviewed qualitative evidence | +| Core versus unused functions | Unavailable | Unavailable | Needs audited usage events and qualitative review | + +## Reliability, media, search, and engineering + +| Metric | Current value | Status | Source and limitation | +| --------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------------- | +| Point-in-time public HTTPS | HTTP 200 | Direct | Observed for root, JSON readiness, the 152-record approved catalogue, a detail read, and responsive WebP through `/api` | +| Uptime/availability/downtime/MTTR | Unavailable | Unavailable | No historical monitor coverage | +| HTTP error rate / unhandled exceptions | 42 5xx among 182,149 strict recognized-route requests in retained logs | Proxy | Filtered request share only, not whole-service error rate; exceptions remain unavailable | +| p50/p95/p99, search, upload, database latency | Unavailable | Unavailable | No latency telemetry | +| CPU/memory/disk state | Point-in-time baseline collected privately | Direct | Not a capacity trend or performance claim | +| TLS validity | 2026-02-25 through 2027-02-25 | Direct | Certificate dates only | +| Automated restart/health/alerting | Liveness/readiness endpoints exist; historical monitor coverage unavailable | Direct/partial | MongoDB and Redis readiness passed after the controlled release restart; external monitoring and alert coverage are not verified | +| Backup restore success | Unavailable | Unavailable | Presence of backup files is not a restore test | +| Pic/Art path existence | 997 of 997 document paths present | Direct | Does not prove visual validity or unique physical files | +| Average size, compression ratio, storage saved | Full-population original and 480/960/1600 variant metrics measured | Direct | See CV impact report; reductions are width-specific and cannot be summed | +| Image format/limit/process failure rate | JPEG/PNG/WebP inputs; 20 MB/file and 20 files/request; 3,099/3,099 backfill outputs succeeded | Direct/partial | Backfill failure rate is direct; ongoing upload-processing failure rate needs telemetry | +| Multilingual/fuzzy search quality and index latency | Implementation exists; quality metric unavailable | Partial | Requires a test corpus and measured queries | +| Architecture/API/schema/auth model | Source-reviewed baseline available | Direct/partial | Must be kept current as modules move | +| Test coverage/CI/security scan | 39 backend and 19 frontend tests pass with a production build; CI workflow present; numeric coverage unavailable | Partial | Production dependency audits report zero known issues; development trees and hosted CI history retain limitations documented in phase 12 | + +## Guardrails for future reporting + +- Never call registered accounts active users. +- Never call access-log requests visits, sessions, pageviews, or unique people. +- Never infer historical uptime from a start date, a Git commit, or a current + healthy response. +- Never claim image compression, performance, or reliability improvements + without a comparable pre/post method and recorded sample or population. +- Never publish names, accounts, IP addresses, raw user feedback, or private + operational configuration without explicit permission. diff --git a/docs/evidence/production-baseline-2026-07-22.md b/docs/evidence/production-baseline-2026-07-22.md new file mode 100644 index 0000000..7f54cdc --- /dev/null +++ b/docs/evidence/production-baseline-2026-07-22.md @@ -0,0 +1,118 @@ +# Production baseline — 2026-07-22 + +Collection time: 2026-07-22T07:00:56Z. + +This is a point-in-time, read-only production baseline. It is not an uptime +report, a traffic report, or a backup-restore certification. + +## Verified current state + +| Area | Direct observation | Important limitation | +| --- | --- | --- | +| Deployed source | Commit ea471b6; production checkout is detached | A matching Git commit does not prove every historical deployment | +| Application listeners | Frontend on port 3000 and backend on port 3001 were present | Direct listeners may bypass Nginx and are not a traffic source of record | +| Core services | Nginx, MongoDB, and Redis were active at collection time | This is a point-in-time health observation, not availability | +| Public HTTPS | The public home page returned HTTP 200 after the audit | The application has no dedicated health endpoint yet | +| Plant data | 153 current plant documents: 152 authorized and 1 pending | Current documents exclude deleted historical records | +| Bird data | 0 current bird documents | This does not establish whether bird features were historically used | +| Images and artwork | 970 current Pic documents and 27 current Art documents | Documents are not proven to be unique physical images | +| Media references | All 970 Pic paths and all 27 Art paths mapped to an existing file | This checks existence only; it does not detect duplicate file references or visual correctness | +| Media filesystem | 1,245 files using 2,332,361,589 bytes | Includes originals, derivatives, uploads, assets, and possible archives | +| Media subdirectories | Originals: 1,033 files / 2,109,916,481 bytes; derivatives: 196 / 41,024,169 bytes; uploads: 2 / 6,811,922 bytes | The three folders do not account for every file below public | +| MongoDB logical data | 14 collections; 597,225 data bytes; 741,376 storage bytes; 589,824 index bytes | Separate from media files and MongoDB engine files | +| Redis | 2 keys; RDB persistence enabled, AOF disabled; last RDB save reported successful | Key count is not a session, user, or cache metric | +| Access-log evidence | 1,131,038 unfiltered frontend access-log entries from 2024-10-31 through 2026-07-22 | Entries include requests that may be assets, bots, scans, or internal traffic; they are not visits or users | +| Backups | 151 panel-backup files and 1 root-level database-backup candidate were observed | Scope, retention, restore success, and media/Redis coverage remain unverified | +| TLS | Certificate validity observed from 2026-02-25 through 2027-02-25 | Certificate validity does not prove endpoint availability | + +## Lifecycle evidence + +Metric: Domain registration date + +Exact definition: Registration timestamp returned by the public registry record +for the production domain. + +Value: 2023-10-12T13:35:34Z + +Time window: Domain registration event. + +Source: Verisign RDAP, collected during the baseline research. + +Query/calculation: Public RDAP registration-event field. + +Bot/internal-traffic filtering: Not applicable. + +Collected on: 2026-07-22. + +Confidence: Direct for the registry event. + +Limitations: A registration date is not a launch date. + +Metric: Earliest currently verified public page snapshot + +Exact definition: Earliest retained successful HTML snapshot returned by the +Internet Archive query used for this audit. + +Value: 2024-01-15. + +Time window: Retained public snapshots available to the query. + +Source: Internet Archive CDX. + +Query/calculation: Successful HTML snapshots for the production root URL, +collapsed by digest. + +Bot/internal-traffic filtering: Not applicable. + +Collected on: 2026-07-22. + +Confidence: Direct for the retained snapshot record. + +Limitations: It is a lower bound for public visibility, not proof of the first +launch, continuous service, or uptime. + +Metric: Current deployment candidate + +Exact definition: Most recent Git reflog entry matching a pull from the main +branch in the active production checkout. + +Value: 2025-12-19T13:10:32+08:00. + +Time window: Current checkout reflog retained on the host. + +Source: Production Git reflog. + +Query/calculation: First matching pull-origin-main reflog record. + +Bot/internal-traffic filtering: Not applicable. + +Collected on: 2026-07-22. + +Confidence: Candidate. + +Limitations: A Git pull does not prove a completed application build, process +restart, or user-visible deployment. Total deployment count remains unavailable. + +## Operational finding + +An empty PM2 daemon created during the initial read-only inspection was +rechecked before cleanup. It reported zero managed applications and was +subsequently absent. The application listener PIDs stayed unchanged; Nginx, +MongoDB, Redis, and public HTTPS remained healthy. No application process, +database record, media file, Nginx configuration, or deployment was changed. + +## Explicitly unavailable claims + +- Historical uptime, availability percentage, downtime total, incident count, + recovery time, and latency percentiles. +- Valid visits/sessions, verified unique visitors, pageviews, source mix, + device mix, geography, bounce rate, pages per visit, and visit duration. +- Historical searches, successful searches, zero-result searches, uploads, + edits, approvals, account activity, and real contributor counts. +- Average image size, compression ratio, storage savings, image-processing + failure rate, search latency, cache-hit rate, database latency, and capacity + trends. +- A verified backup restore, staging parity, or end-to-end recovery test. + +These fields remain unavailable until instrumentation or a defensible +server-side aggregation produces a documented value. diff --git a/docs/evidence/traffic-report-2026-07-22.md b/docs/evidence/traffic-report-2026-07-22.md new file mode 100644 index 0000000..57edc75 --- /dev/null +++ b/docs/evidence/traffic-report-2026-07-22.md @@ -0,0 +1,146 @@ +# BiphFlora data and traffic report — 2026-07-22 + +This is the current redacted report. It separates direct counts, operational +request proxies, candidates, and unavailable business metrics. Raw logs, +identifiers, credentials, database dumps, media files, and user feedback are +not copied here. + +## Six priority metrics + +```text +Metric: public operation lower bound +Exact definition: earliest retained successful public HTML snapshot +Value: 2024-01-15 +Time window: retained Internet Archive snapshots +Source: Internet Archive CDX +Query/calculation: successful HTML root snapshots collapsed by digest +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: direct for the snapshot +Limitations: lower bound only; not launch date, continuous service, or uptime + +Metric: valid visits/sessions +Exact definition: filtered 30-minute inactivity sessions +Value: unavailable +Time window: 2024-10-31 through 2026-07-22 logs exist, but no approved +server-side aggregation was completed for this report +Source: Nginx access logs +Query/calculation: not calculated +Bot/internal-traffic filtering: not calculated +Collected on: 2026-07-22 +Confidence: unavailable +Limitations: request entries are not sessions + +Metric: verified unique visitors +Exact definition: consented identity-backed distinct visitors +Value: unavailable +Time window: unavailable +Source: no verified identity analytics source +Query/calculation: not calculated +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: unavailable +Limitations: IP+UA signatures would only be estimated visitor signatures + +Metric: current plant records +Exact definition: current MongoDB plant documents, split by authorization +Value: 152 authorized; 153 total including 1 pending +Time window: point-in-time baseline +Source: MongoDB Post collection +Query/calculation: aggregate current documents by authorization state +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: direct +Limitations: excludes deleted historical records + +Metric: current image/work documents +Exact definition: current MongoDB Pic and Art documents +Value: 970 Pic; 27 Art +Time window: point-in-time baseline +Source: MongoDB Pic and Art collections +Query/calculation: current document counts +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: direct +Limitations: documents are not proven unique physical images + +Metric: real searches/edits/uploads/contributors +Exact definition: completed user operations and distinct verified contributors +Value: unavailable +Time window: historical period +Source: no verified historical append-only event source or consented qualitative +evidence +Query/calculation: not calculated +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: unavailable +Limitations: registered accounts and editor fields are not active users or +verified contributors +``` + +## Traffic and access + +```text +Metric: HTTP request entries +Exact definition: frontend Nginx access-log entries before business filtering +Value: 1,131,459 +Time window: 2024-10-31 through the post-deploy verification on 2026-07-22 +Source: production Nginx access logs +Query/calculation: counted retained frontend access-log entries after the +deployment checks +Bot/internal-traffic filtering: none; includes assets, bots, scans, health, +and internal/test traffic +Collected on: 2026-07-22 +Confidence: direct for log-entry count +Limitations: must never be called pageviews, visits, sessions, or users +``` + +Pageviews, 30/90/365-day visits, monthly/daily averages, trends, peaks, new +versus returning visitors, duration, pages per visit, bounce rate, source mix, +device mix, country mix, and most visited pages remain unavailable. A +server-side aggregation must retain the exact 30-minute session rule and +exclusion list before any of these values can be reported. + +## Product, media, and reliability evidence + +- Current registered accounts: 3. This is an account count, not active users. +- Media filesystem: 1,245 mixed files using 2,332,435,708 bytes in the + pre-deploy server snapshot. This includes originals, derivatives, uploads, + assets, and possible archives; the deployment did not modify this tree. +- MongoDB Pic/Art path coverage: 997 of 997 document paths existed at baseline. +- Search result quality, search counts, success/zero-result rates, image + processing failure rate, average sizes, compression ratio, and storage saved: + unavailable without a retained event source or matched media analysis. +- Point-in-time public HTTPS: HTTP 200. This does not establish uptime. +- TLS validity observed: 2026-02-25 through 2027-02-25. +- Historical uptime, downtime, MTTR, error rate, latency percentiles, cache hit + rate, backup recoverability, and restore-test success: unavailable. + +## Engineering and deployment state + +- Current production after the protected cutover: commit + `6c9bfb77528f3b4341c01088d4df4355d2c91a2a` (`6c9bfb7`), with previous + commit `ea471b6` retained in the rollback backup. +- Local verification: 24 backend tests and 15 frontend tests pass; production + build succeeds with existing CRA/Browserslist/ESLint warnings. +- Root production dependency audit: 0 advisories after the native and + transitive patch wave. +- Client production dependency audit with devDependencies omitted: 0 + advisories after the dependency boundary and overrides. +- Full client development-tree audit still reports CRA-related advisories; this + report does not claim a CRA migration. +- No independent staging or restore rehearsal is verified. One controlled + backend restart and client build swap occurred during deployment; no Nginx + reload, data migration, or media backfill was performed. Empty additive + `audit_events` and `search_events` collections exist after application + startup, with zero event documents at verification. + +The deployment and rollback evidence is recorded in +[phase-11-report.md](../operations/phase-11-report.md). The valid session, +verified visitor, and historical uptime fields remain `unavailable` rather +than being inferred from the request count. + +The metric register in [metric-catalog.md](metric-catalog.md) and the method in +[collection-method.md](collection-method.md) are authoritative for definitions, +filtering, and limitations. The cloud access gate is recorded in +[phase-8-report.md](../operations/phase-8-report.md). diff --git a/docs/evidence/traffic-report-2026-07-23.md b/docs/evidence/traffic-report-2026-07-23.md new file mode 100644 index 0000000..5770950 --- /dev/null +++ b/docs/evidence/traffic-report-2026-07-23.md @@ -0,0 +1,128 @@ +# BiphFlora traffic and product-response report — 2026-07-23 + +Reporting cutoff: 2026-07-22T17:10:05Z. Raw logs stayed on the production +host. The collector emitted fixed aggregate categories only. + +## Strict traffic windows + +`Filtered requests` are recognized product-route requests left after bot, +automation, scanner, static/protocol, health, administration, known-internal, +burst, rapid-duplicate, and unknown-route removal. `Document-load candidates` +are 2xx GET/HEAD responses to non-API product routes. Neither metric is a visit, +pageview, or person. + +| Window | Filtered requests | 2xx document-load candidates | 30-minute session candidates | Approximate signatures | +| ---------------------------------- | ----------------: | ---------------------------: | ---------------------------: | ---------------------: | +| Retained log, 2024-10-31 to cutoff | 182,149 | 37,409 | 96,307 | 35,897 | +| Last 365 days | 126,753 | 23,215 | 58,067 | 22,320 | +| Last 90 days | 21,989 | 6,398 | 15,326 | 6,720 | +| Last 30 days | 5,708 | 1,802 | 5,010 | 2,619 | + +The session/signature columns are low confidence: public DNS uses an upstream +proxy, while origin Nginx does not restore a verified client address. The +collector reordered requests within a 24-hour bounded window and observed no +later included entry. These columns must not be relabelled as valid sessions, +visits, unique visitors, or users. + +The retained file contained 1,131,690 physical entries when collected; +1,081,407 parsed and 50,283 did not match the combined-log parser. Eighty-three parsed +entries after the fixed cutoff were excluded from window calculations. These +are source-volume facts, not traffic-audience metrics. + +## Monthly strict trend + +The first and last months are partial retained/cutoff months. These are request +and document-load proxies, not people or visits. + +| Month | Filtered requests | 2xx document-load candidates | +| ------- | ----------------: | ---------------------------: | +| 2024-10 | 355 | 63 | +| 2024-11 | 4,913 | 1,654 | +| 2024-12 | 5,009 | 1,526 | +| 2025-01 | 4,723 | 1,745 | +| 2025-02 | 7,075 | 1,586 | +| 2025-03 | 8,630 | 1,770 | +| 2025-04 | 7,361 | 1,453 | +| 2025-05 | 7,836 | 1,678 | +| 2025-06 | 6,145 | 1,638 | +| 2025-07 | 4,733 | 1,567 | +| 2025-08 | 4,767 | 1,622 | +| 2025-09 | 5,135 | 1,950 | +| 2025-10 | 8,600 | 1,668 | +| 2025-11 | 6,269 | 1,283 | +| 2025-12 | 13,117 | 1,656 | +| 2026-01 | 17,134 | 1,683 | +| 2026-02 | 21,800 | 1,926 | +| 2026-03 | 15,869 | 1,966 | +| 2026-04 | 13,502 | 3,398 | +| 2026-05 | 8,844 | 2,249 | +| 2026-06 | 6,031 | 1,986 | +| 2026-07 | 4,301 | 1,342 | + +## Successful fixed endpoint responses + +These are 2xx responses after bot, automation, missing-user-agent, and known +internal-address removal. Query strings and identifiers were discarded. + +| Fixed category | 2xx responses | +| ---------------- | ------------: | +| Plant index API | 1,547 | +| Plant detail API | 1,538 | +| Media upload | 372 | +| Creation upload | 24 | +| Edit submission | 75 | +| Edit review | 93 | +| Catalogue review | 295 | +| Creation review | 28 | +| Catalogue delete | 29 | +| Media delete | 48 | +| **Total** | **4,049** | + +The eight write/review/delete categories total 964 responses. A response can be +a repeated test; one upload request can carry multiple files. Index responses +are not searches, and endpoint responses are not people or unique actions. + +Their retained monthly distribution is useful as workflow-history evidence, +but still has the same response-count limitations. Months not listed had zero +matching responses. + +| Month | Write/review/delete 2xx responses | +| ------- | --------------------------------: | +| 2024-10 | 3 | +| 2024-11 | 20 | +| 2024-12 | 36 | +| 2025-01 | 6 | +| 2025-02 | 118 | +| 2025-03 | 257 | +| 2025-04 | 115 | +| 2025-06 | 4 | +| 2025-08 | 1 | +| 2025-10 | 196 | +| 2025-11 | 208 | + +## Operational distribution + +- Highest strict request day: 1,153 on 2026-02-18. +- Highest strict request hour: 392 at 2025-09-02T18:00Z. +- Strict request device categories: 87.10% desktop-or-other, 12.70% mobile, + 0.20% tablet. +- Strict request source categories: 81.67% direct-or-unattributed, 14.67% + self-referral, 3.17% external referral, 0.45% search, 0.01% social, and 0.04% + invalid-or-unattributed. +- Strict status classes: 47,326 2xx, 131,061 3xx, 3,720 4xx, and 42 5xx. + +All distributions are shares or counts of filtered requests. Historical +uptime, verified visitors, valid visits, geography, new/returning users, +bounce rate, complete SPA pageviews, and pre-telemetry search behavior remain +unavailable. + +Reproduce with: + +```bash +node scripts/collect-traffic-metrics.js \ + --known-routes-only \ + --as-of 2026-07-22T17:10:05.000Z \ + /path/to/oldest.log /path/to/newest.log +``` + +The command must run on the log host. Do not copy raw logs into the repository. diff --git a/docs/operations/deployment-readiness.md b/docs/operations/deployment-readiness.md new file mode 100644 index 0000000..b26688e --- /dev/null +++ b/docs/operations/deployment-readiness.md @@ -0,0 +1,31 @@ +# Deployment readiness and rollback + +This is a preparation checklist, not a production runbook authorization. The current repository has no verified staging environment, so a release may be described as deployable only after local checks and an isolated staging or equivalent fixture run; production must not substitute for staging. + +## Before a release + +- Record the old and candidate Git commits and the build timestamp. +- Run `npm run verify` and capture the exact result. +- Back up and verify, separately: a MongoDB logical dump; a media file manifest plus snapshot; `.env` and secret-store references; Nginx/宝塔 configuration; required Redis persistence state; and the access/error-log metric cutoff. +- Confirm the backup locations, retention policy, and a restore test or clearly mark restore as unverified. +- Review API compatibility, authorization tests, upload limits, media path references, and the phase report. +- Do not run `git clean`, overwrite `public`, replace `.env`, or copy production data into local fixtures. + +## Staging or isolated fixture checks + +Use anonymous records and synthetic media only. Exercise MongoDB readiness, Redis session behavior, catalog/search, login, upload rejection and cleanup, edit/review authorization, image fallback, and rollback to the previous build. Compare URL paths, request bodies, success responses, record counts, and database-to-media references before and after. + +## Production steps requiring separate approval + +Deploy one phase commit at a time. Record old/new commit, dependency installation result, build time, process start time, health checks, HTTP status/error observations, downtime, and regressions. Database migrations, media backfills, Nginx reloads, service restarts, and Redis restoration are separate approvals; none are implied by a code commit. + +## Rollback order + +1. Stop routing the candidate build and restore the last recorded application build/commit. +2. Restore dependency state if it changed and perform the authorized process restart. +3. If configuration changed, restore the Nginx/宝塔 backup, run `nginx -t`, then reload with authorization. +4. If data changed, restore the affected MongoDB collection or full dump and verify counts and references. +5. If media references changed, restore the media snapshot or old path references. Do not delete new derivatives until their dependency and reference status is reviewed. +6. Prefer session expiry and re-login after a Redis rollback; restore a Redis snapshot only when session preservation is explicitly required. + +Record whether there was downtime, whether any requests regressed, and which evidence was unavailable. Never claim a successful recovery without a completed health check and data/reference comparison. diff --git a/docs/operations/phase-0-report.md b/docs/operations/phase-0-report.md new file mode 100644 index 0000000..deb513f --- /dev/null +++ b/docs/operations/phase-0-report.md @@ -0,0 +1,53 @@ +# Phase 0 report — verified production baseline + +Date: 2026-07-22. + +## What changed and why + +- Created the local branch refactor/progressive-stability from ea471b6. +- Added redacted evidence, metric, and collection-method documentation so + future refactors can be evaluated against a known baseline. +- Rechecked and removed the empty PM2 daemon accidentally created during the + initial inspection. It had zero managed applications. +- Created no production code, deployment, configuration, database, Redis, or + media change. + +## Checks and health results + +- Local branch base: ea471b6. +- PM2 daemon: absent after cleanup. +- Application listeners: unchanged on ports 3000 and 3001. +- Nginx, MongoDB, and Redis: active at the post-cleanup check. +- Public home page: HTTP 200 at the post-cleanup check. +- MongoDB media path coverage: 970 of 970 Pic paths and 27 of 27 Art paths + mapped to existing files. +- Evidence collection: aggregate-only MongoDB, media, Redis, log metadata, + Git/reflog, backup metadata, and TLS reads completed. + +## Production impact + +No user-facing application process was restarted or replaced. No database +write, media write, Nginx change, deploy, or backup deletion occurred. The only +production-side mutation was stopping the verified empty PM2 daemon. + +## Unresolved risks + +- There is no staging environment, application health endpoint, or verified + restore test. +- Existing logs cannot directly prove sessions, users, operations, uptime, or + latency. +- Backup directories exist, but their data-domain coverage and recovery + success are unverified. +- Media references exist, but duplicate, orphaned, corrupt, and mismatched + derivative files have not been classified. +- Authorization, plaintext-password storage, test coverage, startup ordering, + image delivery, and documentation drift remain for later phases. + +## Deployment and rollback + +No deployment is proposed for this phase. + +To roll back the repository-only part, revert the commit that adds these +documents. The PM2 cleanup has no business-service rollback because it removed +only an empty daemon; application listeners and service health were verified +afterward. diff --git a/docs/operations/phase-1-report.md b/docs/operations/phase-1-report.md new file mode 100644 index 0000000..63573c0 --- /dev/null +++ b/docs/operations/phase-1-report.md @@ -0,0 +1,75 @@ +# Phase 1 report — test guardrails and startup boundary + +Date: 2026-07-22. + +## What changed and why + +- Kept app.js as the compatible root entry point while making imports + side-effect free: importing the Express app no longer starts a listener or + connects to MongoDB or Redis. +- Added runtime.js to own Redis/MongoDB connection state, readiness, and + graceful dependency shutdown. +- Added server.js to own HTTP startup, dependency connection, SIGINT/SIGTERM + handling, and fatal-process shutdown handling. +- Added GET /health/live and GET /health/ready. Live confirms the process can + answer; ready returns 503 until both MongoDB and Redis are ready. Neither + endpoint returns configuration values. +- Moved terminal Express error handling to the end of route registration. +- Replaced the failing placeholder tests with backend read-contract tests and + frontend route smoke tests. Tests use existing Node and CRA tooling only. +- Added root test, build, and verify scripts. Verify runs backend tests, + frontend tests, and a production build. +- Corrected the login page's invalid nested body element and label attributes, + which removed React DOM warnings from the route test. + +## Checks and health results + +- Syntax: app.js, runtime.js, server.js, and both backend test files pass + Node syntax checks. +- Backend: 4 passing tests cover import isolation, live/ready contracts, + public plant/bird search-detail-count-refresh contracts, CORS, and graceful + server shutdown. +- Frontend: 2 passing route smoke tests cover login and unknown-route fallback. +- Unified local verification: npm run verify passed. +- Production build: passed. It required two pre-existing, untracked static + background assets that were read from production without changing production, + checksum-verified locally, and kept Git-ignored. +- Production health check: no new code was deployed. Existing production + services were not restarted during this phase. + +## Production impact + +No production deployment, service restart, database write, Redis write, media +write, Nginx change, or backup change occurred. The new health endpoints exist +only on the local branch until a separately authorized deployment. + +## Unresolved risks + +- There is still no staging environment or verified backup restore. +- Existing npm and pnpm locks differ. Local verification deliberately used the + existing npm lock without changing either lock; lock consolidation remains a + later, separately verified task. +- The client public asset directory is ignored and not reproducible from Git. + Two background assets needed for the local build remain untracked. Do not + treat the local asset copy as a deployment artifact or publish it without an + approved asset/versioning policy. +- The CRA build passes with pre-existing CSS nesting, ESLint, Browserslist, and + unmaintained Babel-preset warnings. Jest diagnostics attribute its open + handle warning to that CRA preset, not application test resources. +- Characterization coverage is deliberately limited to non-destructive public + read flows. Upload, edit, approval, deletion, and authorization tests remain + for the security phase so unsafe current behavior is not normalized. +- Readiness is explicit, but existing route handlers still need later + dependency-failure and authorization hardening. + +## Deployment and rollback + +No deployment is proposed for this phase. + +If deployment is separately approved, build with the same Node/package-manager +decision and verify health endpoints after startup. Deploying must preserve the +production static asset bundle and environment files. + +Rollback is code-only: return to the prior commit, rebuild the client with the +verified static bundle, then perform an authorized service restart. No database +migration or media rollback is needed for this phase. diff --git a/docs/operations/phase-10-report.md b/docs/operations/phase-10-report.md new file mode 100644 index 0000000..0bcc5fb --- /dev/null +++ b/docs/operations/phase-10-report.md @@ -0,0 +1,54 @@ +# Phase 10 report — client release dependency boundary + +Date: 2026-07-22 + +## Changes + +- Classified `react-scripts` and `cssnano` as client `devDependencies`; they + are required to build/test the static application but are not runtime code + shipped in `client/build`. +- Added lockfile overrides for compatible patched versions of `@babel/runtime`, + `nanoid`, `postcss`, and `styled-components`. +- Kept React, React Router, PrimeReact, image compression, and API packages in + runtime dependencies. + +## Verification + +- Clean `npm --prefix client ci`: passed. +- Actual installed override versions: `@babel/runtime` 7.26.10, `nanoid` + 3.3.8, `postcss` 8.5.10, and `styled-components` 6.4.4. +- Frontend: 6 suites and 15/15 tests passed. +- Production build completed successfully with the existing CRA/Browserslist + and ESLint warnings; no new warning category was introduced. +- The generated main bundle remained 129.91 kB gzip, a 49-byte decrease from + the previous local build in this wave. + +## Dependency evidence + +```text +Metric: client production dependency advisories +Exact definition: npm audit advisories with devDependencies omitted +Value: 0 total (0 low, 0 moderate, 0 high, 0 critical) +Time window: clean client lockfile installation on 2026-07-22 +Source: official npm registry audit endpoint +Query/calculation: npm --prefix client audit --omit=dev --audit-level=high --json +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: high for the lockfile and static production dependency boundary +Limitations: the full development tree still reports CRA-related advisories; +this does not claim CRA migration or eliminate build-tool maintenance risk +``` + +## Production impact and unresolved risks + +No production process, database, media directory, Nginx configuration, or +environment file was changed. No deployment or restart occurred. Runtime +behavior is covered by the existing tests, but the public host still requires +an authenticated SSH connection, backup confirmation, and staging/restore +evidence before rollout. Visits, verified unique visitors, historical uptime, +and production latency remain unavailable. + +## Rollback + +Revert this commit and reinstall the previous client lockfile. No production +rollback is needed because only local repository files changed. diff --git a/docs/operations/phase-11-report.md b/docs/operations/phase-11-report.md new file mode 100644 index 0000000..ae1299c --- /dev/null +++ b/docs/operations/phase-11-report.md @@ -0,0 +1,103 @@ +# Phase 11 report — protected cloud deployment and verification + +Date: 2026-07-22 + +## What changed + +- Deployed local commit `6c9bfb7` (`6c9bfb77528f3b4341c01088d4df4355d2c91a2a`) + to the production application directory, replacing the previous deployed + commit `ea471b6`. +- Replaced the backend runtime dependencies from the isolated release + installation and swapped the client `build` directory. The production + `.env`, `public` media directory, client public assets, Nginx configuration, + and pre-existing untracked files were left in place. +- Added a timestamped, server-side rollback point at + `/www/backup/biphflora-predeploy-20260722T105508Z`. It contains the previous + source archive, untracked files, environment-file copy, media archive, + MongoDB logical dump, Redis RDB (when present), Nginx configuration, log + cutoff, old `node_modules`, and old client build directory. + +## Pre-deploy protection and isolated verification + +- Backup result: `backup_created`, 11 top-level files, 2,610,226,184 bytes; + the recorded checksum checks had zero failures. +- MongoDB logical dump completed successfully; Redis RDB was present. No + restore rehearsal was performed, so this is a rollback artifact, not a + recovery certification. +- The release was unpacked at `/www/wwwroot/biphflora-releases/6c9bfb7`, + installed with the server Node runtime, syntax-checked, loaded without + listening, and started temporarily on port 3101 with the production + dependency endpoints. `/health/live` and `/health/ready` both passed, with + MongoDB and Redis reported ready. The temporary process was stopped. +- No independent staging environment exists; this was an isolated release + smoke check, not staging parity or a restore test. + +## Production verification + +- The backend was stopped and restarted using the existing `npm run start` + / nodemon launch path. A controlled restart therefore occurred; its exact + interruption duration was not instrumented and is not claimed as zero. +- Direct backend checks returned JSON 200 for `/health/live` and + `/health/ready`; the readiness response reported MongoDB and Redis ready. +- Public HTTPS checks returned 200 for `/`, `/api/health/live`, and + `/api/searchNames`. `nginx -t` passed; no Nginx reload or configuration edit + was performed. +- The frontend static process remained running and served the new build asset. +- A read-only sample path returned by `/api/getDb2Pic` successfully served one + compressed media byte over public HTTPS. The media directory was not changed + or backfilled. +- Existing MongoDB counts remained 153 posts (152 authorized, 1 pending), + 970 Pic documents, 27 Art documents, 3 users, and 0 bird posts. The new + code caused empty `audit_events` and `search_events` collections to exist; + no audit or search event documents were written by the checks. +- Redis remained reachable with two keys at the verification point. No + session or token values were recorded. + +## Production impact + +- One controlled backend process restart and one client build-directory swap + occurred. Nginx, MongoDB, Redis, the media tree, and environment values were + not intentionally changed. +- Existing API/database contracts were not migrated. The additive empty event + collections are a schema-side effect of Mongoose model initialization and + require observation before enabling event collection in production. +- No user-facing regression was observed in the health, search, homepage, or + static-build checks. This does not replace an end-to-end authenticated upload, + edit, approval, or deletion test. + +## Remaining risks + +- There is still no independent staging environment or successful restore + rehearsal. The backup artifacts have not been restored into an isolated + MongoDB/media environment. +- Historical uptime, valid visits/sessions, verified unique visitors, search + success rates, latency percentiles, and contributor counts remain + unavailable until documented server-side aggregation or reliable monitoring + exists. +- The full CRA development dependency tree and existing CRA/ESLint/CSS build + warnings remain. Production dependency audits are documented separately. +- The Nginx file still contains a stale filesystem `root` path while the + frontend proxy is serving correctly; correcting it requires a separate + Nginx approval. The frontend/backend processes are not represented by a + verified systemd unit. +- SSH access intermittently closed during banner exchange after deployment; + no firewall or SSH setting was changed. Server-side SSH/fail2ban logs need a + separate read-only review when a stable session is available. + +## Rollback + +1. Confirm the current process command and stop only the BiphFlora backend + launch tree. +2. Restore the previous source from + `production-source-ea471b695dac502ede06b0f77ecbd56d1efd785a.tar.gz` or the + recorded pre-deploy checkout, and move the saved + `node_modules-predeploy` back into the application directory. +3. Restore `client-build-predeploy-dir` as `client/build`. +4. Preserve `.env`, `public`, and existing untracked files; do not restore a + database or media archive unless a separate recovery decision requires it. +5. Start the existing launch command, check direct and public health/search, + and record the old/new process times. Nginx rollback is not required for + this release because its configuration was not changed. + +No push, pull request, database migration, media backfill, backup deletion, or +Git history rewrite was performed. diff --git a/docs/operations/phase-12-report.md b/docs/operations/phase-12-report.md new file mode 100644 index 0000000..5c7cb72 --- /dev/null +++ b/docs/operations/phase-12-report.md @@ -0,0 +1,161 @@ +# Phase 12 report — responsive media, evidence, and production acceptance + +Date: 2026-07-23 + +> Post-release correction: the first responsive-media frontend build omitted +> its production API prefix and was rolled back after a browser runtime failure. +> Release `4168079` corrects the issue. See `phase-13-report.md` for the incident, +> recovery, browser verification, and current production status. + +## Release and Git record + +Production code release: `5e8919a` + +The release is composed of ordinary repository commits: + +- `fecb467` — `perf: add responsive media delivery` +- `b729394` — `chore: add privacy-safe evidence collectors` +- `5e8919a` — `docs: record verified product impact` + +The branch is `refactor/progressive-stability`. No push, pull request, Git +history rewrite, database migration, Nginx change, or credential change was +performed. The production application keeps an explicit deployed-commit marker +because its historical `.git` metadata is not treated as deployment evidence. +That historical server worktree remains on its old HEAD with a release overlay +and is intentionally not claimed as Git-clean; changing it would risk +unreviewed tracked or untracked production data. The authoritative local branch +and commit metadata passed the clean-worktree gate. + +## What changed + +- Added versioned 480, 960, and 1600 pixel WebP derivatives while preserving + every original and all legacy media URLs. +- Added browser `srcset`, `sizes`, lazy loading, asynchronous decoding, explicit + dimensions, legacy fallbacks, and eager loading only for the primary landing + image. +- Added bounded image processing, atomic no-overwrite publication, path + validation, graceful queue draining, and a shared serial boundary for + generate, delete, and rename operations. +- Added a dry-run-first media backfill and aggregate-only media, traffic, and + product evidence collectors. +- Added redacted CV, traffic, metric-method, and image-delivery reports. Raw + logs, addresses, user agents, account data, filenames, and credentials stayed + on the production host. + +## Production media result + +- Original population: 1,033 readable JPEG/PNG files, 2,109,916,481 bytes. +- Backfill: 3,099 of 3,099 derivatives created with zero failures and no + original replacement. +- 480 px: 27,799,366 bytes, 98.68% aggregate reduction versus paired originals. +- 960 px: 73,519,304 bytes, 96.52% aggregate reduction. +- 1600 px: 135,733,456 bytes, 93.57% aggregate reduction. +- Total additive derivative storage: 237,052,126 bytes. +- A five-file, size-stratified visual smoke check at 480 and 1600 px found no + obvious decode, rotation, crop, severe artifact, or colour problem. This is + not an exhaustive perceptual-quality score. + +Public delivery returned `200 image/webp` through the production `/api` proxy +and advertised `Cache-Control: public, max-age=31536000, immutable`. Direct +backend delivery returned the same image type. The first acceptance script +tested the unproxied browser path and therefore produced a false failure; the +corrected public-path check passed and is the recorded gate. + +## Evidence result + +The complete CV-safe evidence is in +`docs/evidence/cv-impact-report-2026-07-23.md`, with the detailed monthly and +endpoint tables in `docs/evidence/traffic-report-2026-07-23.md`. + +Key defensible values: + +- Publicly observable lower bound: 919 days from 2024-01-15 through + 2026-07-22; this is not continuous uptime. +- Retained source volume: 1,131,690 Nginx log entries, of which 1,081,407 + parsed; HTTP requests are not visits. +- Strict recognized product-route traffic: 182,149 filtered requests and + 37,409 successful document-load candidates across the retained window. +- Recent strict traffic: 5,708 / 21,989 / 126,753 requests and + 1,802 / 6,398 / 23,215 document-load candidates over 30 / 90 / 365 days. +- Product workflow evidence: 4,049 fixed 2xx endpoint responses, including + 964 upload, edit, review, and deletion responses. +- Current product: 153 plants (152 approved, 1 pending), 970 picture + documents, 27 artwork documents, 18 approved creation entries, and 3 + registered accounts. +- Current attribution: 29 labels, of which 1 matches a current account label; + neither value is a verified contributor count. + +Valid visits, verified unique visitors, active users, historical uptime, +historical search totals, and verified contributor or organisation headcounts +remain unavailable. Low-confidence session/signature proxies are retained only +with their limitations and must not be relabelled. + +## Acceptance gates + +| Gate | Result | +| --- | --- | +| Server marker, application source, and client build match release `5e8919a` | Pass | +| Backend and frontend each have one expected listener and application working directory | Pass | +| Public homepage | `200 text/html` | +| Public `/api/health/ready` with MongoDB and Redis ready | `200 application/json` | +| Approved plant catalogue | `200 application/json`, 152 entries | +| Read-only plant detail workflow | Pass | +| Unauthenticated administrator route | `401` | +| Public responsive image and immutable cache header | `200 image/webp`, pass | +| MongoDB counts after deployment | Unchanged: 153 / 152 / 1 plants, 0 birds, 970 Pic, 27 Art, 3 accounts | +| Media counts after deployment | Unchanged originals: 1,033; responsive derivatives: 3,099 | +| Nginx configuration syntax | Pass; no edit or reload | +| Recent backend fatal-pattern scan | 0 matches in the bounded tail | +| Local verification | 39 backend tests, 17 frontend tests, production build pass | + +The server-side acceptance record is stored with the timestamped predeployment +backup. The old frontend build directory was moved into that backup after +acceptance. A pre-existing protected media archive in the application root was +preserved; it is not a release transfer artifact. Temporary evidence and visual +QA directories were removed, and no release-namespaced temporary item or build +switching directory remained in the active application tree. + +## Production impact + +- The backend received a controlled restart. The frontend process remained + available while its build directory was switched. +- The exact backend interruption duration was not instrumented and is not + claimed as zero. Public health remained available after the automatic + rollback of the first attempt and passed after the final cutover. +- MongoDB, Redis, Nginx configuration, environment values, original media, and + legacy media paths were not migrated or replaced. +- No regression was observed in homepage, readiness, catalogue, detail read, + authorization rejection, or media delivery checks. Authenticated mutation + flows were covered by local characterization tests rather than writes to + production data. + +## Remaining risks + +- There is no independent staging environment and no completed restore + rehearsal; recovery certification remains deferred. +- Historical valid visits, verified visitors, uptime, latency percentiles, + active contributors, and organisation headcounts lack reliable evidence. +- The upstream proxy does not restore a verified client address at the origin, + so session/signature calculations remain low-confidence proxies. +- Full development dependency audits still report 3 high-severity findings in + the root tree and 54 client findings (13 low, 11 moderate, 27 high, 3 + critical). Production-only audits report zero known findings. No destructive + automatic dependency upgrade was run. +- Existing CRA, Browserslist, ESLint, and CSS build warnings remain. They did + not fail the production build, but should be removed through scoped upgrades + and warning-by-warning fixes. +- The launch path still relies on the existing process-management arrangement; + independent external monitoring and alert coverage are not verified. + +## Deployment and rollback + +The timestamped predeployment backup contains the previous source and client +build plus configuration and process records. The responsive release is also +retained in an isolated release directory. + +Code rollback restores the previous source and saved build, preserves `.env` +and `public`, restarts only the backend launch tree, and re-runs direct and +public health/catalog/media checks. No MongoDB or media restore is needed for +this release because it introduced no schema migration and only added +derivatives; originals and legacy paths remain intact. Newly generated +derivatives can remain unused after a code rollback. diff --git a/docs/operations/phase-13-report.md b/docs/operations/phase-13-report.md new file mode 100644 index 0000000..e2cd14c --- /dev/null +++ b/docs/operations/phase-13-report.md @@ -0,0 +1,110 @@ +# Phase 13 report — frontend API-routing incident and hotfix + +Date: 2026-07-23 + +> Current production later advanced to CSS-only style fix `c5e348e`. See +> [phase-14-report.md](phase-14-report.md) for the old-build comparison, +> deployment event, browser acceptance, and rollback. + +## Outcome + +Production is serving frontend hotfix `4168079`. The homepage, plant catalogue, +plant detail data, bird empty state, and responsive images were exercised in a +real browser after deployment. Both tested pages rendered with zero browser +console errors. No backend restart, database write, media change, Redis change, +or Nginx change was required. + +The exact incident duration and affected-user count are unavailable and are not +estimated. + +## Incident + +The responsive-media frontend build did not contain +`REACT_APP_Source_URL`. The URL helper converted the missing value to an empty +origin, so the browser requested `/getDb2Pic`, `/catalog/...`, and +`/public/variants/...` from the frontend static server instead of the production +`/api` proxy. + +The static server returned the SPA HTML fallback with HTTP 200 for the unknown +picture route. Axios therefore treated the response as successful. +`HomeDatabase` stored the missing `response.data.pics` as `undefined` and then +read `pics.length`, which stopped the React render. `BirdHomeDatabase` contained +the same unsafe response assumption. The missing prefix also prevented the +browser from using the responsive image endpoint. + +The earlier acceptance checks called backend API and image URLs directly but +did not execute the newly built SPA. They therefore verified the backend +contract without detecting the build-time routing error. + +## Immediate recovery + +- Atomically restored the saved predeployment frontend build. +- Verified the restored homepage in a browser; it rendered with no console + errors. +- Preserved the regressed build and the restored build as separate rollback + evidence. +- Did not restart the frontend or backend process and did not modify Nginx, + MongoDB, Redis, media, or environment configuration. + +## Fix + +- Missing, empty, or whitespace-only API configuration now defaults to the + production `/api` proxy. +- Explicit development or alternate API origins remain supported and trailing + slashes are normalized. +- Plant and bird homepage picture responses are accepted only when `pics` is an + array; malformed success bodies fall back to the existing three placeholders. +- Added focused tests for the API-origin default and malformed homepage picture + response. + +Commit: `4168079` — `fix: restore frontend API routing` + +## Verification + +Local: + +- Backend tests: 39 passed. +- Frontend tests: 19 passed across 7 suites. +- Focused routing/homepage tests: 5 passed. +- Production build: succeeded with the previously recorded CRA, + Browserslist, ESLint, and CSS warnings. +- Compiled bundle contains the `/api` default and responsive-media routes. + +Production: + +| Gate | Result | +| --- | --- | +| Deployed marker and client build hash | Match `4168079` release | +| Public homepage and readiness | HTTP 200 | +| Plant homepage render | Pass; approved count displayed as 152 | +| Plant homepage responsive images | 3 of 3 loaded with `/api/public/variants` URLs | +| Plant homepage console errors | 0 | +| Bird homepage with zero records | Pass; 3 placeholders displayed | +| Bird homepage console errors | 0 | +| Backend restart | None | +| Database, media, Redis, Nginx changes | None | +| Temporary transfer/build-switch files | 0 after cleanup | + +## Production impact + +Clients that loaded the regressed frontend could encounter a blank or failed +homepage render. The saved frontend build restored service before the hotfix +was prepared. The final hotfix used an atomic frontend directory swap; backend +and data services remained running. + +No reliable client-side telemetry existed for the incident window, so affected +requests, people, duration, and error rate remain unavailable. + +## Rollback + +The immediately previous working frontend build remains in the timestamped +predeployment backup. Rollback requires only an atomic client build-directory +swap and browser verification; no backend restart or data restore is needed. + +## Prevention + +- Treat a real browser render and console-error check as a required production + gate for every frontend build. +- Verify the page's own API and media URLs, not only direct endpoint curls. +- Keep the API proxy default covered by a build-independent unit test. +- Retain the last working frontend build until browser acceptance completes. diff --git a/docs/operations/phase-14-report.md b/docs/operations/phase-14-report.md new file mode 100644 index 0000000..1d1bebf --- /dev/null +++ b/docs/operations/phase-14-report.md @@ -0,0 +1,109 @@ +# Phase 14 report — button-style regression recovery + +Date: 2026-07-23 + +## Outcome + +Production is serving style fix `c5e348e`. Direct navigation to the plant +detail and creation routes now applies the same button styles as the verified +pre-refactor build. Public HTTPS and readiness return 200, the released CSS +hash matches the locally tested build, and the final asset-only cutover did not +change the frontend or backend process IDs. + +## Regression and cause + +The shared button reset was stored in `home.module.css`. Commit `8b64a7c` +changed `Home` to a lazy-loaded route, so users who opened another route +directly did not load that stylesheet. Those routes consequently displayed +browser-native button backgrounds, borders, cursors, and font sizes. Visiting +Home first could mask the issue, making the result depend on navigation order. + +The plant detail `Expand` and gallery-arrow buttons, the creation +`Newest`/`Oldest` controls, the creation page selector, and pagination all +depended on this reset. + +## Fix + +- Moved the existing global `button` rule to always-loaded `App.css`. +- Removed the duplicate global selector from the lazy Home stylesheet. +- Kept component structure, API contracts, data models, colors, spacing, and + user interactions unchanged. + +Commit: `c5e348e` — `fix: restore global button styles` + +## Verification + +Local: + +- Frontend tests: 19 passed across 7 suites. +- Production build: succeeded. +- Existing CRA, Browserslist, and ESLint warnings remain; no new build failure + was introduced. +- The locally built creation page matched the retained pre-refactor build for + the affected computed styles. + +Production browser comparison at the same desktop viewport: + +| Control | Regressed production | Retained old build and fixed production | +| --- | --- | --- | +| `Expand`, gallery arrows | Native grey background, 2 px outset border, default cursor, 13.33 px font | Transparent background, no border, pointer cursor, 24 px font | +| `Newest`, `Oldest` | Native grey background, 2 px outset border, default cursor, 13.33 px font | Transparent background, no border, pointer cursor, 24 px font | +| Pagination 1–5 | Intended green background plus native 2 px outset border and default cursor | Intended green background, no border, pointer cursor | + +The plant detail rendered its information and gallery with the released +stylesheet. The creation page rendered its artwork data and all ten images in +the current viewport loaded successfully. + +Additional production gates: + +| Gate | Result | +| --- | --- | +| Deployed marker | `c5e348e` | +| Public root and `/api/health/ready` | HTTP 200 | +| Public CSS hash | Exact match with locally tested build | +| Active and isolated-release source CSS | Exact match | +| Final cutover frontend/backend process IDs | Unchanged | +| Database, Redis, media, and Nginx changes | None | +| Active release transfer/next-build files | 0 | + +## Deployment event and production impact + +Two guarded full-build cutover attempts were rejected and automatically rolled +back when the process/health gates did not remain stable. Moving the complete +build tree interacted with the existing Nodemon-managed production layout; at +least one automatic backend child-process reload was observed. No deliberate +restart was issued. The exact interruption duration and public impact were not +instrumented and are not estimated. + +The successful deployment activated only the uniquely hashed CSS file and an +atomic HTML reference update. The corresponding source CSS is present in the +active application and the complete build is retained in the isolated +`c5e348e` release directory. JavaScript, MongoDB, Redis, media, Nginx, and +environment configuration were not changed by the successful cutover. + +The active asset manifest still describes the preceding full build because +changing its JSON file would be watched by the current Nodemon arrangement. +The public HTML and exact released CSS hash are the authoritative frontend +asset evidence for this CSS-only hotfix. A later controlled deployment should +ignore `client` build artifacts in the backend watcher before replacing the +complete build. + +## Remaining risks + +- The backend production launch path still uses Nodemon and is sensitive to + frontend build-tree changes. +- There is no independent staging environment or completed restore rehearsal. +- Existing CRA/dependency warnings and previously recorded audit findings + remain outside this focused CSS fix. +- Historical visits, verified unique visitors, uptime, and uninstrumented + incident duration remain unavailable. + +## Rollback + +Restore `index.html` and the prior deployed marker from +`/www/backup/biphflora-style-asset-predeploy-20260723T032855Z`, then restore the +two source CSS files from the retained `4168079` release. The new hashed CSS may +remain unused. Recheck the public root, readiness, plant detail, and creation +routes. No process restart, database restore, media restore, or Nginx change is +required for this rollback. + diff --git a/docs/operations/phase-2-report.md b/docs/operations/phase-2-report.md new file mode 100644 index 0000000..2ab2fcb --- /dev/null +++ b/docs/operations/phase-2-report.md @@ -0,0 +1,130 @@ +# Phase 2 report — authorization boundaries and upload validation + +Date: 2026-07-22. + +## What changed and why + +- Kept optional identity attachment for the existing public personalized + endpoints, while adding explicit `requireAuth` (401) and `requireAdmin` + (403) middleware for protected actions. +- `requireAdmin` checks the current User record rather than trusting the + long-lived `admin` value embedded in a JWT. It now protects management data, + role changes, approvals, recommendations, and destructive routes. +- A token must also match the active Redis session for its username. A Redis + lookup/delete failure produces a 503 response for login, logout, and + protected actions rather than being treated as an invalid token or a + successful logout. +- Content creation, edit submissions, and media uploads require a valid login. + Authentication now precedes multipart processing, so anonymous requests do + not reach Multer's disk-writing middleware. +- Both legacy bare JWTs and standard `Bearer` JWTs are accepted. The client + adds a Bearer token only to requests sent to its configured API base URL; + existing explicit raw-token calls remain compatible. +- New registrations no longer write `originalPassword`. Both password fields + are excluded by default at the schema level, and administrative user lists + use an explicit public projection plus a DTO that contains only `_id`, + `username`, and `admin`. +- Added one shared upload policy for JPEG, PNG, and WebP. It writes only + server-generated filenames to a private temporary directory, verifies image + content with Sharp, caps each image at 16 MiB, and caps a multipart batch at + 20 files. Failure paths remove temporary/derived files and return generic + 400/413 errors without exposing internals. +- Removed the password column from the administrator UI, since it is no + longer a supported response field. + +## Authorization matrix + +| Access | Route groups | +| --- | --- | +| Public or optional identity | Health, login/register/logout/refresh, public catalog/search/detail/count routes, public media/creation reads, and optional user-info/glossary responses. | +| Authenticated contributor | `/edit`, plant/bird/creation submissions, picture/art uploads, and plant/bird edit-request submissions. | +| Current administrator | Admin data/view/role routes; plant, bird, creation, and edit approvals; feature/recommendation management; and user, media, creation, and plant deletion routes. | + +The source route handlers are the authoritative mapping. Every protected +operation that writes, approves, changes a role, recommends content, or +removes data now has an explicit guard before its state-changing middleware. + +## Upload-limit evidence + +Metric: Production image-file distribution used for the server-side per-file +limit. + +Exact definition: Aggregate file sizes beneath the live `plantspic` and +`compressed/plantspic` directories; this is not a count of distinct uploaded +images or a measure of upload requests. + +Value: 1,229 files; min 32,626 B; median 2,035,805 B; p95 3,130,654 B; max +11,050,829 B; total 2,150,940,650 B. Extension counts: PNG 1,150, JPG 79. +The effective Nginx `client_max_body_size` was 500m. + +Time window: Current live filesystem snapshot collected 2026-07-22. + +Source: Read-only production filesystem aggregate and effective Nginx +configuration. + +Query/calculation: File sizes were sorted numerically; median used the middle +observation and p95 used the ceiling of 95 percent of the ordered file count. +Extension counts used lower-cased filename suffixes only. + +Bot/internal-traffic filtering: Not applicable. + +Collected on: 2026-07-22. + +Confidence: Direct for the enumerated directories at collection time. + +Limitations: The directories include derivative files, so this is not a +distinct-image metric. It does not establish historical batch sizes. The 20 +file batch cap is an operational guard, not a claim about past user behavior. +The 16 MiB per-file limit exceeds the observed maximum and remains well below +the configured proxy limit; it needs staging upload sampling before deployment. + +## Checks and health results + +- Backend: 11 tests pass. Seven focused authorization/upload cases cover + anonymous 401s, non-admin 403, raw and Bearer JWT compatibility, current + database admin state, session-store failures, secret-field exclusion, and + invalid multipart cleanup. +- Frontend: 2 existing route smoke tests pass after extending the Axios mock + for the shared request interceptor. +- Unified local verification: `npm run verify` passed, including the + production client build. +- Production HTTPS: a read-only request returned HTTP 200. No new code was + deployed. + +## Production impact + +No deployment, restart, database write, Redis write, media write, Nginx +change, backup change, or credential/configuration permission change occurred. +The production service remains on its prior commit. The only production reads +in this phase were aggregate media/Nginx evidence and an HTTPS status check. + +## Unresolved risks + +- Existing database documents may still contain `originalPassword`; this phase + prevents new writes and responses, but deliberately does not run the + separately approved cleanup migration. +- Redis session continuity and temporary-upload directory permissions still + need an isolated staging check before rollout. +- The final upload limits need an isolated staging upload test before any + production rollout. Historical batch-size telemetry is unavailable. +- A failed upload can leave a gap in a sequential display/code value; it does + not delete or overwrite existing media, but the sequence is not transactional. +- The code does not yet prevent an administrator from deleting or demoting the + last administrator; that needs a separately specified policy and test. +- There is no staging environment or verified backup restore. Existing CRA, + CSS nesting, ESLint, Browserslist, Babel-preset, and Jest open-handle + warnings remain unchanged. + +## Deployment and rollback + +No deployment is proposed for this phase. + +If separately approved, deploy this one commit only after a verified MongoDB +dump, media manifest, environment/configuration backup, and staging smoke test +using an admin and a standard user. Verify public reads, 401/403 responses, +admin workflows, valid JPEG/PNG/WebP uploads, and invalid/oversized upload +rejection. Do not overwrite `public` or `.env`. + +Rollback is code-only: return to the previous commit, rebuild the client, and +perform an authorized service restart. No migration or media change was made, +so no database or file restoration is required for this phase. diff --git a/docs/operations/phase-3-report.md b/docs/operations/phase-3-report.md new file mode 100644 index 0000000..b39e396 --- /dev/null +++ b/docs/operations/phase-3-report.md @@ -0,0 +1,53 @@ +# Phase 3 report — incremental module boundaries + +Date: 2026-07-22. + +## What changed and why + +- Moved token parsing, Redis-session validation, current-user lookup, and + `requireAuth`/`requireAdmin` into `middleware/auth.js`. The Express entry + point now composes those dependencies instead of owning the policy logic. +- Moved the contiguous public catalog lookup block into `routes/catalog.js`: + `GET /searchNames`, `GET /searchBirdNames`, `POST /syncPlantInfo`, + `POST /syncBirdInfo`, `GET /numOfPlants`, and `GET /numOfBirds`. + The router is mounted at the former route position with no URL prefix. +- Moved the shared Axios defaults and request interceptor from `UserContext` + into `client/src/api/http.js`. The same Axios singleton is retained; no + client call sites, headers, relative URLs, or request/response behavior were + mechanically rewritten in this phase. + +## Compatibility evidence + +The existing public-route contract test exercises all six extracted catalog +endpoints, including their methods, response shapes, model queries, and CORS +behavior. The existing authorization tests exercise the extracted middleware's +401, 403, raw/Bearer token, session-store failure, and current-user behavior. +No new broad test suite was added for a code-movement-only change. + +## Checks and health results + +- `npm run test:backend`: 11 tests passed. +- `npm run verify`: backend tests, frontend route smoke tests, and the + production client build passed. +- A read-only public HTTPS check returned HTTP 200. No branch code was + deployed. + +## Production impact + +No production deployment, service restart, database/Redis/media write, Nginx +change, configuration change, or backup action occurred. This is a source-only +refactor; existing database schemas and API routes remain unchanged. + +## Unresolved risks + +- This is the first small extraction only. Admin, content/edit, and media + routes remain in `app.js` for later independently verified steps. +- There is still no isolated staging environment or verified restore test. +- Existing client build warnings remain outside this change. + +## Deployment and rollback + +No deployment is proposed for this phase. If separately approved, stage this +one commit with the normal public-read, contributor, and administrator smoke +tests. Rollback is code-only: return to the previous commit, rebuild, and +perform an authorized restart. No database or media restoration is required. diff --git a/docs/operations/phase-4-report.md b/docs/operations/phase-4-report.md new file mode 100644 index 0000000..d366c42 --- /dev/null +++ b/docs/operations/phase-4-report.md @@ -0,0 +1,60 @@ +# Phase 4 report — search and image delivery optimization + +Date: 2026-07-22. + +## What changed and why + +- Added a small `GET /catalog/names?type=plant|bird` directory endpoint with + an explicit name-only projection. Legacy search endpoints remain available + for compatibility. +- Reused the client Fuse.js catalog snapshot instead of rebuilding the same + search index for every component/request. The cache keeps plant and bird + directories separate and supports invalidation after a write. +- Added the shared `MediaImage` component with direct compressed URLs, one + bounded legacy fallback, native lazy loading, asynchronous decoding, and + explicit eager loading for known above-the-fold images. +- Added route-level React lazy loading and removed the bird landing flow's + preload of an original image before rendering its compressed counterpart. +- Kept MongoDB media paths, existing originals, legacy derivatives, and API + response contracts unchanged. No historical media backfill or new format + migration was attempted. + +## Checks and evidence + +- Backend contract and characterization tests cover the catalog directory, + legacy search/read routes, media path helpers, and fallback behavior. +- Frontend tests cover catalog cache reuse, search URL behavior, image URL + fallback, lazy/eager loading, and asynchronous decoding. The current + cumulative verification is 24 backend tests and 15 frontend tests passing. +- The production build completed. The current main JavaScript bundle is + 129.91 kB gzip and the main CSS bundle is 60.3 kB gzip. These are build + artifacts, not claims about page-load latency. +- Public image delivery was later verified with a read-only sample returned by + `/api/getDb2Pic`; one compressed media request returned HTTP 200. The full + deployment evidence is in [phase-11-report.md](phase-11-report.md). + +## Production impact + +The optimization was developed and verified locally before the protected +cutover. It preserves old URLs and database references. The subsequent +production deployment used a backup, an isolated release smoke check, and a +rollback directory; it did not rewrite the media tree or run a backfill. + +## Unresolved risks + +- No approved dimensions/quality sample or full matched original/derivative + analysis is available. Average size, compression ratio, and storage saved + remain `unavailable`. +- No browser performance trace, LCP/CLS series, image-failure rate, or + search-latency history is available. The bundle size is not a substitute for + those metrics. +- Responsive `srcset`/WebP/AVIF variants and immutable cache headers remain + additive follow-up work requiring staging samples and separate Nginx + approval. Existing media files are never overwritten by this phase. + +## Rollback + +Restore the previous client build and code commit from the protected backup, +then perform the authorized backend restart and public health/search checks. +Because no database path or media file was migrated, no MongoDB or media +restore is required for a code-only rollback. diff --git a/docs/operations/phase-5-report.md b/docs/operations/phase-5-report.md new file mode 100644 index 0000000..16c278f --- /dev/null +++ b/docs/operations/phase-5-report.md @@ -0,0 +1,47 @@ +# Phase 5 report — observability and repository quality + +Date: 2026-07-22 + +## Changes + +- Added request IDs and opt-in structured request summaries containing only method, route, status, and duration. +- Added an opt-in audit-event path for successful create, edit, upload, review, delete, role, and feature operations. Actor identity is stored only as a keyed signature; request bodies, tokens, IPs, and usernames are not written. +- Added an opt-in search-event path that records only language category, record type, bounded result count, and selection. Raw search text is never sent or stored. +- Added focused tests for request-context/log redaction, audit allowlisting, telemetry validation, and client-side event aggregation. +- Replaced stale generated README and security templates with current architecture, setup, data-boundary, rollback, and disclosure guidance. +- Added contributor guidance, a Node 20 npm-lockfile CI workflow, and explicit package metadata/Node engine requirements. +- Removed duplicate pnpm lockfiles after npm lockfile verification; npm is the public installation path. + +## Defaults and production impact + +`REQUEST_LOG_ENABLED`, `AUDIT_EVENTS_ENABLED`, and `SEARCH_TELEMETRY_ENABLED` default to off. Enabling them requires an explicit environment change and a review of retention and access controls. No database schema migration, media rewrite, Nginx change, process restart, or production deployment was performed in this phase. Existing API routes remain compatible; health endpoints and optional telemetry are additive. + +## Verification + +The phase verification record is maintained with the commit and command output. Required checks are: + +- focused backend observability and telemetry tests; +- focused frontend telemetry and URL tests; +- `npm run verify` (backend tests, frontend tests, production build); +- clean `npm ci` installation for both lockfiles; +- dependency and secret scans with exact scope and limitations. + +Local result on 2026-07-22: `npm run verify` passed 22 backend tests, 15 frontend tests, and the production build. The build retains existing CRA/Browserslist, CSS-nesting, and ESLint warnings; they are recorded rather than presented as a clean lint result. + +The hosted CI run, historical monitor coverage, and staging verification remain external evidence and are not inferred from a local pass. + +The official-registry `npm audit --omit=dev --audit-level=high` check found 13 root production-tree advisories (3 moderate, 9 high, 1 critical). The client-tree audit found 65 advisories (13 low, 17 moderate, 32 high, 3 critical), largely through the current CRA toolchain. No automatic or `--force` audit fix was applied: the suggested fixes include breaking upgrades such as Sharp, bcrypt, React Scripts, or major transitive changes and require a separately tested dependency-upgrade phase. + +A redacted working-tree scan found no tracked `.env`, key, credential, or certificate files and no credential-shaped connection string. The only matching test file contains synthetic authentication fixtures; values were not copied into the report. This scan does not prove that an untracked server secret or every historical value is safe, so production rotation remains an operations responsibility if a host-side review finds exposure. + +## Unresolved risks + +- There is no verified staging environment or restore rehearsal for MongoDB, Redis, media, or Nginx configuration. +- Existing production logs do not provide a historical denominator for uptime, latency, unique visitors, or product usage. +- Dependency audit findings remain open; the current scan is evidence of risk, not proof of exploitability in this deployment. +- Audit/search event retention and access controls require an operations decision before enabling them. +- Existing legacy handlers remain in `app.js`; further extraction should continue one boundary at a time. + +## Rollback + +Disable the optional flags or revert this phase commit. Because the event paths are additive and disabled by default, rollback does not require data restoration. If a flag has been enabled, retain the append-only collections according to the approved retention policy; do not delete them as part of a code rollback. diff --git a/docs/operations/phase-6-report.md b/docs/operations/phase-6-report.md new file mode 100644 index 0000000..2176741 --- /dev/null +++ b/docs/operations/phase-6-report.md @@ -0,0 +1,22 @@ +# Phase 6 report — isolated verification and deployment preparation + +Date: 2026-07-22 + +## Completed safely + +- Verified both npm lockfiles with a normal `npm ci` and `npm --prefix client ci`; no tracked lockfile changes were produced. +- Verified the backend after clean installation: 22/22 tests passed, including liveness/readiness, authorization, uploads, media cleanup, catalog compatibility, observability, and graceful shutdown. +- The existing contract tests use synthetic users, records, media, and dependency doubles. No production account, raw log, media file, MongoDB dump, Redis state, or credential was copied into the repository. +- Reconfirmed the release checklist and rollback order in [deployment-readiness.md](deployment-readiness.md). + +## Staging boundary + +No independent staging host or restore rehearsal is verified. The repository is therefore in “deployable preparation” status, not “production approved” status. Local contract tests and a successful build do not prove MongoDB/Redis/media restore capability, Nginx behavior, historical uptime, or production traffic safety. + +## Required before production approval + +Operations must separately provide a staging or equivalent isolated environment, anonymous fixtures, current backup locations, restore evidence for MongoDB and media, Redis persistence decision, Nginx/宝塔 configuration backup, and a health-check record before any deployment. A production deployment, service restart, Nginx reload, migration, media backfill, or backup deletion remains outside this phase. + +## Rollback evidence + +The last known application baseline is commit `ea471b6`; the refactor branch now contains phase commits through `210cb27`. A rollback can select a recorded application commit and restore the separately approved configuration/data/media backups. No production state was changed during this phase, so no production rollback was required and no downtime or regression is claimed. diff --git a/docs/operations/phase-7-report.md b/docs/operations/phase-7-report.md new file mode 100644 index 0000000..d786369 --- /dev/null +++ b/docs/operations/phase-7-report.md @@ -0,0 +1,85 @@ +# Phase 7 report — low-risk dependency and build hygiene wave + +Date: 2026-07-22 + +## Changes + +- Updated the compatible server dependency ranges for `body-parser`, `express`, + `jsonwebtoken`, and `mongoose`; the lockfile records the exact resolved + versions. The unused `fs` package entry was removed; application imports use + Node's built-in module. +- Updated the compatible client dependency ranges for `axios`, `immutable`, + and `react-router-dom`, with a fresh client lockfile. +- Flattened the one nested CSS selector in `uploadHome.css`, removing the + corresponding CSS-nesting build warning without changing the selector's + behavior. +- Moved the repository verification workflow from Node 20 to Node 22. The + package engine remains unchanged until the production Node version is + verified. + +## Verification + +- Clean local `npm ci` with install scripts: passed. +- Clean local `npm --prefix client ci`: passed. +- Backend: 22/22 tests passed. +- Frontend: 6 suites and 15/15 tests passed. +- Production build completed successfully. The CSS-nesting warning is gone. +- Remaining build warnings are the existing CRA/Babel, Browserslist, ESLint, + and Jest open-handle warnings; this wave does not suppress them. + +## Dependency evidence + +The official-registry `npm audit --omit=dev --audit-level=high` result for the +root production tree is: + +```text +Metric: root production dependency advisories +Exact definition: npm audit advisories with dev dependencies omitted +Value: 8 total (1 moderate, 6 high, 1 critical) +Time window: dependency tree resolved on 2026-07-22 +Source: npm registry audit endpoint +Query/calculation: npm audit --omit=dev --audit-level=high --json +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: high for this lockfile and registry snapshot +Limitations: bcrypt 5, sharp 0.33, and CRA transitive/native risks remain; +major upgrades were intentionally deferred for staging compatibility testing +``` + +The client-tree result is: + +```text +Metric: client dependency advisories +Exact definition: npm audit advisories for client/package-lock.json +Value: 59 total (13 low, 16 moderate, 27 high, 3 critical) +Time window: dependency tree resolved on 2026-07-22 +Source: npm registry audit endpoint +Query/calculation: npm --prefix client audit --audit-level=high --json +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: high for this lockfile and registry snapshot +Limitations: most remaining high/critical findings are CRA 5 transitive or +development-tool findings; the CRA-to-Vite migration is a separate tested wave +``` + +## Production impact and unresolved risks + +No production process, database, media directory, Nginx configuration, or +environment file was changed. No deployment, restart, migration, media +backfill, or backup deletion occurred. The dependency changes are not +production-approved until the host Node version, staging smoke test, backup +coverage, and rollback path are verified. + +There is still no independent staging or restore rehearsal. Native dependency +upgrades (`bcrypt` 6, `sharp` 0.35, and `multer` 2), the CRA migration, and +remaining lint/build warnings require separate compatibility work. Visits, +verified unique visitors, historical uptime, and production latency remain +unavailable without server-side evidence. + +## Rollback + +Revert this phase commit and reinstall the prior lockfiles. The CSS change is +source-only. No database or media rollback is needed because production was not +modified. Before any production deployment, capture separate MongoDB, media, +environment, Nginx/宝塔, Redis, and log-cutoff backups as described in +`deployment-readiness.md`. diff --git a/docs/operations/phase-8-report.md b/docs/operations/phase-8-report.md new file mode 100644 index 0000000..0f1b919 --- /dev/null +++ b/docs/operations/phase-8-report.md @@ -0,0 +1,51 @@ +# Phase 8 report — cloud access and deployment gate + +Date: 2026-07-22 + +## Read-only checks completed + +- The local resolver maps `biphflora.com` to a synthetic/reserved network + address. An independent DNS-over-HTTPS query returned a separate source + address; the exact origin address is retained only in private connection + evidence and is intentionally omitted from this public report. +- TCP port 22 accepted a connection attempt on the DNS-derived origin; the + other checked common SSH ports (2022, 2200, 2222, 10022) were refused. +- Public HTTPS returned 200 for `/`, `/health/live`, `/health/ready`, and + `/catalog/names?type=plant`, but each health/catalog response was the 429-byte + CRA HTML shell rather than JSON. `/api/health/live` returned 404 HTML. The + current Nginx public routing therefore does not expose the new backend health + or catalog endpoints. +- The supplied `/Users/LeoQin/Downloads/biphflora connect` file was used only + as an SSH password source; its contents were not printed or copied. The + exact path is the only matching `biphflora connect*` file in Downloads; it is + an ASCII file with 41 bytes, no line terminator, and mode `0644`. Read-only + authentication attempts for `root` and `ubuntu` on the public hostname did + not authenticate. The SSH server advertises password authentication; the + exact file was tested through both `sshpass -f` and OpenSSH askpass, with + `root` still rejected. No additional usernames or keys were brute-forced. + +## Initial gate and subsequent deployment + +The checks above were the initial access gate and intentionally did not change +the host. After the correct root credential was supplied, the authorized +sequence was completed on 2026-07-22. A protected deployment and its evidence +are recorded in [phase-11-report.md](phase-11-report.md). The deployment used +an isolated release directory and a server-side backup before the cutover; it +did not use `git pull`, reload Nginx, migrate MongoDB, backfill media, or delete +backups. + +The deployment gates that remain open even though the release is live are: + +1. Independent staging parity and a successful MongoDB/media restore rehearsal. +2. Reliable historical monitoring or a documented server-side aggregation for + valid sessions, verified visitors, latency, and error-rate metrics. +3. A read-only review of the intermittent SSH banner closures and the server's + SSH/fail2ban logs. + +## Evidence limitation + +Traffic values that require server logs—valid visits/sessions, verified unique +visitors, pageviews, route trends, error rates, latency, and historical uptime— +remain `unavailable`. The repository's metric catalog records the exact +definitions and the already verified MongoDB/media/log aggregates without +relabeling request counts as visits. diff --git a/docs/operations/phase-9-report.md b/docs/operations/phase-9-report.md new file mode 100644 index 0000000..e9f8f0b --- /dev/null +++ b/docs/operations/phase-9-report.md @@ -0,0 +1,58 @@ +# Phase 9 report — native dependency hardening + +Date: 2026-07-22 + +## Changes + +- Upgraded `bcrypt` from 5.x to 6.0.0 and `sharp` from 0.33.x to 0.35.3. +- Added two focused characterization checks: a pre-existing bcrypt hash still + verifies, and the Sharp metadata API used by the compressor remains stable. +- Added lockfile overrides for `bn.js` 4.12.3 and `path-to-regexp` 0.1.13. + These are transitive patch-level security fixes; Express remains on the 4.x + API and `connect-mongo` remains unchanged. +- Deferred `multer` 2.x until an isolated upload compatibility run is + available; Multer 1.x remains a known warning in the install output. + +## Verification + +- Clean root `npm ci` with native install scripts: passed. +- Backend: 24/24 tests passed, including authorization, upload cleanup, image + processing, legacy bcrypt verification, Sharp metadata, and graceful + shutdown. +- Frontend: 6 suites and 15/15 tests passed. +- Production build completed successfully; existing CRA/Browserslist/ESLint + warnings remain and are not suppressed. +- Actual installed versions after clean install: bcrypt 6.0.0, sharp 0.35.3, + express 4.22.2, path-to-regexp 0.1.13, and bn.js 4.12.3. + +## Dependency evidence + +```text +Metric: root production dependency advisories +Exact definition: npm audit advisories with dev dependencies omitted +Value: 0 total (0 low, 0 moderate, 0 high, 0 critical) +Time window: clean lockfile installation on 2026-07-22 +Source: official npm registry audit endpoint +Query/calculation: npm audit --omit=dev --audit-level=high --json +Bot/internal-traffic filtering: not applicable +Collected on: 2026-07-22 +Confidence: high for this lockfile and registry snapshot +Limitations: does not prove exploitability or remove client CRA findings; +multer 1.x and the CRA toolchain still need separate compatibility work +``` + +## Production impact and unresolved risks + +No production process, database, media directory, Nginx configuration, or +environment file was changed. No deployment or restart occurred. The native +upgrades are locally compatible but still require the approved staging/backup +gate before production rollout. The client audit remains 59 advisories, +primarily through CRA 5 transitive tooling; visits, verified unique visitors, +historical uptime, and production latency remain unavailable. + +## Rollback + +Revert this commit and reinstall the prior root lockfile. No data or media +rollback is needed because production was not modified. If a future production +rollout fails, restore the previously recorded application commit and use the +separately verified environment/media/database backups. diff --git a/middleware/auth.js b/middleware/auth.js new file mode 100644 index 0000000..7619401 --- /dev/null +++ b/middleware/auth.js @@ -0,0 +1,154 @@ +function createAuthMiddleware({ User, jwt, runtime, logger = console }) { + function getAuthorizationToken(authorization) { + if (typeof authorization !== "string") { + return null; + } + + const value = authorization.trim(); + if (!value || value === "undefined") { + return null; + } + + const bearerMatch = value.match(/^Bearer\s+(.+)$/i); + const token = bearerMatch ? bearerMatch[1].trim() : value; + + return token || null; + } + + function sessionStoreUnavailable(res) { + return res.status(503).json({ + success: false, + message: "Authentication service unavailable", + }); + } + + async function verifyToken(req, res, next) { + const token = getAuthorizationToken(req.headers["authorization"]); + req.sessionStoreUnavailable = false; + + if (!token) { + req.user = null; + req.token = null; + return next(); + } + + let decoded; + try { + decoded = jwt.verify(token, process.env.secret); + } catch (err) { + if (err.name === "TokenExpiredError") { + const expiredToken = jwt.decode(token); + if (expiredToken?.username) { + try { + const sessionToken = await runtime.getSessionToken( + expiredToken.username, + ); + if (sessionToken === token) { + await runtime.deleteSession(expiredToken.username); + } + } catch (_) { + logger.warn("Unable to clear an expired session cache entry"); + } + } + } + + req.user = null; + req.token = null; + return next(); + } + + try { + const sessionToken = await runtime.getSessionToken(decoded.username); + + if (sessionToken !== token) { + req.user = null; + req.token = null; + return next(); + } + } catch (_) { + req.user = null; + req.token = null; + req.sessionStoreUnavailable = true; + return next(); + } + + req.user = decoded; + req.token = token; + return next(); + } + + function requireAuth(req, res, next) { + return verifyToken(req, res, async (error) => { + if (error) { + return next(error); + } + + if (req.sessionStoreUnavailable) { + return sessionStoreUnavailable(res); + } + + if (!req.user?.username) { + if ( + getAuthorizationToken(req.headers["authorization"]) && + !runtime.isSessionStoreReady() + ) { + return sessionStoreUnavailable(res); + } + + return res.status(401).json({ + success: false, + message: "Authentication required", + }); + } + + try { + const currentUser = await User.findOne( + { username: req.user.username }, + { username: 1, admin: 1 }, + ); + + if (!currentUser) { + return res.status(401).json({ + success: false, + message: "Authentication required", + }); + } + + req.authenticatedUser = { + username: currentUser.username, + admin: Boolean(currentUser.admin), + }; + return next(); + } catch (authError) { + return next(authError); + } + }); + } + + function requireAdmin(req, res, next) { + return requireAuth(req, res, (error) => { + if (error) { + return next(error); + } + + if (!req.authenticatedUser?.admin) { + return res.status(403).json({ + success: false, + message: "Administrator access required", + }); + } + + return next(); + }); + } + + return { + getAuthorizationToken, + requireAdmin, + requireAuth, + sessionStoreUnavailable, + verifyToken, + }; +} + +module.exports = { createAuthMiddleware }; diff --git a/middleware/observability.js b/middleware/observability.js new file mode 100644 index 0000000..09a5a39 --- /dev/null +++ b/middleware/observability.js @@ -0,0 +1,139 @@ +const crypto = require("node:crypto"); + +const AUDITED_ROUTES = new Map([ + ["POST /uploadPlant", "catalog.create_requested"], + ["POST /uploadBird", "catalog.create_requested"], + ["POST /updateText", "catalog.edit_requested"], + ["POST /birdUpdateText", "catalog.edit_requested"], + ["POST /uploadCreation", "creation.uploaded"], + ["POST /uploadPic", "media.uploaded"], + ["POST /uploadBirdPic", "media.uploaded"], + ["POST /uploadArt", "media.uploaded"], + ["POST /newPostAuth", "catalog.reviewed"], + ["POST /newBirdPostAuth", "catalog.reviewed"], + ["POST /newCreationAuth", "creation.reviewed"], + ["PUT /handleEditDecision", "catalog.edit_reviewed"], + ["PUT /handleBirdEditDecision", "catalog.edit_reviewed"], + ["POST /adminToggle", "user.role_changed"], + ["POST /adminMakeAdminUser", "user.role_changed"], + ["POST /adminDeleteUser", "user.deleted"], + ["POST /makeFeatured", "feature.changed"], + ["POST /featureToHome", "feature.changed"], + ["POST /makePicFeatured", "feature.changed"], + ["POST /uploadFeatureSingle", "feature.changed"], + ["POST /uploadFeatureArtSingle", "feature.changed"], + ["POST /unFeatureHome", "feature.changed"], + ["POST /unFeatureCreation", "feature.changed"], + ["POST /editPageDelete", "media.deleted"], + ["DELETE /editPageDeletePlant", "catalog.deleted"], +]); + +function createRequestContext({ idFactory = crypto.randomUUID } = {}) { + return function requestContext(req, res, next) { + req.requestId = idFactory(); + res.setHeader("X-Request-Id", req.requestId); + next(); + }; +} + +function getMatchedRoute(req) { + if (!req.route || typeof req.route.path !== "string") { + return "unmatched"; + } + + return `${req.baseUrl || ""}${req.route.path}` || "/"; +} + +function createRequestLogger({ + logger = console, + now = process.hrtime.bigint, + timestamp = () => new Date().toISOString(), +} = {}) { + return function requestLogger(req, res, next) { + const startedAt = now(); + + res.once("finish", () => { + const durationMs = Number(now() - startedAt) / 1_000_000; + const entry = { + event: "http_request", + timestamp: timestamp(), + requestId: req.requestId, + method: req.method, + route: getMatchedRoute(req), + status: res.statusCode, + durationMs: Number(durationMs.toFixed(3)), + }; + const write = logger.info || logger.log; + write.call(logger, JSON.stringify(entry)); + }); + + next(); + }; +} + +function createActorSignature(username, secret) { + if (!username || !secret) { + return undefined; + } + + return crypto.createHmac("sha256", secret).update(username).digest("hex"); +} + +function createAuditMiddleware({ + enabled = false, + writeEvent, + actorHashSecret, + logger = console, +} = {}) { + if (!enabled) { + return function auditDisabled(req, res, next) { + next(); + }; + } + + if (typeof writeEvent !== "function") { + throw new TypeError("writeEvent is required when audit events are enabled"); + } + + return function auditRequest(req, res, next) { + const routeKey = `${req.method} ${req.path}`; + const action = AUDITED_ROUTES.get(routeKey); + + if (action) { + res.once("finish", async () => { + if (res.statusCode < 200 || res.statusCode >= 400) { + return; + } + + try { + await writeEvent({ + action, + method: req.method, + route: req.path, + status: res.statusCode, + requestId: req.requestId, + actorSignature: createActorSignature( + req.user?.username, + actorHashSecret, + ), + occurredAt: new Date(), + }); + } catch (_) { + const warn = logger.warn || logger.log; + warn.call(logger, "Unable to append audit event"); + } + }); + } + + next(); + }; +} + +module.exports = { + AUDITED_ROUTES, + createActorSignature, + createAuditMiddleware, + createRequestContext, + createRequestLogger, + getMatchedRoute, +}; diff --git a/models/auditEvent.js b/models/auditEvent.js new file mode 100644 index 0000000..f6b5df2 --- /dev/null +++ b/models/auditEvent.js @@ -0,0 +1,19 @@ +const mongoose = require("mongoose"); + +const auditEventSchema = new mongoose.Schema( + { + action: { type: String, required: true, immutable: true }, + method: { type: String, required: true, immutable: true }, + route: { type: String, required: true, immutable: true }, + status: { type: Number, required: true, immutable: true }, + requestId: { type: String, required: true, immutable: true }, + actorSignature: { type: String, immutable: true }, + occurredAt: { type: Date, required: true, immutable: true }, + }, + { + collection: "audit_events", + versionKey: false, + }, +); + +module.exports = mongoose.model("AuditEvent", auditEventSchema); diff --git a/models/compression.js b/models/compression.js index 06af030..6412500 100644 --- a/models/compression.js +++ b/models/compression.js @@ -1,53 +1,78 @@ +const crypto = require("node:crypto"); +const fs = require("node:fs/promises"); +const path = require("node:path"); const sharp = require("sharp"); -const fs = require("fs").promises; -const path = require("path"); -async function compressImages(inputFiles, outputFolderPath, level,jquality) { +// Keep Sharp's documented default pixel ceiling explicit until production +// dimensions can be sampled in an isolated environment. +const MAX_INPUT_PIXELS = 268_402_689; +const PROCESSING_TIMEOUT_SECONDS = 30; + +function createPipeline(inputFile, extension, pngCompressionLevel, quality) { + const image = sharp(inputFile, { + failOn: "error", + limitInputPixels: MAX_INPUT_PIXELS, + }) + .rotate() + .timeout({ seconds: PROCESSING_TIMEOUT_SECONDS }); + + if (extension === ".jpg" || extension === ".jpeg") { + return image.jpeg({ quality }); + } + if (extension === ".png") { + return image.png({ compressionLevel: pngCompressionLevel }); + } + if (extension === ".webp") { + return image.webp({ quality, lossless: false }); + } + + return null; +} + +async function compressImages( + inputFiles, + outputFolderPath, + pngCompressionLevel, + quality, +) { const results = []; + await fs.mkdir(outputFolderPath, { recursive: true }); for (const inputFile of inputFiles) { const fileName = path.basename(inputFile); - const ext = path.extname(inputFile).toLowerCase(); - const outputFilePath = `${outputFolderPath}${fileName}`; - - console.log( - `Starting processing file: ${inputFile} at ${new Date().toISOString()}`, + const extension = path.extname(inputFile).toLowerCase(); + const outputFilePath = path.join(outputFolderPath, fileName); + const temporaryOutputPath = `${outputFilePath}.tmp-${crypto + .randomBytes(8) + .toString("hex")}${extension}`; + const pipeline = createPipeline( + inputFile, + extension, + pngCompressionLevel, + quality, ); + if (!pipeline) { + results.push({ success: false, file: inputFile }); + continue; + } + try { - let compressImage; - - if (ext === ".jpg" || ext === ".jpeg") { - compressImage = () => sharp(inputFile).jpeg({ quality: jquality }); - } else if (ext === ".webp") { - compressImage = () => - sharp(inputFile).webp({ quality: jquality, lossless: false }); - } else if (ext === ".png") { - compressImage = () => sharp(inputFile).png({ compressionLevel: level }); - } else { - console.error( - `Invalid format for input image "${inputFile}", only PNG, JPG/JPEG, or WEBP are supported. Skipping this file.`, - ); - continue; - } - - const data = await compressImage().toBuffer(); - await fs.writeFile(outputFilePath, data); - - console.log( - `Output file successfully written: ${outputFilePath} at ${new Date().toISOString()}`, - ); + await pipeline.toFile(temporaryOutputPath); + await fs.rename(temporaryOutputPath, outputFilePath); results.push({ success: true, file: inputFile }); - } catch (err) { - console.error("Error processing image:", err); - console.error( - `Failed to process file: ${inputFile} at ${new Date().toISOString()}`, - ); - results.push({ success: false, file: inputFile, error: err }); + } catch (_) { + await fs.unlink(temporaryOutputPath).catch(() => {}); + results.push({ success: false, file: inputFile }); } } return results; } -module.exports = { compressImages }; +module.exports = { + MAX_INPUT_PIXELS, + PROCESSING_TIMEOUT_SECONDS, + compressImages, + createPipeline, +}; diff --git a/models/searchEvent.js b/models/searchEvent.js new file mode 100644 index 0000000..00cda37 --- /dev/null +++ b/models/searchEvent.js @@ -0,0 +1,33 @@ +const mongoose = require("mongoose"); + +const searchEventSchema = new mongoose.Schema( + { + catalogType: { + type: String, + enum: ["plant", "bird"], + required: true, + immutable: true, + }, + languageCategory: { + type: String, + enum: ["cjk", "latin_script", "mixed_or_other"], + required: true, + immutable: true, + }, + resultCount: { + type: Number, + min: 0, + max: 3, + required: true, + immutable: true, + }, + selected: { type: Boolean, required: true, immutable: true }, + occurredAt: { type: Date, required: true, immutable: true }, + }, + { + collection: "search_events", + versionKey: false, + }, +); + +module.exports = mongoose.model("SearchEvent", searchEventSchema); diff --git a/models/uploadPolicy.js b/models/uploadPolicy.js new file mode 100644 index 0000000..65bd74f --- /dev/null +++ b/models/uploadPolicy.js @@ -0,0 +1,130 @@ +const multer = require("multer"); +const crypto = require("crypto"); +const fs = require("fs"); +const path = require("path"); +const sharp = require("sharp"); + +// This stays below the effective Nginx request limit and above the largest +// image currently stored in production. It is a per-file limit, not a claim +// about typical uploads. +const MAX_IMAGE_FILE_SIZE = 16 * 1024 * 1024; +const MAX_FILES_PER_BATCH = 20; +const SUPPORTED_IMAGE_TYPES = new Set([ + "image/jpeg", + "image/png", + "image/webp", +]); +const SUPPORTED_IMAGE_EXTENSIONS = new Set([".jpg", ".jpeg", ".png", ".webp"]); +const IMAGE_EXTENSION_BY_MIME_TYPE = { + "image/jpeg": ".jpg", + "image/png": ".png", + "image/webp": ".webp", +}; +const IMAGE_FORMAT_BY_MIME_TYPE = { + "image/jpeg": "jpeg", + "image/png": "png", + "image/webp": "webp", +}; +const UPLOAD_TEMP_DIR = path.join(__dirname, "..", "uploads"); + +function imageFileFilter(req, file, callback) { + const extension = path.extname(file.originalname || "").toLowerCase(); + const isSupported = + SUPPORTED_IMAGE_TYPES.has(file.mimetype) && + SUPPORTED_IMAGE_EXTENSIONS.has(extension); + + if (isSupported) { + return callback(null, true); + } + + return callback(new multer.MulterError("LIMIT_UNEXPECTED_FILE", file.fieldname)); +} + +function createImageFilename(mimetype) { + const extension = IMAGE_EXTENSION_BY_MIME_TYPE[mimetype]; + if (!extension) { + throw new Error("Unsupported image type"); + } + + return `${crypto.randomBytes(16).toString("hex")}${extension}`; +} + +function ensureUploadTempDirectory() { + fs.mkdirSync(UPLOAD_TEMP_DIR, { recursive: true }); + return UPLOAD_TEMP_DIR; +} + +function invalidImageError() { + const error = new Error("Invalid image data"); + error.code = "INVALID_IMAGE"; + return error; +} + +async function validateImageFiles(files) { + try { + await Promise.all( + files.map(async (file) => { + const metadata = await sharp(file.path).metadata(); + if (metadata.format !== IMAGE_FORMAT_BY_MIME_TYPE[file.mimetype]) { + throw invalidImageError(); + } + }), + ); + } catch (_) { + throw invalidImageError(); + } +} + +function getUploadErrorResponse(error) { + if (error?.code === "INVALID_IMAGE") { + return { + status: 400, + body: { + success: false, + message: "Invalid image upload", + }, + }; + } + + if (!(error instanceof multer.MulterError)) { + return null; + } + + if (error.code === "LIMIT_FILE_SIZE") { + return { + status: 413, + body: { + success: false, + message: "Image file is too large", + }, + }; + } + + return { + status: 400, + body: { + success: false, + message: "Invalid image upload", + }, + }; +} + +const batchImageUploadOptions = { + limits: { + fileSize: MAX_IMAGE_FILE_SIZE, + files: MAX_FILES_PER_BATCH, + }, + fileFilter: imageFileFilter, +}; + +module.exports = { + MAX_FILES_PER_BATCH, + MAX_IMAGE_FILE_SIZE, + UPLOAD_TEMP_DIR, + batchImageUploadOptions, + createImageFilename, + ensureUploadTempDirectory, + getUploadErrorResponse, + imageFileFilter, + validateImageFiles, +}; diff --git a/models/uploadart.js b/models/uploadart.js index 38b88c2..9879a43 100644 --- a/models/uploadart.js +++ b/models/uploadart.js @@ -1,36 +1,56 @@ const multer = require("multer"); -const crypto = require("crypto"); +const fs = require("fs").promises; +const { + MAX_FILES_PER_BATCH, + batchImageUploadOptions, + createImageFilename, + ensureUploadTempDirectory, + getUploadErrorResponse, +} = require("./uploadPolicy"); var fileCount = 0; // Initialize a variable to keep track of the file count const storage = multer.diskStorage({ destination: function (req, file, cb) { - cb(null, "./public/uploads/"); // Set the destination folder for uploaded files + try { + cb(null, ensureUploadTempDirectory()); + } catch (error) { + cb(error); + } }, filename: function (req, file, cb) { - const fileExtension = file.originalname.split(".").pop().toLowerCase(); - const filename = - req.body.plant + - "-" + - crypto.randomBytes(16).toString("hex").slice(0, 16) + - "." + - fileExtension; // Generate a unique filename - cb(null, filename); + try { + cb(null, createImageFilename(file.mimetype)); + } catch (error) { + cb(error); + } }, }); const upload = multer({ storage: storage, -}).array("files"); + ...batchImageUploadOptions, +}).array("files", MAX_FILES_PER_BATCH); const middleware = function (req, res, next) { - upload(req, res, function (err) { - if (err instanceof multer.MulterError) { - // A Multer error occurred during file upload - return res.status(500).json({ message: "File upload error" }); - } else if (err) { - // An unknown error occurred during file upload - return res.status(500).json({ message: "Unknown error occurred" }); + upload(req, res, async function (err) { + if (err) { + await Promise.all( + (req.files || []).map((file) => fs.unlink(file.path).catch(() => {})), + ); + } + + const uploadError = getUploadErrorResponse(err); + if (uploadError) { + return res.status(uploadError.status).json(uploadError.body); + } + + if (err) { + console.error("Image upload middleware failed"); + return res.status(500).json({ + success: false, + message: "Unable to process image upload", + }); } // Set the file count to the number of uploaded files at the moment diff --git a/models/uploadfile.js b/models/uploadfile.js index fd8c16d..9879a43 100644 --- a/models/uploadfile.js +++ b/models/uploadfile.js @@ -1,39 +1,56 @@ const multer = require("multer"); -const crypto = require("crypto"); +const fs = require("fs").promises; +const { + MAX_FILES_PER_BATCH, + batchImageUploadOptions, + createImageFilename, + ensureUploadTempDirectory, + getUploadErrorResponse, +} = require("./uploadPolicy"); var fileCount = 0; // Initialize a variable to keep track of the file count const storage = multer.diskStorage({ destination: function (req, file, cb) { - cb(null, "./public/uploads/"); // Set the destination folder for uploaded files + try { + cb(null, ensureUploadTempDirectory()); + } catch (error) { + cb(error); + } }, filename: function (req, file, cb) { - const fileExtension = file.originalname.split(".").pop().toLowerCase(); - const filename = - req.body.picEnglishName + - "-" + - crypto.randomBytes(16).toString("hex").slice(0, 16) + - "." + - fileExtension; // Generate a unique filename - cb(null, filename); + try { + cb(null, createImageFilename(file.mimetype)); + } catch (error) { + cb(error); + } }, }); const upload = multer({ storage: storage, -}).array("files"); + ...batchImageUploadOptions, +}).array("files", MAX_FILES_PER_BATCH); const middleware = function (req, res, next) { - upload(req, res, function (err) { - if (err instanceof multer.MulterError) { - // A Multer error occurred during file upload - return res.status(500).json({ message: "File upload error" }); - } else if (err) { - console.log("err", err); - // An unknown error occurred during file upload - return res - .status(500) - .json({ message: "Unknown error occurred", error: err }); + upload(req, res, async function (err) { + if (err) { + await Promise.all( + (req.files || []).map((file) => fs.unlink(file.path).catch(() => {})), + ); + } + + const uploadError = getUploadErrorResponse(err); + if (uploadError) { + return res.status(uploadError.status).json(uploadError.body); + } + + if (err) { + console.error("Image upload middleware failed"); + return res.status(500).json({ + success: false, + message: "Unable to process image upload", + }); } // Set the file count to the number of uploaded files at the moment diff --git a/models/user.js b/models/user.js index 7530d25..55932a5 100644 --- a/models/user.js +++ b/models/user.js @@ -9,10 +9,12 @@ const userSchema = new Schema({ }, originalPassword: { type: String, + select: false, }, password: { type: String, required: true, + select: false, }, admin: { type: Boolean, diff --git a/package-lock.json b/package-lock.json index 9bdd77e..a57b417 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,31 +7,33 @@ "": { "name": "biphflora", "version": "3.0.0", - "license": "ISC", + "license": "SEE LICENSE IN LICENSE", "dependencies": { - "bcrypt": "^5.1.1", - "body-parser": "^1.20.3", + "bcrypt": "^6.0.0", + "body-parser": "^1.20.6", "compression": "^1.7.5", "connect-mongo": "^5.1.0", "cors": "^2.8.5", "dotenv": "^16.4.5", - "express": "^4.21.1", - "fs": "0.0.1-security", + "express": "^4.22.2", "fuse.js": "^7.0.0", - "jsonwebtoken": "^9.0.2", + "jsonwebtoken": "^9.0.3", "moment-timezone": "^0.5.46", - "mongoose": "^8.8.2", + "mongoose": "^8.24.1", "multer": "1.4.5-lts.1", "primeflex": "^3.3.1", "primeicons": "^7.0.0", "primereact": "^10.8.4", "react-player": "^3.3.3", "redis": "^4.7.0", - "sharp": "^0.33.5" + "sharp": "^0.35.3" }, "devDependencies": { "nodemon": "^3.1.10", "prettier": "^3.3.3" + }, + "engines": { + "node": ">=18.17.0" } }, "node_modules/@babel/runtime": { @@ -44,19 +46,28 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, + "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", + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", + "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", "cpu": [ "arm64" ], @@ -66,19 +77,19 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "@img/sharp-libvips-darwin-arm64": "1.3.2" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", + "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", "cpu": [ "x64" ], @@ -88,19 +99,38 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "@img/sharp-libvips-darwin-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", + "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", + "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", "cpu": [ "arm64" ], @@ -114,9 +144,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", + "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", "cpu": [ "x64" ], @@ -130,9 +160,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", + "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", "cpu": [ "arm" ], @@ -146,9 +176,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", + "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", "cpu": [ "arm64" ], @@ -161,10 +191,42 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", + "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", + "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.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", + "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", + "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.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", + "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", "cpu": [ "s390x" ], @@ -178,9 +240,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", + "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", "cpu": [ "x64" ], @@ -194,9 +256,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", + "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", "cpu": [ "arm64" ], @@ -210,9 +272,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", + "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", "cpu": [ "x64" ], @@ -226,9 +288,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", + "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", "cpu": [ "arm" ], @@ -238,19 +300,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "@img/sharp-libvips-linux-arm": "1.3.2" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", + "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", "cpu": [ "arm64" ], @@ -260,19 +322,63 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", + "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.2" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", + "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "@img/sharp-libvips-linux-riscv64": "1.3.2" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", + "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", "cpu": [ "s390x" ], @@ -282,19 +388,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" + "@img/sharp-libvips-linux-s390x": "1.3.2" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", + "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", "cpu": [ "x64" ], @@ -304,19 +410,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", + "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", "cpu": [ "arm64" ], @@ -326,19 +432,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", + "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", "cpu": [ "x64" ], @@ -348,38 +454,73 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "1.3.2" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", + "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", "cpu": [ "wasm32" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "license": "Apache-2.0", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@img/sharp-wasm32": "0.35.3" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", + "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", + "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", "cpu": [ "ia32" ], @@ -389,16 +530,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", + "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", "cpu": [ "x64" ], @@ -408,32 +549,12 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, "node_modules/@mongodb-js/saslprep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.1.tgz", @@ -620,12 +741,6 @@ "weakmap-polyfill": "2.0.4" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -648,50 +763,6 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/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/agent-base/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/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -712,40 +783,6 @@ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", "license": "MIT" }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -768,6 +805,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/bcp-47": { @@ -810,17 +848,17 @@ } }, "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" }, "engines": { - "node": ">= 10.0.0" + "node": ">= 18" } }, "node_modules/binary-extensions": { @@ -837,39 +875,69 @@ } }, "node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1002,15 +1070,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/cloudflare-video-element": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/cloudflare-video-element/-/cloudflare-video-element-1.3.4.tgz", @@ -1032,56 +1091,6 @@ "integrity": "sha512-eNk3TRV+xQMJ1PEj0FQGY8KD4m0GPxT487XJ+Iftm7mVa9WpPFDMWqPt+46buiP5j5Wzqe5oMIhqBcAeKfygSA==", "license": "MIT" }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -1116,6 +1125,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -1173,12 +1183,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1284,12 +1288,6 @@ "ms": "2.0.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1369,12 +1367,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1403,9 +1395,9 @@ } }, "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1430,39 +1422,39 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -1567,42 +1559,6 @@ "node": ">= 0.6" } }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", - "license": "ISC" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1636,27 +1592,6 @@ "node": ">=10" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/generic-pool": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", @@ -1703,27 +1638,6 @@ "node": ">= 0.4" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1771,16 +1685,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1838,42 +1746,6 @@ "node": ">= 0.8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/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/https-proxy-agent/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/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1908,17 +1780,6 @@ "sax": "1.2.1" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1958,12 +1819,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1997,15 +1852,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2042,12 +1888,12 @@ "license": "MIT" }, "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "license": "MIT", "dependencies": { - "jws": "^3.2.2", + "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", @@ -2070,9 +1916,9 @@ "license": "MIT" }, "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -2081,12 +1927,12 @@ } }, "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", "dependencies": { - "jwa": "^1.4.1", + "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, @@ -2183,30 +2029,6 @@ "loose-envify": "cli.js" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -2316,6 +2138,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2333,40 +2156,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -2457,9 +2246,9 @@ } }, "node_modules/mongoose": { - "version": "8.19.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.19.1.tgz", - "integrity": "sha512-oB7hGQJn4f8aebqE7mhE54EReb5cxVgpCxQCQj0K/cK3q4J3Tg08nFP6sM52nJ4Hlm8jsDnhVYpqIITZUAhckQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.24.1.tgz", + "integrity": "sha512-UpHBA0l5kHyKJQFjmBaFYQFo5sgz1DK0TRqDkOyBLYbqiIbKKhIvBpHWBXqeo0rgW4kGI1UhhAw+kTQZoj1BdA==", "license": "MIT", "dependencies": { "bson": "^6.10.4", @@ -2575,51 +2364,23 @@ } }, "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": "^18 || ^20 || >= 21" } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, "node_modules/nodemon": { @@ -2676,21 +2437,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2701,19 +2447,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2756,15 +2489,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2780,19 +2504,10 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "license": "MIT" }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/picomatch": { @@ -2931,12 +2646,13 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -2965,20 +2681,49 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "19.2.0", "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", @@ -3098,22 +2843,6 @@ "@redis/time-series": "1.1.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3154,9 +2883,9 @@ "peer": true }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3219,12 +2948,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -3232,53 +2955,63 @@ "license": "ISC" }, "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", + "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", "license": "Apache-2.0", "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "@img/sharp-darwin-arm64": "0.35.3", + "@img/sharp-darwin-x64": "0.35.3", + "@img/sharp-freebsd-wasm32": "0.35.3", + "@img/sharp-libvips-darwin-arm64": "1.3.2", + "@img/sharp-libvips-darwin-x64": "1.3.2", + "@img/sharp-libvips-linux-arm": "1.3.2", + "@img/sharp-libvips-linux-arm64": "1.3.2", + "@img/sharp-libvips-linux-ppc64": "1.3.2", + "@img/sharp-libvips-linux-riscv64": "1.3.2", + "@img/sharp-libvips-linux-s390x": "1.3.2", + "@img/sharp-libvips-linux-x64": "1.3.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", + "@img/sharp-libvips-linuxmusl-x64": "1.3.2", + "@img/sharp-linux-arm": "0.35.3", + "@img/sharp-linux-arm64": "0.35.3", + "@img/sharp-linux-ppc64": "0.35.3", + "@img/sharp-linux-riscv64": "0.35.3", + "@img/sharp-linux-s390x": "0.35.3", + "@img/sharp-linux-x64": "0.35.3", + "@img/sharp-linuxmusl-arm64": "0.35.3", + "@img/sharp-linuxmusl-x64": "0.35.3", + "@img/sharp-webcontainers-wasm32": "0.35.3", + "@img/sharp-win32-arm64": "0.35.3", + "@img/sharp-win32-ia32": "0.35.3", + "@img/sharp-win32-x64": "0.35.3" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -3290,13 +3023,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -3348,21 +3081,6 @@ "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", "license": "MIT" }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -3423,32 +3141,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/super-media-element": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/super-media-element/-/super-media-element-1.4.2.tgz", @@ -3468,35 +3160,6 @@ "node": ">=4" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/tiktok-video-element": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/tiktok-video-element/-/tiktok-video-element-0.1.1.tgz", @@ -3698,15 +3361,6 @@ "node": ">=18" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wistia-video-element": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/wistia-video-element/-/wistia-video-element-1.3.4.tgz", @@ -3716,12 +3370,6 @@ "super-media-element": "~1.4.2" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 86dfd66..d8fd82a 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,57 @@ { "name": "biphflora", "version": "3.0.0", - "description": "", + "description": "Private plant and bird catalog with community contribution workflows", "main": "index.js", "scripts": { - "start": "nodemon app", - "test": "echo \"Error: no test specified\" && exit 1", + "start": "nodemon app.js", + "test": "npm run test:backend", + "test:backend": "node --test --test-concurrency=1 test/*.test.js", + "test:frontend": "npm --prefix client test -- --watchAll=false --runInBand", + "build": "npm --prefix client run build", + "verify": "npm run test:backend && npm run test:frontend && npm run build", + "evidence:media": "node scripts/collect-media-metrics.js", + "evidence:product": "node scripts/collect-product-metrics.js", + "evidence:traffic": "node scripts/collect-traffic-metrics.js", + "media:backfill": "node scripts/backfill-media-variants.js", "format": "prettier --write ." }, "keywords": [], "author": "", - "license": "ISC", + "license": "SEE LICENSE IN LICENSE", + "engines": { + "node": ">=18.17.0" + }, "dependencies": { - "bcrypt": "^5.1.1", - "body-parser": "^1.20.3", + "bcrypt": "^6.0.0", + "body-parser": "^1.20.6", "compression": "^1.7.5", "connect-mongo": "^5.1.0", "cors": "^2.8.5", "dotenv": "^16.4.5", - "express": "^4.21.1", - "fs": "0.0.1-security", + "express": "^4.22.2", "fuse.js": "^7.0.0", - "jsonwebtoken": "^9.0.2", + "jsonwebtoken": "^9.0.3", "moment-timezone": "^0.5.46", - "mongoose": "^8.8.2", + "mongoose": "^8.24.1", "multer": "1.4.5-lts.1", "primeflex": "^3.3.1", "primeicons": "^7.0.0", "primereact": "^10.8.4", "react-player": "^3.3.3", "redis": "^4.7.0", - "sharp": "^0.33.5" + "sharp": "^0.35.3" }, "devDependencies": { "nodemon": "^3.1.10", "prettier": "^3.3.3" + }, + "overrides": { + "asn1.js": { + "bn.js": "4.12.3" + }, + "express": { + "path-to-regexp": "0.1.13" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 9d26f4b..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,2777 +0,0 @@ -lockfileVersion: "9.0" - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - .: - dependencies: - bcrypt: - specifier: ^5.1.1 - version: 5.1.1 - body-parser: - specifier: ^1.20.3 - version: 1.20.3 - compression: - specifier: ^1.7.5 - version: 1.7.5 - connect-mongo: - specifier: ^5.1.0 - version: 5.1.0(express-session@1.18.1)(mongodb@6.10.0) - cors: - specifier: ^2.8.5 - version: 2.8.5 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - express: - specifier: ^4.21.1 - version: 4.21.1 - fs: - specifier: 0.0.1-security - version: 0.0.1-security - fuse.js: - specifier: ^7.0.0 - version: 7.0.0 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - moment-timezone: - specifier: ^0.5.46 - version: 0.5.46 - mongoose: - specifier: ^8.8.2 - version: 8.8.2 - multer: - specifier: 1.4.5-lts.1 - version: 1.4.5-lts.1 - primeflex: - specifier: ^3.3.1 - version: 3.3.1 - primeicons: - specifier: ^7.0.0 - version: 7.0.0 - primereact: - specifier: ^10.8.4 - version: 10.8.4(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - redis: - specifier: ^4.7.0 - version: 4.7.0 - sharp: - specifier: ^0.33.5 - version: 0.33.5 - devDependencies: - prettier: - specifier: ^3.3.3 - version: 3.3.3 - -packages: - "@babel/runtime@7.26.0": - resolution: - { - integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==, - } - engines: { node: ">=6.9.0" } - - "@emnapi/runtime@1.3.1": - resolution: - { - integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==, - } - - "@img/sharp-darwin-arm64@0.33.5": - resolution: - { - integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [arm64] - os: [darwin] - - "@img/sharp-darwin-x64@0.33.5": - resolution: - { - integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [x64] - os: [darwin] - - "@img/sharp-libvips-darwin-arm64@1.0.4": - resolution: - { - integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, - } - cpu: [arm64] - os: [darwin] - - "@img/sharp-libvips-darwin-x64@1.0.4": - resolution: - { - integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, - } - cpu: [x64] - os: [darwin] - - "@img/sharp-libvips-linux-arm64@1.0.4": - resolution: - { - integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, - } - cpu: [arm64] - os: [linux] - libc: [glibc] - - "@img/sharp-libvips-linux-arm@1.0.5": - resolution: - { - integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, - } - cpu: [arm] - os: [linux] - libc: [glibc] - - "@img/sharp-libvips-linux-s390x@1.0.4": - resolution: - { - integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, - } - cpu: [s390x] - os: [linux] - libc: [glibc] - - "@img/sharp-libvips-linux-x64@1.0.4": - resolution: - { - integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, - } - cpu: [x64] - os: [linux] - libc: [glibc] - - "@img/sharp-libvips-linuxmusl-arm64@1.0.4": - resolution: - { - integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, - } - cpu: [arm64] - os: [linux] - libc: [musl] - - "@img/sharp-libvips-linuxmusl-x64@1.0.4": - resolution: - { - integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, - } - cpu: [x64] - os: [linux] - libc: [musl] - - "@img/sharp-linux-arm64@0.33.5": - resolution: - { - integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [arm64] - os: [linux] - libc: [glibc] - - "@img/sharp-linux-arm@0.33.5": - resolution: - { - integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [arm] - os: [linux] - libc: [glibc] - - "@img/sharp-linux-s390x@0.33.5": - resolution: - { - integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [s390x] - os: [linux] - libc: [glibc] - - "@img/sharp-linux-x64@0.33.5": - resolution: - { - integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [x64] - os: [linux] - libc: [glibc] - - "@img/sharp-linuxmusl-arm64@0.33.5": - resolution: - { - integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [arm64] - os: [linux] - libc: [musl] - - "@img/sharp-linuxmusl-x64@0.33.5": - resolution: - { - integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [x64] - os: [linux] - libc: [musl] - - "@img/sharp-wasm32@0.33.5": - resolution: - { - integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [wasm32] - - "@img/sharp-win32-ia32@0.33.5": - resolution: - { - integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [ia32] - os: [win32] - - "@img/sharp-win32-x64@0.33.5": - resolution: - { - integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [x64] - os: [win32] - - "@mapbox/node-pre-gyp@1.0.11": - resolution: - { - integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==, - } - hasBin: true - - "@mongodb-js/saslprep@1.1.9": - resolution: - { - integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==, - } - - "@redis/bloom@1.2.0": - resolution: - { - integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==, - } - peerDependencies: - "@redis/client": ^1.0.0 - - "@redis/client@1.6.0": - resolution: - { - integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==, - } - engines: { node: ">=14" } - - "@redis/graph@1.1.1": - resolution: - { - integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==, - } - peerDependencies: - "@redis/client": ^1.0.0 - - "@redis/json@1.0.7": - resolution: - { - integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==, - } - peerDependencies: - "@redis/client": ^1.0.0 - - "@redis/search@1.2.0": - resolution: - { - integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==, - } - peerDependencies: - "@redis/client": ^1.0.0 - - "@redis/time-series@1.1.0": - resolution: - { - integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==, - } - peerDependencies: - "@redis/client": ^1.0.0 - - "@types/prop-types@15.7.13": - resolution: - { - integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==, - } - - "@types/react-transition-group@4.4.11": - resolution: - { - integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==, - } - - "@types/react@18.3.12": - resolution: - { - integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==, - } - - "@types/webidl-conversions@7.0.3": - resolution: - { - integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==, - } - - "@types/whatwg-url@11.0.5": - resolution: - { - integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==, - } - - abbrev@1.1.1: - resolution: - { - integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, - } - - accepts@1.3.8: - resolution: - { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, - } - engines: { node: ">= 0.6" } - - agent-base@6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - } - engines: { node: ">= 6.0.0" } - - ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - append-field@1.0.0: - resolution: - { - integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==, - } - - aproba@2.0.0: - resolution: - { - integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, - } - - are-we-there-yet@2.0.0: - resolution: - { - integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==, - } - engines: { node: ">=10" } - deprecated: This package is no longer supported. - - array-flatten@1.1.1: - resolution: - { - integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, - } - - asn1.js@5.4.1: - resolution: - { - integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==, - } - - balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - bcrypt@5.1.1: - resolution: - { - integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==, - } - engines: { node: ">= 10.0.0" } - - bn.js@4.12.1: - resolution: - { - integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==, - } - - body-parser@1.20.3: - resolution: - { - integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - - brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - - bson@6.10.0: - resolution: - { - integrity: sha512-ROchNosXMJD2cbQGm84KoP7vOGPO6/bOAW0veMMbzhXLqoZptcaYRVLitwvuhwhjjpU1qP4YZRWLhgETdgqUQw==, - } - engines: { node: ">=16.20.1" } - - buffer-equal-constant-time@1.0.1: - resolution: - { - integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, - } - - buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - - busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: ">=10.16.0" } - - bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: ">= 0.8" } - - call-bind@1.0.7: - resolution: - { - integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, - } - engines: { node: ">= 0.4" } - - chownr@2.0.0: - resolution: - { - integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, - } - engines: { node: ">=10" } - - cluster-key-slot@1.1.2: - resolution: - { - integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, - } - engines: { node: ">=0.10.0" } - - color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - - color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - color-string@1.9.1: - resolution: - { - integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, - } - - color-support@1.1.3: - resolution: - { - integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, - } - hasBin: true - - color@4.2.3: - resolution: - { - integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, - } - engines: { node: ">=12.5.0" } - - compressible@2.0.18: - resolution: - { - integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, - } - engines: { node: ">= 0.6" } - - compression@1.7.5: - resolution: - { - integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==, - } - engines: { node: ">= 0.8.0" } - - concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - concat-stream@1.6.2: - resolution: - { - integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, - } - engines: { "0": node >= 0.8 } - - connect-mongo@5.1.0: - resolution: - { - integrity: sha512-xT0vxQLqyqoUTxPLzlP9a/u+vir0zNkhiy9uAdHjSCcUUf7TS5b55Icw8lVyYFxfemP3Mf9gdwUOgeF3cxCAhw==, - } - engines: { node: ">=12.9.0" } - peerDependencies: - express-session: ^1.17.1 - mongodb: ">= 5.1.0 < 7" - - console-control-strings@1.1.0: - resolution: - { - integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, - } - - content-disposition@0.5.4: - resolution: - { - integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, - } - engines: { node: ">= 0.6" } - - content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } - - cookie-signature@1.0.6: - resolution: - { - integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, - } - - cookie-signature@1.0.7: - resolution: - { - integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==, - } - - cookie@0.7.1: - resolution: - { - integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==, - } - engines: { node: ">= 0.6" } - - cookie@0.7.2: - resolution: - { - integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, - } - engines: { node: ">= 0.6" } - - core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } - - cors@2.8.5: - resolution: - { - integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, - } - engines: { node: ">= 0.10" } - - csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } - - debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: - { - integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - - define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: ">= 0.4" } - - delegates@1.0.0: - resolution: - { - integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==, - } - - depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: ">= 0.8" } - - destroy@1.2.0: - resolution: - { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - - detect-libc@2.0.3: - resolution: - { - integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, - } - engines: { node: ">=8" } - - dom-helpers@5.2.1: - resolution: - { - integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==, - } - - dotenv@16.4.5: - resolution: - { - integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==, - } - engines: { node: ">=12" } - - ecdsa-sig-formatter@1.0.11: - resolution: - { - integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, - } - - ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } - - emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - - encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: ">= 0.8" } - - encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: ">= 0.8" } - - es-define-property@1.0.0: - resolution: - { - integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, - } - engines: { node: ">= 0.4" } - - es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: ">= 0.4" } - - escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } - - etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: ">= 0.6" } - - express-session@1.18.1: - resolution: - { - integrity: sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==, - } - engines: { node: ">= 0.8.0" } - - express@4.21.1: - resolution: - { - integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==, - } - engines: { node: ">= 0.10.0" } - - finalhandler@1.3.1: - resolution: - { - integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==, - } - engines: { node: ">= 0.8" } - - forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: ">= 0.6" } - - fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: ">= 0.6" } - - fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: ">= 8" } - - fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - fs@0.0.1-security: - resolution: - { - integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==, - } - - function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } - - fuse.js@7.0.0: - resolution: - { - integrity: sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==, - } - engines: { node: ">=10" } - - gauge@3.0.2: - resolution: - { - integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==, - } - engines: { node: ">=10" } - deprecated: This package is no longer supported. - - generic-pool@3.9.0: - resolution: - { - integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==, - } - engines: { node: ">= 4" } - - get-intrinsic@1.2.4: - resolution: - { - integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, - } - engines: { node: ">= 0.4" } - - glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - deprecated: Glob versions prior to v9 are no longer supported - - gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } - - has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } - - has-proto@1.0.3: - resolution: - { - integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, - } - engines: { node: ">= 0.4" } - - has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: ">= 0.4" } - - has-unicode@2.0.1: - resolution: - { - integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, - } - - hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } - - http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: ">= 0.8" } - - https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: ">= 6" } - - iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: ">=0.10.0" } - - inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: ">= 0.10" } - - is-arrayish@0.3.2: - resolution: - { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, - } - - is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: ">=8" } - - isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } - - js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - - jsonwebtoken@9.0.2: - resolution: - { - integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==, - } - engines: { node: ">=12", npm: ">=6" } - - jwa@1.4.1: - resolution: - { - integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==, - } - - jws@3.2.2: - resolution: - { - integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==, - } - - kareem@2.6.3: - resolution: - { - integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==, - } - engines: { node: ">=12.0.0" } - - kruptein@3.0.7: - resolution: - { - integrity: sha512-vTftnEjfbqFHLqxDUMQCj6gBo5lKqjV4f0JsM8rk8rM3xmvFZ2eSy4YALdaye7E+cDKnEj7eAjFR3vwh8a4PgQ==, - } - engines: { node: ">8" } - - lodash.includes@4.3.0: - resolution: - { - integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, - } - - lodash.isboolean@3.0.3: - resolution: - { - integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, - } - - lodash.isinteger@4.0.4: - resolution: - { - integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, - } - - lodash.isnumber@3.0.3: - resolution: - { - integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, - } - - lodash.isplainobject@4.0.6: - resolution: - { - integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, - } - - lodash.isstring@4.0.1: - resolution: - { - integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, - } - - lodash.once@4.1.1: - resolution: - { - integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, - } - - loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } - hasBin: true - - make-dir@3.1.0: - resolution: - { - integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, - } - engines: { node: ">=8" } - - media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: ">= 0.6" } - - memory-pager@1.5.0: - resolution: - { - integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==, - } - - merge-descriptors@1.0.3: - resolution: - { - integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, - } - - methods@1.1.2: - resolution: - { - integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, - } - engines: { node: ">= 0.6" } - - mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - - mime-db@1.53.0: - resolution: - { - integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==, - } - engines: { node: ">= 0.6" } - - mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - - mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: ">=4" } - hasBin: true - - minimalistic-assert@1.0.1: - resolution: - { - integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, - } - - minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - - minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - - minipass@3.3.6: - resolution: - { - integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, - } - engines: { node: ">=8" } - - minipass@5.0.0: - resolution: - { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, - } - engines: { node: ">=8" } - - minizlib@2.1.2: - resolution: - { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, - } - engines: { node: ">= 8" } - - mkdirp@0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - } - hasBin: true - - mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: ">=10" } - hasBin: true - - moment-timezone@0.5.46: - resolution: - { - integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==, - } - - moment@2.30.1: - resolution: - { - integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==, - } - - mongodb-connection-string-url@3.0.1: - resolution: - { - integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==, - } - - mongodb@6.10.0: - resolution: - { - integrity: sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==, - } - engines: { node: ">=16.20.1" } - peerDependencies: - "@aws-sdk/credential-providers": ^3.188.0 - "@mongodb-js/zstd": ^1.1.0 - gcp-metadata: ^5.2.0 - kerberos: ^2.0.1 - mongodb-client-encryption: ">=6.0.0 <7" - snappy: ^7.2.2 - socks: ^2.7.1 - peerDependenciesMeta: - "@aws-sdk/credential-providers": - optional: true - "@mongodb-js/zstd": - optional: true - gcp-metadata: - optional: true - kerberos: - optional: true - mongodb-client-encryption: - optional: true - snappy: - optional: true - socks: - optional: true - - mongoose@8.8.2: - resolution: - { - integrity: sha512-jCTSqDANfRzk909v4YoZQi7jlGRB2MTvgG+spVBc/BA4tOs1oWJr//V6yYujqNq9UybpOtsSfBqxI0dSOEFJHQ==, - } - engines: { node: ">=16.20.1" } - - mpath@0.9.0: - resolution: - { - integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==, - } - engines: { node: ">=4.0.0" } - - mquery@5.0.0: - resolution: - { - integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==, - } - engines: { node: ">=14.0.0" } - - ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } - - ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } - - multer@1.4.5-lts.1: - resolution: - { - integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==, - } - engines: { node: ">= 6.0.0" } - - negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: ">= 0.6" } - - negotiator@0.6.4: - resolution: - { - integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, - } - engines: { node: ">= 0.6" } - - node-addon-api@5.1.0: - resolution: - { - integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==, - } - - node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - nopt@5.0.0: - resolution: - { - integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==, - } - engines: { node: ">=6" } - hasBin: true - - npmlog@5.0.1: - resolution: - { - integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==, - } - deprecated: This package is no longer supported. - - object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: ">=0.10.0" } - - object-inspect@1.13.3: - resolution: - { - integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==, - } - engines: { node: ">= 0.4" } - - on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: ">= 0.8" } - - on-headers@1.0.2: - resolution: - { - integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, - } - engines: { node: ">= 0.8" } - - once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - - parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } - - path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - path-to-regexp@0.1.10: - resolution: - { - integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==, - } - - prettier@3.3.3: - resolution: - { - integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==, - } - engines: { node: ">=14" } - hasBin: true - - primeflex@3.3.1: - resolution: - { - integrity: sha512-zaOq3YvcOYytbAmKv3zYc+0VNS9Wg5d37dfxZnveKBFPr7vEIwfV5ydrpiouTft8MVW6qNjfkaQphHSnvgQbpQ==, - } - - primeicons@7.0.0: - resolution: - { - integrity: sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==, - } - - primereact@10.8.4: - resolution: - { - integrity: sha512-jwkSzq6pOHayzEh+9dgk2M71gEZtoQakwPKVo3FUJO3eEX3SoAOchON+Xm1tGCNqtd66ca8RgOWQcpv3AQoMvg==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - "@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: - "@types/react": - optional: true - - process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } - - prop-types@15.8.1: - resolution: - { - integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, - } - - proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: ">= 0.10" } - - punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } - - qs@6.13.0: - resolution: - { - integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, - } - engines: { node: ">=0.6" } - - random-bytes@1.0.0: - resolution: - { - integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==, - } - engines: { node: ">= 0.8" } - - range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } - - raw-body@2.5.2: - resolution: - { - integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, - } - engines: { node: ">= 0.8" } - - react-dom@18.3.1: - resolution: - { - integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, - } - peerDependencies: - react: ^18.3.1 - - react-is@16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } - - react-transition-group@4.4.5: - resolution: - { - integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==, - } - peerDependencies: - react: ">=16.6.0" - react-dom: ">=16.6.0" - - react@18.3.1: - resolution: - { - integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, - } - engines: { node: ">=0.10.0" } - - readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } - - readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - - redis@4.7.0: - resolution: - { - integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==, - } - - regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } - - rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } - - safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - - safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - - scheduler@0.23.2: - resolution: - { - integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, - } - - semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } - hasBin: true - - semver@7.6.3: - resolution: - { - integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, - } - engines: { node: ">=10" } - hasBin: true - - send@0.19.0: - resolution: - { - integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, - } - engines: { node: ">= 0.8.0" } - - serve-static@1.16.2: - resolution: - { - integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, - } - engines: { node: ">= 0.8.0" } - - set-blocking@2.0.0: - resolution: - { - integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, - } - - set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: ">= 0.4" } - - setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } - - sharp@0.33.5: - resolution: - { - integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - - side-channel@1.0.6: - resolution: - { - integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, - } - engines: { node: ">= 0.4" } - - sift@17.1.3: - resolution: - { - integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==, - } - - signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - - simple-swizzle@0.2.2: - resolution: - { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, - } - - sparse-bitfield@3.0.3: - resolution: - { - integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==, - } - - statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: ">= 0.8" } - - streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: ">=10.0.0" } - - string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: ">=8" } - - string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } - - string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - - strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - - tar@6.2.1: - resolution: - { - integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==, - } - engines: { node: ">=10" } - - toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: ">=0.6" } - - tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - - tr46@4.1.1: - resolution: - { - integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==, - } - engines: { node: ">=14" } - - tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } - - type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: ">= 0.6" } - - typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } - - uid-safe@2.1.5: - resolution: - { - integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==, - } - engines: { node: ">= 0.8" } - - unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: ">= 0.8" } - - util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - - utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: ">= 0.4.0" } - - vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: ">= 0.8" } - - webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - - webidl-conversions@7.0.0: - resolution: - { - integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, - } - engines: { node: ">=12" } - - whatwg-url@13.0.0: - resolution: - { - integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==, - } - engines: { node: ">=16" } - - whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } - - wide-align@1.1.5: - resolution: - { - integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, - } - - wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: ">=0.4" } - - yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - -snapshots: - "@babel/runtime@7.26.0": - dependencies: - regenerator-runtime: 0.14.1 - - "@emnapi/runtime@1.3.1": - dependencies: - tslib: 2.8.1 - optional: true - - "@img/sharp-darwin-arm64@0.33.5": - optionalDependencies: - "@img/sharp-libvips-darwin-arm64": 1.0.4 - optional: true - - "@img/sharp-darwin-x64@0.33.5": - optionalDependencies: - "@img/sharp-libvips-darwin-x64": 1.0.4 - optional: true - - "@img/sharp-libvips-darwin-arm64@1.0.4": - optional: true - - "@img/sharp-libvips-darwin-x64@1.0.4": - optional: true - - "@img/sharp-libvips-linux-arm64@1.0.4": - optional: true - - "@img/sharp-libvips-linux-arm@1.0.5": - optional: true - - "@img/sharp-libvips-linux-s390x@1.0.4": - optional: true - - "@img/sharp-libvips-linux-x64@1.0.4": - optional: true - - "@img/sharp-libvips-linuxmusl-arm64@1.0.4": - optional: true - - "@img/sharp-libvips-linuxmusl-x64@1.0.4": - optional: true - - "@img/sharp-linux-arm64@0.33.5": - optionalDependencies: - "@img/sharp-libvips-linux-arm64": 1.0.4 - optional: true - - "@img/sharp-linux-arm@0.33.5": - optionalDependencies: - "@img/sharp-libvips-linux-arm": 1.0.5 - optional: true - - "@img/sharp-linux-s390x@0.33.5": - optionalDependencies: - "@img/sharp-libvips-linux-s390x": 1.0.4 - optional: true - - "@img/sharp-linux-x64@0.33.5": - optionalDependencies: - "@img/sharp-libvips-linux-x64": 1.0.4 - optional: true - - "@img/sharp-linuxmusl-arm64@0.33.5": - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 - optional: true - - "@img/sharp-linuxmusl-x64@0.33.5": - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64": 1.0.4 - optional: true - - "@img/sharp-wasm32@0.33.5": - dependencies: - "@emnapi/runtime": 1.3.1 - optional: true - - "@img/sharp-win32-ia32@0.33.5": - optional: true - - "@img/sharp-win32-x64@0.33.5": - optional: true - - "@mapbox/node-pre-gyp@1.0.11": - dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.6.3 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - - "@mongodb-js/saslprep@1.1.9": - dependencies: - sparse-bitfield: 3.0.3 - - "@redis/bloom@1.2.0(@redis/client@1.6.0)": - dependencies: - "@redis/client": 1.6.0 - - "@redis/client@1.6.0": - dependencies: - cluster-key-slot: 1.1.2 - generic-pool: 3.9.0 - yallist: 4.0.0 - - "@redis/graph@1.1.1(@redis/client@1.6.0)": - dependencies: - "@redis/client": 1.6.0 - - "@redis/json@1.0.7(@redis/client@1.6.0)": - dependencies: - "@redis/client": 1.6.0 - - "@redis/search@1.2.0(@redis/client@1.6.0)": - dependencies: - "@redis/client": 1.6.0 - - "@redis/time-series@1.1.0(@redis/client@1.6.0)": - dependencies: - "@redis/client": 1.6.0 - - "@types/prop-types@15.7.13": {} - - "@types/react-transition-group@4.4.11": - dependencies: - "@types/react": 18.3.12 - - "@types/react@18.3.12": - dependencies: - "@types/prop-types": 15.7.13 - csstype: 3.1.3 - - "@types/webidl-conversions@7.0.3": {} - - "@types/whatwg-url@11.0.5": - dependencies: - "@types/webidl-conversions": 7.0.3 - - abbrev@1.1.1: {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - agent-base@6.0.2: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - ansi-regex@5.0.1: {} - - append-field@1.0.0: {} - - aproba@2.0.0: {} - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - - array-flatten@1.1.1: {} - - asn1.js@5.4.1: - dependencies: - bn.js: 4.12.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - - balanced-match@1.0.2: {} - - bcrypt@5.1.1: - dependencies: - "@mapbox/node-pre-gyp": 1.0.11 - node-addon-api: 5.1.0 - transitivePeerDependencies: - - encoding - - supports-color - - bn.js@4.12.1: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - bson@6.10.0: {} - - buffer-equal-constant-time@1.0.1: {} - - buffer-from@1.1.2: {} - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - bytes@3.1.2: {} - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - chownr@2.0.0: {} - - cluster-key-slot@1.1.2: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color-support@1.1.3: {} - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - - compressible@2.0.18: - dependencies: - mime-db: 1.53.0 - - compression@1.7.5: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.0.2 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-map@0.0.1: {} - - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - connect-mongo@5.1.0(express-session@1.18.1)(mongodb@6.10.0): - dependencies: - debug: 4.3.7 - express-session: 1.18.1 - kruptein: 3.0.7 - mongodb: 6.10.0 - transitivePeerDependencies: - - supports-color - - console-control-strings@1.1.0: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.0.6: {} - - cookie-signature@1.0.7: {} - - cookie@0.7.1: {} - - cookie@0.7.2: {} - - core-util-is@1.0.3: {} - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - csstype@3.1.3: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - delegates@1.0.0: {} - - depd@2.0.0: {} - - destroy@1.2.0: {} - - detect-libc@2.0.3: {} - - dom-helpers@5.2.1: - dependencies: - "@babel/runtime": 7.26.0 - csstype: 3.1.3 - - dotenv@16.4.5: {} - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - emoji-regex@8.0.0: {} - - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - escape-html@1.0.3: {} - - etag@1.8.1: {} - - express-session@1.18.1: - dependencies: - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - on-headers: 1.0.2 - parseurl: 1.3.3 - safe-buffer: 5.2.1 - uid-safe: 2.1.5 - transitivePeerDependencies: - - supports-color - - express@4.21.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.10 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - forwarded@0.2.0: {} - - fresh@0.5.2: {} - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - function-bind@1.1.2: {} - - fuse.js@7.0.0: {} - - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - - generic-pool@3.9.0: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-unicode@2.0.1: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ipaddr.js@1.9.1: {} - - is-arrayish@0.3.2: {} - - is-fullwidth-code-point@3.0.0: {} - - isarray@1.0.0: {} - - js-tokens@4.0.0: {} - - jsonwebtoken@9.0.2: - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.6.3 - - jwa@1.4.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@3.2.2: - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - - kareem@2.6.3: {} - - kruptein@3.0.7: - dependencies: - asn1.js: 5.4.1 - - lodash.includes@4.3.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - - lodash.once@4.1.1: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - - media-typer@0.3.0: {} - - memory-pager@1.5.0: {} - - merge-descriptors@1.0.3: {} - - methods@1.1.2: {} - - mime-db@1.52.0: {} - - mime-db@1.53.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - minimalistic-assert@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mkdirp@1.0.4: {} - - moment-timezone@0.5.46: - dependencies: - moment: 2.30.1 - - moment@2.30.1: {} - - mongodb-connection-string-url@3.0.1: - dependencies: - "@types/whatwg-url": 11.0.5 - whatwg-url: 13.0.0 - - mongodb@6.10.0: - dependencies: - "@mongodb-js/saslprep": 1.1.9 - bson: 6.10.0 - mongodb-connection-string-url: 3.0.1 - - mongoose@8.8.2: - dependencies: - bson: 6.10.0 - kareem: 2.6.3 - mongodb: 6.10.0 - mpath: 0.9.0 - mquery: 5.0.0 - ms: 2.1.3 - sift: 17.1.3 - transitivePeerDependencies: - - "@aws-sdk/credential-providers" - - "@mongodb-js/zstd" - - gcp-metadata - - kerberos - - mongodb-client-encryption - - snappy - - socks - - supports-color - - mpath@0.9.0: {} - - mquery@5.0.0: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - ms@2.0.0: {} - - ms@2.1.3: {} - - multer@1.4.5-lts.1: - dependencies: - append-field: 1.0.0 - busboy: 1.6.0 - concat-stream: 1.6.2 - mkdirp: 0.5.6 - object-assign: 4.1.1 - type-is: 1.6.18 - xtend: 4.0.2 - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - node-addon-api@5.1.0: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - - object-assign@4.1.1: {} - - object-inspect@1.13.3: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.0.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - parseurl@1.3.3: {} - - path-is-absolute@1.0.1: {} - - path-to-regexp@0.1.10: {} - - prettier@3.3.3: {} - - primeflex@3.3.1: {} - - primeicons@7.0.0: {} - - primereact@10.8.4(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - "@types/react-transition-group": 4.4.11 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - optionalDependencies: - "@types/react": 18.3.12 - - process-nextick-args@2.0.1: {} - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - punycode@2.3.1: {} - - qs@6.13.0: - dependencies: - side-channel: 1.0.6 - - random-bytes@1.0.0: {} - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-is@16.13.1: {} - - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - "@babel/runtime": 7.26.0 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - redis@4.7.0: - dependencies: - "@redis/bloom": 1.2.0(@redis/client@1.6.0) - "@redis/client": 1.6.0 - "@redis/graph": 1.1.1(@redis/client@1.6.0) - "@redis/json": 1.0.7(@redis/client@1.6.0) - "@redis/search": 1.2.0(@redis/client@1.6.0) - "@redis/time-series": 1.1.0(@redis/client@1.6.0) - - regenerator-runtime@0.14.1: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - semver@6.3.1: {} - - semver@7.6.3: {} - - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - set-blocking@2.0.0: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - setprototypeof@1.2.0: {} - - sharp@0.33.5: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.6.3 - optionalDependencies: - "@img/sharp-darwin-arm64": 0.33.5 - "@img/sharp-darwin-x64": 0.33.5 - "@img/sharp-libvips-darwin-arm64": 1.0.4 - "@img/sharp-libvips-darwin-x64": 1.0.4 - "@img/sharp-libvips-linux-arm": 1.0.5 - "@img/sharp-libvips-linux-arm64": 1.0.4 - "@img/sharp-libvips-linux-s390x": 1.0.4 - "@img/sharp-libvips-linux-x64": 1.0.4 - "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 - "@img/sharp-libvips-linuxmusl-x64": 1.0.4 - "@img/sharp-linux-arm": 0.33.5 - "@img/sharp-linux-arm64": 0.33.5 - "@img/sharp-linux-s390x": 0.33.5 - "@img/sharp-linux-x64": 0.33.5 - "@img/sharp-linuxmusl-arm64": 0.33.5 - "@img/sharp-linuxmusl-x64": 0.33.5 - "@img/sharp-wasm32": 0.33.5 - "@img/sharp-win32-ia32": 0.33.5 - "@img/sharp-win32-x64": 0.33.5 - - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.3 - - sift@17.1.3: {} - - signal-exit@3.0.7: {} - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - - sparse-bitfield@3.0.3: - dependencies: - memory-pager: 1.5.0 - - statuses@2.0.1: {} - - streamsearch@1.1.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - toidentifier@1.0.1: {} - - tr46@0.0.3: {} - - tr46@4.1.1: - dependencies: - punycode: 2.3.1 - - tslib@2.8.1: - optional: true - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typedarray@0.0.6: {} - - uid-safe@2.1.5: - dependencies: - random-bytes: 1.0.0 - - unpipe@1.0.0: {} - - util-deprecate@1.0.2: {} - - utils-merge@1.0.1: {} - - vary@1.1.2: {} - - webidl-conversions@3.0.1: {} - - webidl-conversions@7.0.0: {} - - whatwg-url@13.0.0: - dependencies: - tr46: 4.1.1 - webidl-conversions: 7.0.0 - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - - wrappy@1.0.2: {} - - xtend@4.0.2: {} - - yallist@4.0.0: {} diff --git a/routes/auth.js b/routes/auth.js new file mode 100644 index 0000000..fc91037 --- /dev/null +++ b/routes/auth.js @@ -0,0 +1,151 @@ +const express = require("express"); + +function createAuthRouter({ + User, + bcrypt, + getAuthorizationToken, + jwt, + runtime, + sessionStoreUnavailable, + verifyToken, +}) { + const router = express.Router(); + + router.post("/login", verifyToken, async (req, res) => { + var passwordMatch = false; + if (req.sessionStoreUnavailable) { + return sessionStoreUnavailable(res); + } + + if (req.user) { + return res.json({ + success: true, + message: "Already logged in", + user: req.user, + token: req.token, + }); + } + + const { username, password } = req.body; + const user = await User.findOne({ username }).select("+password"); + + if (user) { + passwordMatch = await bcrypt.compare(password, user.password); + } else { + return res.json({ success: false, message: "User not found" }); + } + + if (passwordMatch) { + if (!runtime.isSessionStoreReady()) { + return sessionStoreUnavailable(res); + } + + var token = jwt.sign( + { username: user.username, admin: user.admin }, + process.env.secret, + { expiresIn: "180d" }, + ); + + try { + const redisToken = await runtime.getSessionToken(username); + let hasUsableSession = false; + + if (redisToken) { + try { + const sessionPayload = jwt.verify(redisToken, process.env.secret); + hasUsableSession = sessionPayload?.username === username; + } catch (_) { + hasUsableSession = false; + } + } + + if (hasUsableSession) { + token = redisToken; + } else { + await runtime.deleteSession(username); + await runtime.setSessionToken(username, token); + } + + return res.json({ + success: true, + message: "Login successful", + user: (({ username, admin }) => ({ username, admin }))(user), + token, + }); + } catch (_) { + console.warn("Unable to create a login session"); + return sessionStoreUnavailable(res); + } + } else { + return res.json({ + success: false, + message: "Invalid username or password", + }); + } + }); + + router.get("/refresh", verifyToken, async (req, res) => { + if (req.sessionStoreUnavailable) { + return sessionStoreUnavailable(res); + } + + if (!req.user) { + return res.json({ success: false, message: "Token not valid" }); + } + + return res.json({ + success: true, + message: "Token refreshed", + user: req.user, + }); + }); + + router.post("/logout", verifyToken, async (req, res) => { + if (!req.user) { + if ( + req.sessionStoreUnavailable || + (getAuthorizationToken(req.headers["authorization"]) && + !runtime.isSessionStoreReady()) + ) { + return sessionStoreUnavailable(res); + } + + return res.json({ success: true, message: "Logout successful" }); + } + + try { + await runtime.deleteSession(req.user.username); + } catch (_) { + console.warn("Unable to remove login session"); + return sessionStoreUnavailable(res); + } + + return res.json({ success: true, message: "Logout successful" }); + }); + + router.post("/register", async (req, res) => { + const { username } = req.body; + const password = await bcrypt.hash(req.body.password, 10); + try { + await User.create({ + username, + password: password, + admin: false, + }); + return res.json({ success: true, message: "Register successful" }); + } catch (error) { + if (error.code === 11000) { + return res.json({ success: false, message: "Username already exists" }); + } + console.warn("Unable to register user"); + return res.status(500).json({ + success: false, + message: "Unable to register user", + }); + } + }); + + return router; +} + +module.exports = { createAuthRouter }; diff --git a/routes/catalog.js b/routes/catalog.js new file mode 100644 index 0000000..c62835e --- /dev/null +++ b/routes/catalog.js @@ -0,0 +1,124 @@ +const express = require("express"); +const Post = require("../models/post"); +const BirdPost = require("../models/birdPost"); +const Pic = require("../models/pic"); +const Art = require("../models/art"); + +const router = express.Router(); +const NAME_DIRECTORY_PROJECTION = { + _id: 1, + latinName: 1, + chineseName: 1, + commonName: 1, + otherNames: 1, +}; +const NAME_DIRECTORY_MODELS = { + plant: Post, + bird: BirdPost, +}; + +function toNameDirectoryEntry(entry) { + return { + _id: entry._id, + latinName: entry.latinName, + chineseName: entry.chineseName, + commonName: entry.commonName, + otherNames: entry.otherNames, + }; +} + +router.get("/searchNames", async (req, res) => { + const posts = await Post.find({ authorization: true }); + if (!posts) { + res.json({ success: false, returnNames: [], numOfPlants: 0 }); + } + res.json({ success: true, returnNames: posts, numOfPlants: posts.length }); +}); + +router.get("/searchBirdNames", async (req, res) => { + const birdPosts = await BirdPost.find({ authorization: true }); + if (!birdPosts) { + res.json({ success: false, returnNames: [], numOfPlants: 0 }); + } + res.json({ success: true, returnNames: birdPosts, numOfPlants: birdPosts.length }); +}); + +router.get("/catalog/names", async (req, res) => { + const { type } = req.query; + + if (type !== "plant" && type !== "bird") { + return res.status(400).json({ + success: false, + message: "Type must be either plant or bird", + }); + } + + try { + const model = NAME_DIRECTORY_MODELS[type]; + const entries = await model + .find({ authorization: true }, NAME_DIRECTORY_PROJECTION) + .lean(); + + return res.json({ + success: true, + type, + names: entries.map(toNameDirectoryEntry), + }); + } catch (_) { + console.error("Unable to load name directory"); + return res.status(500).json({ + success: false, + message: "Unable to load name directory", + }); + } +}); + +router.post("/syncPlantInfo", async (req, res) => { + const resultPost = await Post.find({ + latinName: req.body.postName, + authorization: true, + }); + const photographs = await Pic.find({ + art: "photography", + plant: req.body.postName, + }); + const arts = await Art.find({ plant: req.body.postName }); + res.json({ resultPost: resultPost, photographs: photographs, arts: arts }); +}); + +router.post("/syncBirdInfo", async (req, res) => { + const resultPost = await BirdPost.find({ + latinName: req.body.postName, + authorization: true, + }); + const photographs = await Pic.find({ + art: "photography", + plant: req.body.postName, + }); + const arts = await Art.find({ plant: req.body.postName }); + res.json({ resultPost: resultPost, photographs: photographs, arts: arts }); +}); + +router.get("/numOfPlants", async (req, res) => { + const posts = await Post.find({ authorization: true }); + var numOfPlants = 0; + + posts.forEach((post) => { + numOfPlants++; + }); + + res.json({ numOfPlants }); +}); + +router.get("/numOfBirds", async (req, res) => { + const posts = await BirdPost.find({ authorization: true }); + var numOfPlants = 0; + + posts.forEach((post) => { + numOfPlants++; + }); + + res.json({ numOfPlants }); +}); + +module.exports = router; diff --git a/routes/content.js b/routes/content.js new file mode 100644 index 0000000..d9d4235 --- /dev/null +++ b/routes/content.js @@ -0,0 +1,204 @@ +const express = require("express"); + +function createContentRouter({ + Art, + BirdPost, + FeatureHome, + Pic, + Post, + creationBottom, + verifyToken, +}) { + const router = express.Router(); + + router.get("/creationDocumentary", async (req, res) => { + const allDisplays = await creationBottom.find({ auth: true }); + + res.json({ success: true, allDisplays }); + }); + + router.get("/userInfo", verifyToken, async (req, res) => { + const featureLists = await FeatureHome.find().lean(); + if (req.user) { + res.json({ + success: true, + username: req.user?.username, + admin: req.user?.admin, + featureLists, + }); + } else { + res.json({ success: false, featureLists }); + } + }); + + router.get("/userInfoGlossary", verifyToken, async (req, res) => { + const posts = await Post.find({ authorization: true }); + const letters = "abcdefghijklmnopqrstuvwxyz".split(""); + const glossary = {}; + const cnNames = {}; + + // Initialize an array for each letter + letters.forEach((letter) => { + glossary[letter] = []; + cnNames[letter] = []; + }); + + posts.forEach((post) => { + const firstLetter = post.latinName[0].toLowerCase(); + if (glossary[firstLetter]) { + glossary[firstLetter].push(post.latinName); + cnNames[firstLetter].push(post.chineseName); + } + }); + + const response = req.user + ? { + success: true, + username: req.user?.username, + admin: req.user?.admin, + glossary, + cnNames, + } + : { + success: false, + glossary, + cnNames, + }; + + res.json(response); + }); + + router.get("/userInfoGlossaryBird", verifyToken, async (req, res) => { + const posts = await BirdPost.find({ authorization: true }); + const letters = "abcdefghijklmnopqrstuvwxyz".split(""); + const glossary = {}; + const cnNames = {}; + + // Initialize an array for each letter + letters.forEach((letter) => { + glossary[letter] = []; + cnNames[letter] = []; + }); + + posts.forEach((post) => { + const firstLetter = post.latinName[0].toLowerCase(); + if (glossary[firstLetter]) { + glossary[firstLetter].push(post.latinName); + cnNames[firstLetter].push(post.chineseName); + } + }); + + const response = req.user + ? { + success: true, + username: req.user?.username, + admin: req.user?.admin, + glossary, + cnNames, + } + : { + success: false, + glossary, + cnNames, + }; + + res.json(response); + }); + + router.post("/getPics", async (req, res) => { + try { + const pics = await Pic.find({ plant: req.body.plant }); + + var springPics = []; + var summerPics = []; + var autumnPics = []; + var winterPics = []; + + if (Array.isArray(pics) && pics.length > 0) { + pics.forEach((pic) => { + if (pic.season == "spring") { + springPics.push(pic); + } else if (pic.season == "summer") { + summerPics.push(pic); + } else if (pic.season == "autumn") { + autumnPics.push(pic); + } else if (pic.season == "winter") { + winterPics.push(pic); + } + }); + } + + res.json({ + success: true, + springPics: springPics, + summerPics: summerPics, + autumnPics: autumnPics, + winterPics: winterPics, + }); + } catch (_) { + console.warn("Unable to load seasonal pictures"); + res.status(500).json({ + success: false, + message: "Unable to load seasonal pictures", + }); + } + }); + + router.get("/getDb2Pic", async (req, res) => { + const pics = await Pic.aggregate([ + { $sample: { size: 3 } }, + { $project: { path: 1, _id: 0 } }, + ]); + res.json({ success: true, pics }); + }); + + router.get("/getDb2PicBird", async (req, res) => { + const pics = await Pic.aggregate([ + { $match: {dbType: 'bird' }}, + { $sample: { size: 3 } }, + { $project: { path: 1, _id: 0} }, + ]); + res.json({ success: true, pics }); + }); + + router.get("/db2Alt", async (req, res) => { + const pic = await Pic.aggregate([ + { $sample: { size: 1 } }, + { $project: { path: 1, _id: 0 } }, + ]); + if (!pic) { + res.json({ success: false }); + } + res.json({ success: true, pic }); + }); + + router.get("/db2AltBird", async (req, res) => { + const pic = await Pic.aggregate([ + { $match: {dbType: 'bird' }}, + { $sample: { size: 1 } }, + { $project: { path: 1, _id: 0} }, + ]); + if (!pic) { + res.json({ success: false }); + } + res.json({ success: true, pic }); + }); + + router.post("/getPicsAndArts", async (req, res) => { + try { + const pics = await Pic.find({ plant: req.body.plant }); + const arts = await Art.find({ plant: req.body.plant }); + res.json({ success: true, pics, arts }); + } catch (_) { + console.warn("Unable to load media details"); + res.status(500).json({ + success: false, + message: "Unable to load media details", + }); + } + }); + + return router; +} + +module.exports = { createContentRouter }; diff --git a/routes/telemetry.js b/routes/telemetry.js new file mode 100644 index 0000000..79e5544 --- /dev/null +++ b/routes/telemetry.js @@ -0,0 +1,67 @@ +const express = require("express"); + +const ALLOWED_FIELDS = new Set([ + "catalogType", + "languageCategory", + "resultCount", + "selected", +]); +const CATALOG_TYPES = new Set(["plant", "bird"]); +const LANGUAGE_CATEGORIES = new Set([ + "cjk", + "latin_script", + "mixed_or_other", +]); + +function validateSearchEvent(body) { + if (!body || typeof body !== "object" || Array.isArray(body)) { + return false; + } + if (Object.keys(body).some((field) => !ALLOWED_FIELDS.has(field))) { + return false; + } + + return ( + CATALOG_TYPES.has(body.catalogType) && + LANGUAGE_CATEGORIES.has(body.languageCategory) && + Number.isInteger(body.resultCount) && + body.resultCount >= 0 && + body.resultCount <= 3 && + typeof body.selected === "boolean" + ); +} + +function createTelemetryRouter({ enabled = false, SearchEvent, logger = console }) { + const router = express.Router(); + + router.post("/telemetry/search", async (req, res) => { + if (!enabled) { + return res.status(204).end(); + } + if (!validateSearchEvent(req.body)) { + return res.status(400).json({ + success: false, + message: "Invalid search event", + }); + } + + try { + await SearchEvent.create({ + ...req.body, + occurredAt: new Date(), + }); + return res.status(202).json({ success: true }); + } catch (_) { + const warn = logger.warn || logger.log; + warn.call(logger, "Unable to append search event"); + return res.status(503).json({ + success: false, + message: "Search telemetry unavailable", + }); + } + }); + + return router; +} + +module.exports = { createTelemetryRouter, validateSearchEvent }; diff --git a/runtime.js b/runtime.js new file mode 100644 index 0000000..0fc8bef --- /dev/null +++ b/runtime.js @@ -0,0 +1,179 @@ +function createRuntime({ + mongoose, + redis, + env = process.env, + logger = console, +}) { + if (!mongoose || !redis) { + throw new Error("Mongoose and Redis clients are required"); + } + + const redisOptions = { pingInterval: 1000 }; + + if (env.REDIS_URL) { + redisOptions.url = env.REDIS_URL; + } + + const redisClient = redis.createClient(redisOptions); + let mongoReady = false; + let redisReady = false; + let mongoOwned = false; + let connectionPromise = null; + + const log = (level, message) => { + if (typeof logger[level] === "function") { + logger[level](message); + } + }; + + redisClient.on("ready", () => { + redisReady = true; + log("info", "Redis connection is ready"); + }); + + redisClient.on("end", () => { + redisReady = false; + log("warn", "Redis connection ended"); + }); + + redisClient.on("error", () => { + redisReady = false; + log("error", "Redis connection error"); + }); + + const getReadiness = () => { + const mongodb = + mongoReady && mongoose.connection && mongoose.connection.readyState === 1; + const redis = redisReady && redisClient.isReady; + + return { + ready: Boolean(mongodb && redis), + dependencies: { + mongodb: Boolean(mongodb), + redis: Boolean(redis), + }, + }; + }; + + const connectMongo = async () => { + if (mongoose.connection && mongoose.connection.readyState === 1) { + mongoReady = true; + return; + } + + if (!env.MONGODB_URL) { + mongoReady = false; + log("warn", "MongoDB configuration is unavailable"); + return; + } + + try { + await mongoose.connect(env.MONGODB_URL); + mongoOwned = true; + mongoReady = true; + log("info", "MongoDB connection is ready"); + } catch (_) { + mongoReady = false; + log("error", "MongoDB connection failed"); + } + }; + + const connectRedis = async () => { + if (redisClient.isReady) { + redisReady = true; + return; + } + + try { + if (!redisClient.isOpen) { + await redisClient.connect(); + } + + redisReady = redisClient.isReady; + } catch (_) { + redisReady = false; + log("error", "Redis connection failed"); + } + }; + + const connect = async () => { + if (!connectionPromise) { + connectionPromise = Promise.all([connectMongo(), connectRedis()]).finally( + () => { + connectionPromise = null; + }, + ); + } + + await connectionPromise; + return getReadiness(); + }; + + const getSessionToken = async (username) => { + if (!redisClient.isReady) { + return null; + } + + return redisClient.get(username); + }; + + const setSessionToken = async (username, token) => { + if (!redisClient.isReady) { + throw new Error("Redis session store is unavailable"); + } + + await redisClient.set(username, token); + }; + + const deleteSession = async (username) => { + if (!redisClient.isReady) { + throw new Error("Redis session store is unavailable"); + } + + await redisClient.del(username); + return true; + }; + + const isSessionStoreReady = () => redisClient.isReady; + + const disconnect = async () => { + const tasks = []; + + if (redisClient.isOpen) { + tasks.push( + redisClient.quit().catch(() => { + log("error", "Redis shutdown failed"); + }), + ); + } + + if ( + mongoOwned && + mongoose.connection && + mongoose.connection.readyState !== 0 + ) { + tasks.push( + mongoose.disconnect().catch(() => { + log("error", "MongoDB shutdown failed"); + }), + ); + } + + await Promise.all(tasks); + mongoReady = false; + redisReady = false; + }; + + return { + redisClient, + connect, + deleteSession, + disconnect, + getSessionToken, + getReadiness, + setSessionToken, + isSessionStoreReady, + }; +} + +module.exports = { createRuntime }; diff --git a/scripts/backfill-media-variants.js b/scripts/backfill-media-variants.js new file mode 100644 index 0000000..025ccae --- /dev/null +++ b/scripts/backfill-media-variants.js @@ -0,0 +1,243 @@ +#!/usr/bin/env node + +const fs = require("node:fs/promises"); +const path = require("node:path"); +const sharp = require("sharp"); +const { + PUBLIC_DIRECTORY, + VARIANT_QUALITY, + VARIANT_WIDTHS, + generateImageVariants, + getVariantFilePath, +} = require("../services/imageVariants"); + +const IMAGE_EXTENSIONS = new Set([".jpeg", ".jpg", ".png", ".webp"]); +const DEFAULT_CONCURRENCY = 2; +const MAX_CONCURRENCY = 4; + +async function listFiles(directory) { + let entries; + try { + entries = await fs.readdir(directory, { withFileTypes: true }); + } catch (error) { + if (error.code === "ENOENT") { + return []; + } + throw error; + } + + const files = []; + for (const entry of entries) { + const entryPath = path.join(directory, entry.name); + if (entry.isDirectory()) { + files.push(...(await listFiles(entryPath))); + } else if (entry.isFile()) { + files.push(entryPath); + } + } + return files; +} + +async function mapWithConcurrency(items, concurrency, worker) { + const results = new Array(items.length); + let nextIndex = 0; + const workerCount = Math.min(items.length, concurrency); + + await Promise.all( + Array.from({ length: workerCount }, async () => { + while (nextIndex < items.length) { + const currentIndex = nextIndex; + nextIndex += 1; + results[currentIndex] = await worker(items[currentIndex]); + } + }), + ); + + return results; +} + +async function isReadableImage(filePath) { + try { + const metadata = await sharp(filePath, { failOn: "error" }).metadata(); + return Boolean(metadata.width && metadata.height && metadata.format); + } catch (_) { + return false; + } +} + +async function fileExists(filePath) { + return fs + .stat(filePath) + .then((stat) => stat.isFile()) + .catch((error) => { + if (error.code === "ENOENT") { + return false; + } + throw error; + }); +} + +function normalizeConcurrency(concurrency) { + const parsed = Number(concurrency); + if (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_CONCURRENCY) { + throw new RangeError( + `Concurrency must be an integer from 1 to ${MAX_CONCURRENCY}`, + ); + } + return parsed; +} + +async function inspectForBackfill(inputFilePath, publicDirectory) { + const relativePath = path + .relative(publicDirectory, inputFilePath) + .split(path.sep) + .join("/"); + const mediaPath = `/${relativePath}`; + + if (!(await isReadableImage(inputFilePath))) { + return { readable: false, existing: 0, missing: 0 }; + } + + let existing = 0; + for (const width of VARIANT_WIDTHS) { + if ( + await fileExists(getVariantFilePath(mediaPath, width, publicDirectory)) + ) { + existing += 1; + } + } + + return { + readable: true, + existing, + missing: VARIANT_WIDTHS.length - existing, + }; +} + +async function runBackfill({ + publicDirectory = PUBLIC_DIRECTORY, + dryRun = true, + concurrency = DEFAULT_CONCURRENCY, +} = {}) { + const safeConcurrency = normalizeConcurrency(concurrency); + const plantMediaDirectory = path.join(publicDirectory, "plantspic"); + const allFiles = await listFiles(plantMediaDirectory); + const candidateFiles = allFiles.filter((filePath) => + IMAGE_EXTENSIONS.has(path.extname(filePath).toLowerCase()), + ); + const inspections = await mapWithConcurrency( + candidateFiles, + safeConcurrency, + (filePath) => inspectForBackfill(filePath, publicDirectory), + ); + const readableFiles = candidateFiles.filter( + (_, index) => inspections[index].readable, + ); + let createdVariantCount = 0; + let failedVariantCount = 0; + let raceExistingVariantCount = 0; + + if (!dryRun) { + const generationResults = await mapWithConcurrency( + readableFiles, + safeConcurrency, + (filePath) => generateImageVariants(filePath, { publicDirectory }), + ); + + for (const fileResults of generationResults) { + for (const result of fileResults) { + if (result.status === "created") { + createdVariantCount += 1; + } else if (result.status === "failed") { + failedVariantCount += 1; + } else if (result.status === "existing") { + raceExistingVariantCount += 1; + } + } + } + } + + const existingVariantCount = inspections.reduce( + (total, inspection) => total + inspection.existing, + 0, + ); + const plannedVariantCount = inspections.reduce( + (total, inspection) => total + inspection.missing, + 0, + ); + + return { + metricVersion: 1, + collectedOn: new Date().toISOString(), + mode: dryRun ? "dry-run" : "write-new-variants", + source: "public/plantspic", + widths: [...VARIANT_WIDTHS], + outputFormat: "webp", + quality: VARIANT_QUALITY, + concurrency: safeConcurrency, + originalFileCount: allFiles.length, + eligibleExtensionCount: candidateFiles.length, + eligibleImageCount: readableFiles.length, + unreadableCandidateCount: candidateFiles.length - readableFiles.length, + existingVariantCount, + plannedVariantCount, + createdVariantCount, + failedVariantCount, + raceOrPreviouslyExistingCount: raceExistingVariantCount, + guarantees: { + originalFilesModified: false, + existingVariantsOverwritten: false, + defaultModeWritesFiles: false, + }, + limitations: [ + "Counts cover regular JPEG, PNG, and WebP files currently present under public/plantspic.", + "Dry-run counts candidates and existing outputs but does not estimate encoded byte size.", + ], + }; +} + +function parseArguments(argumentsList) { + const options = { dryRun: true, concurrency: DEFAULT_CONCURRENCY }; + + for (let index = 0; index < argumentsList.length; index += 1) { + const argument = argumentsList[index]; + if (argument === "--write") { + options.dryRun = false; + } else if (argument === "--dry-run") { + options.dryRun = true; + } else if (argument === "--public-root") { + options.publicDirectory = argumentsList[index + 1]; + index += 1; + } else if (argument === "--concurrency") { + options.concurrency = argumentsList[index + 1]; + index += 1; + } else { + throw new Error("Unsupported argument"); + } + } + + return options; +} + +if (require.main === module) { + runBackfill(parseArguments(process.argv.slice(2))) + .then((result) => + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`), + ) + .catch(() => { + process.stderr.write( + "Media variant backfill failed; no source paths were reported.\n", + ); + process.exitCode = 1; + }); +} + +module.exports = { + DEFAULT_CONCURRENCY, + IMAGE_EXTENSIONS, + MAX_CONCURRENCY, + listFiles, + mapWithConcurrency, + parseArguments, + runBackfill, +}; diff --git a/scripts/collect-media-metrics.js b/scripts/collect-media-metrics.js new file mode 100644 index 0000000..a9d16fd --- /dev/null +++ b/scripts/collect-media-metrics.js @@ -0,0 +1,317 @@ +#!/usr/bin/env node + +const fs = require("node:fs/promises"); +const path = require("node:path"); +const sharp = require("sharp"); +const { + PUBLIC_DIRECTORY, + VARIANT_VERSION, + VARIANT_WIDTHS, + getVariantFilePath, +} = require("../services/imageVariants"); +const { + DEFAULT_CONCURRENCY, + MAX_CONCURRENCY, + listFiles, + mapWithConcurrency, +} = require("./backfill-media-variants"); + +function round(value, digits = 2) { + if (!Number.isFinite(value)) { + return null; + } + const multiplier = 10 ** digits; + return Math.round(value * multiplier) / multiplier; +} + +function median(values) { + if (values.length === 0) { + return null; + } + const sorted = [...values].sort((left, right) => left - right); + const middle = Math.floor(sorted.length / 2); + return sorted.length % 2 === 0 + ? (sorted[middle - 1] + sorted[middle]) / 2 + : sorted[middle]; +} + +async function inspectFile(filePath, relativePath) { + const stat = await fs.stat(filePath); + try { + const metadata = await sharp(filePath, { failOn: "error" }).metadata(); + return { + relativePath, + bytes: stat.size, + format: metadata.format || "unknown", + width: metadata.width || null, + height: metadata.height || null, + readable: Boolean(metadata.width && metadata.height && metadata.format), + }; + } catch (_) { + return { + relativePath, + bytes: stat.size, + format: "unreadable", + width: null, + height: null, + readable: false, + }; + } +} + +async function inspectDirectory(directory, concurrency) { + const files = await listFiles(directory); + return mapWithConcurrency(files, concurrency, (filePath) => + inspectFile( + filePath, + path.relative(directory, filePath).split(path.sep).join("/"), + ), + ); +} + +function countBy(records, selector) { + return Object.fromEntries( + [ + ...records.reduce((counts, record) => { + const key = selector(record); + counts.set(key, (counts.get(key) || 0) + 1); + return counts; + }, new Map()), + ].sort(([left], [right]) => left.localeCompare(right)), + ); +} + +function summarizeRecords(records) { + const readable = records.filter((record) => record.readable); + const bytes = records.map((record) => record.bytes); + const widths = readable.map((record) => record.width); + const heights = readable.map((record) => record.height); + const totalBytes = bytes.reduce((total, value) => total + value, 0); + + return { + fileCount: records.length, + readableImageCount: readable.length, + unreadableFileCount: records.length - readable.length, + totalBytes, + averageBytes: records.length ? round(totalBytes / records.length) : null, + medianBytes: round(median(bytes)), + formats: countBy(records, (record) => record.format), + dimensions: { + averageWidth: readable.length + ? round( + widths.reduce((total, value) => total + value, 0) / readable.length, + ) + : null, + averageHeight: readable.length + ? round( + heights.reduce((total, value) => total + value, 0) / + readable.length, + ) + : null, + medianWidth: round(median(widths)), + medianHeight: round(median(heights)), + minimumWidth: widths.length ? Math.min(...widths) : null, + maximumWidth: widths.length ? Math.max(...widths) : null, + minimumHeight: heights.length ? Math.min(...heights) : null, + maximumHeight: heights.length ? Math.max(...heights) : null, + }, + }; +} + +function summarizePairs( + originalRecords, + derivativeRecords, + derivativeKey, + originalKeyFromDerivative = (record) => record.relativePath, +) { + const derivativeMap = new Map( + derivativeRecords.map((record) => [record.relativePath, record]), + ); + const originalKeys = new Set( + originalRecords.map((record) => record.relativePath), + ); + const pairs = originalRecords + .map((original) => [original, derivativeMap.get(derivativeKey(original))]) + .filter( + ([original, derivative]) => + original.readable && derivative && derivative.readable, + ); + const originalBytes = pairs.reduce( + (total, [original]) => total + original.bytes, + 0, + ); + const derivativeBytes = pairs.reduce( + (total, [, derivative]) => total + derivative.bytes, + 0, + ); + const savingsBytes = originalBytes - derivativeBytes; + + return { + exactFilenamePairCount: pairs.length, + coveragePercent: originalRecords.length + ? round((pairs.length / originalRecords.length) * 100) + : null, + unpairedOriginalCount: originalRecords.length - pairs.length, + orphanDerivativeCount: derivativeRecords.filter( + (record) => !originalKeys.has(originalKeyFromDerivative(record)), + ).length, + pairedOriginalBytes: originalBytes, + pairedDerivativeBytes: derivativeBytes, + savingsBytes, + sizeReductionPercent: originalBytes + ? round((savingsBytes / originalBytes) * 100) + : null, + derivativeToOriginalRatio: originalBytes + ? round(derivativeBytes / originalBytes, 4) + : null, + }; +} + +function normalizeConcurrency(concurrency) { + const parsed = Number(concurrency); + if (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_CONCURRENCY) { + throw new RangeError( + `Concurrency must be an integer from 1 to ${MAX_CONCURRENCY}`, + ); + } + return parsed; +} + +async function collectMediaMetrics({ + publicDirectory = PUBLIC_DIRECTORY, + concurrency = DEFAULT_CONCURRENCY, +} = {}) { + const safeConcurrency = normalizeConcurrency(concurrency); + const originalDirectory = path.join(publicDirectory, "plantspic"); + const compressedDirectory = path.join( + publicDirectory, + "compressed", + "plantspic", + ); + const originalRecords = await inspectDirectory( + originalDirectory, + safeConcurrency, + ); + const compressedRecords = await inspectDirectory( + compressedDirectory, + safeConcurrency, + ); + const variantMetrics = {}; + let totalVariantBytes = 0; + + for (const width of VARIANT_WIDTHS) { + const variantDirectory = path.dirname( + getVariantFilePath("/plantspic/placeholder.jpg", width, publicDirectory), + ); + const variantRecords = await inspectDirectory( + variantDirectory, + safeConcurrency, + ); + const summary = summarizeRecords(variantRecords); + totalVariantBytes += summary.totalBytes; + variantMetrics[String(width)] = { + ...summary, + pairing: summarizePairs( + originalRecords, + variantRecords, + (record) => `${record.relativePath}.webp`, + (record) => + record.relativePath.endsWith(".webp") + ? record.relativePath.slice(0, -".webp".length) + : record.relativePath, + ), + }; + } + + const originalSummary = summarizeRecords(originalRecords); + const compressedSummary = summarizeRecords(compressedRecords); + + return { + metricVersion: 1, + collectedOn: new Date().toISOString(), + source: "server media filesystem (aggregate only)", + scope: { + originals: "public/plantspic", + compressed: "public/compressed/plantspic", + variants: `public/variants/${VARIANT_VERSION}/{width}/plantspic`, + recursive: true, + symbolicLinksFollowed: false, + }, + originals: originalSummary, + compressed: { + ...compressedSummary, + pairing: summarizePairs( + originalRecords, + compressedRecords, + (record) => record.relativePath, + ), + }, + variants: variantMetrics, + storage: { + originalBytes: originalSummary.totalBytes, + compressedBytes: compressedSummary.totalBytes, + variantBytes: totalVariantBytes, + measuredTotalBytes: + originalSummary.totalBytes + + compressedSummary.totalBytes + + totalVariantBytes, + }, + definitions: { + pair: "An original and derivative whose relative filenames match exactly; WebP variants add only the .webp suffix.", + sizeReductionPercent: + "100 * (sum paired original bytes - sum paired derivative bytes) / sum paired original bytes.", + coveragePercent: + "100 * readable exact pairs / all regular files in the original directory.", + }, + privacy: { + filenamesIncluded: false, + databaseRecordsIncluded: false, + accountDataIncluded: false, + }, + limitations: [ + "Filesystem files can include uploads, archives, and derivatives; file count is not a unique-photo count.", + "Pairing is filesystem-based and does not establish that a database record references each file.", + "Compression percentages use only readable exact-name pairs and can be negative when a derivative is larger.", + ], + }; +} + +function parseArguments(argumentsList) { + const options = { concurrency: DEFAULT_CONCURRENCY }; + for (let index = 0; index < argumentsList.length; index += 1) { + const argument = argumentsList[index]; + if (argument === "--public-root") { + options.publicDirectory = argumentsList[index + 1]; + index += 1; + } else if (argument === "--concurrency") { + options.concurrency = argumentsList[index + 1]; + index += 1; + } else { + throw new Error("Unsupported argument"); + } + } + return options; +} + +if (require.main === module) { + collectMediaMetrics(parseArguments(process.argv.slice(2))) + .then((metrics) => + process.stdout.write(`${JSON.stringify(metrics, null, 2)}\n`), + ) + .catch(() => { + process.stderr.write( + "Media metric collection failed; no source paths were reported.\n", + ); + process.exitCode = 1; + }); +} + +module.exports = { + collectMediaMetrics, + inspectDirectory, + median, + parseArguments, + round, + summarizePairs, + summarizeRecords, +}; diff --git a/scripts/collect-product-metrics.js b/scripts/collect-product-metrics.js new file mode 100644 index 0000000..10ce02e --- /dev/null +++ b/scripts/collect-product-metrics.js @@ -0,0 +1,751 @@ +#!/usr/bin/env node + +const EXPECTED_COLLECTIONS = Object.freeze({ + plants: "posts", + birds: "birdposts", + pictures: "pics", + birdPictures: "birdpics", + artworks: "arts", + creations: "creationbottoms", + users: "users", + plantEditRequests: "edittextrequests", + birdEditRequests: "birdedittextrequests", + auditEvents: "audit_events", + searchEvents: "search_events", + activities: "activities", +}); + +const KNOWN_AUDIT_ACTIONS = new Set([ + "catalog.create_requested", + "catalog.edit_requested", + "catalog.reviewed", + "catalog.edit_reviewed", + "catalog.deleted", + "creation.uploaded", + "creation.reviewed", + "media.uploaded", + "media.deleted", + "user.role_changed", + "user.deleted", + "feature.changed", +]); +const CATALOG_TYPES = new Set(["plant", "bird"]); +const LANGUAGE_CATEGORIES = new Set(["cjk", "latin_script", "mixed_or_other"]); + +function successfulAuditMatchStage() { + return { + $match: { + action: { $in: [...KNOWN_AUDIT_ACTIONS] }, + status: { $gte: 200, $lt: 400 }, + }, + }; +} + +function numberOrZero(value) { + return Number.isFinite(Number(value)) ? Number(value) : 0; +} + +function authorizationPipeline(field) { + return [ + { + $group: { + _id: null, + total: { $sum: 1 }, + approved: { $sum: { $cond: [{ $eq: [`$${field}`, true] }, 1, 0] } }, + pending: { $sum: { $cond: [{ $eq: [`$${field}`, false] }, 1, 0] } }, + unspecified: { + $sum: { + $cond: [ + { $in: [{ $type: `$${field}` }, ["missing", "null"]] }, + 1, + 0, + ], + }, + }, + }, + }, + { $project: { _id: 0, total: 1, approved: 1, pending: 1, unspecified: 1 } }, + ]; +} + +function objectIdMonthPipeline() { + return [ + { $match: { _id: { $type: "objectId" } } }, + { + $group: { + _id: { + $dateToString: { + format: "%Y-%m", + date: { $toDate: "$_id" }, + timezone: "UTC", + }, + }, + count: { $sum: 1 }, + }, + }, + { $sort: { _id: 1 } }, + { $project: { _id: 0, month: "$_id", count: 1 } }, + ]; +} + +function sanitizeMonthRows(rows) { + return (Array.isArray(rows) ? rows : []) + .filter((row) => /^\d{4}-(?:0[1-9]|1[0-2])$/.test(row.month)) + .map((row) => ({ month: row.month, count: numberOrZero(row.count) })) + .sort((left, right) => left.month.localeCompare(right.month)); +} + +function sanitizeAuditRows(rows) { + const actions = {}; + for (const row of Array.isArray(rows) ? rows : []) { + const key = KNOWN_AUDIT_ACTIONS.has(row.action) + ? row.action + : "other_known_only_by_count"; + actions[key] = (actions[key] || 0) + numberOrZero(row.count); + } + return actions; +} + +function sanitizeSearchRows(rows) { + const summary = { + total: 0, + successfulResultEvents: 0, + zeroResultEvents: 0, + selectedEvents: 0, + byCatalogType: { plant: 0, bird: 0, unknown: 0 }, + byLanguageCategory: { + cjk: 0, + latin_script: 0, + mixed_or_other: 0, + unknown: 0, + }, + }; + for (const row of Array.isArray(rows) ? rows : []) { + const count = numberOrZero(row.count); + summary.total += count; + const catalog = CATALOG_TYPES.has(row.catalogType) + ? row.catalogType + : "unknown"; + const language = LANGUAGE_CATEGORIES.has(row.languageCategory) + ? row.languageCategory + : "unknown"; + summary.byCatalogType[catalog] += count; + summary.byLanguageCategory[language] += count; + if (numberOrZero(row.resultCount) > 0) + summary.successfulResultEvents += count; + else summary.zeroResultEvents += count; + if (row.selected === true) summary.selectedEvents += count; + } + summary.successfulResultRate = summary.total + ? Number((summary.successfulResultEvents / summary.total).toFixed(4)) + : null; + summary.zeroResultRate = summary.total + ? Number((summary.zeroResultEvents / summary.total).toFixed(4)) + : null; + summary.selectionEventRate = summary.total + ? Number((summary.selectedEvents / summary.total).toFixed(4)) + : null; + return summary; +} + +async function aggregateRows(db, collection, pipeline) { + return db + .collection(collection) + .aggregate(pipeline, { allowDiskUse: false, maxTimeMS: 120_000 }) + .toArray(); +} + +async function collectionNames(db) { + const rows = await db.listCollections({}, { nameOnly: true }).toArray(); + return new Set(rows.map((row) => row.name)); +} + +async function authorizationSummary(db, available, collection, field) { + if (!available.has(collection)) { + return { + available: false, + total: 0, + approved: 0, + pending: 0, + unspecified: 0, + }; + } + const [row = {}] = await aggregateRows( + db, + collection, + authorizationPipeline(field), + ); + return { + available: true, + total: numberOrZero(row.total), + approved: numberOrZero(row.approved), + pending: numberOrZero(row.pending), + unspecified: numberOrZero(row.unspecified), + }; +} + +async function currentCount(db, available, collection) { + if (!available.has(collection)) return { available: false, count: 0 }; + return { + available: true, + count: await db + .collection(collection) + .countDocuments({}, { maxTimeMS: 120_000 }), + }; +} + +async function objectIdCohort(db, available, collection) { + if (!available.has(collection)) return []; + return sanitizeMonthRows( + await aggregateRows(db, collection, objectIdMonthPipeline()), + ); +} + +function attributionSource(collection, fields) { + return { + collection, + pipeline: [ + { $project: { labels: fields.map((field) => `$${field}`) } }, + { $unwind: "$labels" }, + { + $project: { + label: { $trim: { input: { $ifNull: ["$labels", ""] } } }, + }, + }, + { $match: { label: { $ne: "" } } }, + ], + }; +} + +function availableAttributionSources(available) { + return [ + attributionSource(EXPECTED_COLLECTIONS.plants, ["editor", "username"]), + attributionSource(EXPECTED_COLLECTIONS.birds, ["editor", "username"]), + attributionSource(EXPECTED_COLLECTIONS.pictures, ["takenBy"]), + attributionSource(EXPECTED_COLLECTIONS.birdPictures, ["takenBy"]), + attributionSource(EXPECTED_COLLECTIONS.artworks, ["artist"]), + attributionSource(EXPECTED_COLLECTIONS.creations, [ + "creator", + "photographer", + "artist", + ]), + attributionSource(EXPECTED_COLLECTIONS.plantEditRequests, [ + "editor", + "username", + ]), + attributionSource(EXPECTED_COLLECTIONS.birdEditRequests, [ + "editor", + "username", + ]), + ].filter((source) => available.has(source.collection)); +} + +function attributionUnionPipeline(sources) { + const [first, ...rest] = sources; + return [ + ...first.pipeline, + ...rest.map((source) => ({ + $unionWith: { coll: source.collection, pipeline: source.pipeline }, + })), + { $group: { _id: "$label" } }, + ]; +} + +async function attributionSummary(db, available) { + const sources = availableAttributionSources(available); + if (sources.length === 0) { + return { + available: false, + distinctCurrentAttributionLabels: 0, + labelsMatchingCurrentAccounts: 0, + }; + } + const union = attributionUnionPipeline(sources); + const [distinctRow = {}] = await aggregateRows(db, sources[0].collection, [ + ...union, + { $count: "count" }, + ]); + let labelsMatchingCurrentAccounts = 0; + if (available.has(EXPECTED_COLLECTIONS.users)) { + const [matchRow = {}] = await aggregateRows(db, sources[0].collection, [ + ...union, + { + $lookup: { + from: EXPECTED_COLLECTIONS.users, + localField: "_id", + foreignField: "username", + as: "accountMatches", + }, + }, + { $match: { "accountMatches.0": { $exists: true } } }, + { $count: "count" }, + ]); + labelsMatchingCurrentAccounts = numberOrZero(matchRow.count); + } + return { + available: true, + distinctCurrentAttributionLabels: numberOrZero(distinctRow.count), + labelsMatchingCurrentAccounts, + }; +} + +async function auditSummary(db, available) { + const collection = EXPECTED_COLLECTIONS.auditEvents; + if (!available.has(collection)) { + return { + available: false, + totalSuccessfulEvents: 0, + byAction: {}, + distinctActorSignatures: 0, + monthlyEvents: [], + monthlyActiveActorSignatures: [], + observedTimeRange: null, + }; + } + + const [actionRows, coverageRows, actorRows, monthlyRows, monthlyActorRows] = + await Promise.all([ + aggregateRows(db, collection, [ + successfulAuditMatchStage(), + { $group: { _id: "$action", count: { $sum: 1 } } }, + { $project: { _id: 0, action: "$_id", count: 1 } }, + ]), + aggregateRows(db, collection, [ + successfulAuditMatchStage(), + { + $group: { + _id: null, + count: { $sum: 1 }, + first: { $min: "$occurredAt" }, + last: { $max: "$occurredAt" }, + }, + }, + { $project: { _id: 0, count: 1, first: 1, last: 1 } }, + ]), + aggregateRows(db, collection, [ + successfulAuditMatchStage(), + { $match: { actorSignature: { $type: "string", $ne: "" } } }, + { $group: { _id: "$actorSignature" } }, + { $count: "count" }, + ]), + aggregateRows(db, collection, [ + successfulAuditMatchStage(), + { + $group: { + _id: { + $dateToString: { + format: "%Y-%m", + date: "$occurredAt", + timezone: "UTC", + }, + }, + count: { $sum: 1 }, + }, + }, + { $sort: { _id: 1 } }, + { $project: { _id: 0, month: "$_id", count: 1 } }, + ]), + aggregateRows(db, collection, [ + successfulAuditMatchStage(), + { $match: { actorSignature: { $type: "string", $ne: "" } } }, + { + $group: { + _id: { + month: { + $dateToString: { + format: "%Y-%m", + date: "$occurredAt", + timezone: "UTC", + }, + }, + actor: "$actorSignature", + }, + }, + }, + { $group: { _id: "$_id.month", count: { $sum: 1 } } }, + { $sort: { _id: 1 } }, + { $project: { _id: 0, month: "$_id", count: 1 } }, + ]), + ]); + const [coverage = {}] = coverageRows; + const [actors = {}] = actorRows; + return { + available: true, + totalSuccessfulEvents: numberOrZero(coverage.count), + byAction: sanitizeAuditRows(actionRows), + distinctActorSignatures: numberOrZero(actors.count), + monthlyEvents: sanitizeMonthRows(monthlyRows), + monthlyActiveActorSignatures: sanitizeMonthRows(monthlyActorRows), + observedTimeRange: + coverage.first && coverage.last + ? { + start: new Date(coverage.first).toISOString(), + end: new Date(coverage.last).toISOString(), + } + : null, + }; +} + +async function searchSummary(db, available) { + const collection = EXPECTED_COLLECTIONS.searchEvents; + if (!available.has(collection)) { + return { + available: false, + observedTimeRange: null, + monthlyEvents: [], + ...sanitizeSearchRows([]), + }; + } + const [groupRows, coverageRows, monthlyRows] = await Promise.all([ + aggregateRows(db, collection, [ + { + $group: { + _id: { + catalogType: "$catalogType", + languageCategory: "$languageCategory", + resultCount: "$resultCount", + selected: "$selected", + }, + count: { $sum: 1 }, + }, + }, + { + $project: { + _id: 0, + catalogType: "$_id.catalogType", + languageCategory: "$_id.languageCategory", + resultCount: "$_id.resultCount", + selected: "$_id.selected", + count: 1, + }, + }, + ]), + aggregateRows(db, collection, [ + { + $group: { + _id: null, + first: { $min: "$occurredAt" }, + last: { $max: "$occurredAt" }, + }, + }, + { $project: { _id: 0, first: 1, last: 1 } }, + ]), + aggregateRows(db, collection, [ + { + $group: { + _id: { + $dateToString: { + format: "%Y-%m", + date: "$occurredAt", + timezone: "UTC", + }, + }, + count: { $sum: 1 }, + }, + }, + { $sort: { _id: 1 } }, + { $project: { _id: 0, month: "$_id", count: 1 } }, + ]), + ]); + const summary = sanitizeSearchRows(groupRows); + const [coverage = {}] = coverageRows; + return { + available: true, + ...summary, + monthlyEvents: sanitizeMonthRows(monthlyRows), + observedTimeRange: + coverage.first && coverage.last + ? { + start: new Date(coverage.first).toISOString(), + end: new Date(coverage.last).toISOString(), + } + : null, + }; +} + +async function collectMongoSnapshot(db) { + const available = await collectionNames(db); + const [ + plants, + birds, + creations, + activities, + pictures, + birdPictures, + artworks, + registeredAccounts, + plantEditRequests, + birdEditRequests, + audits, + searches, + attribution, + ] = await Promise.all([ + authorizationSummary( + db, + available, + EXPECTED_COLLECTIONS.plants, + "authorization", + ), + authorizationSummary( + db, + available, + EXPECTED_COLLECTIONS.birds, + "authorization", + ), + authorizationSummary(db, available, EXPECTED_COLLECTIONS.creations, "auth"), + authorizationSummary( + db, + available, + EXPECTED_COLLECTIONS.activities, + "auth", + ), + currentCount(db, available, EXPECTED_COLLECTIONS.pictures), + currentCount(db, available, EXPECTED_COLLECTIONS.birdPictures), + currentCount(db, available, EXPECTED_COLLECTIONS.artworks), + currentCount(db, available, EXPECTED_COLLECTIONS.users), + currentCount(db, available, EXPECTED_COLLECTIONS.plantEditRequests), + currentCount(db, available, EXPECTED_COLLECTIONS.birdEditRequests), + auditSummary(db, available), + searchSummary(db, available), + attributionSummary(db, available), + ]); + + const cohortCollections = { + plants: EXPECTED_COLLECTIONS.plants, + birds: EXPECTED_COLLECTIONS.birds, + pictures: EXPECTED_COLLECTIONS.pictures, + birdPictures: EXPECTED_COLLECTIONS.birdPictures, + artworks: EXPECTED_COLLECTIONS.artworks, + creations: EXPECTED_COLLECTIONS.creations, + plantEditRequests: EXPECTED_COLLECTIONS.plantEditRequests, + birdEditRequests: EXPECTED_COLLECTIONS.birdEditRequests, + }; + const cohortEntries = await Promise.all( + Object.entries(cohortCollections).map(async ([label, collection]) => [ + label, + await objectIdCohort(db, available, collection), + ]), + ); + + return { + current: { + plants, + birds, + creations, + activities, + pictures, + birdPictures, + artworks, + registeredAccounts, + plantEditRequests, + birdEditRequests, + }, + actualOperations: { audits, searches }, + attribution, + currentDocumentObjectIdMonthProxy: Object.fromEntries(cohortEntries), + }; +} + +function evidenceRecord({ + metric, + exactDefinition, + value, + source, + query, + collectedOn, + confidence, + limitations, + timeWindow = "point-in-time", +}) { + return { + metric, + exactDefinition, + value, + timeWindow, + source, + queryCalculation: query, + botInternalTrafficFiltering: "not applicable", + collectedOn, + confidence, + limitations, + }; +} + +function formatProductMetrics( + snapshot, + collectedOn = new Date().toISOString(), +) { + const current = snapshot.current || {}; + const audits = snapshot.actualOperations?.audits || {}; + const searches = snapshot.actualOperations?.searches || {}; + const attribution = snapshot.attribution || {}; + return { + schemaVersion: 1, + collectedOn, + privacy: { + rawIdentifiersEmitted: false, + credentialsEmitted: false, + accountOrAttributionLabelsEmitted: false, + aggregateOnly: true, + }, + ...snapshot, + evidenceRecords: [ + evidenceRecord({ + metric: "current plant records", + exactDefinition: + "Current MongoDB plant documents split by authorization state.", + value: current.plants || { available: false }, + source: "MongoDB posts collection", + query: "Read-only group by authorization boolean.", + collectedOn, + confidence: current.plants?.available + ? "direct current count" + : "unavailable", + limitations: + "Excludes deleted records and is not a historical creation total.", + }), + evidenceRecord({ + metric: "current image/work documents", + exactDefinition: + "Current Pic, BirdPic, and Art MongoDB document counts.", + value: { + pictures: current.pictures?.count || 0, + birdPictures: current.birdPictures?.count || 0, + artworks: current.artworks?.count || 0, + }, + source: "MongoDB media collections", + query: "Read-only countDocuments.", + collectedOn, + confidence: "direct for available collections", + limitations: + "Documents are not proven unique physical image files or uploads.", + }), + evidenceRecord({ + metric: "registered accounts", + exactDefinition: "Current user documents, not active users.", + value: current.registeredAccounts?.count || 0, + source: "MongoDB users collection", + query: "Read-only countDocuments without selecting account fields.", + collectedOn, + confidence: current.registeredAccounts?.available + ? "direct current count" + : "unavailable", + limitations: + "Must not be described as active users or verified people.", + }), + evidenceRecord({ + metric: "successful audited product operations", + exactDefinition: + "Append-only successful audit events recorded while audit telemetry was enabled.", + value: audits.totalSuccessfulEvents || 0, + source: "MongoDB audit_events collection", + query: "Read-only aggregate by allow-listed action and month.", + collectedOn, + confidence: audits.available + ? "direct within telemetry coverage" + : "unavailable", + limitations: + "Does not recover operations before telemetry, failed operations, or actions outside the audit route matrix.", + timeWindow: audits.observedTimeRange || "no retained events", + }), + evidenceRecord({ + metric: "search telemetry events", + exactDefinition: + "Aggregate search events recorded while optional privacy-preserving telemetry was enabled.", + value: searches.total || 0, + source: "MongoDB search_events collection", + query: + "Read-only aggregate by fixed catalog/language/result/selection categories.", + collectedOn, + confidence: searches.available + ? "direct within telemetry coverage" + : "unavailable", + limitations: + "Does not recover earlier searches; an event is not necessarily a distinct person or session.", + timeWindow: searches.observedTimeRange || "no retained events", + }), + evidenceRecord({ + metric: "distinct current attribution labels", + exactDefinition: + "Distinct non-empty editor/username/photographer/artist labels attached to current documents.", + value: attribution.distinctCurrentAttributionLabels || 0, + source: "MongoDB current content collections", + query: + "Server-side union/group/count; labels never leave MongoDB and are not emitted.", + collectedOn, + confidence: attribution.available + ? "direct label count" + : "unavailable", + limitations: + "Labels can alias, duplicate, or describe credits rather than people; not verified contributors or active users.", + }), + ], + unavailable: { + historicalDeletedRecords: + "Current collections and ObjectId cohorts cannot recover deleted documents.", + verifiedContributors: + "Attribution labels, actor signatures, and accounts are not identity verification.", + organizationUsage: + "Requires consented qualitative or organization-level evidence.", + preTelemetrySearchEditUploadTotals: + "No verified historical append-only event source was found.", + }, + limitations: [ + "ObjectId month cohorts describe creation time of currently retained documents only.", + "Registered accounts are not active users.", + "Audit actor signatures are pseudonymous account signatures, not verified people.", + "Empty telemetry collections prove zero retained events, not zero historical use.", + "No document values, usernames, attribution labels, credentials, or connection strings are emitted.", + ], + }; +} + +async function collectProductMetrics({ + db, + snapshotProvider = collectMongoSnapshot, + now = () => new Date(), +}) { + if (!db) throw new TypeError("A MongoDB database handle is required"); + const snapshot = await snapshotProvider(db); + return formatProductMetrics(snapshot, now().toISOString()); +} + +async function main() { + require("dotenv").config(); + if (!process.env.MONGODB_URL) { + throw new Error("MONGODB_URL is not configured"); + } + const mongoose = require("mongoose"); + const connection = mongoose.createConnection(process.env.MONGODB_URL, { + maxPoolSize: 2, + readPreference: "primaryPreferred", + serverSelectionTimeoutMS: 15_000, + }); + try { + await connection.asPromise(); + const result = await collectProductMetrics({ db: connection.db }); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); + } finally { + await connection.close().catch(() => {}); + } +} + +if (require.main === module) { + main().catch(() => { + process.stderr.write( + "Product metric collection failed; credentials and database errors were not emitted.\n", + ); + process.exitCode = 1; + }); +} + +module.exports = { + EXPECTED_COLLECTIONS, + collectMongoSnapshot, + collectProductMetrics, + formatProductMetrics, + sanitizeAuditRows, + sanitizeMonthRows, + sanitizeSearchRows, + successfulAuditMatchStage, +}; diff --git a/scripts/collect-traffic-metrics.js b/scripts/collect-traffic-metrics.js new file mode 100644 index 0000000..5d407ff --- /dev/null +++ b/scripts/collect-traffic-metrics.js @@ -0,0 +1,1169 @@ +#!/usr/bin/env node + +const crypto = require("node:crypto"); +const fs = require("node:fs"); +const readline = require("node:readline"); +const zlib = require("node:zlib"); + +const MONTHS = new Map([ + ["Jan", 0], + ["Feb", 1], + ["Mar", 2], + ["Apr", 3], + ["May", 4], + ["Jun", 5], + ["Jul", 6], + ["Aug", 7], + ["Sep", 8], + ["Oct", 9], + ["Nov", 10], + ["Dec", 11], +]); + +const STATIC_EXTENSION = + /\.(?:avif|bmp|css|eot|gif|ico|jpe?g|js|mjs|map|mp3|mp4|ogg|otf|pdf|png|svg|ttf|webm|webp|woff2?|xml)(?:$|\/)/i; +const BOT_USER_AGENT = + /(?:bot\b|crawler|spider|slurp|bingpreview|facebookexternalhit|headlesschrome|lighthouse|pagespeed|pingdom|uptimerobot|semrush|ahrefs|mj12bot|bytespider|yandex|baiduspider|sogou|petalbot|applebot|duckduckbot)/i; +const AUTOMATION_USER_AGENT = + /(?:^|\s)(?:curl|wget|httpie|postmanruntime|python-requests|python-urllib|go-http-client|java\/|libwww-perl|axios\/|node-fetch\/)/i; +const SCANNER_PATH = + /(?:^|\/)(?:\.env|\.git|wp-admin|wp-login|xmlrpc\.php|phpmyadmin|adminer|vendor\/phpunit|cgi-bin|actuator|server-status|boaform|HNAP1|solr|jenkins|console\/)(?:\/|$)|(?:etc\/passwd|proc\/self\/environ)/i; +const ADMIN_PATH = + /(?:^|\/)(?:admin[^/]*|new(?:bird)?postauth|newcreationauth|handle(?:bird)?editdecision|makefeatured|featuretohome|makepicfeatured|uploadfeature(?:art)?single|unfeature(?:home|creation)|editpagedelete(?:plant)?)(?:\/|$)/i; +const HEALTH_PATH = + /(?:^|\/)(?:health|healthz|ready|readiness|live|liveness)(?:\/|$)/i; +const ALLOWED_METHODS = new Set([ + "GET", + "HEAD", + "POST", + "PUT", + "PATCH", + "DELETE", +]); + +const PRODUCT_EVENT_ENDPOINTS = new Map([ + ["POST /api/uploadplant", "catalog_submission_response"], + ["POST /api/uploadbird", "catalog_submission_response"], + ["POST /api/uploadpic", "media_upload_response"], + ["POST /api/uploadbirdpic", "media_upload_response"], + ["POST /api/uploadart", "media_upload_response"], + ["POST /api/uploadcreation", "creation_upload_response"], + ["POST /api/updatetext", "edit_submission_response"], + ["POST /api/birdupdatetext", "edit_submission_response"], + ["POST /api/newpostauth", "catalog_review_response"], + ["POST /api/newbirdpostauth", "catalog_review_response"], + ["POST /api/newcreationauth", "creation_review_response"], + ["PUT /api/handleeditdecision", "edit_review_response"], + ["PUT /api/handlebirdeditdecision", "edit_review_response"], + ["POST /api/editpagedelete", "media_delete_response"], + ["DELETE /api/editpagedeleteplant", "catalog_delete_response"], + ["POST /api/admintoggle", "role_change_response"], + ["POST /api/admindeleteuser", "account_delete_response"], + ["POST /api/syncplantinfo", "plant_detail_api_response"], + ["POST /api/syncbirdinfo", "bird_detail_api_response"], + ["GET /api/searchnames", "plant_index_api_response"], + ["GET /api/searchbirdnames", "bird_index_api_response"], + ["GET /api/catalog/names", "catalog_index_api_response"], +]); + +const DEFAULTS = Object.freeze({ + burstThreshold: 120, + duplicateSeconds: 2, + maxActiveSignatures: 250_000, + maxMinuteSignatures: 50_000, + reorderHours: 24, + sessionMinutes: 30, + siteHost: "biphflora.com", + knownRoutesOnly: false, +}); + +function increment(target, key, amount = 1) { + target[key] = (target[key] || 0) + amount; +} + +function parseTimestamp(value) { + const match = value.match( + /^(\d{2})\/([A-Z][a-z]{2})\/(\d{4}):(\d{2}):(\d{2}):(\d{2}) ([+-])(\d{2})(\d{2})$/, + ); + if (!match || !MONTHS.has(match[2])) { + return undefined; + } + + const offsetMinutes = + (Number(match[8]) * 60 + Number(match[9])) * (match[7] === "+" ? 1 : -1); + const localUtc = Date.UTC( + Number(match[3]), + MONTHS.get(match[2]), + Number(match[1]), + Number(match[4]), + Number(match[5]), + Number(match[6]), + ); + const timestamp = localUtc - offsetMinutes * 60_000; + return Number.isFinite(timestamp) ? timestamp : undefined; +} + +function parseNginxLine(line) { + const match = line.match( + /^(\S+)\s+\S+\s+\S+\s+\[([^\]]+)\]\s+"([A-Z]+)\s+([^\s"]+)(?:\s+[^\"]*)?"\s+(\d{3})\s+(?:\d+|-)\s+"([^\"]*)"\s+"([^\"]*)"/, + ); + if (!match) { + return undefined; + } + + const timestamp = parseTimestamp(match[2]); + if (timestamp === undefined) { + return undefined; + } + + return { + ip: match[1], + timestamp, + method: match[3], + target: match[4], + status: Number(match[5]), + referrer: match[6], + userAgent: match[7], + }; +} + +function normalizedPath(target) { + try { + const parsed = new URL(target, "http://local.invalid"); + const decoded = decodeURIComponent(parsed.pathname); + return (decoded.replace(/\/{2,}/g, "/") || "/").slice(0, 1024); + } catch (_) { + return undefined; + } +} + +function isPrivateAddress(ip) { + if (ip === "::1" || ip.startsWith("127.")) { + return true; + } + if (/^10\./.test(ip) || /^192\.168\./.test(ip)) { + return true; + } + const private172 = ip.match(/^172\.(\d+)\./); + if ( + private172 && + Number(private172[1]) >= 16 && + Number(private172[1]) <= 31 + ) { + return true; + } + return /^(?:fc|fd)[0-9a-f]{2}:/i.test(ip) || /^fe[89ab][0-9a-f]:/i.test(ip); +} + +function normalizeUserAgent(userAgent) { + return userAgent + .toLowerCase() + .replace(/(\d+)(?:\.\d+){1,}/g, "$1") + .replace(/\s+/g, " ") + .trim() + .slice(0, 512); +} + +function signatureFor(entry, secret) { + return crypto + .createHmac("sha256", secret) + .update(entry.ip) + .update("\0") + .update(normalizeUserAgent(entry.userAgent)) + .digest(); +} + +function classifyDevice(userAgent) { + if (/(?:ipad|tablet|kindle|silk)/i.test(userAgent)) { + return "tablet"; + } + if (/(?:mobile|iphone|ipod|android)/i.test(userAgent)) { + return "mobile"; + } + return "desktop_or_other"; +} + +function classifySource(referrer, siteHost) { + if (!referrer || referrer === "-") { + return "direct_or_unattributed"; + } + try { + const hostname = new URL(referrer).hostname.toLowerCase(); + if (hostname === siteHost || hostname.endsWith(`.${siteHost}`)) { + return "self_referral"; + } + if ( + /(?:^|\.)(?:google|bing|baidu|yahoo|duckduckgo|sogou|so)\.[a-z.]+$/.test( + hostname, + ) + ) { + return "search"; + } + if ( + /(?:^|\.)(?:facebook|instagram|linkedin|reddit|tiktok|twitter|x|wechat|weibo|youtube)\.[a-z.]+$/.test( + hostname, + ) + ) { + return "social"; + } + return "external_referral"; + } catch (_) { + return "invalid_or_unattributed"; + } +} + +function classifyRoute(pathname) { + const path = pathname.toLowerCase().replace(/\/+$/, "") || "/"; + const apiPath = path.startsWith("/api/") ? path.slice(4) : path; + + if (path === "/" || path === "/home" || path === "/index.html") return "home"; + if (path === "/databaseplant" || path === "/glossary") return "plant_catalog"; + if (path === "/databasebird" || path === "/glossarybird") + return "bird_catalog"; + if (path === "/search" || path.startsWith("/search/")) + return "plant_detail_or_search"; + if (path.startsWith("/searchbird/")) return "bird_detail_or_search"; + if (path === "/creation" || path.startsWith("/video/")) + return "creative_content"; + if (path === "/aboutus") return "about"; + if (path === "/activities") return "activities"; + if (["/upload", "/editpage", "/birdeditpage"].includes(path)) + return "contribution_ui"; + + if (path.startsWith("/api/")) { + if (/(?:searchnames|searchbirdnames|catalog\/names)/.test(apiPath)) + return "search_api"; + if ( + /(?:syncplantinfo|syncbirdinfo|numofplants|numofbirds|getpics|getdb2pic|db2alt|creationdocumentary)/.test( + apiPath, + ) + ) { + return "catalog_api"; + } + if (/(?:login|logout|refresh|register|userinfo)/.test(apiPath)) + return "auth_api"; + if (/(?:upload|updatetext|edit|decision|feature)/.test(apiPath)) + return "contribution_api"; + if (apiPath.startsWith("/telemetry/")) return "telemetry_api"; + return "other_api"; + } + + return "other_public"; +} + +function classifyProductEvent(entry, pathname, excludedAddresses) { + const category = PRODUCT_EVENT_ENDPOINTS.get( + `${entry.method} ${pathname.toLowerCase()}`, + ); + if ( + !category || + entry.status < 200 || + entry.status >= 300 || + isPrivateAddress(entry.ip) || + excludedAddresses.has(entry.ip) || + !entry.userAgent || + entry.userAgent === "-" || + BOT_USER_AGENT.test(entry.userAgent) || + AUTOMATION_USER_AGENT.test(entry.userAgent) + ) { + return undefined; + } + return category; +} + +function filterEntry(entry, excludedAddresses = new Set()) { + const pathname = normalizedPath(entry.target); + if (!pathname) return { reason: "invalid_target" }; + if (!ALLOWED_METHODS.has(entry.method)) + return { reason: "non_user_flow_method" }; + if (isPrivateAddress(entry.ip) || excludedAddresses.has(entry.ip)) { + return { reason: "known_internal_address" }; + } + if (!entry.userAgent || entry.userAgent === "-") + return { reason: "missing_user_agent" }; + if (BOT_USER_AGENT.test(entry.userAgent)) return { reason: "recognized_bot" }; + if (AUTOMATION_USER_AGENT.test(entry.userAgent)) + return { reason: "automation_or_test_client" }; + if ( + STATIC_EXTENSION.test(pathname) || + pathname.startsWith("/public/") || + pathname.startsWith("/static/") + ) { + return { reason: "static_asset" }; + } + if (pathname === "/robots.txt" || pathname.startsWith("/.well-known/")) { + return { reason: "static_or_protocol_request" }; + } + if (HEALTH_PATH.test(pathname)) return { reason: "health_check" }; + if (ADMIN_PATH.test(pathname)) return { reason: "administration_route" }; + if (SCANNER_PATH.test(pathname)) return { reason: "obvious_scanner" }; + + return { pathname }; +} + +class HyperLogLog { + constructor(precision = 12) { + this.precision = precision; + this.registers = new Uint8Array(1 << precision); + } + + add(digest) { + const hash = digest.readUInt32BE(0); + const index = hash >>> (32 - this.precision); + const remainder = (hash << this.precision) >>> 0; + const rank = Math.min(Math.clz32(remainder) + 1, 32 - this.precision + 1); + this.registers[index] = Math.max(this.registers[index], rank); + } + + estimate() { + const count = this.registers.length; + const alpha = 0.7213 / (1 + 1.079 / count); + let inverseSum = 0; + let zeros = 0; + for (const register of this.registers) { + inverseSum += 2 ** -register; + if (register === 0) zeros += 1; + } + let estimate = (alpha * count * count) / inverseSum; + if (estimate <= 2.5 * count && zeros > 0) { + estimate = count * Math.log(count / zeros); + } + return Math.max(0, Math.round(estimate)); + } +} + +class MinHeap { + constructor() { + this.items = []; + } + + push(value) { + const items = this.items; + items.push(value); + let index = items.length - 1; + while (index > 0) { + const parent = Math.floor((index - 1) / 2); + if (items[parent].last <= value.last) break; + items[index] = items[parent]; + index = parent; + } + items[index] = value; + } + + peek() { + return this.items[0]; + } + + pop() { + const items = this.items; + if (items.length === 0) return undefined; + const first = items[0]; + const last = items.pop(); + if (items.length === 0) return first; + let index = 0; + while (true) { + const left = index * 2 + 1; + const right = left + 1; + if (left >= items.length) break; + const child = + right < items.length && items[right].last < items[left].last + ? right + : left; + if (items[child].last >= last.last) break; + items[index] = items[child]; + index = child; + } + items[index] = last; + return first; + } + + rebuild(states) { + this.items = []; + for (const [signature, state] of states) { + this.push({ signature, last: state.last }); + } + } +} + +class TimestampHeap { + constructor() { + this.items = []; + } + + push(value) { + const items = this.items; + items.push(value); + let index = items.length - 1; + while (index > 0) { + const parent = Math.floor((index - 1) / 2); + if (items[parent].timestamp <= value.timestamp) break; + items[index] = items[parent]; + index = parent; + } + items[index] = value; + } + + peek() { + return this.items[0]; + } + + pop() { + const items = this.items; + if (items.length === 0) return undefined; + const first = items[0]; + const last = items.pop(); + if (items.length === 0) return first; + let index = 0; + while (true) { + const left = index * 2 + 1; + const right = left + 1; + if (left >= items.length) break; + const child = + right < items.length && items[right].timestamp < items[left].timestamp + ? right + : left; + if (items[child].timestamp >= last.timestamp) break; + items[index] = items[child]; + index = child; + } + items[index] = last; + return first; + } +} + +class SessionTracker { + constructor({ gapMs, maxActiveSignatures }) { + this.gapMs = gapMs; + this.maxActiveSignatures = maxActiveSignatures; + this.active = new Map(); + this.heap = new MinHeap(); + this.sessions = 0; + this.completed = 0; + this.totalDurationMs = 0; + this.totalRequests = 0; + this.totalDocumentLoads = 0; + this.singleDocumentSessions = 0; + this.capacityEvictions = 0; + } + + finalizeState(state) { + this.completed += 1; + this.totalDurationMs += Math.max(0, state.last - state.started); + this.totalRequests += state.requests; + this.totalDocumentLoads += state.documentLoads; + if (state.documentLoads === 1) this.singleDocumentSessions += 1; + } + + evictBefore(cutoff) { + while (this.heap.peek() && this.heap.peek().last < cutoff) { + const candidate = this.heap.pop(); + const state = this.active.get(candidate.signature); + if (state && state.last === candidate.last) { + this.active.delete(candidate.signature); + this.finalizeState(state); + } + } + } + + process(signature, timestamp, documentLoad) { + let state = this.active.get(signature); + let startedNewSession = false; + if (state && timestamp - state.last > this.gapMs) { + this.active.delete(signature); + this.finalizeState(state); + state = undefined; + } + + if (!state) { + while (this.active.size >= this.maxActiveSignatures) { + const oldest = this.heap.pop(); + if (!oldest) break; + const oldestState = this.active.get(oldest.signature); + if (oldestState && oldestState.last === oldest.last) { + this.active.delete(oldest.signature); + this.finalizeState(oldestState); + this.capacityEvictions += 1; + } + } + state = { + started: timestamp, + last: timestamp, + requests: 0, + documentLoads: 0, + }; + this.active.set(signature, state); + this.sessions += 1; + startedNewSession = true; + } + + state.last = Math.max(state.last, timestamp); + state.requests += 1; + if (documentLoad) state.documentLoads += 1; + this.heap.push({ signature, last: state.last }); + if (this.heap.items.length > this.maxActiveSignatures * 8) { + this.heap.rebuild(this.active); + } + return startedNewSession; + } + + finish() { + for (const state of this.active.values()) this.finalizeState(state); + this.active.clear(); + this.heap.items = []; + } + + summary() { + const divisor = this.completed || 1; + return { + sessionCandidates: this.sessions, + averageCandidateDurationSeconds: Number( + (this.totalDurationMs / divisor / 1000).toFixed(2), + ), + averageRequestsPerSessionCandidate: Number( + (this.totalRequests / divisor).toFixed(2), + ), + averageDocumentLoadsPerSessionCandidate: Number( + (this.totalDocumentLoads / divisor).toFixed(2), + ), + singleDocumentSessionCandidates: this.singleDocumentSessions, + capacityEvictions: this.capacityEvictions, + }; + } +} + +function emptyDistribution(keys = []) { + return Object.fromEntries(keys.map((key) => [key, 0])); +} + +function createWindow(label, start, end, options) { + return { + label, + start, + end, + filteredRequests: 0, + documentLoadCandidates: 0, + signatures: new HyperLogLog(), + sessions: new SessionTracker({ + gapMs: options.sessionMinutes * 60_000, + maxActiveSignatures: options.maxActiveSignatures, + }), + sources: emptyDistribution([ + "direct_or_unattributed", + "self_referral", + "search", + "social", + "external_referral", + "invalid_or_unattributed", + ]), + devices: emptyDistribution(["desktop_or_other", "mobile", "tablet"]), + routes: {}, + statuses: emptyDistribution(["2xx", "3xx", "4xx", "5xx"]), + }; +} + +function isDocumentLoad(event) { + return ( + (event.method === "GET" || event.method === "HEAD") && + event.status >= 200 && + event.status < 300 && + !event.route.endsWith("_api") + ); +} + +function periodKey(timestamp, unit) { + const iso = new Date(timestamp).toISOString(); + if (unit === "month") return iso.slice(0, 7); + if (unit === "day") return iso.slice(0, 10); + return iso.slice(0, 13) + ":00Z"; +} + +function summarizeWindow(window) { + window.sessions.finish(); + const calendarDays = Math.max( + 1, + Math.ceil((window.end - window.start) / 86_400_000), + ); + const topRouteCategories = Object.entries(window.routes) + .sort( + (left, right) => right[1] - left[1] || left[0].localeCompare(right[0]), + ) + .slice(0, 10) + .map(([category, filteredRequests]) => ({ category, filteredRequests })); + const sessionCandidateMetrics = window.sessions.summary(); + return { + timeWindow: { + start: new Date(window.start).toISOString(), + end: new Date(window.end).toISOString(), + }, + filteredRequests: window.filteredRequests, + documentLoadCandidates: window.documentLoadCandidates, + sessionCandidateMetrics, + estimatedVisitorSignatures: { + value: window.signatures.estimate(), + method: + "HMAC-SHA-256 signature estimated with HyperLogLog (4096 registers)", + relativeStandardError: "approximately 1.63%", + }, + averageFilteredRequestsPerCalendarDay: Number( + (window.filteredRequests / calendarDays).toFixed(2), + ), + averageDocumentLoadCandidatesPerCalendarDay: Number( + (window.documentLoadCandidates / calendarDays).toFixed(2), + ), + averageSessionCandidatesPerCalendarDay: Number( + (sessionCandidateMetrics.sessionCandidates / calendarDays).toFixed(2), + ), + sourceCategories: window.sources, + deviceCategories: window.devices, + routeCategories: window.routes, + topRouteCategories, + statusClasses: window.statuses, + }; +} + +function openLogStream(file) { + const input = fs.createReadStream(file); + return file.endsWith(".gz") ? input.pipe(zlib.createGunzip()) : input; +} + +async function scanFile(file) { + const input = openLogStream(file); + const lines = readline.createInterface({ input, crlfDelay: Infinity }); + let totalLines = 0; + let parsedLines = 0; + let firstTimestamp; + let lastTimestamp; + for await (const line of lines) { + totalLines += 1; + const parsed = parseNginxLine(line); + if (!parsed) continue; + parsedLines += 1; + firstTimestamp = + firstTimestamp === undefined + ? parsed.timestamp + : Math.min(firstTimestamp, parsed.timestamp); + lastTimestamp = + lastTimestamp === undefined + ? parsed.timestamp + : Math.max(lastTimestamp, parsed.timestamp); + } + return { file, totalLines, parsedLines, firstTimestamp, lastTimestamp }; +} + +async function* parsedEntries(file) { + const lines = readline.createInterface({ + input: openLogStream(file), + crlfDelay: Infinity, + }); + for await (const line of lines) { + const entry = parseNginxLine(line); + if (entry) yield entry; + } +} + +async function forEachParsedEntry(files, callback) { + const iterators = files.map((file) => + parsedEntries(file)[Symbol.asyncIterator](), + ); + const heads = await Promise.all(iterators.map((iterator) => iterator.next())); + + while (true) { + let nextIndex = -1; + for (let index = 0; index < heads.length; index += 1) { + if (heads[index].done) continue; + if ( + nextIndex === -1 || + heads[index].value.timestamp < heads[nextIndex].value.timestamp + ) { + nextIndex = index; + } + } + if (nextIndex === -1) return; + await callback(heads[nextIndex].value); + heads[nextIndex] = await iterators[nextIndex].next(); + } +} + +function createMinuteBuffer(options, filters, accept) { + let currentMinute; + let buckets = new Map(); + const recentAcrossMinutes = new Map(); + let capacityDropped = 0; + const duplicateWindowMs = options.duplicateSeconds * 1000; + + function flush() { + if (currentMinute === undefined) return; + const acceptedEvents = []; + for (const [signatureKey, bucket] of buckets) { + if (bucket.burst) { + increment(filters, "anomalous_signature_minute_burst", bucket.total); + continue; + } + const recent = recentAcrossMinutes.get(signatureKey)?.routes || new Map(); + let latestTimestamp = -Infinity; + for (const event of bucket.events) { + const routeKey = `${event.method}\0${event.pathname}`; + const previousTimestamp = recent.get(routeKey); + if ( + previousTimestamp !== undefined && + event.timestamp >= previousTimestamp && + event.timestamp - previousTimestamp <= duplicateWindowMs + ) { + increment(filters, "rapid_duplicate_refresh"); + continue; + } + acceptedEvents.push(event); + recent.set(routeKey, event.timestamp); + latestTimestamp = Math.max(latestTimestamp, event.timestamp); + } + if (latestTimestamp > -Infinity) { + recentAcrossMinutes.set(signatureKey, { + last: latestTimestamp, + routes: recent, + }); + } + } + acceptedEvents + .sort((left, right) => left.timestamp - right.timestamp) + .forEach(accept); + if (capacityDropped > 0) { + increment(filters, "minute_buffer_capacity", capacityDropped); + } + buckets = new Map(); + capacityDropped = 0; + } + + return { + add(event) { + const minute = Math.floor(event.timestamp / 60_000) * 60_000; + if (currentMinute === undefined) currentMinute = minute; + if (minute !== currentMinute) { + flush(); + currentMinute = minute; + const cutoff = minute - duplicateWindowMs; + for (const [signatureKey, recent] of recentAcrossMinutes) { + if (recent.last < cutoff) recentAcrossMinutes.delete(signatureKey); + } + } + + let bucket = buckets.get(event.signatureKey); + if (!bucket) { + if (buckets.size >= options.maxMinuteSignatures) { + capacityDropped += 1; + return; + } + bucket = { total: 0, burst: false, events: [] }; + buckets.set(event.signatureKey, bucket); + } + bucket.total += 1; + if (bucket.total > options.burstThreshold) { + bucket.burst = true; + bucket.events = []; + } else if (!bucket.burst) { + bucket.events.push(event); + } + }, + finish: flush, + }; +} + +function createChronologicalBuffer(options, filters, accept) { + const heap = new TimestampHeap(); + const reorderWindowMs = options.reorderHours * 3_600_000; + let maxSeen = -Infinity; + let lastEmitted = -Infinity; + let peakEntries = 0; + + function emitNext() { + const event = heap.pop(); + if (event.timestamp < lastEmitted) { + increment(filters, "late_beyond_reorder_window"); + } + accept(event); + lastEmitted = Math.max(lastEmitted, event.timestamp); + } + + return { + add(event) { + maxSeen = Math.max(maxSeen, event.timestamp); + heap.push(event); + peakEntries = Math.max(peakEntries, heap.items.length); + const safeCutoff = maxSeen - reorderWindowMs; + while (heap.peek() && heap.peek().timestamp <= safeCutoff) emitNext(); + }, + finish() { + while (heap.peek()) emitNext(); + }, + summary() { + return { peakEntries }; + }, + }; +} + +function sanitizeOptions(options = {}) { + function positiveInteger(value, fallback) { + return Number.isInteger(value) && value > 0 ? value : fallback; + } + return { + ...DEFAULTS, + ...options, + burstThreshold: positiveInteger( + options.burstThreshold, + DEFAULTS.burstThreshold, + ), + duplicateSeconds: positiveInteger( + options.duplicateSeconds, + DEFAULTS.duplicateSeconds, + ), + maxActiveSignatures: positiveInteger( + options.maxActiveSignatures, + DEFAULTS.maxActiveSignatures, + ), + maxMinuteSignatures: positiveInteger( + options.maxMinuteSignatures, + DEFAULTS.maxMinuteSignatures, + ), + reorderHours: positiveInteger(options.reorderHours, DEFAULTS.reorderHours), + sessionMinutes: positiveInteger( + options.sessionMinutes, + DEFAULTS.sessionMinutes, + ), + siteHost: String(options.siteHost || DEFAULTS.siteHost).toLowerCase(), + }; +} + +async function collectTrafficMetrics({ + files, + asOf, + secret = crypto.randomBytes(32), + excludedAddresses = new Set(), + options: suppliedOptions = {}, +}) { + if (!Array.isArray(files) || files.length === 0) { + throw new TypeError("At least one log file is required"); + } + const options = sanitizeOptions(suppliedOptions); + const scans = await Promise.all(files.map(scanFile)); + const orderedScans = scans + .filter((scan) => scan.firstTimestamp !== undefined) + .sort((a, b) => a.firstTimestamp - b.firstTimestamp); + if (orderedScans.length === 0) + throw new Error("No parseable Nginx entries found"); + + const observedStart = Math.min( + ...orderedScans.map((scan) => scan.firstTimestamp), + ); + const observedEnd = Math.max( + ...orderedScans.map((scan) => scan.lastTimestamp), + ); + const effectiveEnd = asOf ? new Date(asOf).getTime() : observedEnd; + if (!Number.isFinite(effectiveEnd)) + throw new TypeError("Invalid asOf timestamp"); + + const day = 86_400_000; + const windows = [ + createWindow( + "last_30_days", + effectiveEnd - 30 * day, + effectiveEnd, + options, + ), + createWindow( + "last_90_days", + effectiveEnd - 90 * day, + effectiveEnd, + options, + ), + createWindow( + "last_365_days", + effectiveEnd - 365 * day, + effectiveEnd, + options, + ), + createWindow("all_retained_logs", observedStart, effectiveEnd, options), + ]; + const filters = {}; + const successfulProductResponses = {}; + const monthlyProductResponses = new Map(); + const monthly = new Map(); + const peakDays = new Map(); + const peakHours = new Map(); + let nonChronologicalEntries = 0; + let lastTimestamp = -Infinity; + + function accept(event) { + if (event.timestamp < lastTimestamp) nonChronologicalEntries += 1; + lastTimestamp = Math.max(lastTimestamp, event.timestamp); + const documentLoad = isDocumentLoad(event); + const month = periodKey(event.timestamp, "month"); + const dayKey = periodKey(event.timestamp, "day"); + const hourKey = periodKey(event.timestamp, "hour"); + if (!monthly.has(month)) + monthly.set(month, { + filteredRequests: 0, + documentLoadCandidates: 0, + sessionCandidatesByStartMonth: 0, + }); + const monthEntry = monthly.get(month); + monthEntry.filteredRequests += 1; + if (documentLoad) monthEntry.documentLoadCandidates += 1; + peakDays.set(dayKey, (peakDays.get(dayKey) || 0) + 1); + peakHours.set(hourKey, (peakHours.get(hourKey) || 0) + 1); + + for (const window of windows) { + if (event.timestamp < window.start || event.timestamp > window.end) + continue; + window.filteredRequests += 1; + if (documentLoad) window.documentLoadCandidates += 1; + window.signatures.add(event.signatureDigest); + window.sessions.evictBefore( + Math.floor(event.timestamp / 60_000) * 60_000 - + options.sessionMinutes * 60_000, + ); + const startedNewSession = window.sessions.process( + event.signatureKey, + event.timestamp, + documentLoad, + ); + if (window.label === "all_retained_logs" && startedNewSession) { + monthEntry.sessionCandidatesByStartMonth += 1; + } + increment(window.sources, event.source); + increment(window.devices, event.device); + increment(window.routes, event.route); + increment(window.statuses, `${Math.floor(event.status / 100)}xx`); + } + } + + const minuteBuffer = createMinuteBuffer(options, filters, accept); + const chronologicalBuffer = createChronologicalBuffer( + options, + filters, + (event) => minuteBuffer.add(event), + ); + await forEachParsedEntry( + orderedScans.map((scan) => scan.file), + async (entry) => { + if (entry.timestamp > effectiveEnd) { + increment(filters, "after_reporting_cutoff"); + return; + } + const pathname = normalizedPath(entry.target); + const productEvent = pathname + ? classifyProductEvent(entry, pathname, excludedAddresses) + : undefined; + if (productEvent) { + increment(successfulProductResponses, productEvent); + const month = periodKey(entry.timestamp, "month"); + if (!monthlyProductResponses.has(month)) { + monthlyProductResponses.set(month, {}); + } + increment(monthlyProductResponses.get(month), productEvent); + } + + const result = filterEntry(entry, excludedAddresses); + if (result.reason) { + increment(filters, result.reason); + return; + } + const route = classifyRoute(result.pathname); + if ( + options.knownRoutesOnly && + (route === "other_public" || route === "other_api") + ) { + increment(filters, "unrecognized_product_route"); + return; + } + const signatureDigest = signatureFor(entry, secret); + chronologicalBuffer.add({ + timestamp: entry.timestamp, + method: entry.method, + status: entry.status, + pathname: result.pathname, + signatureDigest, + signatureKey: signatureDigest.toString("hex"), + source: classifySource(entry.referrer, options.siteHost), + device: classifyDevice(entry.userAgent), + route, + }); + }, + ); + chronologicalBuffer.finish(); + minuteBuffer.finish(); + + const highest = (map) => { + let result = { period: null, filteredRequests: 0 }; + for (const [period, count] of map) { + if (count > result.filteredRequests) + result = { period, filteredRequests: count }; + } + return result; + }; + + const resultWindows = {}; + for (const window of windows) + resultWindows[window.label] = summarizeWindow(window); + const totalLogEntries = scans.reduce((sum, scan) => sum + scan.totalLines, 0); + const parsedEntries = scans.reduce((sum, scan) => sum + scan.parsedLines, 0); + + return { + schemaVersion: 1, + collectedOn: new Date().toISOString(), + definitions: { + filteredRequests: options.knownRoutesOnly + ? "Parsed requests to recognized product route categories remaining after fixed bot, scanner, health, static, admin, internal/test, burst, and rapid-duplicate exclusions." + : "Parsed requests remaining after fixed bot, scanner, health, static, admin, internal/test, burst, and rapid-duplicate exclusions.", + documentLoadCandidates: + "Included successful GET/HEAD requests to non-API route categories; a conservative navigation proxy, not complete SPA pageviews.", + sessionCandidates: `Included requests sharing an ephemeral HMAC IP + normalized user-agent signature, split after more than ${options.sessionMinutes} minutes of inactivity.`, + estimatedVisitorSignatures: + "Approximate distinct HMAC signatures; not verified unique visitors or people.", + chronologicalReordering: `Included events are reordered within a ${options.reorderHours}-hour bounded window before burst, duplicate, and session calculations.`, + }, + sourceSummary: { + fileCount: files.length, + totalLogEntries, + parsedEntries, + unparseableEntries: totalLogEntries - parsedEntries, + addressField: + "First field in the active Nginx combined log; proxy/client semantics must be verified from deployment configuration.", + observedTimeRange: { + start: new Date(observedStart).toISOString(), + end: new Date(observedEnd).toISOString(), + }, + }, + privacy: { + rawIdentifiersEmitted: false, + signatureSecret: "ephemeral or externally supplied; never emitted", + outputCategoriesOnly: true, + }, + filtering: { + ...filters, + nonChronologicalEntries, + burstThresholdPerSignatureMinute: options.burstThreshold, + rapidDuplicateWindowSeconds: options.duplicateSeconds, + knownRoutesOnly: options.knownRoutesOnly, + reorderWindowHours: options.reorderHours, + peakReorderBufferEntries: chronologicalBuffer.summary().peakEntries, + }, + successfulProductEndpointResponses: { + exactDefinition: + "2xx responses from fixed product endpoints after bot, automation, missing-UA, and known-internal exclusions; response counts are not people and can include repeated tests.", + total: Object.values(successfulProductResponses).reduce( + (sum, value) => sum + value, + 0, + ), + byFixedCategory: successfulProductResponses, + monthly: [...monthlyProductResponses.entries()] + .sort(([left], [right]) => left.localeCompare(right)) + .map(([month, categories]) => ({ month, categories })), + }, + windows: resultWindows, + monthlyTrend: [...monthly.entries()] + .sort(([left], [right]) => left.localeCompare(right)) + .map(([month, values]) => ({ month, ...values })), + peaks: { + highestFilteredRequestDay: highest(peakDays), + highestFilteredRequestHour: highest(peakHours), + }, + unavailable: { + verifiedUniqueVisitors: "No consented identity-backed analytics source.", + countries: "No verified GeoIP source was used.", + newVersusReturningVisitors: + "Ephemeral request signatures do not establish a stable person or consented identity.", + bounceRate: + "Nginx requests cannot observe complete client-side SPA navigation or engagement.", + uptime: + "Access-log presence is not an availability monitor and cannot establish uptime.", + }, + limitations: [ + "Results cover retained, parseable log entries only and inherit Nginx log rotation gaps.", + options.knownRoutesOnly + ? "Strict mode excludes unrecognized routes; this reduces scanner noise but can omit legitimate routes missing from the fixed classifier." + : "Broad mode retains unrecognized routes and can therefore include distributed scanners not caught by the fixed filters.", + "Direct traffic to backend/frontend ports and client-side SPA route changes may be absent.", + "IP plus normalized user-agent HMAC signatures can merge shared devices or split one person across devices and browser changes.", + "If a reverse proxy or CDN is present and Nginx has not restored the originating client address, session/signature metrics are edge-dependent and must be treated as low confidence.", + "Source and device categories are user-agent/referrer classifications, not verified demographics.", + "Each reporting window starts its own inactivity sequence, so a session crossing the window boundary can be counted as a new candidate inside that window.", + `Entries arriving more than ${options.reorderHours} hours late cannot be fully reordered; any late_beyond_reorder_window count reduces duplicate, burst, and session confidence.`, + "Any nonChronologicalEntries or capacityEvictions reduce session-candidate confidence.", + "HTTP requests, document-load candidates, session candidates, signatures, and people are distinct measures.", + ], + }; +} + +function parseArguments(argv) { + const files = []; + const options = {}; + let asOf; + let excludeIpFile; + for (let index = 0; index < argv.length; index += 1) { + const argument = argv[index]; + if (argument === "--as-of") asOf = argv[++index]; + else if (argument === "--site-host") options.siteHost = argv[++index]; + else if (argument === "--burst-threshold") + options.burstThreshold = Number(argv[++index]); + else if (argument === "--duplicate-seconds") + options.duplicateSeconds = Number(argv[++index]); + else if (argument === "--max-active-signatures") + options.maxActiveSignatures = Number(argv[++index]); + else if (argument === "--max-minute-signatures") + options.maxMinuteSignatures = Number(argv[++index]); + else if (argument === "--reorder-hours") + options.reorderHours = Number(argv[++index]); + else if (argument === "--known-routes-only") options.knownRoutesOnly = true; + else if (argument === "--exclude-ip-file") excludeIpFile = argv[++index]; + else if (argument.startsWith("--")) + throw new Error(`Unknown option: ${argument}`); + else files.push(argument); + } + return { files, asOf, excludeIpFile, options }; +} + +async function main() { + const { files, asOf, excludeIpFile, options } = parseArguments( + process.argv.slice(2), + ); + if (files.length === 0) { + throw new Error( + "Usage: node scripts/collect-traffic-metrics.js [options] ... ", + ); + } + const excludedAddresses = new Set(); + if (excludeIpFile) { + const values = fs.readFileSync(excludeIpFile, "utf8").split(/\r?\n/); + for (const value of values) + if (value.trim()) excludedAddresses.add(value.trim()); + } + const result = await collectTrafficMetrics({ + files, + asOf, + excludedAddresses, + secret: process.env.TRAFFIC_METRICS_HASH_SECRET || crypto.randomBytes(32), + options, + }); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); +} + +if (require.main === module) { + main().catch((error) => { + process.stderr.write(`${error.message}\n`); + process.exitCode = 1; + }); +} + +module.exports = { + HyperLogLog, + TimestampHeap, + classifyDevice, + classifyRoute, + classifySource, + collectTrafficMetrics, + filterEntry, + normalizeUserAgent, + normalizedPath, + parseNginxLine, + parseTimestamp, + signatureFor, +}; diff --git a/server.js b/server.js new file mode 100644 index 0000000..d13a852 --- /dev/null +++ b/server.js @@ -0,0 +1,79 @@ +const { app, drainImageVariantQueue, runtime } = require("./app"); + +function closeServer(server) { + return new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + return; + } + + resolve(); + }); + }); +} + +function startServer({ + appInstance = app, + runtimeInstance = runtime, + port = Number(process.env.PORT || 3001), + host = process.env.HOST || "0.0.0.0", + logger = console, + registerSignalHandlers = true, + drainBackgroundTasks = drainImageVariantQueue, +} = {}) { + const server = appInstance.listen(port, host, () => { + logger.info("HTTP server is listening"); + }); + let shutdownPromise = null; + + const shutdown = async (signal = "shutdown") => { + if (!shutdownPromise) { + shutdownPromise = (async () => { + logger.info("Graceful shutdown requested: " + signal); + await closeServer(server); + await drainBackgroundTasks(); + await runtimeInstance.disconnect(); + })(); + } + + return shutdownPromise; + }; + + runtimeInstance.connect().then((readiness) => { + logger.info( + readiness.ready + ? "Application dependencies are ready" + : "Application dependencies are not ready", + ); + }); + + if (registerSignalHandlers) { + const exitAfterShutdown = (signal) => { + shutdown(signal) + .then(() => { + process.exitCode = 0; + }) + .catch(() => { + process.exitCode = 1; + }); + }; + + process.once("SIGINT", () => exitAfterShutdown("SIGINT")); + process.once("SIGTERM", () => exitAfterShutdown("SIGTERM")); + process.once("uncaughtException", () => + exitAfterShutdown("uncaughtException"), + ); + process.once("unhandledRejection", () => + exitAfterShutdown("unhandledRejection"), + ); + } + + return { server, shutdown }; +} + +if (require.main === module) { + startServer(); +} + +module.exports = { startServer }; diff --git a/services/imageVariants.js b/services/imageVariants.js new file mode 100644 index 0000000..eadc13b --- /dev/null +++ b/services/imageVariants.js @@ -0,0 +1,369 @@ +const crypto = require("node:crypto"); +const fs = require("node:fs/promises"); +const path = require("node:path"); +const sharp = require("sharp"); + +const PUBLIC_DIRECTORY = path.join(__dirname, "..", "public"); +const VARIANT_VERSION = "v1"; +const VARIANT_WIDTHS = Object.freeze([480, 960, 1600]); +const VARIANT_QUALITY = 78; +const MAX_INPUT_PIXELS = 268_402_689; +const PROCESSING_TIMEOUT_SECONDS = 30; + +function createSerialTaskQueue() { + let tail = Promise.resolve(); + + return { + enqueue(task) { + if (typeof task !== "function") { + throw new TypeError("Queued image work must be a function"); + } + const result = tail.then(task, task); + tail = result.catch(() => {}); + return result; + }, + async drain() { + await tail; + }, + }; +} + +function assertSafeMediaPath(mediaPath) { + if (typeof mediaPath !== "string" || mediaPath.includes("\0")) { + throw new TypeError("Media path must be a non-empty string"); + } + + const normalized = mediaPath.replaceAll("\\", "/").replace(/^\/+/, ""); + const segments = normalized.split("/"); + + if ( + normalized.length === 0 || + segments.some( + (segment) => segment.length === 0 || segment === "." || segment === "..", + ) || + segments.length < 2 || + segments[0] !== "plantspic" + ) { + throw new Error("Media path must stay within the plant media directory"); + } + + return segments.join("/"); +} + +function assertVariantWidth(width) { + const parsedWidth = Number(width); + if (!VARIANT_WIDTHS.includes(parsedWidth)) { + throw new RangeError("Unsupported image variant width"); + } + return parsedWidth; +} + +function getVariantRelativePath(mediaPath, width) { + const safeMediaPath = assertSafeMediaPath(mediaPath); + const safeWidth = assertVariantWidth(width); + return path.posix.join( + "variants", + VARIANT_VERSION, + String(safeWidth), + `${safeMediaPath}.webp`, + ); +} + +function getVariantPublicPath(mediaPath, width) { + return `/public/${getVariantRelativePath(mediaPath, width)}`; +} + +function getVariantFilePath( + mediaPath, + width, + publicDirectory = PUBLIC_DIRECTORY, +) { + const publicRoot = path.resolve(publicDirectory); + const destination = path.resolve( + publicRoot, + ...getVariantRelativePath(mediaPath, width).split("/"), + ); + + if (!destination.startsWith(`${publicRoot}${path.sep}`)) { + throw new Error("Image variant path escaped the public directory"); + } + + return destination; +} + +function getVariantFallbackFilePaths( + mediaPath, + publicDirectory = PUBLIC_DIRECTORY, +) { + const safeMediaPath = assertSafeMediaPath(mediaPath); + const publicRoot = path.resolve(publicDirectory); + const pathSegments = safeMediaPath.split("/"); + return { + compressed: path.resolve(publicRoot, "compressed", ...pathSegments), + original: path.resolve(publicRoot, ...pathSegments), + }; +} + +function parseVariantRequestPath(requestPath) { + if (typeof requestPath !== "string" || requestPath.includes("\0")) { + throw new TypeError("Variant request path must be a non-empty string"); + } + + let decodedPath; + try { + decodedPath = decodeURIComponent(requestPath); + } catch (_) { + throw new Error("Variant request path is not valid URL encoding"); + } + const normalized = decodedPath.replaceAll("\\", "/").replace(/^\/+/, ""); + const segments = normalized.split("/"); + if ( + segments.length < 6 || + segments[0] !== "public" || + segments[1] !== "variants" || + segments[2] !== VARIANT_VERSION + ) { + throw new Error("Unsupported image variant request path"); + } + + const width = assertVariantWidth(segments[3]); + const encodedMediaPath = segments.slice(4).join("/"); + if (!encodedMediaPath.endsWith(".webp")) { + throw new Error("Image variant request must use the WebP suffix"); + } + const mediaPath = assertSafeMediaPath( + encodedMediaPath.slice(0, -".webp".length), + ); + + if (normalized !== `public/${getVariantRelativePath(mediaPath, width)}`) { + throw new Error("Image variant request is not canonical"); + } + + return { mediaPath: `/${mediaPath}`, width }; +} + +function getMediaPathFromInput(inputFilePath, publicDirectory) { + const publicRoot = path.resolve(publicDirectory); + const absoluteInput = path.resolve(inputFilePath); + const relativeInput = path.relative(publicRoot, absoluteInput); + + if ( + relativeInput.length === 0 || + relativeInput.startsWith("..") || + path.isAbsolute(relativeInput) + ) { + throw new Error("Input image must stay within the public directory"); + } + + return assertSafeMediaPath(relativeInput.split(path.sep).join("/")); +} + +function createVariantPipeline( + inputFilePath, + width, + quality = VARIANT_QUALITY, +) { + return sharp(inputFilePath, { + failOn: "error", + limitInputPixels: MAX_INPUT_PIXELS, + }) + .rotate() + .resize({ + width: assertVariantWidth(width), + fit: "inside", + withoutEnlargement: true, + }) + .webp({ quality, lossless: false }) + .timeout({ seconds: PROCESSING_TIMEOUT_SECONDS }); +} + +async function pathExists(filePath) { + return fs + .stat(filePath) + .then(() => true) + .catch((error) => { + if (error.code === "ENOENT") { + return false; + } + throw error; + }); +} + +async function publishWithoutOverwrite(temporaryPath, destinationPath) { + try { + await fs.link(temporaryPath, destinationPath); + return true; + } catch (error) { + if (error.code === "EEXIST") { + return false; + } + throw error; + } finally { + await fs.unlink(temporaryPath).catch(() => {}); + } +} + +async function generateImageVariants( + inputFilePath, + { + publicDirectory = PUBLIC_DIRECTORY, + widths = VARIANT_WIDTHS, + quality = VARIANT_QUALITY, + } = {}, +) { + const mediaPath = getMediaPathFromInput(inputFilePath, publicDirectory); + const inputStat = await fs.lstat(inputFilePath); + if (!inputStat.isFile() || inputStat.isSymbolicLink()) { + throw new Error("Input image must be a regular file"); + } + const safeWidths = [...new Set(widths.map(assertVariantWidth))].sort( + (left, right) => left - right, + ); + const results = []; + + for (const width of safeWidths) { + const destinationPath = getVariantFilePath( + mediaPath, + width, + publicDirectory, + ); + + if (await pathExists(destinationPath)) { + results.push({ status: "existing", width }); + continue; + } + + await fs.mkdir(path.dirname(destinationPath), { recursive: true }); + const temporaryPath = `${destinationPath}.tmp-${crypto + .randomBytes(8) + .toString("hex")}.webp`; + + try { + const information = await createVariantPipeline( + inputFilePath, + width, + quality, + ).toFile(temporaryPath); + const published = await publishWithoutOverwrite( + temporaryPath, + destinationPath, + ); + results.push({ + status: published ? "created" : "existing", + width, + ...(published + ? { + bytes: information.size, + height: information.height, + outputWidth: information.width, + } + : {}), + }); + } catch (error) { + await fs.unlink(temporaryPath).catch(() => {}); + results.push({ + status: "failed", + width, + errorCode: error.code || "IMAGE", + }); + } + } + + return results; +} + +async function cleanupImageVariants( + mediaPath, + { publicDirectory = PUBLIC_DIRECTORY, widths = VARIANT_WIDTHS } = {}, +) { + const results = []; + + for (const width of [...new Set(widths.map(assertVariantWidth))]) { + const variantPath = getVariantFilePath(mediaPath, width, publicDirectory); + try { + await fs.unlink(variantPath); + results.push({ status: "removed", width }); + } catch (error) { + if (error.code === "ENOENT") { + results.push({ status: "missing", width }); + } else { + results.push({ status: "failed", width, errorCode: error.code }); + } + } + } + + return results; +} + +async function moveWithoutOverwrite(sourcePath, destinationPath) { + await fs.mkdir(path.dirname(destinationPath), { recursive: true }); + try { + await fs.link(sourcePath, destinationPath); + } catch (error) { + if (error.code === "ENOENT") { + return "missing"; + } + if (error.code === "EEXIST") { + return "destination-exists"; + } + throw error; + } + + try { + await fs.unlink(sourcePath); + return "renamed"; + } catch (error) { + await fs.unlink(destinationPath).catch(() => {}); + throw error; + } +} + +async function renameImageVariants( + oldMediaPath, + newMediaPath, + { publicDirectory = PUBLIC_DIRECTORY, widths = VARIANT_WIDTHS } = {}, +) { + assertSafeMediaPath(oldMediaPath); + assertSafeMediaPath(newMediaPath); + const results = []; + + for (const width of [...new Set(widths.map(assertVariantWidth))]) { + const sourcePath = getVariantFilePath(oldMediaPath, width, publicDirectory); + const destinationPath = getVariantFilePath( + newMediaPath, + width, + publicDirectory, + ); + try { + results.push({ + status: await moveWithoutOverwrite(sourcePath, destinationPath), + width, + }); + } catch (error) { + results.push({ status: "failed", width, errorCode: error.code || "IO" }); + } + } + + return results; +} + +module.exports = { + MAX_INPUT_PIXELS, + PROCESSING_TIMEOUT_SECONDS, + PUBLIC_DIRECTORY, + VARIANT_QUALITY, + VARIANT_VERSION, + VARIANT_WIDTHS, + assertSafeMediaPath, + assertVariantWidth, + cleanupImageVariants, + createSerialTaskQueue, + createVariantPipeline, + generateImageVariants, + getVariantFallbackFilePaths, + getVariantFilePath, + getVariantPublicPath, + getVariantRelativePath, + parseVariantRequestPath, + renameImageVariants, +}; diff --git a/services/mediaFiles.js b/services/mediaFiles.js new file mode 100644 index 0000000..3b6cc29 --- /dev/null +++ b/services/mediaFiles.js @@ -0,0 +1,169 @@ +const fs = require("fs").promises; +const path = require("path"); +const { + cleanupImageVariants, + renameImageVariants, +} = require("./imageVariants"); + +const PUBLIC_DIRECTORY = path.join(__dirname, "..", "public"); +const PLANT_MEDIA_DIRECTORY = path.join(PUBLIC_DIRECTORY, "plantspic"); +const COMPRESSED_PLANT_MEDIA_DIRECTORY = path.join( + PUBLIC_DIRECTORY, + "compressed", + "plantspic", +); + +function getUploadedFiles(files) { + if (Array.isArray(files)) { + return files; + } + + return Object.values(files || {}).flat(); +} + +function getPlantMediaDirectory() { + return `${PLANT_MEDIA_DIRECTORY}${path.sep}`; +} + +function getCompressedPlantMediaDirectory() { + return `${COMPRESSED_PLANT_MEDIA_DIRECTORY}${path.sep}`; +} + +function getPlantMediaPath(filename) { + return path.join(PLANT_MEDIA_DIRECTORY, filename); +} + +function getCompressedPlantMediaPath(filename) { + return path.join(COMPRESSED_PLANT_MEDIA_DIRECTORY, filename); +} + +async function cleanupFiles(filePaths) { + await Promise.all( + filePaths.map((filePath) => + fs.unlink(filePath).catch((error) => { + if (error.code !== "ENOENT") { + console.warn("Unable to clean up uploaded file"); + } + }), + ), + ); +} + +function assertSafeFilename(filename) { + if ( + typeof filename !== "string" || + filename.length === 0 || + filename.includes("\0") || + path.basename(filename) !== filename + ) { + throw new Error("Media filename must not contain a directory path"); + } + + return filename; +} + +async function moveFileWithoutOverwrite(sourcePath, destinationPath) { + await fs.mkdir(path.dirname(destinationPath), { recursive: true }); + try { + await fs.link(sourcePath, destinationPath); + } catch (error) { + if (error.code === "ENOENT") { + return "missing"; + } + if (error.code === "EEXIST") { + return "destination-exists"; + } + throw error; + } + + try { + await fs.unlink(sourcePath); + return "renamed"; + } catch (error) { + await fs.unlink(destinationPath).catch(() => {}); + throw error; + } +} + +async function cleanupPlantMediaDerivatives( + filename, + { publicDirectory = PUBLIC_DIRECTORY } = {}, +) { + const safeFilename = assertSafeFilename(filename); + const compressedPath = path.join( + publicDirectory, + "compressed", + "plantspic", + safeFilename, + ); + let compressedStatus = "removed"; + + try { + await fs.unlink(compressedPath); + } catch (error) { + compressedStatus = error.code === "ENOENT" ? "missing" : "failed"; + } + + return { + compressed: compressedStatus, + variants: await cleanupImageVariants(`/plantspic/${safeFilename}`, { + publicDirectory, + }), + }; +} + +function assertDerivativeCleanupSucceeded(result) { + const variantFailure = result?.variants?.some( + (variant) => variant.status === "failed", + ); + if (!result || result.compressed === "failed" || variantFailure) { + throw new Error("Unable to remove one or more media derivatives"); + } + return result; +} + +async function renamePlantMediaDerivatives( + oldFilename, + newFilename, + { publicDirectory = PUBLIC_DIRECTORY } = {}, +) { + const safeOldFilename = assertSafeFilename(oldFilename); + const safeNewFilename = assertSafeFilename(newFilename); + const oldCompressedPath = path.join( + publicDirectory, + "compressed", + "plantspic", + safeOldFilename, + ); + const newCompressedPath = path.join( + publicDirectory, + "compressed", + "plantspic", + safeNewFilename, + ); + + return { + compressed: await moveFileWithoutOverwrite( + oldCompressedPath, + newCompressedPath, + ), + variants: await renameImageVariants( + `/plantspic/${safeOldFilename}`, + `/plantspic/${safeNewFilename}`, + { publicDirectory }, + ), + }; +} + +module.exports = { + assertDerivativeCleanupSucceeded, + assertSafeFilename, + cleanupFiles, + cleanupPlantMediaDerivatives, + getCompressedPlantMediaDirectory, + getCompressedPlantMediaPath, + getPlantMediaDirectory, + getPlantMediaPath, + getUploadedFiles, + renamePlantMediaDerivatives, +}; diff --git a/test/app.contract.test.js b/test/app.contract.test.js new file mode 100644 index 0000000..0b64e60 --- /dev/null +++ b/test/app.contract.test.js @@ -0,0 +1,336 @@ +const assert = require("node:assert/strict"); +const http = require("node:http"); +const { after, before, test } = require("node:test"); +const { once } = require("node:events"); + +const Post = require("../models/post"); +const BirdPost = require("../models/birdPost"); +const Pic = require("../models/pic"); +const Art = require("../models/art"); +const creationBottom = require("../models/creationBottom"); +const FeatureHome = require("../models/featureHome"); +const { app, runtime } = require("../app"); + +let server; +const calls = []; +const originals = { + postFind: Post.find, + birdPostFind: BirdPost.find, + picFind: Pic.find, + picAggregate: Pic.aggregate, + artFind: Art.find, + creationBottomFind: creationBottom.find, + featureHomeFind: FeatureHome.find, +}; + +function request(pathname, { method = "GET", body, headers = {} } = {}) { + const payload = body ? JSON.stringify(body) : null; + + return new Promise((resolve, reject) => { + const requestOptions = { + hostname: "127.0.0.1", + port: server.address().port, + path: pathname, + method, + headers: { + ...headers, + ...(payload + ? { + "content-type": "application/json", + "content-length": Buffer.byteLength(payload), + } + : {}), + }, + }; + const req = http.request(requestOptions, (res) => { + let responseBody = ""; + + res.setEncoding("utf8"); + res.on("data", (chunk) => { + responseBody += chunk; + }); + res.on("end", () => { + resolve({ + status: res.statusCode, + headers: res.headers, + body: responseBody ? JSON.parse(responseBody) : null, + }); + }); + }); + + req.on("error", reject); + if (payload) { + req.write(payload); + } + req.end(); + }); +} + +before(async () => { + Post.find = async (query) => { + calls.push({ model: "Post", query }); + + if (query.latinName) { + return [{ latinName: query.latinName, authorization: true }]; + } + + return [{ latinName: "Acer rubrum", authorization: true }]; + }; + BirdPost.find = async (query) => { + calls.push({ model: "BirdPost", query }); + + if (query.latinName) { + return [{ latinName: query.latinName, authorization: true }]; + } + + return [{ latinName: "Corvus corax", authorization: true }]; + }; + Pic.find = async (query) => { + calls.push({ model: "Pic", query }); + return [{ path: "/plantspic/example.jpg", art: "photography" }]; + }; + Art.find = async (query) => { + calls.push({ model: "Art", query }); + return [{ path: "/plantspic/example-art.jpg" }]; + }; + + server = app.listen(0, "127.0.0.1"); + await once(server, "listening"); +}); + +after(async () => { + Post.find = originals.postFind; + BirdPost.find = originals.birdPostFind; + Pic.find = originals.picFind; + Pic.aggregate = originals.picAggregate; + Art.find = originals.artFind; + creationBottom.find = originals.creationBottomFind; + FeatureHome.find = originals.featureHomeFind; + + await new Promise((resolve, reject) => { + server.close((error) => { + if (error) { + reject(error); + return; + } + + resolve(); + }); + }); +}); + +test("importing the application does not make dependencies ready", () => { + assert.deepEqual(runtime.getReadiness(), { + ready: false, + dependencies: { + mongodb: false, + redis: false, + }, + }); +}); + +test("health endpoints expose liveness separately from dependency readiness", async () => { + const live = await request("/health/live"); + const ready = await request("/health/ready"); + + assert.equal(live.status, 200); + assert.deepEqual(live.body, { status: "live" }); + assert.equal(ready.status, 503); + assert.deepEqual(ready.body, { + status: "not_ready", + dependencies: { + mongodb: false, + redis: false, + }, + }); +}); + +test("responsive image route rejects unsupported or missing variants safely", async () => { + const unsupportedWidth = await request( + "/public/variants/v1/481/plantspic/example.jpg.webp", + ); + const missingVariant = await request( + "/public/variants/v1/480/plantspic/missing.jpg.webp", + ); + + assert.equal(unsupportedWidth.status, 404); + assert.equal(missingVariant.status, 404); + assert.equal(unsupportedWidth.body, null); + assert.equal(missingVariant.body, null); +}); + +test("public read routes retain search, detail, count, refresh, and CORS contracts", async () => { + const search = await request("/searchNames", { + headers: { origin: "https://www.biphflora.com" }, + }); + const birdSearch = await request("/searchBirdNames"); + const plantDetail = await request("/syncPlantInfo", { + method: "POST", + body: { postName: "Acer rubrum" }, + }); + const birdDetail = await request("/syncBirdInfo", { + method: "POST", + body: { postName: "Corvus corax" }, + }); + const plantCount = await request("/numOfPlants"); + const birdCount = await request("/numOfBirds"); + const refresh = await request("/refresh"); + + assert.equal(search.status, 200); + assert.equal( + search.headers["access-control-allow-origin"], + "https://www.biphflora.com", + ); + assert.deepEqual(search.body, { + success: true, + returnNames: [{ latinName: "Acer rubrum", authorization: true }], + numOfPlants: 1, + }); + assert.deepEqual(birdSearch.body, { + success: true, + returnNames: [{ latinName: "Corvus corax", authorization: true }], + numOfPlants: 1, + }); + assert.deepEqual(plantDetail.body, { + resultPost: [{ latinName: "Acer rubrum", authorization: true }], + photographs: [{ path: "/plantspic/example.jpg", art: "photography" }], + arts: [{ path: "/plantspic/example-art.jpg" }], + }); + assert.deepEqual(birdDetail.body, { + resultPost: [{ latinName: "Corvus corax", authorization: true }], + photographs: [{ path: "/plantspic/example.jpg", art: "photography" }], + arts: [{ path: "/plantspic/example-art.jpg" }], + }); + assert.deepEqual(plantCount.body, { numOfPlants: 1 }); + assert.deepEqual(birdCount.body, { numOfPlants: 1 }); + assert.deepEqual(refresh.body, { + success: false, + message: "Token not valid", + }); + assert.deepEqual(calls, [ + { model: "Post", query: { authorization: true } }, + { model: "BirdPost", query: { authorization: true } }, + { + model: "Post", + query: { latinName: "Acer rubrum", authorization: true }, + }, + { + model: "Pic", + query: { art: "photography", plant: "Acer rubrum" }, + }, + { model: "Art", query: { plant: "Acer rubrum" } }, + { + model: "BirdPost", + query: { latinName: "Corvus corax", authorization: true }, + }, + { + model: "Pic", + query: { art: "photography", plant: "Corvus corax" }, + }, + { model: "Art", query: { plant: "Corvus corax" } }, + { model: "Post", query: { authorization: true } }, + { model: "BirdPost", query: { authorization: true } }, + ]); +}); + +test("public content routes retain documentary, glossary, media, and feature contracts", async () => { + Post.find = async (query) => { + calls.push({ model: "Post", query }); + return [ + { + latinName: "Acer rubrum", + chineseName: "红花槭", + authorization: true, + }, + ]; + }; + BirdPost.find = async (query) => { + calls.push({ model: "BirdPost", query }); + return [ + { + latinName: "Corvus corax", + chineseName: "渡鸦", + authorization: true, + }, + ]; + }; + Pic.find = async (query) => { + calls.push({ model: "Pic", query }); + return [ + { path: "/plantspic/spring.jpg", season: "spring" }, + { path: "/plantspic/winter.jpg", season: "winter" }, + ]; + }; + Pic.aggregate = async (pipeline) => { + calls.push({ model: "Pic", pipeline }); + return [{ path: "/plantspic/random.jpg" }]; + }; + Art.find = async (query) => { + calls.push({ model: "Art", query }); + return [{ path: "/plantspic/art.jpg" }]; + }; + creationBottom.find = async (query) => { + calls.push({ model: "creationBottom", query }); + return [{ plant: "Acer rubrum", auth: true }]; + }; + FeatureHome.find = () => ({ + lean: async () => [{ plant: "Acer rubrum" }], + }); + + const documentary = await request("/creationDocumentary"); + const userInfo = await request("/userInfo"); + const plantGlossary = await request("/userInfoGlossary"); + const birdGlossary = await request("/userInfoGlossaryBird"); + const seasonalPics = await request("/getPics", { + method: "POST", + body: { plant: "Acer rubrum" }, + }); + const randomPics = await request("/getDb2Pic"); + const randomBirdPics = await request("/getDb2PicBird"); + const randomAlt = await request("/db2Alt"); + const randomBirdAlt = await request("/db2AltBird"); + const media = await request("/getPicsAndArts", { + method: "POST", + body: { plant: "Acer rubrum" }, + }); + + assert.deepEqual(documentary.body, { + success: true, + allDisplays: [{ plant: "Acer rubrum", auth: true }], + }); + assert.deepEqual(userInfo.body, { + success: false, + featureLists: [{ plant: "Acer rubrum" }], + }); + assert.equal(plantGlossary.body.success, false); + assert.deepEqual(plantGlossary.body.glossary.a, ["Acer rubrum"]); + assert.deepEqual(plantGlossary.body.cnNames.a, ["红花槭"]); + assert.equal(birdGlossary.body.success, false); + assert.deepEqual(birdGlossary.body.glossary.c, ["Corvus corax"]); + assert.deepEqual(birdGlossary.body.cnNames.c, ["渡鸦"]); + assert.deepEqual(seasonalPics.body, { + success: true, + springPics: [{ path: "/plantspic/spring.jpg", season: "spring" }], + summerPics: [], + autumnPics: [], + winterPics: [{ path: "/plantspic/winter.jpg", season: "winter" }], + }); + assert.deepEqual(randomPics.body, { + success: true, + pics: [{ path: "/plantspic/random.jpg" }], + }); + assert.deepEqual(randomBirdPics.body, randomPics.body); + assert.deepEqual(randomAlt.body, { + success: true, + pic: [{ path: "/plantspic/random.jpg" }], + }); + assert.deepEqual(randomBirdAlt.body, randomAlt.body); + assert.deepEqual(media.body, { + success: true, + pics: [ + { path: "/plantspic/spring.jpg", season: "spring" }, + { path: "/plantspic/winter.jpg", season: "winter" }, + ], + arts: [{ path: "/plantspic/art.jpg" }], + }); +}); diff --git a/test/auth-boundary.test.js b/test/auth-boundary.test.js new file mode 100644 index 0000000..a0b21f2 --- /dev/null +++ b/test/auth-boundary.test.js @@ -0,0 +1,467 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs/promises"); +const http = require("node:http"); +const path = require("node:path"); +const { after, before, beforeEach, test } = require("node:test"); +const { once } = require("node:events"); +const jwt = require("jsonwebtoken"); +const bcrypt = require("bcrypt"); + +process.env.secret = "phase-two-test-secret"; + +const User = require("../models/user"); +const Post = require("../models/post"); +const Pic = require("../models/pic"); +const { UPLOAD_TEMP_DIR } = require("../models/uploadPolicy"); +const { app, runtime } = require("../app"); + +let server; +let sessionStoreAvailable = true; +const sessions = new Map(); +const originals = { + userCreate: User.create, + userFind: User.find, + userFindOne: User.findOne, + postFind: Post.find, + picFind: Pic.find, + deleteSession: runtime.deleteSession, + getSessionToken: runtime.getSessionToken, + isSessionStoreReady: runtime.isSessionStoreReady, + setSessionToken: runtime.setSessionToken, +}; + +function request( + pathname, + { method = "GET", body, payload: suppliedPayload, headers = {} } = {}, +) { + const payload = suppliedPayload ?? (body ? JSON.stringify(body) : null); + const payloadLength = Buffer.isBuffer(payload) + ? payload.length + : Buffer.byteLength(payload || ""); + + return new Promise((resolve, reject) => { + const req = http.request( + { + hostname: "127.0.0.1", + port: server.address().port, + path: pathname, + method, + headers: { + ...headers, + ...(payload + ? { + ...(suppliedPayload ? {} : { "content-type": "application/json" }), + "content-length": payloadLength, + } + : {}), + }, + }, + (res) => { + let responseBody = ""; + res.setEncoding("utf8"); + res.on("data", (chunk) => { + responseBody += chunk; + }); + res.on("end", () => { + let parsedBody = null; + if (responseBody) { + try { + parsedBody = JSON.parse(responseBody); + } catch (_) { + parsedBody = responseBody; + } + } + + resolve({ + status: res.statusCode, + body: parsedBody, + }); + }); + }, + ); + + req.on("error", reject); + if (payload) { + req.write(payload); + } + req.end(); + }); +} + +before(async () => { + runtime.getSessionToken = async (username) => + sessionStoreAvailable ? sessions.get(username) || null : null; + runtime.setSessionToken = async (username, token) => { + if (!sessionStoreAvailable) { + throw new Error("session store unavailable"); + } + sessions.set(username, token); + }; + runtime.deleteSession = async (username) => { + if (!sessionStoreAvailable) { + throw new Error("session store unavailable"); + } + return sessions.delete(username); + }; + runtime.isSessionStoreReady = () => sessionStoreAvailable; + + server = app.listen(0, "127.0.0.1"); + await once(server, "listening"); +}); + +beforeEach(() => { + sessionStoreAvailable = true; + sessions.clear(); + User.create = originals.userCreate; + User.find = originals.userFind; + User.findOne = originals.userFindOne; + Post.find = originals.postFind; + Pic.find = originals.picFind; +}); + +after(async () => { + User.create = originals.userCreate; + User.find = originals.userFind; + User.findOne = originals.userFindOne; + Post.find = originals.postFind; + Pic.find = originals.picFind; + runtime.deleteSession = originals.deleteSession; + runtime.getSessionToken = originals.getSessionToken; + runtime.isSessionStoreReady = originals.isSessionStoreReady; + runtime.setSessionToken = originals.setSessionToken; + + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); +}); + +test("protected write and administration routes reject requests without a token", async () => { + const responses = await Promise.all([ + request("/uploadPic", { method: "POST", body: {} }), + request("/newPostAuth", { method: "POST", body: {} }), + request("/adminDataGet"), + request("/editPageDelete", { method: "POST", body: {} }), + ]); + + for (const response of responses) { + assert.equal(response.status, 401); + assert.deepEqual(response.body, { + success: false, + message: "Authentication required", + }); + } +}); + +test("a non-admin token cannot access administration data", async () => { + User.findOne = async () => ({ username: "member", admin: false }); + const token = jwt.sign( + { username: "member", admin: false }, + process.env.secret, + ); + sessions.set("member", token); + + const response = await request("/adminInfo", { + headers: { authorization: `Bearer ${token}` }, + }); + + assert.equal(response.status, 403); + assert.deepEqual(response.body, { + success: false, + message: "Administrator access required", + }); +}); + +test("raw and Bearer JWTs work while admin user responses exclude secret fields", async () => { + const memberToken = jwt.sign( + { username: "member", admin: false }, + process.env.secret, + ); + sessions.set("member", memberToken); + const refresh = await request("/refresh", { + headers: { authorization: memberToken }, + }); + assert.equal(refresh.status, 200); + assert.equal(refresh.body.success, true); + assert.equal(refresh.body.user.username, "member"); + + User.findOne = async (query, projection) => { + assert.deepEqual(query, { username: "admin" }); + assert.deepEqual(projection, { username: 1, admin: 1 }); + return { username: "admin", admin: true }; + }; + User.find = async (query, projection) => { + assert.deepEqual(query, {}); + assert.deepEqual(projection, { username: 1, admin: 1 }); + return [ + { + _id: "user-1", + username: "member", + admin: false, + password: "bcrypt-hash", + originalPassword: "plaintext", + }, + ]; + }; + Post.find = async () => []; + Pic.find = async () => []; + + const adminToken = jwt.sign( + { username: "admin", admin: false }, + process.env.secret, + ); + sessions.set("admin", adminToken); + const response = await request("/adminInfo", { + headers: { authorization: `Bearer ${adminToken}` }, + }); + + assert.equal(response.status, 200); + assert.deepEqual(response.body.users, [ + { _id: "user-1", username: "member", admin: false }, + ]); + assert.equal("password" in response.body.users[0], false); + assert.equal("originalPassword" in response.body.users[0], false); +}); + +test("logout and removed accounts lose protected access", async () => { + const token = jwt.sign( + { username: "member", admin: false }, + process.env.secret, + ); + sessions.set("member", token); + + const logout = await request("/logout", { + method: "POST", + headers: { authorization: token }, + }); + assert.equal(logout.status, 200); + assert.equal(sessions.has("member"), false); + + const afterLogout = await request("/updateText", { + method: "POST", + body: {}, + headers: { authorization: token }, + }); + assert.equal(afterLogout.status, 401); + + sessions.set("member", token); + User.findOne = async () => null; + const removedAccount = await request("/updateText", { + method: "POST", + body: {}, + headers: { authorization: token }, + }); + assert.equal(removedAccount.status, 401); +}); + +test("login and logout report a session-store outage", async () => { + const password = "correct-password"; + const passwordHash = await bcrypt.hash(password, 4); + User.findOne = () => ({ + select: async () => ({ + username: "member", + admin: false, + password: passwordHash, + }), + }); + sessionStoreAvailable = false; + + const login = await request("/login", { + method: "POST", + body: { username: "member", password }, + }); + assert.equal(login.status, 503); + assert.deepEqual(login.body, { + success: false, + message: "Authentication service unavailable", + }); + + const token = jwt.sign( + { username: "member", admin: false }, + process.env.secret, + ); + const logout = await request("/logout", { + method: "POST", + headers: { authorization: token }, + }); + assert.equal(logout.status, 503); + assert.deepEqual(logout.body, { + success: false, + message: "Authentication service unavailable", + }); + + const protectedWrite = await request("/updateText", { + method: "POST", + body: {}, + headers: { authorization: token }, + }); + assert.equal(protectedWrite.status, 503); + assert.deepEqual(protectedWrite.body, { + success: false, + message: "Authentication service unavailable", + }); +}); + +test("registration retains its public response and stored user shape", async () => { + const createdUsers = []; + User.create = async (user) => { + createdUsers.push(user); + return user; + }; + + const registered = await request("/register", { + method: "POST", + body: { username: "new-member", password: "registration-password" }, + }); + + assert.equal(registered.status, 200); + assert.deepEqual(registered.body, { + success: true, + message: "Register successful", + }); + assert.equal(createdUsers.length, 1); + assert.equal(createdUsers[0].username, "new-member"); + assert.equal(createdUsers[0].admin, false); + assert.equal("originalPassword" in createdUsers[0], false); + assert.equal( + await bcrypt.compare("registration-password", createdUsers[0].password), + true, + ); + + User.create = async () => { + const error = new Error("duplicate key"); + error.code = 11000; + throw error; + }; + const duplicate = await request("/register", { + method: "POST", + body: { username: "new-member", password: "registration-password" }, + }); + assert.deepEqual(duplicate.body, { + success: false, + message: "Username already exists", + }); +}); + +test("spoofed multipart images are rejected and removed without path traversal", async () => { + const token = jwt.sign( + { username: "member", admin: false }, + process.env.secret, + ); + sessions.set("member", token); + User.findOne = async () => ({ username: "member", admin: false }); + Post.findOne = async () => ({ latinName: "Acer rubrum" }); + + const uploadDirectoryExisted = await fs + .stat(UPLOAD_TEMP_DIR) + .then(() => true) + .catch(() => false); + await fs.mkdir(UPLOAD_TEMP_DIR, { recursive: true }); + const before = new Set(await fs.readdir(UPLOAD_TEMP_DIR)); + const boundary = "biphflora-test-boundary"; + const payload = Buffer.from( + `--${boundary}\r\n` + + 'Content-Disposition: form-data; name="picEnglishName"\r\n\r\n' + + "Acer rubrum\r\n" + + `--${boundary}\r\n` + + 'Content-Disposition: form-data; name="files"; filename="../../escape.png"\r\n' + + "Content-Type: image/png\r\n\r\n" + + "not-a-real-image\r\n" + + `--${boundary}--\r\n`, + ); + + const response = await request("/uploadPic", { + method: "POST", + payload, + headers: { + authorization: `Bearer ${token}`, + "content-type": `multipart/form-data; boundary=${boundary}`, + }, + }); + + assert.equal(response.status, 400); + assert.deepEqual(response.body, { + success: false, + message: "Invalid image upload", + }); + + Post.findOne = async () => null; + const validPng = Buffer.from( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIHWP4z8DwHwAFgAI/ScL0QgAAAABJRU5ErkJggg==", + "base64", + ); + const missingPlantPayload = Buffer.concat([ + Buffer.from( + `--${boundary}\r\n` + + 'Content-Disposition: form-data; name="picEnglishName"\r\n\r\n' + + "Missing plant\r\n" + + `--${boundary}\r\n` + + 'Content-Disposition: form-data; name="files"; filename="../../missing.png"\r\n' + + "Content-Type: image/png\r\n\r\n", + ), + validPng, + Buffer.from(`\r\n--${boundary}--\r\n`), + ]); + const missingPlant = await request("/uploadPic", { + method: "POST", + payload: missingPlantPayload, + headers: { + authorization: `Bearer ${token}`, + "content-type": `multipart/form-data; boundary=${boundary}`, + }, + }); + assert.equal(missingPlant.status, 404); + assert.equal(missingPlant.body, "Plant not found"); + + assert.deepEqual(new Set(await fs.readdir(UPLOAD_TEMP_DIR)), before); + assert.equal( + await fs + .stat(path.join(process.cwd(), "escape.png")) + .then(() => true) + .catch(() => false), + false, + ); + + if (!uploadDirectoryExisted) { + await fs.rmdir(UPLOAD_TEMP_DIR); + } +}); + +test("session lookup errors do not masquerade as an invalid token or successful logout", async () => { + const token = jwt.sign( + { username: "member", admin: false }, + process.env.secret, + ); + const getSessionToken = runtime.getSessionToken; + runtime.getSessionToken = async () => { + throw new Error("transient Redis read failure"); + }; + + try { + const responses = await Promise.all([ + request("/login", { + method: "POST", + body: { username: "member", password: "ignored" }, + headers: { authorization: `Bearer ${token}` }, + }), + request("/logout", { + method: "POST", + headers: { authorization: token }, + }), + request("/updateText", { + method: "POST", + body: {}, + headers: { authorization: token }, + }), + ]); + + for (const response of responses) { + assert.equal(response.status, 503); + assert.deepEqual(response.body, { + success: false, + message: "Authentication service unavailable", + }); + } + } finally { + runtime.getSessionToken = getSessionToken; + } +}); diff --git a/test/catalog-directory.test.js b/test/catalog-directory.test.js new file mode 100644 index 0000000..a253c8c --- /dev/null +++ b/test/catalog-directory.test.js @@ -0,0 +1,193 @@ +const assert = require("node:assert/strict"); +const http = require("node:http"); +const { after, before, test } = require("node:test"); +const { once } = require("node:events"); +const express = require("express"); + +const Post = require("../models/post"); +const BirdPost = require("../models/birdPost"); +const catalogRouter = require("../routes/catalog"); + +const NAME_DIRECTORY_PROJECTION = { + _id: 1, + latinName: 1, + chineseName: 1, + commonName: 1, + otherNames: 1, +}; + +const originals = { + postFind: Post.find, + birdPostFind: BirdPost.find, +}; +const calls = []; +let server; + +function queryWith(entries) { + return { + lean: async () => entries, + }; +} + +function request(pathname, { method = "GET" } = {}) { + return new Promise((resolve, reject) => { + const req = http.request( + { + hostname: "127.0.0.1", + port: server.address().port, + path: pathname, + method, + }, + (res) => { + let responseBody = ""; + res.setEncoding("utf8"); + res.on("data", (chunk) => { + responseBody += chunk; + }); + res.on("end", () => { + let body = null; + if (responseBody) { + try { + body = JSON.parse(responseBody); + } catch (_) { + body = responseBody; + } + } + + resolve({ + status: res.statusCode, + body, + }); + }); + }, + ); + + req.on("error", reject); + req.end(); + }); +} + +before(async () => { + Post.find = (query, projection) => { + calls.push({ model: "Post", query, projection }); + return queryWith([ + { + _id: "plant-1", + latinName: "Acer rubrum", + chineseName: "红花槭", + commonName: "red maple", + otherNames: ["swamp maple"], + authorization: true, + internalNotes: "must not be returned", + }, + ]); + }; + BirdPost.find = (query, projection) => { + calls.push({ model: "BirdPost", query, projection }); + return queryWith([ + { + _id: "bird-1", + latinName: "Corvus corax", + chineseName: "渡鸦", + commonName: "common raven", + otherNames: ["northern raven"], + authorization: true, + internalNotes: "must not be returned", + }, + ]); + }; + + const app = express(); + app.use(catalogRouter); + server = app.listen(0, "127.0.0.1"); + await once(server, "listening"); +}); + +after(async () => { + Post.find = originals.postFind; + BirdPost.find = originals.birdPostFind; + + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); +}); + +test("name directory validates type and returns only projected plant or bird names", async () => { + const plant = await request("/catalog/names?type=plant"); + const bird = await request("/catalog/names?type=bird"); + const missingType = await request("/catalog/names"); + const invalidType = await request("/catalog/names?type=fungi"); + const repeatedType = await request( + "/catalog/names?type=plant&type=bird", + ); + const wrongMethod = await request("/catalog/names?type=plant", { + method: "POST", + }); + + assert.equal(plant.status, 200); + assert.deepEqual(plant.body, { + success: true, + type: "plant", + names: [ + { + _id: "plant-1", + latinName: "Acer rubrum", + chineseName: "红花槭", + commonName: "red maple", + otherNames: ["swamp maple"], + }, + ], + }); + assert.equal(bird.status, 200); + assert.deepEqual(bird.body, { + success: true, + type: "bird", + names: [ + { + _id: "bird-1", + latinName: "Corvus corax", + chineseName: "渡鸦", + commonName: "common raven", + otherNames: ["northern raven"], + }, + ], + }); + assert.equal(missingType.status, 400); + assert.deepEqual(missingType.body, { + success: false, + message: "Type must be either plant or bird", + }); + assert.deepEqual(invalidType, missingType); + assert.deepEqual(repeatedType, missingType); + assert.equal(wrongMethod.status, 404); + assert.deepEqual(calls, [ + { + model: "Post", + query: { authorization: true }, + projection: NAME_DIRECTORY_PROJECTION, + }, + { + model: "BirdPost", + query: { authorization: true }, + projection: NAME_DIRECTORY_PROJECTION, + }, + ]); +}); + +test("name directory failures use a generic response", async () => { + Post.find = () => ({ + lean: async () => { + throw new Error("mongodb://private-host/catalog-secret"); + }, + }); + + const response = await request("/catalog/names?type=plant"); + + assert.equal(response.status, 500); + assert.deepEqual(response.body, { + success: false, + message: "Unable to load name directory", + }); + assert.equal(JSON.stringify(response.body).includes("private-host"), false); + assert.equal(JSON.stringify(response.body).includes("catalog-secret"), false); +}); diff --git a/test/image-compression.test.js b/test/image-compression.test.js new file mode 100644 index 0000000..5cc0d97 --- /dev/null +++ b/test/image-compression.test.js @@ -0,0 +1,72 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs/promises"); +const os = require("node:os"); +const path = require("node:path"); +const { test } = require("node:test"); +const sharp = require("sharp"); + +const { compressImages } = require("../models/compression"); + +test("image processing preserves the requested format and writes atomically", async () => { + const temporaryDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-compression-"), + ); + const inputDirectory = path.join(temporaryDirectory, "input"); + const outputDirectory = path.join(temporaryDirectory, "output"); + const inputFile = path.join(inputDirectory, "fixture.png"); + + try { + await fs.mkdir(inputDirectory); + await sharp({ + create: { + width: 12, + height: 8, + channels: 3, + background: "#4f7f3f", + }, + }) + .png() + .toFile(inputFile); + + const results = await compressImages( + [inputFile], + outputDirectory, + 9, + 70, + ); + const outputFile = path.join(outputDirectory, "fixture.png"); + const metadata = await sharp(outputFile).metadata(); + const outputFiles = await fs.readdir(outputDirectory); + + assert.deepEqual(results, [{ success: true, file: inputFile }]); + assert.equal(metadata.format, "png"); + assert.equal(metadata.width, 12); + assert.equal(metadata.height, 8); + assert.deepEqual(outputFiles, ["fixture.png"]); + } finally { + await fs.rm(temporaryDirectory, { recursive: true, force: true }); + } +}); + +test("failed processing leaves no partial derivative", async () => { + const temporaryDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-compression-failure-"), + ); + const inputFile = path.join(temporaryDirectory, "invalid.png"); + const outputDirectory = path.join(temporaryDirectory, "output"); + + try { + await fs.writeFile(inputFile, "not an image"); + const results = await compressImages( + [inputFile], + outputDirectory, + 9, + 70, + ); + + assert.deepEqual(results, [{ success: false, file: inputFile }]); + assert.deepEqual(await fs.readdir(outputDirectory), []); + } finally { + await fs.rm(temporaryDirectory, { recursive: true, force: true }); + } +}); diff --git a/test/image-variants.test.js b/test/image-variants.test.js new file mode 100644 index 0000000..c4d424d --- /dev/null +++ b/test/image-variants.test.js @@ -0,0 +1,222 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs/promises"); +const os = require("node:os"); +const path = require("node:path"); +const { test } = require("node:test"); +const sharp = require("sharp"); + +const { + VARIANT_WIDTHS, + assertSafeMediaPath, + cleanupImageVariants, + createSerialTaskQueue, + generateImageVariants, + getVariantFallbackFilePaths, + getVariantFilePath, + getVariantPublicPath, + parseVariantRequestPath, +} = require("../services/imageVariants"); +const { runBackfill } = require("../scripts/backfill-media-variants"); + +async function createImage(filePath, width = 2000, height = 1200) { + await fs.mkdir(path.dirname(filePath), { recursive: true }); + await sharp({ + create: { + width, + height, + channels: 3, + background: { r: 42, g: 120, b: 64 }, + }, + }) + .jpeg({ quality: 90 }) + .toFile(filePath); +} + +test("versioned WebP variants are bounded, deterministic, and never enlarged", async () => { + const publicDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-variants-"), + ); + const largeInput = path.join(publicDirectory, "plantspic", "large.jpg"); + const smallInput = path.join(publicDirectory, "plantspic", "small.jpg"); + + try { + await createImage(largeInput); + await createImage(smallInput, 320, 200); + + const largeResults = await generateImageVariants(largeInput, { + publicDirectory, + }); + assert.deepEqual( + largeResults.map(({ status, width }) => ({ status, width })), + VARIANT_WIDTHS.map((width) => ({ status: "created", width })), + ); + + for (const width of VARIANT_WIDTHS) { + const metadata = await sharp( + getVariantFilePath("/plantspic/large.jpg", width, publicDirectory), + ).metadata(); + assert.equal(metadata.format, "webp"); + assert.equal(metadata.width, width); + assert.ok(metadata.height <= 1200); + } + + await generateImageVariants(smallInput, { + publicDirectory, + widths: [480], + }); + const smallMetadata = await sharp( + getVariantFilePath("plantspic/small.jpg", 480, publicDirectory), + ).metadata(); + assert.equal(smallMetadata.width, 320); + assert.equal(smallMetadata.height, 200); + assert.equal( + getVariantPublicPath("/plantspic/small.jpg", 480), + "/public/variants/v1/480/plantspic/small.jpg.webp", + ); + } finally { + await fs.rm(publicDirectory, { recursive: true, force: true }); + } +}); + +test("variant publication preserves an existing destination", async () => { + const publicDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-variants-existing-"), + ); + const input = path.join(publicDirectory, "plantspic", "existing.png"); + + try { + await createImage(input, 900, 600); + await generateImageVariants(input, { + publicDirectory, + widths: [480], + }); + const destination = getVariantFilePath( + "/plantspic/existing.png", + 480, + publicDirectory, + ); + const before = await fs.readFile(destination); + + await createImage(input, 900, 600); + const secondRun = await generateImageVariants(input, { + publicDirectory, + widths: [480], + }); + assert.equal(secondRun[0].status, "existing"); + assert.deepEqual(await fs.readFile(destination), before); + assert.deepEqual( + (await fs.readdir(path.dirname(destination))).filter((name) => + name.includes(".tmp-"), + ), + [], + ); + } finally { + await fs.rm(publicDirectory, { recursive: true, force: true }); + } +}); + +test("serialized deletion runs after pending generation and leaves no variant", async () => { + const publicDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-variant-queue-"), + ); + const input = path.join(publicDirectory, "plantspic", "queued.jpg"); + const queue = createSerialTaskQueue(); + + try { + await createImage(input, 900, 600); + const generation = queue.enqueue(() => + generateImageVariants(input, { publicDirectory }), + ); + const deletion = queue.enqueue(async () => { + await cleanupImageVariants("/plantspic/queued.jpg", { publicDirectory }); + await fs.unlink(input); + }); + await Promise.all([generation, deletion]); + await queue.drain(); + + for (const width of VARIANT_WIDTHS) { + await assert.rejects( + fs.stat( + getVariantFilePath("/plantspic/queued.jpg", width, publicDirectory), + ), + { code: "ENOENT" }, + ); + } + } finally { + await fs.rm(publicDirectory, { recursive: true, force: true }); + } +}); + +test("variant paths reject traversal and unsupported widths", () => { + assert.throws(() => assertSafeMediaPath("../secret.jpg")); + assert.throws(() => assertSafeMediaPath("plantspic/../../secret.jpg")); + assert.throws(() => getVariantPublicPath("/other/file.jpg", 480)); + assert.throws(() => getVariantPublicPath("/plantspic/file.jpg", 481)); + assert.deepEqual( + parseVariantRequestPath( + "/public/variants/v1/480/plantspic/nested/file.jpg.webp", + ), + { mediaPath: "/plantspic/nested/file.jpg", width: 480 }, + ); + assert.deepEqual( + parseVariantRequestPath( + "/public/variants/v1/960/plantspic/nested/%E8%8A%B1%20one.jpg.webp", + ), + { mediaPath: "/plantspic/nested/花 one.jpg", width: 960 }, + ); + assert.throws(() => + parseVariantRequestPath( + "/public/variants/v1/480/plantspic/../../secret.jpg.webp", + ), + ); + assert.throws(() => + parseVariantRequestPath( + "/public/variants/v1/480/plantspic/%2e%2e/secret.jpg.webp", + ), + ); + assert.throws(() => + parseVariantRequestPath("/public/variants/v2/480/plantspic/file.jpg.webp"), + ); + const fallbacks = getVariantFallbackFilePaths( + "/plantspic/nested/file.jpg", + "/safe/public", + ); + assert.equal( + fallbacks.compressed, + path.resolve("/safe/public/compressed/plantspic/nested/file.jpg"), + ); + assert.equal( + fallbacks.original, + path.resolve("/safe/public/plantspic/nested/file.jpg"), + ); +}); + +test("backfill defaults to dry-run and reports aggregates only", async () => { + const publicDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-backfill-"), + ); + const input = path.join(publicDirectory, "plantspic", "private-name.jpg"); + + try { + await createImage(input, 800, 600); + const dryRun = await runBackfill({ publicDirectory }); + assert.equal(dryRun.mode, "dry-run"); + assert.equal(dryRun.eligibleImageCount, 1); + assert.equal(dryRun.plannedVariantCount, 3); + assert.equal(dryRun.createdVariantCount, 0); + await assert.rejects( + fs.stat( + getVariantFilePath("/plantspic/private-name.jpg", 480, publicDirectory), + ), + { code: "ENOENT" }, + ); + assert.equal(JSON.stringify(dryRun).includes("private-name"), false); + + const writeRun = await runBackfill({ publicDirectory, dryRun: false }); + assert.equal(writeRun.mode, "write-new-variants"); + assert.equal(writeRun.createdVariantCount, 3); + assert.equal(writeRun.failedVariantCount, 0); + } finally { + await fs.rm(publicDirectory, { recursive: true, force: true }); + } +}); diff --git a/test/media-files.test.js b/test/media-files.test.js new file mode 100644 index 0000000..9bb1692 --- /dev/null +++ b/test/media-files.test.js @@ -0,0 +1,188 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs/promises"); +const os = require("node:os"); +const path = require("node:path"); +const { test } = require("node:test"); + +const { + assertDerivativeCleanupSucceeded, + cleanupFiles, + cleanupPlantMediaDerivatives, + getCompressedPlantMediaDirectory, + getCompressedPlantMediaPath, + getPlantMediaDirectory, + getPlantMediaPath, + getUploadedFiles, + renamePlantMediaDerivatives, +} = require("../services/mediaFiles"); +const { + VARIANT_WIDTHS, + getVariantFilePath, +} = require("../services/imageVariants"); + +test("derivative cleanup failures are not accepted as a completed deletion", () => { + assert.doesNotThrow(() => + assertDerivativeCleanupSucceeded({ + compressed: "missing", + variants: [{ status: "removed", width: 480 }], + }), + ); + assert.throws( + () => + assertDerivativeCleanupSucceeded({ + compressed: "removed", + variants: [{ status: "failed", width: 480 }], + }), + /Unable to remove/, + ); +}); + +test("media path helpers retain the existing public directory layout", () => { + const applicationRoot = path.resolve(__dirname, ".."); + const plantMediaDirectory = path.join(applicationRoot, "public", "plantspic"); + const compressedPlantMediaDirectory = path.join( + applicationRoot, + "public", + "compressed", + "plantspic", + ); + + assert.equal(getPlantMediaDirectory(), `${plantMediaDirectory}${path.sep}`); + assert.equal( + getCompressedPlantMediaDirectory(), + `${compressedPlantMediaDirectory}${path.sep}`, + ); + assert.equal( + getPlantMediaPath("example.png"), + path.join(plantMediaDirectory, "example.png"), + ); + assert.equal( + getCompressedPlantMediaPath("example.png"), + path.join(compressedPlantMediaDirectory, "example.png"), + ); +}); + +test("upload collection and cleanup retain array, field-map, and missing-file behavior", async () => { + const firstFile = { path: "/tmp/first" }; + const secondFile = { path: "/tmp/second" }; + + assert.deepEqual(getUploadedFiles([firstFile, secondFile]), [ + firstFile, + secondFile, + ]); + assert.deepEqual(getUploadedFiles({ pic: [firstFile], art: [secondFile] }), [ + firstFile, + secondFile, + ]); + assert.deepEqual(getUploadedFiles(undefined), []); + + const temporaryDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-media-files-"), + ); + const existingFile = path.join(temporaryDirectory, "existing.tmp"); + const missingFile = path.join(temporaryDirectory, "missing.tmp"); + await fs.writeFile(existingFile, "temporary upload"); + + try { + await cleanupFiles([existingFile, missingFile]); + assert.equal( + await fs + .stat(existingFile) + .then(() => true) + .catch(() => false), + false, + ); + } finally { + await fs.rm(temporaryDirectory, { recursive: true, force: true }); + } +}); + +test("derivative rename and cleanup cover compressed and versioned files only", async () => { + const publicDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-media-derivatives-"), + ); + const oldFilename = "old.jpg"; + const newFilename = "new.jpg"; + const originalPath = path.join(publicDirectory, "plantspic", oldFilename); + const compressedPath = path.join( + publicDirectory, + "compressed", + "plantspic", + oldFilename, + ); + + try { + await fs.mkdir(path.dirname(originalPath), { recursive: true }); + await fs.mkdir(path.dirname(compressedPath), { recursive: true }); + await fs.writeFile(originalPath, "original"); + await fs.writeFile(compressedPath, "compressed"); + for (const width of VARIANT_WIDTHS) { + const variantPath = getVariantFilePath( + `/plantspic/${oldFilename}`, + width, + publicDirectory, + ); + await fs.mkdir(path.dirname(variantPath), { recursive: true }); + await fs.writeFile(variantPath, `variant-${width}`); + } + + const renameResult = await renamePlantMediaDerivatives( + oldFilename, + newFilename, + { publicDirectory }, + ); + assert.equal(renameResult.compressed, "renamed"); + assert.deepEqual( + renameResult.variants.map(({ status, width }) => ({ status, width })), + VARIANT_WIDTHS.map((width) => ({ status: "renamed", width })), + ); + assert.equal(await fs.readFile(originalPath, "utf8"), "original"); + + const cleanupResult = await cleanupPlantMediaDerivatives(newFilename, { + publicDirectory, + }); + assert.equal(cleanupResult.compressed, "removed"); + assert.deepEqual( + cleanupResult.variants.map(({ status, width }) => ({ status, width })), + VARIANT_WIDTHS.map((width) => ({ status: "removed", width })), + ); + assert.equal(await fs.readFile(originalPath, "utf8"), "original"); + } finally { + await fs.rm(publicDirectory, { recursive: true, force: true }); + } +}); + +test("derivative helpers reject path traversal and do not overwrite", async () => { + const publicDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-media-no-overwrite-"), + ); + const compressedDirectory = path.join( + publicDirectory, + "compressed", + "plantspic", + ); + + try { + await fs.mkdir(compressedDirectory, { recursive: true }); + await fs.writeFile(path.join(compressedDirectory, "old.jpg"), "old"); + await fs.writeFile(path.join(compressedDirectory, "new.jpg"), "new"); + const result = await renamePlantMediaDerivatives("old.jpg", "new.jpg", { + publicDirectory, + }); + assert.equal(result.compressed, "destination-exists"); + assert.equal( + await fs.readFile(path.join(compressedDirectory, "old.jpg"), "utf8"), + "old", + ); + assert.equal( + await fs.readFile(path.join(compressedDirectory, "new.jpg"), "utf8"), + "new", + ); + await assert.rejects( + cleanupPlantMediaDerivatives("../outside.jpg", { publicDirectory }), + /directory path/, + ); + } finally { + await fs.rm(publicDirectory, { recursive: true, force: true }); + } +}); diff --git a/test/media-metrics.test.js b/test/media-metrics.test.js new file mode 100644 index 0000000..a5d7763 --- /dev/null +++ b/test/media-metrics.test.js @@ -0,0 +1,95 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs/promises"); +const os = require("node:os"); +const path = require("node:path"); +const { test } = require("node:test"); +const sharp = require("sharp"); + +const { getVariantFilePath } = require("../services/imageVariants"); +const { collectMediaMetrics } = require("../scripts/collect-media-metrics"); + +async function createImage(filePath, format, options = {}) { + await fs.mkdir(path.dirname(filePath), { recursive: true }); + let pipeline = sharp({ + create: { + width: options.width || 120, + height: options.height || 80, + channels: 3, + background: options.background || { r: 80, g: 150, b: 40 }, + }, + }); + pipeline = + format === "png" + ? pipeline.png({ compressionLevel: options.compressionLevel || 6 }) + : format === "webp" + ? pipeline.webp({ quality: options.quality || 75 }) + : pipeline.jpeg({ quality: options.quality || 90 }); + await pipeline.toFile(filePath); +} + +test("media metrics report pairing, dimensions, bytes, and no filenames", async () => { + const publicDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "biphflora-media-metrics-"), + ); + const originalDirectory = path.join(publicDirectory, "plantspic"); + const compressedDirectory = path.join( + publicDirectory, + "compressed", + "plantspic", + ); + const pairedName = "private-paired.jpg"; + const unpairedName = "private-unpaired.png"; + const orphanName = "private-orphan.jpg"; + + try { + await createImage(path.join(originalDirectory, pairedName), "jpeg", { + width: 900, + height: 600, + quality: 96, + }); + await createImage(path.join(originalDirectory, unpairedName), "png"); + await createImage(path.join(compressedDirectory, pairedName), "jpeg", { + width: 900, + height: 600, + quality: 45, + }); + await createImage(path.join(compressedDirectory, orphanName), "jpeg"); + const variantPath = getVariantFilePath( + `/plantspic/${pairedName}`, + 480, + publicDirectory, + ); + await createImage(variantPath, "webp", { + width: 480, + height: 320, + }); + + const metrics = await collectMediaMetrics({ publicDirectory }); + assert.equal(metrics.originals.fileCount, 2); + assert.equal(metrics.originals.readableImageCount, 2); + assert.equal(metrics.compressed.fileCount, 2); + assert.equal(metrics.compressed.pairing.exactFilenamePairCount, 1); + assert.equal(metrics.compressed.pairing.coveragePercent, 50); + assert.equal(metrics.compressed.pairing.orphanDerivativeCount, 1); + assert.equal(metrics.variants["480"].pairing.exactFilenamePairCount, 1); + assert.equal(metrics.variants["480"].pairing.coveragePercent, 50); + assert.equal(metrics.variants["960"].fileCount, 0); + assert.equal(metrics.variants["1600"].fileCount, 0); + assert.equal(metrics.privacy.filenamesIncluded, false); + assert.ok(Number.isFinite(metrics.compressed.pairing.sizeReductionPercent)); + assert.equal( + metrics.storage.measuredTotalBytes, + metrics.storage.originalBytes + + metrics.storage.compressedBytes + + metrics.storage.variantBytes, + ); + + const serialized = JSON.stringify(metrics); + assert.equal(serialized.includes(pairedName), false); + assert.equal(serialized.includes(unpairedName), false); + assert.equal(serialized.includes(orphanName), false); + assert.equal(serialized.includes(publicDirectory), false); + } finally { + await fs.rm(publicDirectory, { recursive: true, force: true }); + } +}); diff --git a/test/native-dependency-compat.test.js b/test/native-dependency-compat.test.js new file mode 100644 index 0000000..e66e569 --- /dev/null +++ b/test/native-dependency-compat.test.js @@ -0,0 +1,26 @@ +const assert = require("node:assert/strict"); +const { test } = require("node:test"); +const bcrypt = require("bcrypt"); +const sharp = require("sharp"); + +test("bcrypt verifies a pre-existing bcrypt hash after native upgrades", async () => { + const legacyHash = "$2b$04$jzszmk5tCZwkqDF/m8tuO./jG1Upc.A/zuzpimCUWF03Jh2aHAFk6"; + + assert.equal(await bcrypt.compare("legacy-password", legacyHash), true); + assert.equal(await bcrypt.compare("wrong-password", legacyHash), false); +}); + +test("sharp retains the image metadata API used by the compressor", async () => { + const metadata = await sharp({ + create: { + width: 4, + height: 3, + channels: 3, + background: "#4f7f3f", + }, + }).metadata(); + + assert.equal(metadata.width, 4); + assert.equal(metadata.height, 3); + assert.equal(metadata.channels, 3); +}); diff --git a/test/observability.test.js b/test/observability.test.js new file mode 100644 index 0000000..b15c19b --- /dev/null +++ b/test/observability.test.js @@ -0,0 +1,90 @@ +const assert = require("node:assert/strict"); +const { EventEmitter } = require("node:events"); +const { test } = require("node:test"); + +const { + createActorSignature, + createAuditMiddleware, + createRequestContext, + createRequestLogger, +} = require("../middleware/observability"); + +function createResponse() { + const response = new EventEmitter(); + response.statusCode = 200; + response.headers = {}; + response.setHeader = (name, value) => { + response.headers[name.toLowerCase()] = value; + }; + return response; +} + +test("request context and logs expose only bounded operational fields", () => { + const req = { + method: "GET", + originalUrl: "/catalog/names?private=query", + headers: { authorization: "Bearer secret" }, + route: { path: "/catalog/names" }, + baseUrl: "", + }; + const res = createResponse(); + const messages = []; + const times = [1_000_000n, 3_500_000n]; + + createRequestContext({ idFactory: () => "request-1" })(req, res, () => {}); + createRequestLogger({ + logger: { info: (message) => messages.push(message) }, + now: () => times.shift(), + timestamp: () => "2026-07-22T00:00:00.000Z", + })(req, res, () => {}); + res.emit("finish"); + + assert.equal(res.headers["x-request-id"], "request-1"); + assert.deepEqual(JSON.parse(messages[0]), { + event: "http_request", + timestamp: "2026-07-22T00:00:00.000Z", + requestId: "request-1", + method: "GET", + route: "/catalog/names", + status: 200, + durationMs: 2.5, + }); + assert.equal(messages[0].includes("private=query"), false); + assert.equal(messages[0].includes("Bearer secret"), false); +}); + +test("audit events are allowlisted, pseudonymous, and successful-only", async () => { + const events = []; + const middleware = createAuditMiddleware({ + enabled: true, + actorHashSecret: "audit-test-secret", + writeEvent: async (event) => events.push(event), + }); + const req = { + method: "POST", + path: "/uploadPlant", + requestId: "request-2", + user: { username: "private-member" }, + body: { raw: "must not be retained" }, + }; + const res = createResponse(); + + middleware(req, res, () => {}); + res.emit("finish"); + await new Promise((resolve) => setImmediate(resolve)); + + assert.equal(events.length, 1); + assert.equal(events[0].action, "catalog.create_requested"); + assert.equal(events[0].actorSignature, createActorSignature( + "private-member", + "audit-test-secret", + )); + assert.equal("body" in events[0], false); + assert.equal(JSON.stringify(events[0]).includes("private-member"), false); + + res.statusCode = 500; + middleware(req, res, () => {}); + res.emit("finish"); + await new Promise((resolve) => setImmediate(resolve)); + assert.equal(events.length, 1); +}); diff --git a/test/product-metrics.test.js b/test/product-metrics.test.js new file mode 100644 index 0000000..4daabc9 --- /dev/null +++ b/test/product-metrics.test.js @@ -0,0 +1,133 @@ +const assert = require("node:assert/strict"); +const test = require("node:test"); + +const { + collectProductMetrics, + formatProductMetrics, + sanitizeAuditRows, + sanitizeMonthRows, + sanitizeSearchRows, + successfulAuditMatchStage, +} = require("../scripts/collect-product-metrics"); + +test("sanitizes aggregate category rows to fixed, non-identifying output", () => { + const auditMatch = successfulAuditMatchStage().$match; + assert.deepEqual(auditMatch.status, { $gte: 200, $lt: 400 }); + assert.ok(auditMatch.action.$in.includes("media.uploaded")); + assert.deepEqual( + sanitizeAuditRows([ + { action: "media.uploaded", count: 4 }, + { action: "private-account-label", count: 2 }, + ]), + { "media.uploaded": 4, other_known_only_by_count: 2 }, + ); + assert.deepEqual( + sanitizeMonthRows([ + { month: "2026-07", count: 3 }, + { month: "private-date-label", count: 99 }, + ]), + [{ month: "2026-07", count: 3 }], + ); + const searches = sanitizeSearchRows([ + { + catalogType: "plant", + languageCategory: "cjk", + resultCount: 2, + selected: true, + count: 3, + }, + { + catalogType: "private-catalog", + languageCategory: "private-language", + resultCount: 0, + selected: false, + count: 1, + }, + ]); + assert.equal(searches.total, 4); + assert.equal(searches.successfulResultEvents, 3); + assert.equal(searches.zeroResultEvents, 1); + assert.equal(searches.byCatalogType.unknown, 1); + assert.equal(searches.byLanguageCategory.unknown, 1); + assert.equal(JSON.stringify(searches).includes("private"), false); +}); + +test("formats current counts without upgrading proxies into user claims", async () => { + const snapshot = { + current: { + plants: { + available: true, + total: 153, + approved: 152, + pending: 1, + unspecified: 0, + }, + pictures: { available: true, count: 970 }, + birdPictures: { available: true, count: 0 }, + artworks: { available: true, count: 27 }, + registeredAccounts: { available: true, count: 3 }, + }, + actualOperations: { + audits: { + available: true, + totalSuccessfulEvents: 8, + distinctActorSignatures: 2, + byAction: { "media.uploaded": 8 }, + observedTimeRange: { + start: "2026-07-01T00:00:00.000Z", + end: "2026-07-20T00:00:00.000Z", + }, + }, + searches: { + available: true, + total: 12, + successfulResultEvents: 9, + zeroResultEvents: 3, + observedTimeRange: { + start: "2026-07-01T00:00:00.000Z", + end: "2026-07-20T00:00:00.000Z", + }, + }, + }, + attribution: { + available: true, + distinctCurrentAttributionLabels: 5, + labelsMatchingCurrentAccounts: 2, + }, + currentDocumentObjectIdMonthProxy: { + plants: [{ month: "2026-01", count: 4 }], + }, + }; + const fakeDb = { marker: "never serialized" }; + let receivedDb; + const output = await collectProductMetrics({ + db: fakeDb, + snapshotProvider: async (db) => { + receivedDb = db; + return snapshot; + }, + now: () => new Date("2026-07-23T00:00:00.000Z"), + }); + assert.equal(receivedDb, fakeDb); + assert.equal(output.current.registeredAccounts.count, 3); + assert.match( + output.limitations.join(" "), + /Registered accounts are not active users/, + ); + assert.match( + output.unavailable.verifiedContributors, + /not identity verification/, + ); + assert.equal(output.privacy.accountOrAttributionLabelsEmitted, false); + assert.equal(JSON.stringify(output).includes("never serialized"), false); + + const formatted = formatProductMetrics(snapshot, "2026-07-23T00:00:00.000Z"); + const accountRecord = formatted.evidenceRecords.find( + (record) => record.metric === "registered accounts", + ); + assert.match(accountRecord.limitations, /active users/); + const attributionRecord = formatted.evidenceRecords.find( + (record) => record.metric === "distinct current attribution labels", + ); + assert.match(attributionRecord.limitations, /not verified contributors/); +}); diff --git a/test/search-telemetry.test.js b/test/search-telemetry.test.js new file mode 100644 index 0000000..d0dc874 --- /dev/null +++ b/test/search-telemetry.test.js @@ -0,0 +1,35 @@ +const assert = require("node:assert/strict"); +const { test } = require("node:test"); + +const { validateSearchEvent } = require("../routes/telemetry"); + +test("search telemetry rejects raw or unbounded fields", () => { + assert.equal( + validateSearchEvent({ + catalogType: "plant", + languageCategory: "latin_script", + resultCount: 3, + selected: true, + }), + true, + ); + assert.equal( + validateSearchEvent({ + catalogType: "plant", + languageCategory: "latin_script", + resultCount: 1, + selected: false, + query: "must never be stored", + }), + false, + ); + assert.equal( + validateSearchEvent({ + catalogType: "plant", + languageCategory: "latin_script", + resultCount: 4, + selected: true, + }), + false, + ); +}); diff --git a/test/server-lifecycle.test.js b/test/server-lifecycle.test.js new file mode 100644 index 0000000..86e0e8a --- /dev/null +++ b/test/server-lifecycle.test.js @@ -0,0 +1,56 @@ +const assert = require("node:assert/strict"); +const http = require("node:http"); +const { once } = require("node:events"); +const { test } = require("node:test"); + +const { startServer } = require("../server"); + +test("server startup connects dependencies and graceful shutdown closes both layers", async () => { + let connectCalls = 0; + let disconnectCalls = 0; + let drainCalls = 0; + const runtime = { + async connect() { + connectCalls += 1; + return { ready: true }; + }, + async disconnect() { + disconnectCalls += 1; + }, + }; + const app = { + listen(port, host, callback) { + const server = http.createServer((req, res) => { + res.statusCode = 204; + res.end(); + }); + + return server.listen(port, host, callback); + }, + }; + const logger = { + info() {}, + error() {}, + }; + + const { server, shutdown } = startServer({ + appInstance: app, + runtimeInstance: runtime, + port: 0, + host: "127.0.0.1", + logger, + registerSignalHandlers: false, + drainBackgroundTasks: async () => { + drainCalls += 1; + }, + }); + + await once(server, "listening"); + await new Promise((resolve) => setImmediate(resolve)); + await shutdown("test"); + + assert.equal(connectCalls, 1); + assert.equal(disconnectCalls, 1); + assert.equal(drainCalls, 1); + assert.equal(server.listening, false); +}); diff --git a/test/traffic-metrics.test.js b/test/traffic-metrics.test.js new file mode 100644 index 0000000..71076c5 --- /dev/null +++ b/test/traffic-metrics.test.js @@ -0,0 +1,310 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs/promises"); +const os = require("node:os"); +const path = require("node:path"); +const test = require("node:test"); + +const { + classifyRoute, + collectTrafficMetrics, + parseNginxLine, +} = require("../scripts/collect-traffic-metrics"); + +function logLine({ + ip, + time, + method = "GET", + target = "/", + status = 200, + referrer = "-", + userAgent = "Mozilla/5.0 DesktopBrowser/123.4", +}) { + return `${ip} - - [${time}] "${method} ${target} HTTP/1.1" ${status} 123 "${referrer}" "${userAgent}"`; +} + +test("parses combined Nginx logs without retaining query strings as routes", () => { + const parsed = parseNginxLine( + logLine({ + ip: "203.0.113.9", + time: "22/Jul/2026:08:15:30 +0800", + target: "/search/rose?q=private", + }), + ); + assert.equal( + new Date(parsed.timestamp).toISOString(), + "2026-07-22T00:15:30.000Z", + ); + assert.equal(classifyRoute("/search/rose"), "plant_detail_or_search"); +}); + +test("collects bounded, privacy-safe request and session candidates", async (context) => { + const temporaryDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "traffic-metrics-"), + ); + context.after(() => + fs.rm(temporaryDirectory, { recursive: true, force: true }), + ); + const logPath = path.join(temporaryDirectory, "access.log"); + const desktop = "Mozilla/5.0 PrivateBrowser/123.4 SecretUA"; + const mobile = "Mozilla/5.0 (iPhone) Mobile/17.4 PrivateMobile"; + const lines = [ + logLine({ + ip: "198.51.100.1", + time: "01/Jan/2026:00:00:00 +0000", + target: "/?query=private-search-term", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.1", + time: "01/Jan/2026:00:10:00 +0000", + target: "/search/rose", + referrer: "https://private-search.example/?q=secret", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.2", + time: "01/Jun/2026:00:00:00 +0000", + target: "/databasePlant", + userAgent: mobile, + }), + logLine({ + ip: "198.51.100.2", + time: "01/Jun/2026:00:00:01 +0000", + target: "/databasePlant?repeat=secret", + userAgent: mobile, + }), + logLine({ + ip: "198.51.100.2", + time: "01/Jun/2026:00:31:00 +0000", + target: "/search/lily", + userAgent: mobile, + }), + logLine({ + ip: "198.51.100.3", + time: "22/Jul/2026:00:00:00 +0000", + target: "/aboutus", + referrer: "https://private-referrer.example/path", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.3", + time: "22/Jul/2026:00:31:00 +0000", + target: "/activities", + referrer: "https://social.example/post", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.11", + time: "22/Jul/2026:00:32:00 +0000", + method: "POST", + target: "/api/uploadPic?account=private-label", + referrer: "https://biphflora.com/upload", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.3", + time: "22/Jul/2026:00:33:00 +0000", + target: "/aboutus", + status: 500, + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.20", + time: "22/Jul/2026:00:34:00 +0000", + userAgent: "Googlebot/2.1", + }), + logLine({ + ip: "198.51.100.21", + time: "22/Jul/2026:00:35:00 +0000", + target: "/static/app.js", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.22", + time: "22/Jul/2026:00:36:00 +0000", + target: "/api/adminToggle", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.23", + time: "22/Jul/2026:00:37:00 +0000", + target: "/.env", + userAgent: desktop, + }), + logLine({ + ip: "198.51.100.24", + time: "22/Jul/2026:00:38:00 +0000", + userAgent: "curl/8.0", + }), + logLine({ + ip: "198.51.100.25", + time: "22/Jul/2026:00:39:00 +0000", + target: "/api/health/ready", + userAgent: desktop, + }), + logLine({ + ip: "127.0.0.1", + time: "22/Jul/2026:00:40:00 +0000", + userAgent: desktop, + }), + ...[0, 1, 2, 3].map((second) => + logLine({ + ip: "198.51.100.30", + time: `22/Jul/2026:00:41:0${second} +0000`, + target: `/path-${second}`, + userAgent: desktop, + }), + ), + ]; + await fs.writeFile(logPath, `${lines.join("\n")}\n`); + + const result = await collectTrafficMetrics({ + files: [logPath], + asOf: "2026-07-23T00:00:00.000Z", + secret: "test-only-secret", + options: { burstThreshold: 3 }, + }); + + const all = result.windows.all_retained_logs; + assert.equal(all.filteredRequests, 8); + assert.equal(all.documentLoadCandidates, 6); + assert.equal(all.sessionCandidateMetrics.sessionCandidates, 6); + assert.equal(result.windows.last_30_days.filteredRequests, 4); + assert.equal( + result.windows.last_30_days.averageFilteredRequestsPerCalendarDay, + 0.13, + ); + assert.equal( + result.windows.last_30_days.averageSessionCandidatesPerCalendarDay, + 0.1, + ); + assert.equal(result.windows.last_90_days.filteredRequests, 6); + assert.equal(result.windows.last_365_days.filteredRequests, 8); + assert.equal(result.filtering.rapid_duplicate_refresh, 1); + assert.equal(result.filtering.anomalous_signature_minute_burst, 4); + assert.equal(result.filtering.recognized_bot, 1); + assert.equal(result.filtering.static_asset, 1); + assert.equal(result.filtering.administration_route, 1); + assert.equal(result.filtering.obvious_scanner, 1); + assert.equal(result.filtering.automation_or_test_client, 1); + assert.equal(result.filtering.health_check, 1); + assert.equal(result.filtering.known_internal_address, 1); + assert.equal(result.successfulProductEndpointResponses.total, 1); + assert.equal( + result.successfulProductEndpointResponses.byFixedCategory + .media_upload_response, + 1, + ); + assert.deepEqual(result.peaks.highestFilteredRequestDay, { + period: "2026-07-22", + filteredRequests: 4, + }); + assert.ok(all.estimatedVisitorSignatures.value >= 3); + assert.ok(all.estimatedVisitorSignatures.value <= 5); + assert.equal(all.topRouteCategories[0].category, "about"); + assert.equal(all.topRouteCategories[0].filteredRequests, 2); + assert.deepEqual( + result.monthlyTrend.map(({ month, sessionCandidatesByStartMonth }) => ({ + month, + sessionCandidatesByStartMonth, + })), + [ + { month: "2026-01", sessionCandidatesByStartMonth: 1 }, + { month: "2026-06", sessionCandidatesByStartMonth: 2 }, + { month: "2026-07", sessionCandidatesByStartMonth: 3 }, + ], + ); + + const serialized = JSON.stringify(result); + for (const privateValue of [ + "198.51.100.1", + "SecretUA", + "private-search-term", + "private-search.example", + "private-referrer.example", + "private-label", + ]) { + assert.equal(serialized.includes(privateValue), false); + } + assert.equal(result.privacy.rawIdentifiersEmitted, false); + assert.match(result.unavailable.verifiedUniqueVisitors, /No consented/); + assert.match(result.limitations.join(" "), /crossing the window boundary/); + + await fs.appendFile( + logPath, + `${logLine({ + ip: "198.51.100.40", + time: "22/Jul/2026:00:45:00 +0000", + target: "/not-a-known-product-route", + userAgent: desktop, + })}\n`, + ); + const strictResult = await collectTrafficMetrics({ + files: [logPath], + asOf: "2026-07-23T00:00:00.000Z", + secret: "test-only-secret", + options: { burstThreshold: 3, knownRoutesOnly: true }, + }); + assert.equal(strictResult.windows.all_retained_logs.filteredRequests, 8); + assert.equal(strictResult.filtering.unrecognized_product_route, 5); + assert.equal(strictResult.filtering.knownRoutesOnly, true); +}); + +test("merges rotated logs chronologically and deduplicates by route across a minute", async (context) => { + const temporaryDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), "traffic-rotations-"), + ); + context.after(() => + fs.rm(temporaryDirectory, { recursive: true, force: true }), + ); + const firstLog = path.join(temporaryDirectory, "first.log"); + const secondLog = path.join(temporaryDirectory, "second.log"); + const common = { + ip: "198.51.100.90", + userAgent: "Mozilla/5.0 RotatedBrowser/1.0", + }; + + await fs.writeFile( + firstLog, + [ + logLine({ + ...common, + time: "01/Jan/2026:00:00:59 +0000", + target: "/aboutus", + }), + logLine({ + ...common, + time: "01/Jan/2026:00:01:01 +0000", + target: "/activities", + }), + ].join("\n") + "\n", + ); + await fs.writeFile( + secondLog, + [ + logLine({ + ...common, + time: "01/Jan/2026:00:01:02 +0000", + target: "/activities", + }), + logLine({ + ...common, + time: "01/Jan/2026:00:01:00 +0000", + target: "/aboutus", + }), + ].join("\n") + "\n", + ); + + const result = await collectTrafficMetrics({ + files: [firstLog, secondLog], + asOf: "2026-01-01T00:02:00.000Z", + secret: "test-only-secret", + }); + + assert.equal(result.sourceSummary.fileCount, 2); + assert.equal(result.windows.all_retained_logs.filteredRequests, 2); + assert.equal(result.filtering.rapid_duplicate_refresh, 2); + assert.equal(result.filtering.nonChronologicalEntries, 0); + assert.equal(result.filtering.late_beyond_reorder_window, undefined); + assert.equal(result.filtering.reorderWindowHours, 24); +});