From e3784651265477b8535f22ccf5eac07a78822c1a Mon Sep 17 00:00:00 2001 From: danis Date: Wed, 21 Jun 2023 08:21:34 +0200 Subject: [PATCH 001/133] components RowCustom & SongRow + artist banner --- back/src/song/song.controller.ts | 3 ++ front/components/RowCustom.tsx | 36 ++++++++++++++++ front/components/SongRow.tsx | 69 +++++++++++++++++++++++++++++++ front/views/ArtistDetailsView.tsx | 59 +++++++++++++++----------- 4 files changed, 144 insertions(+), 23 deletions(-) create mode 100644 front/components/RowCustom.tsx create mode 100644 front/components/SongRow.tsx diff --git a/back/src/song/song.controller.ts b/back/src/song/song.controller.ts index 63ac65e..5e69056 100644 --- a/back/src/song/song.controller.ts +++ b/back/src/song/song.controller.ts @@ -26,6 +26,7 @@ import { createReadStream, existsSync } from 'fs'; import { ApiTags, ApiUnauthorizedResponse } from '@nestjs/swagger'; import { HistoryService } from 'src/history/history.service'; import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; +import { IsDefined } from 'class-validator'; @Controller('song') @ApiTags('song') @@ -107,6 +108,7 @@ export class SongController { @Query() filter: Prisma.SongWhereInput, @Query('skip', new DefaultValuePipe(0), ParseIntPipe) skip: number, @Query('take', new DefaultValuePipe(20), ParseIntPipe) take: number, + // @Query('artistId') artistId: number, ): Promise> { try { const ret = await this.songService.songs({ @@ -115,6 +117,7 @@ export class SongController { where: { ...filter, id: filter.id ? +filter.id : undefined, + // artistId: artistId ? +artistId : undefined, }, }); return new Plage(ret, req); diff --git a/front/components/RowCustom.tsx b/front/components/RowCustom.tsx new file mode 100644 index 0000000..f72cded --- /dev/null +++ b/front/components/RowCustom.tsx @@ -0,0 +1,36 @@ +import { useColorScheme } from "react-native"; +import { RootState, useSelector } from "../state/Store"; +import { Box, Pressable } from "native-base"; + +const RowCustom = ( + props: Parameters[0] & { onPress?: () => void } +) => { + const settings = useSelector((state: RootState) => state.settings.local); + const systemColorMode = useColorScheme(); + const colorScheme = settings.colorScheme; + + return ( + + {({ isHovered, isPressed }) => ( + + {props.children} + + )} + + ); +}; + +export default RowCustom; \ No newline at end of file diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx new file mode 100644 index 0000000..1924e86 --- /dev/null +++ b/front/components/SongRow.tsx @@ -0,0 +1,69 @@ +import { HStack, Image, Text } from "native-base"; +import Song, { SongWithArtist } from "../models/Song"; +import RowCustom from "./RowCustom"; +import TextButton from "./TextButton"; + + +type SongRowProps = { + song: Song | SongWithArtist; // TODO: remove Song + onPress: () => void; +}; + +const SongRow = ({ song, onPress }: SongRowProps) => { + return ( + + + {song.name} + + + {song.name} + + + {song.artistId ?? "artist"} + + + + + + ); +}; + +export default SongRow; \ No newline at end of file diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 4485263..a1358aa 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -1,40 +1,53 @@ -import { VStack, Text, Image, Heading, IconButton, Icon, Container } from 'native-base'; +import { VStack, Text, Box, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue } from 'native-base'; import { Ionicons } from '@expo/vector-icons'; import { SafeAreaView } from 'react-native'; import { useQuery } from 'react-query'; import LoadingComponent from '../components/Loading'; import API from '../API'; - -const handleFavorite = () => { - -}; +import Song from '../models/Song'; +import SongRow from '../components/SongRow'; +import { useNavigation } from '@react-navigation/native'; const ArtistDetailsView = ({ artistId }: any) => { const { isLoading, data: artistData, error } = useQuery(['artist', artistId], () => API.getArtist(artistId)); + const screenSize = useBreakpointValue({ base: "small", md: "big" }); + const isMobileView = screenSize == "small"; + let songData = [] as Song[]; + const navigation = useNavigation(); if (isLoading) { - return ; + return
; } return ( - - {artistData?.name} - - {artistData?.name} - } - onPress={() => handleFavorite()} - variant="unstyled" - _pressed={{ opacity: 0.6 }} - /> - - + + {artistData?.name} + + Abba + + {songData.map((comp, index) => ( + { + API.createSearchHistoryEntry(comp.name, "song", Date.now()); + navigation.navigate("Song", { songId: comp.id }); + }} + /> + )) + } + + + + ); }; From 04d288b84473c8d1810841a5a5b763a8eeddbc72 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 21 Jun 2023 19:10:18 +0900 Subject: [PATCH 002/133] Add google signin/signup --- back/package-lock.json | 147 ++++++++++++++++++ back/package.json | 2 + .../20230621090510_google/migration.sql | 12 ++ back/prisma/schema.prisma | 3 +- back/src/auth/auth.controller.ts | 17 ++ back/src/auth/auth.module.ts | 3 +- back/src/auth/auth.service.ts | 2 +- back/src/auth/google.strategy.ts | 34 ++++ back/src/users/users.service.ts | 3 +- front/i18n/Translations.ts | 4 +- front/views/AuthenticationView.tsx | 7 + 11 files changed, 229 insertions(+), 5 deletions(-) create mode 100644 back/prisma/migrations/20230621090510_google/migration.sql create mode 100644 back/src/auth/google.strategy.ts diff --git a/back/package-lock.json b/back/package-lock.json index a41cbe8..017de09 100644 --- a/back/package-lock.json +++ b/back/package-lock.json @@ -24,6 +24,7 @@ "bcryptjs": "^2.4.3", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", + "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", "reflect-metadata": "^0.1.13", @@ -38,6 +39,7 @@ "@types/express": "^4.17.13", "@types/jest": "27.4.1", "@types/node": "^16.0.0", + "@types/passport-google-oauth20": "^2.0.11", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", @@ -1962,6 +1964,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA==" }, + "node_modules/@types/oauth": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", + "integrity": "sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -1976,6 +1987,28 @@ "@types/express": "*" } }, + "node_modules/@types/passport-google-oauth20": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.11.tgz", + "integrity": "sha512-9XMT1GfwhZL7UQEiCepLef55RNPHkbrCtsU7rsWPTEOsmu5qVIW8nSemtB4p+P24CuOhA+IKkv8LsPThYghGww==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-oauth2": "*" + } + }, + "node_modules/@types/passport-oauth2": { + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.12.tgz", + "integrity": "sha512-RZg6cYTyEGinrZn/7REYQds6zrTxoBorX1/fdaz5UHzkG8xdFE7QQxkJagCr2ETzGII58FAFDmnmbTUVMrltNA==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/oauth": "*", + "@types/passport": "*" + } + }, "node_modules/@types/prettier": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", @@ -2763,6 +2796,14 @@ } ] }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -6870,6 +6911,11 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7113,6 +7159,17 @@ "url": "https://github.com/sponsors/jaredhanson" } }, + "node_modules/passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "dependencies": { + "passport-oauth2": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/passport-jwt": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", @@ -7133,6 +7190,25 @@ "node": ">= 0.4.0" } }, + "node_modules/passport-oauth2": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.7.0.tgz", + "integrity": "sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ==", + "dependencies": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, "node_modules/passport-strategy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", @@ -8775,6 +8851,11 @@ "node": ">=4.2.0" } }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -10691,6 +10772,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA==" }, + "@types/oauth": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", + "integrity": "sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -10705,6 +10795,28 @@ "@types/express": "*" } }, + "@types/passport-google-oauth20": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.11.tgz", + "integrity": "sha512-9XMT1GfwhZL7UQEiCepLef55RNPHkbrCtsU7rsWPTEOsmu5qVIW8nSemtB4p+P24CuOhA+IKkv8LsPThYghGww==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-oauth2": "*" + } + }, + "@types/passport-oauth2": { + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.12.tgz", + "integrity": "sha512-RZg6cYTyEGinrZn/7REYQds6zrTxoBorX1/fdaz5UHzkG8xdFE7QQxkJagCr2ETzGII58FAFDmnmbTUVMrltNA==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/oauth": "*", + "@types/passport": "*" + } + }, "@types/prettier": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", @@ -11301,6 +11413,11 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -14452,6 +14569,11 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14624,6 +14746,14 @@ "utils-merge": "^1.0.1" } }, + "passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "requires": { + "passport-oauth2": "1.x.x" + } + }, "passport-jwt": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", @@ -14641,6 +14771,18 @@ "passport-strategy": "1.x.x" } }, + "passport-oauth2": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.7.0.tgz", + "integrity": "sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ==", + "requires": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, "passport-strategy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", @@ -15831,6 +15973,11 @@ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true }, + "uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", diff --git a/back/package.json b/back/package.json index 2be88c8..217d059 100644 --- a/back/package.json +++ b/back/package.json @@ -36,6 +36,7 @@ "bcryptjs": "^2.4.3", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", + "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", "reflect-metadata": "^0.1.13", @@ -50,6 +51,7 @@ "@types/express": "^4.17.13", "@types/jest": "27.4.1", "@types/node": "^16.0.0", + "@types/passport-google-oauth20": "^2.0.11", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", diff --git a/back/prisma/migrations/20230621090510_google/migration.sql b/back/prisma/migrations/20230621090510_google/migration.sql new file mode 100644 index 0000000..b4bb7c2 --- /dev/null +++ b/back/prisma/migrations/20230621090510_google/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - A unique constraint covering the columns `[googleID]` on the table `User` will be added. If there are existing duplicate values, this will fail. + +*/ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "googleID" TEXT, +ALTER COLUMN "password" DROP NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "User_googleID_key" ON "User"("googleID"); diff --git a/back/prisma/schema.prisma b/back/prisma/schema.prisma index bebd22c..8eeed4a 100644 --- a/back/prisma/schema.prisma +++ b/back/prisma/schema.prisma @@ -12,8 +12,9 @@ datasource db { model User { id Int @id @default(autoincrement()) username String @unique - password String + password String? email String + googleID String? @unique isGuest Boolean @default(false) partyPlayed Int @default(0) LessonHistory LessonHistory[] diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index db904d8..bd69b01 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -12,6 +12,7 @@ import { InternalServerErrorException, Patch, NotFoundException, + Req, } from '@nestjs/common'; import { AuthService } from './auth.service'; import { JwtAuthGuard } from './jwt-auth.guard'; @@ -32,6 +33,7 @@ import { Profile } from './dto/profile.dto'; import { Setting } from 'src/models/setting'; import { UpdateSettingDto } from 'src/settings/dto/update-setting.dto'; import { SettingsService } from 'src/settings/settings.service'; +import { AuthGuard } from '@nestjs/passport'; @ApiTags('auth') @Controller('auth') @@ -42,6 +44,21 @@ export class AuthController { private settingsService: SettingsService, ) {} + @Get("login/google") + @UseGuards(AuthGuard('google')) + googleLogin() { } + + @Get("logged/google") + @UseGuards(AuthGuard('google')) + async googleLoginCallbakc(@Req() req: any) { + let user = await this.usersService.user({googleID: req.id}); + if (!user) { + user = await this.usersService.createUser(req) + await this.settingsService.createUserSetting(user.id); + } + return this.authService.login(user); + } + @Post('register') async register(@Body() registerDto: RegisterDto): Promise { try { diff --git a/back/src/auth/auth.module.ts b/back/src/auth/auth.module.ts index 7ac9c82..c5fee1f 100644 --- a/back/src/auth/auth.module.ts +++ b/back/src/auth/auth.module.ts @@ -9,6 +9,7 @@ import { ConfigModule } from '@nestjs/config'; import { ConfigService } from '@nestjs/config'; import { JwtStrategy } from './jwt.strategy'; import { SettingsModule } from 'src/settings/settings.module'; +import { GoogleStrategy } from './google.strategy'; @Module({ imports: [ @@ -25,7 +26,7 @@ import { SettingsModule } from 'src/settings/settings.module'; inject: [ConfigService], }), ], - providers: [AuthService, LocalStrategy, JwtStrategy], + providers: [AuthService, LocalStrategy, JwtStrategy, GoogleStrategy], controllers: [AuthController], }) export class AuthModule {} diff --git a/back/src/auth/auth.service.ts b/back/src/auth/auth.service.ts index 1568cd8..c733207 100644 --- a/back/src/auth/auth.service.ts +++ b/back/src/auth/auth.service.ts @@ -15,7 +15,7 @@ export class AuthService { password: string, ): Promise { const user = await this.userService.user({ username }); - if (user && bcrypt.compareSync(password, user.password)) { + if (user && user.password && bcrypt.compareSync(password, user.password)) { return { username: user.username, id: user.id, diff --git a/back/src/auth/google.strategy.ts b/back/src/auth/google.strategy.ts new file mode 100644 index 0000000..9fb2406 --- /dev/null +++ b/back/src/auth/google.strategy.ts @@ -0,0 +1,34 @@ +import { PassportStrategy } from '@nestjs/passport'; +import { Strategy, VerifyCallback } from 'passport-google-oauth20'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class GoogleStrategy extends PassportStrategy(Strategy) { + constructor() { + super({ + clientID: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_SECRET, + callbackURL: 'http://localhost:3000/google/redirect', + scope: ['email', 'profile'], + }); + } + + async validate( + _accessToken: string, + _refreshToken: string, + profile: any, + done: VerifyCallback, + ): Promise { + console.log(profile); + const { name, emails, photos, username } = profile; + const user = { + email: emails[0].value, + username, + password: null, + // firstName: name.givenName, + // lastName: name.familyName, + // picture: photos[0].value, + }; + done(null, user); + } +} diff --git a/back/src/users/users.service.ts b/back/src/users/users.service.ts index 0bcfab8..1cbfc20 100644 --- a/back/src/users/users.service.ts +++ b/back/src/users/users.service.ts @@ -34,7 +34,8 @@ export class UsersService { } async createUser(data: Prisma.UserCreateInput): Promise { - data.password = await bcrypt.hash(data.password, 8); + if (data.password) + data.password = await bcrypt.hash(data.password, 8); return this.prisma.user.create({ data, }); diff --git a/front/i18n/Translations.ts b/front/i18n/Translations.ts index 014ed86..96f33cb 100644 --- a/front/i18n/Translations.ts +++ b/front/i18n/Translations.ts @@ -7,6 +7,7 @@ export const en = { signOutBtn: 'Sign out', signInBtn: 'Sign in', signUpBtn: 'Sign up', + continuewithgoogle: 'Continue with Google', changeLanguageBtn: 'Change language', search: 'Search', login: 'Login', @@ -189,6 +190,7 @@ export const fr: typeof en = { welcomeMessage: 'Re-Bonjour ', signOutBtn: 'Se déconnecter', signInBtn: 'Se connecter', + continuewithgoogle: 'Continuer avec Google', changeLanguageBtn: 'Changer la langue', searchBtn: 'Rechercher', playBtn: 'Jouer', @@ -362,7 +364,7 @@ export const fr: typeof en = { noRecentSearches: 'Aucune recherche récente', }; -export const sp: typeof en = { +export const sp: Partial = { error: 'Error', anErrorOccured: 'ocurrió un error', goBackHome: 'regresar a casa', diff --git a/front/views/AuthenticationView.tsx b/front/views/AuthenticationView.tsx index a0a463c..df8eee4 100644 --- a/front/views/AuthenticationView.tsx +++ b/front/views/AuthenticationView.tsx @@ -78,6 +78,13 @@ const AuthenticationView = ({ isSignup }: RouteProps) = {translate('forgottenPassword')} )} + window.location.href = "/api/login/google"} + /> Date: Fri, 23 Jun 2023 00:12:25 +0900 Subject: [PATCH 003/133] Add google things on the front --- back/src/auth/auth.controller.ts | 4 ++-- back/src/auth/google.strategy.ts | 11 ++++++----- front/API.ts | 2 +- front/Navigation.tsx | 6 ++++++ front/nginx.conf.template | 2 +- front/views/AuthenticationView.tsx | 16 ++++++++-------- front/views/GoogleView.tsx | 23 +++++++++++++++++++++++ 7 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 front/views/GoogleView.tsx diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index bd69b01..d4320bf 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -51,9 +51,9 @@ export class AuthController { @Get("logged/google") @UseGuards(AuthGuard('google')) async googleLoginCallbakc(@Req() req: any) { - let user = await this.usersService.user({googleID: req.id}); + let user = await this.usersService.user({googleID: req.user.googleID}); if (!user) { - user = await this.usersService.createUser(req) + user = await this.usersService.createUser(req.user) await this.settingsService.createUserSetting(user.id); } return this.authService.login(user); diff --git a/back/src/auth/google.strategy.ts b/back/src/auth/google.strategy.ts index 9fb2406..60dbf61 100644 --- a/back/src/auth/google.strategy.ts +++ b/back/src/auth/google.strategy.ts @@ -1,6 +1,7 @@ import { PassportStrategy } from '@nestjs/passport'; import { Strategy, VerifyCallback } from 'passport-google-oauth20'; import { Injectable } from '@nestjs/common'; +import { User } from '@prisma/client'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy) { @@ -8,7 +9,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy) { super({ clientID: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_SECRET, - callbackURL: 'http://localhost:3000/google/redirect', + callbackURL: process.env.GOOGLE_CALLBACK_URL, scope: ['email', 'profile'], }); } @@ -19,16 +20,16 @@ export class GoogleStrategy extends PassportStrategy(Strategy) { profile: any, done: VerifyCallback, ): Promise { - console.log(profile); - const { name, emails, photos, username } = profile; const user = { - email: emails[0].value, - username, + email: profile.emails[0].value, + username: profile.displayName, password: null, + googleID: profile.id, // firstName: name.givenName, // lastName: name.familyName, // picture: photos[0].value, }; done(null, user); + return user; } } diff --git a/front/API.ts b/front/API.ts index 3f0b407..39d54d6 100644 --- a/front/API.ts +++ b/front/API.ts @@ -47,7 +47,7 @@ export class APIError extends Error { } // we will need the same thing for the scorometer API url -const baseAPIUrl = +export const baseAPIUrl = process.env.NODE_ENV != 'development' && Platform.OS === 'web' ? '/api' : Constants.manifest?.extra?.apiUrl; diff --git a/front/Navigation.tsx b/front/Navigation.tsx index 011967b..10c759a 100644 --- a/front/Navigation.tsx +++ b/front/Navigation.tsx @@ -28,6 +28,7 @@ import { Button, Center, VStack } from 'native-base'; import { unsetAccessToken } from './state/UserSlice'; import TextButton from './components/TextButton'; import ErrorView from './views/ErrorView'; +import GoogleView from './views/GoogleView'; // Util function to hide route props in URL const removeMe = () => ''; @@ -100,6 +101,11 @@ const publicRoutes = () => options: { title: 'Oops', headerShown: false }, link: undefined, }, + Google: { + component: GoogleView, + options: { title: 'Google signin', headerShown: false }, + link: '/logged/google', + }, } as const); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/front/nginx.conf.template b/front/nginx.conf.template index d2e1042..9baf3ed 100644 --- a/front/nginx.conf.template +++ b/front/nginx.conf.template @@ -22,4 +22,4 @@ server { proxy_set_header Connection $http_connection; proxy_http_version 1.1; } -} \ No newline at end of file +} diff --git a/front/views/AuthenticationView.tsx b/front/views/AuthenticationView.tsx index df8eee4..1f18f72 100644 --- a/front/views/AuthenticationView.tsx +++ b/front/views/AuthenticationView.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useDispatch } from '../state/Store'; import { Translate, translate } from '../i18n/i18n'; -import API, { APIError } from '../API'; +import API, { APIError, baseAPIUrl } from '../API'; import { setAccessToken } from '../state/UserSlice'; import { Center, Button, Text } from 'native-base'; import SigninForm from '../components/forms/signinform'; @@ -56,6 +56,13 @@ const AuthenticationView = ({ isSignup }: RouteProps) = + window.location.href = `${baseAPIUrl}/auth/login/google`} + /> {mode === 'signin' ? ( @@ -78,13 +85,6 @@ const AuthenticationView = ({ isSignup }: RouteProps) = {translate('forgottenPassword')} )} - window.location.href = "/api/login/google"} - /> { + const dispatch = useDispatch(); + + useEffect(() => { + async function run() { + const accessToken = await API.fetch({ + route: `/auth/logged/google${window.location.search}`, + method: 'GET', + }).then((responseBody) => responseBody.access_token as AccessToken) + dispatch(setAccessToken(accessToken)) + } + run(); + }, []); + + return

Loading please wait

; +} + +export default GoogleView; From ccc86895e2e264dfe2ffd28f7fde0e53868b4681 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 23 Jun 2023 00:58:39 +0900 Subject: [PATCH 004/133] Add an indicator of the google account on the front --- front/API.ts | 35 ++++++++++---------- front/models/User.ts | 1 + front/views/settings/SettingsProfileView.tsx | 11 ++++++ 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/front/API.ts b/front/API.ts index 39d54d6..68037ca 100644 --- a/front/API.ts +++ b/front/API.ts @@ -151,6 +151,7 @@ export default class API { name: (user.username ?? user.name) as string, email: user.email as string, premium: false, + googleID: user.googleID as string, isGuest: user.isGuest as boolean, data: { gamesPlayed: user.partyPlayed as number, @@ -232,16 +233,16 @@ export default class API { // To be fixed with #168 // eslint-disable-next-line @typescript-eslint/no-explicit-any (song: any) => - ({ - id: song.id as number, - name: song.name as string, - artistId: song.artistId as number, - albumId: song.albumId as number, - genreId: song.genreId as number, - details: song.difficulties, - cover: `${baseAPIUrl}/song/${song.id}/illustration`, - metrics: {}, - } as Song) + ({ + id: song.id as number, + name: song.name as string, + artistId: song.artistId as number, + albumId: song.albumId as number, + genreId: song.genreId as number, + details: song.difficulties, + cover: `${baseAPIUrl}/song/${song.id}/illustration`, + metrics: {}, + } as Song) ); }, }; @@ -474,13 +475,13 @@ export default class API { // To be fixed with #168 // eslint-disable-next-line @typescript-eslint/no-explicit-any (e: any) => - ({ - id: e.id, - query: e.query, - type: e.type, - userId: e.userId, - timestamp: new Date(e.searchDate), - } as SearchHistory) + ({ + id: e.id, + query: e.query, + type: e.type, + userId: e.userId, + timestamp: new Date(e.searchDate), + } as SearchHistory) ) ), }; diff --git a/front/models/User.ts b/front/models/User.ts index 8543fb9..f212ffd 100644 --- a/front/models/User.ts +++ b/front/models/User.ts @@ -5,6 +5,7 @@ import UserSettings from './UserSettings'; interface User extends Model { name: string; email: string; + googleID: string; isGuest: boolean; premium: boolean; data: UserData; diff --git a/front/views/settings/SettingsProfileView.tsx b/front/views/settings/SettingsProfileView.tsx index 4a0b40c..5e9c244 100644 --- a/front/views/settings/SettingsProfileView.tsx +++ b/front/views/settings/SettingsProfileView.tsx @@ -87,6 +87,17 @@ const ProfileSettings = ({ navigation }: { navigation: any }) => { text: user.id.toString(), }, }, + { + type: 'text', + title: 'Google Account', + data: { + text: user.googleID ? "Linked" : "Not linked" + }, + // type: 'custom', + // data: user.googleID + // ? + // : , + }, { type: 'text', title: translate('nbGamesPlayed'), From 3d76834f450cc04f61b4a0b88deb1f6ceb9decdc Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Mon, 26 Jun 2023 15:00:35 +0100 Subject: [PATCH 005/133] Front: Add Missing Translation + Prettier --- front/API.ts | 34 ++++++++++---------- front/i18n/Translations.ts | 3 +- front/views/AuthenticationView.tsx | 4 +-- front/views/GoogleView.tsx | 14 ++++---- front/views/settings/SettingsProfileView.tsx | 2 +- 5 files changed, 29 insertions(+), 28 deletions(-) diff --git a/front/API.ts b/front/API.ts index 68037ca..9cf114f 100644 --- a/front/API.ts +++ b/front/API.ts @@ -233,16 +233,16 @@ export default class API { // To be fixed with #168 // eslint-disable-next-line @typescript-eslint/no-explicit-any (song: any) => - ({ - id: song.id as number, - name: song.name as string, - artistId: song.artistId as number, - albumId: song.albumId as number, - genreId: song.genreId as number, - details: song.difficulties, - cover: `${baseAPIUrl}/song/${song.id}/illustration`, - metrics: {}, - } as Song) + ({ + id: song.id as number, + name: song.name as string, + artistId: song.artistId as number, + albumId: song.albumId as number, + genreId: song.genreId as number, + details: song.difficulties, + cover: `${baseAPIUrl}/song/${song.id}/illustration`, + metrics: {}, + } as Song) ); }, }; @@ -475,13 +475,13 @@ export default class API { // To be fixed with #168 // eslint-disable-next-line @typescript-eslint/no-explicit-any (e: any) => - ({ - id: e.id, - query: e.query, - type: e.type, - userId: e.userId, - timestamp: new Date(e.searchDate), - } as SearchHistory) + ({ + id: e.id, + query: e.query, + type: e.type, + userId: e.userId, + timestamp: new Date(e.searchDate), + } as SearchHistory) ) ), }; diff --git a/front/i18n/Translations.ts b/front/i18n/Translations.ts index 96f33cb..3b783ed 100644 --- a/front/i18n/Translations.ts +++ b/front/i18n/Translations.ts @@ -364,7 +364,7 @@ export const fr: typeof en = { noRecentSearches: 'Aucune recherche récente', }; -export const sp: Partial = { +export const sp: typeof en = { error: 'Error', anErrorOccured: 'ocurrió un error', goBackHome: 'regresar a casa', @@ -547,4 +547,5 @@ export const sp: Partial = { recentSearches: 'Búsquedas recientes', noRecentSearches: 'No hay búsquedas recientes', + continuewithgoogle: 'Continuar con Google', }; diff --git a/front/views/AuthenticationView.tsx b/front/views/AuthenticationView.tsx index 1f18f72..9e57b35 100644 --- a/front/views/AuthenticationView.tsx +++ b/front/views/AuthenticationView.tsx @@ -57,11 +57,11 @@ const AuthenticationView = ({ isSignup }: RouteProps) = window.location.href = `${baseAPIUrl}/auth/login/google`} + onPress={() => (window.location.href = `${baseAPIUrl}/auth/login/google`)} /> {mode === 'signin' ? ( { const dispatch = useDispatch(); @@ -11,13 +11,13 @@ const GoogleView = () => { const accessToken = await API.fetch({ route: `/auth/logged/google${window.location.search}`, method: 'GET', - }).then((responseBody) => responseBody.access_token as AccessToken) - dispatch(setAccessToken(accessToken)) + }).then((responseBody) => responseBody.access_token as AccessToken); + dispatch(setAccessToken(accessToken)); } run(); }, []); return

Loading please wait

; -} +}; export default GoogleView; diff --git a/front/views/settings/SettingsProfileView.tsx b/front/views/settings/SettingsProfileView.tsx index 5e9c244..a2ff6a0 100644 --- a/front/views/settings/SettingsProfileView.tsx +++ b/front/views/settings/SettingsProfileView.tsx @@ -91,7 +91,7 @@ const ProfileSettings = ({ navigation }: { navigation: any }) => { type: 'text', title: 'Google Account', data: { - text: user.googleID ? "Linked" : "Not linked" + text: user.googleID ? 'Linked' : 'Not linked', }, // type: 'custom', // data: user.googleID From b2247e79ae1522ee188bf2ee9f82cb7479b70adc Mon Sep 17 00:00:00 2001 From: danis Date: Wed, 28 Jun 2023 09:11:49 +0200 Subject: [PATCH 006/133] having a bug with api :/ --- front/API.ts | 25 +++++++++++++++++++++++++ front/components/SongRow.tsx | 5 ++++- front/views/ArtistDetailsView.tsx | 17 +++++++++++++---- front/views/SearchView.tsx | 2 +- 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/front/API.ts b/front/API.ts index 4d2d3b7..05b8e7a 100644 --- a/front/API.ts +++ b/front/API.ts @@ -237,6 +237,31 @@ export default class API { ); } + /** + * @description retrieves songs from a specific artist + * @param artistId is the id of the artist that composed the songs aimed + * @param skip is how much songs do we skip before returning the list + * @param take is how much songs should be returned + * @returns a Promise of Songs type array + */ + public static async getSongsByArtist(artistId: number): Promise { + // let queryString = `/song?artisId=${artistId}`; + + // if (skip) { + // queryString = `${queryString}&skip=${skip}`; + // } + // if (take) { + // queryString = `${queryString}&take=${take}`; + // } + // return await API.fetch({ + // route: queryString, + // }); + + return API.fetch({ + route: `/song?artistId=${artistId}`, + }); + } + /** * Retrieve a song * @param songId the id to find the song diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx index 1924e86..a122e40 100644 --- a/front/components/SongRow.tsx +++ b/front/components/SongRow.tsx @@ -20,6 +20,8 @@ const SongRow = ({ song, onPress }: SongRowProps) => { style={{ zIndex: 0, aspectRatio: 1, borderRadius: 5 }} source={{ uri: song.cover }} alt={song.name} + borderColor={'white'} + borderWidth={1} /> { flexShrink: 1, }} isTruncated - pl={10} + pl={5} maxW={"100%"} bold fontSize="md" @@ -59,6 +61,7 @@ const SongRow = ({ song, onPress }: SongRowProps) => { colorScheme="primary" variant={"outline"} size="sm" + mr={5} onPress={onPress} /> diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 178632c..e7ef854 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -7,15 +7,24 @@ import API from '../API'; import Song from '../models/Song'; import SongRow from '../components/SongRow'; import { useNavigation } from '@react-navigation/native'; +import { useEffect, useState } from 'react'; const ArtistDetailsView = ({ artistId }: any) => { - const { isLoading, data: artistData, error } = useQuery(['artist', artistId], () => API.getArtist(artistId)); + const { isLoading: isLoadingArtist, data: artistData, error: errorArtist } = useQuery(['artist', artistId], () => API.getArtist(artistId)); + // const { isLoading: isLoadingSongs, data: songData = [], error: errorSongs } = useQuery(['songs', artistId], () => API.getSongsByArtist(artistId)) const screenSize = useBreakpointValue({ base: "small", md: "big" }); const isMobileView = screenSize == "small"; - let songData = [] as Song[]; const navigation = useNavigation(); + const [merde, setMerde] = useState(null); - if (isLoading) { + useEffect(() => { + // Code to be executed when the component is focused + console.warn('Component focused!'); + setMerde(API.getSongsByArtist(112)); + // Call your function or perform any other actions here + }, []); + + if (isLoadingArtist) { return
; } @@ -33,7 +42,7 @@ const ArtistDetailsView = ({ artistId }: any) => { Abba - {songData.map((comp, index) => ( + {merde.map((comp, index) => ( ) => { const { isLoading: isLoadingSong, data: songData = [] } = useQuery( ['song', stringQuery], - () => API.searchSongs(stringQuery), + () => API.getSongsByArtist(112), { enabled: !!stringQuery } ); From 27f79452891806128e76623b28f966f9630612ef Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Thu, 29 Jun 2023 15:02:06 +0100 Subject: [PATCH 007/133] Front: Use React-Native feature to handle Google Redirections --- front/views/AuthenticationView.tsx | 3 ++- front/views/GoogleView.tsx | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/front/views/AuthenticationView.tsx b/front/views/AuthenticationView.tsx index 9e57b35..7f63779 100644 --- a/front/views/AuthenticationView.tsx +++ b/front/views/AuthenticationView.tsx @@ -8,6 +8,7 @@ import SigninForm from '../components/forms/signinform'; import SignupForm from '../components/forms/signupform'; import TextButton from '../components/TextButton'; import { RouteProps, useNavigation } from '../Navigation'; +import * as Linking from 'expo-linking'; const hanldeSignin = async ( username: string, @@ -61,7 +62,7 @@ const AuthenticationView = ({ isSignup }: RouteProps) = variant="outline" marginTop={5} colorScheme="primary" - onPress={() => (window.location.href = `${baseAPIUrl}/auth/login/google`)} + onPress={() => Linking.openURL(`${baseAPIUrl}/auth/login/google`)} /> {mode === 'signin' ? ( { const dispatch = useDispatch(); + const route = useRoute(); useEffect(() => { + const params = route.path?.replace('/logged/google', ''); async function run() { const accessToken = await API.fetch({ - route: `/auth/logged/google${window.location.search}`, + route: `/auth/logged/google${params}`, method: 'GET', }).then((responseBody) => responseBody.access_token as AccessToken); dispatch(setAccessToken(accessToken)); @@ -17,7 +21,7 @@ const GoogleView = () => { run(); }, []); - return

Loading please wait

; + return Loading please wait; }; export default GoogleView; From 350a4870cddb23de3e182deae6d21b072e130e1b Mon Sep 17 00:00:00 2001 From: Arthur Jamet <60505370+Arthi-chaud@users.noreply.github.com> Date: Mon, 3 Jul 2023 06:46:16 +0100 Subject: [PATCH 008/133] Front: WebSocket Connection: Fix (#244) --- front/views/PlayView.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 117462d..652b61e 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -32,7 +32,7 @@ import PartitionView from '../components/PartitionView'; import TextButton from '../components/TextButton'; import { MIDIAccess, MIDIMessageEvent, requestMIDIAccess } from '@motiz88/react-native-midi'; import * as Linking from 'expo-linking'; -import { URL } from 'url'; +import url from 'url'; type PlayViewProps = { songId: number; @@ -48,9 +48,9 @@ type ScoreMessage = { let scoroBaseApiUrl = Constants.manifest?.extra?.scoroUrl; if (process.env.NODE_ENV != 'development' && Platform.OS === 'web') { - Linking.getInitialURL().then((url) => { - if (url !== null) { - const location = new URL(url); + Linking.getInitialURL().then((initUrl) => { + if (initUrl !== null) { + const location = url.parse(initUrl); if (location.protocol === 'https:') { scoroBaseApiUrl = 'wss://' + location.host + '/ws'; } else { From 28716eeab25720e2b482219adbeece39034f56c9 Mon Sep 17 00:00:00 2001 From: danis Date: Wed, 5 Jul 2023 09:26:45 +0200 Subject: [PATCH 009/133] init genreDetailsView --- back/src/song/song.controller.ts | 6 ++++++ back/src/song/song.service.ts | 8 ++++++++ front/API.ts | 30 ++++++++++++++++++++++++++---- front/views/ArtistDetailsView.tsx | 20 ++++++-------------- front/views/GenreDetailsView.tsx | 14 ++++++++++++++ 5 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 front/views/GenreDetailsView.tsx diff --git a/back/src/song/song.controller.ts b/back/src/song/song.controller.ts index a80a31b..be725ed 100644 --- a/back/src/song/song.controller.ts +++ b/back/src/song/song.controller.ts @@ -146,4 +146,10 @@ export class SongController { songId: id, }); } + + @Get('/artist/:artistId') + async getSongByArtist(@Param('artistId', ParseIntPipe) artistId: number) { + const res = await this.songService.songByArtist(artistId) + return res; + } } diff --git a/back/src/song/song.service.ts b/back/src/song/song.service.ts index 4a7a285..de7aa02 100644 --- a/back/src/song/song.service.ts +++ b/back/src/song/song.service.ts @@ -6,6 +6,14 @@ import { PrismaService } from 'src/prisma/prisma.service'; export class SongService { constructor(private prisma: PrismaService) {} + async songByArtist(data: number): Promise { + return this.prisma.song.findMany({ + where: { + artistId: {equals: data}, + }, + }); + } + async createSong(data: Prisma.SongCreateInput): Promise { return this.prisma.song.create({ data, diff --git a/front/API.ts b/front/API.ts index b75cc0a..5e30e63 100644 --- a/front/API.ts +++ b/front/API.ts @@ -278,10 +278,32 @@ export default class API { * @param artistId is the id of the artist that composed the songs aimed * @returns a Promise of Songs type array */ - public static async getSongsByArtist(artistId: number): Promise { - return API.fetch({ - route: `/song?artistId=${artistId}`, - }); + public static getSongsByArtist(artistId: string): Query { + return { + key: ['songs', artistId], + exec: async () => { + const songs = await API.fetch({ + route: `/song/artist/${artistId}`, + }); + + // this is a dummy illustration, we will need to fetch the real one from the API + return songs.data.map( + // To be fixed with #168 + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (song: any) => + ({ + id: song.id as number, + name: song.name as string, + artistId: song.artistId as number, + albumId: song.albumId as number, + genreId: song.genreId as number, + details: song.difficulties, + cover: `${baseAPIUrl}/song/${song.id}/illustration`, + metrics: {}, + } as Song) + ); + }, + }; } /** diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 2e5e088..9b07677 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -10,25 +10,17 @@ import { Key, useEffect, useState } from 'react'; import { useNavigation } from '../Navigation'; const ArtistDetailsView = ({ artistId }: any) => { - const { isLoading, data: artistData, isError } = useQuery(API.getArtist(artistId)); - // const { isLoading: isLoadingSongs, data: songData = [], error: errorSongs } = useQuery(['songs', artistId], () => API.getSongsByArtist(artistId)) + const { isLoading: isLoadingArt, data: artistData, error: isErrorArt } = useQuery(API.getArtist(artistId)); + const { isLoading: isLoadingSong, data: songData = [], error: isErrorSong } = useQuery(API.getSongsByArtist(artistId)); const screenSize = useBreakpointValue({ base: "small", md: "big" }); const isMobileView = screenSize == "small"; const navigation = useNavigation(); - const [merde, setMerde] = useState(null); - useEffect(() => { - // Code to be executed when the component is focused - console.warn('Component focused!'); - setMerde(API.getSongsByArtist(112)); - // Call your function or perform any other actions here - }, []); - - if (isLoading) { + if (isLoadingArt) { return ; } - if (isError) { + if (isErrorArt) { navigation.navigate('Error'); } @@ -44,9 +36,9 @@ const ArtistDetailsView = ({ artistId }: any) => { resizeMode='cover' /> - Abba + {artistData?.name} - {merde.map((comp: Song | SongWithArtist, index: Key | null | undefined) => ( + {songData.map((comp: Song | SongWithArtist, index: Key | null | undefined) => ( { + return ( + + + + + + ); +} \ No newline at end of file From 10d1342294f1fb25eb75dbcd5539c951d74c47cd Mon Sep 17 00:00:00 2001 From: Arthur Jamet <60505370+Arthi-chaud@users.noreply.github.com> Date: Wed, 5 Jul 2023 09:22:55 +0100 Subject: [PATCH 010/133] Front: Api models validation (#245) * Front: Model: Write Validators * Front: Plage response validator * Front: API: Typing 'fetch' return * Front: Basic Models: Response Handlers * Front: API: Validate authentication response * Front: Validate Search History * Front: Validate Responses of User updates * Front: On Validation Error, more verbose console error --- front/API.ts | 414 ++++++++++++++-------------- front/models/AccessTokenResponse.ts | 13 + front/models/Album.ts | 10 +- front/models/Artist.ts | 16 +- front/models/Genre.ts | 15 +- front/models/Lesson.ts | 33 +-- front/models/List.ts | 11 + front/models/Model.ts | 10 +- front/models/Plage.ts | 34 +++ front/models/ResponseHandler.ts | 8 + front/models/SearchHistory.ts | 27 +- front/models/Skill.ts | 32 ++- front/models/Song.ts | 33 ++- front/models/SongDetails.ts | 31 ++- front/models/SongHistory.ts | 42 ++- front/models/User.ts | 39 ++- front/models/UserData.ts | 8 - front/models/UserSettings.ts | 37 +++ front/package.json | 6 +- front/yarn.lock | 43 ++- 20 files changed, 575 insertions(+), 287 deletions(-) create mode 100644 front/models/AccessTokenResponse.ts create mode 100644 front/models/List.ts create mode 100644 front/models/Plage.ts create mode 100644 front/models/ResponseHandler.ts delete mode 100644 front/models/UserData.ts diff --git a/front/API.ts b/front/API.ts index 3f0b407..9eff42c 100644 --- a/front/API.ts +++ b/front/API.ts @@ -1,21 +1,26 @@ -import Artist from './models/Artist'; +import Artist, { ArtistHandler } from './models/Artist'; import Album from './models/Album'; import Chapter from './models/Chapter'; import Lesson from './models/Lesson'; -import Genre from './models/Genre'; +import Genre, { GenreHandler } from './models/Genre'; import LessonHistory from './models/LessonHistory'; -import Song from './models/Song'; -import SongHistory from './models/SongHistory'; -import User from './models/User'; +import Song, { SongHandler } from './models/Song'; +import { SongHistoryHandler, SongHistoryItem, SongHistoryItemHandler } from './models/SongHistory'; +import User, { UserHandler } from './models/User'; import Constants from 'expo-constants'; import store from './state/Store'; import { Platform } from 'react-native'; import { en } from './i18n/Translations'; -import UserSettings from './models/UserSettings'; -import { PartialDeep } from 'type-fest'; -import SearchHistory from './models/SearchHistory'; +import UserSettings, { UserSettingsHandler } from './models/UserSettings'; +import { PartialDeep, RequireExactlyOne } from 'type-fest'; +import SearchHistory, { SearchHistoryHandler } from './models/SearchHistory'; import { Query } from './Queries'; import CompetenciesTable from './components/CompetenciesTable'; +import ResponseHandler from './models/ResponseHandler'; +import { PlageHandler } from './models/Plage'; +import { ListHandler } from './models/List'; +import { AccessTokenResponseHandler } from './models/AccessTokenResponse'; +import * as yup from 'yup'; type AuthenticationInput = { username: string; password: string }; type RegistrationInput = AuthenticationInput & { email: string }; @@ -26,10 +31,14 @@ type FetchParams = { route: string; body?: object; method?: 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'PUT'; - // If true, No JSON parsing is done, the raw response's content is returned - raw?: true; }; +type HandleParams = RequireExactlyOne<{ + raw: true; + emptyResponse: true; + handler: ResponseHandler; +}>; + // This Exception is intended to cover all business logic errors (invalid credentials, couldn't find a song, etc.) // technical errors (network, server, etc.) should be handled as standard Error exceptions // it helps to filter errors in the catch block, APIErrors messages should @@ -46,37 +55,66 @@ export class APIError extends Error { } } -// we will need the same thing for the scorometer API url -const baseAPIUrl = - process.env.NODE_ENV != 'development' && Platform.OS === 'web' - ? '/api' - : Constants.manifest?.extra?.apiUrl; +export class ValidationError extends Error { + constructor(message: string) { + super(message); + } +} export default class API { - public static async fetch(params: FetchParams) { + public static readonly baseUrl = + process.env.NODE_ENV != 'development' && Platform.OS === 'web' + ? '/api' + : Constants.manifest?.extra?.apiUrl; + public static async fetch( + params: FetchParams, + handle: Pick, 'raw'> + ): Promise; + public static async fetch( + params: FetchParams, + handle: Pick, 'emptyResponse'> + ): Promise; + public static async fetch( + params: FetchParams, + handle: Pick>, 'handler'> + ): Promise; + public static async fetch(params: FetchParams): Promise; + public static async fetch(params: FetchParams, handle?: HandleParams) { const jwtToken = store.getState().user.accessToken; const header = { 'Content-Type': 'application/json', }; - const response = await fetch(`${baseAPIUrl}${params.route}`, { + const response = await fetch(`${API.baseUrl}${params.route}`, { headers: (jwtToken && { ...header, Authorization: `Bearer ${jwtToken}` }) || header, body: JSON.stringify(params.body), method: params.method ?? 'GET', }).catch(() => { - throw new Error('Error while fetching API: ' + baseAPIUrl); + throw new Error('Error while fetching API: ' + API.baseUrl); }); - if (params.raw) { + if (!handle || handle.emptyResponse) { + return; + } + if (handle.raw) { return response.arrayBuffer(); } + const handler = handle.handler; const body = await response.text(); try { - const jsonResponse = body.length != 0 ? JSON.parse(body) : {}; + const jsonResponse = JSON.parse(body); if (!response.ok) { throw new APIError(response.statusText ?? body, response.status); } - return jsonResponse; + const validated = await handler.validator.validate(jsonResponse).catch((e) => { + if (e instanceof yup.ValidationError) { + console.error(e, 'Got: ' + body); + throw new ValidationError(e.message); + } + throw e; + }); + return handler.transformer(handler.validator.cast(validated)); } catch (e) { if (e instanceof SyntaxError) throw new Error("Error while parsing Server's response"); + console.error(e); throw e; } } @@ -84,17 +122,21 @@ export default class API { public static async authenticate( authenticationInput: AuthenticationInput ): Promise { - return API.fetch({ - route: '/auth/login', - body: authenticationInput, - method: 'POST', - }) + return API.fetch( + { + route: '/auth/login', + body: authenticationInput, + method: 'POST', + }, + { handler: AccessTokenResponseHandler } + ) .then((responseBody) => responseBody.access_token) .catch((e) => { - if (!(e instanceof APIError)) throw e; - + /// If validation fails, it means that auth failed. + /// We want that 401 error to be thrown, instead of the plain validation vone if (e.status == 401) throw new APIError('invalidCredentials', 401, 'invalidCredentials'); + if (!(e instanceof APIError)) throw e; throw e; }); } @@ -118,12 +160,20 @@ export default class API { } public static async createAndGetGuestAccount(): Promise { - const response = await API.fetch({ - route: '/auth/guest', - method: 'POST', - }); - if (!response.access_token) throw new APIError('No access token', response.status); - return response.access_token; + return API.fetch( + { + route: '/auth/guest', + method: 'POST', + }, + { handler: AccessTokenResponseHandler } + ) + .then(({ access_token }) => access_token) + .catch((e) => { + if (e.status == 401) + throw new APIError('invalidCredentials', 401, 'invalidCredentials'); + if (!(e instanceof APIError)) throw e; + throw e; + }); } public static async transformGuestToUser(registrationInput: RegistrationInput): Promise { @@ -140,50 +190,28 @@ export default class API { public static getUserInfo(): Query { return { key: 'user', - exec: async () => { - const user = await API.fetch({ - route: '/auth/me', - }); - - // this a dummy settings object, we will need to fetch the real one from the API - return { - id: user.id as number, - name: (user.username ?? user.name) as string, - email: user.email as string, - premium: false, - isGuest: user.isGuest as boolean, - data: { - gamesPlayed: user.partyPlayed as number, - xp: 0, - createdAt: new Date('2023-04-09T00:00:00.000Z'), - avatar: 'https://imgs.search.brave.com/RnQpFhmAFvuQsN_xTw7V-CN61VeHDBg2tkEXnKRYHAE/rs:fit:768:512:1/g:ce/aHR0cHM6Ly96b29h/c3Ryby5jb20vd3At/Y29udGVudC91cGxv/YWRzLzIwMjEvMDIv/Q2FzdG9yLTc2OHg1/MTIuanBn', + exec: async () => + API.fetch( + { + route: '/auth/me', }, - } as User; - }, + { handler: UserHandler } + ), }; } public static getUserSettings(): Query { return { key: 'settings', - exec: async () => { - const settings = await API.fetch({ - route: '/auth/me/settings', - }); - - return { - notifications: { - pushNotif: settings.pushNotification, - emailNotif: settings.emailNotification, - trainNotif: settings.trainingNotification, - newSongNotif: settings.newSongNotification, + exec: () => + API.fetch( + { + route: '/auth/me/settings', }, - recommendations: settings.recommendations, - weeklyReport: settings.weeklyReport, - leaderBoard: settings.leaderBoard, - showActivity: settings.showActivity, - }; - }, + { + handler: UserSettingsHandler, + } + ), }; } @@ -222,28 +250,15 @@ export default class API { public static getAllSongs(): Query { return { key: 'songs', - exec: async () => { - const songs = await API.fetch({ - route: '/song', - }); - - // this is a dummy illustration, we will need to fetch the real one from the API - return songs.data.map( - // To be fixed with #168 - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (song: any) => - ({ - id: song.id as number, - name: song.name as string, - artistId: song.artistId as number, - albumId: song.albumId as number, - genreId: song.genreId as number, - details: song.difficulties, - cover: `${baseAPIUrl}/song/${song.id}/illustration`, - metrics: {}, - } as Song) - ); - }, + exec: () => + API.fetch( + { + route: '/song', + }, + { + handler: PlageHandler(SongHandler), + } + ).then(({ data }) => data), }; } @@ -254,22 +269,13 @@ export default class API { public static getSong(songId: number): Query { return { key: ['song', songId], - exec: async () => { - const song = await API.fetch({ - route: `/song/${songId}`, - }); - - // this is a dummy illustration, we will need to fetch the real one from the API - return { - id: song.id as number, - name: song.name as string, - artistId: song.artistId as number, - albumId: song.albumId as number, - genreId: song.genreId as number, - details: song.difficulties, - cover: `${baseAPIUrl}/song/${song.id}/illustration`, - } as Song; - }, + exec: async () => + API.fetch( + { + route: `/song/${songId}`, + }, + { handler: SongHandler } + ), }; } /** @@ -280,10 +286,14 @@ export default class API { return { key: ['midi', songId], exec: () => - API.fetch({ - route: `/song/${songId}/midi`, - raw: true, - }), + API.fetch( + { + route: `/song/${songId}/midi`, + }, + { + raw: true, + } + ), }; } @@ -292,7 +302,7 @@ export default class API { * @param songId the id to find the song */ public static getArtistIllustration(artistId: number): string { - return `${baseAPIUrl}/artist/${artistId}/illustration`; + return `${API.baseUrl}/artist/${artistId}/illustration`; } /** @@ -300,7 +310,7 @@ export default class API { * @param songId the id to find the song */ public static getGenreIllustration(genreId: number): string { - return `${baseAPIUrl}/genre/${genreId}/illustration`; + return `${API.baseUrl}/genre/${genreId}/illustration`; } /** @@ -311,10 +321,12 @@ export default class API { return { key: ['musixml', songId], exec: () => - API.fetch({ - route: `/song/${songId}/musicXml`, - raw: true, - }), + API.fetch( + { + route: `/song/${songId}/musicXml`, + }, + { raw: true } + ), }; } @@ -325,9 +337,12 @@ export default class API { return { key: ['artist', artistId], exec: () => - API.fetch({ - route: `/artist/${artistId}`, - }), + API.fetch( + { + route: `/artist/${artistId}`, + }, + { handler: ArtistHandler } + ), }; } @@ -356,13 +371,16 @@ export default class API { * Retrieve a song's play history * @param songId the id to find the song */ - public static getSongHistory(songId: number): Query<{ best: number; history: SongHistory[] }> { + public static getSongHistory(songId: number) { return { key: ['song', 'history', songId], exec: () => - API.fetch({ - route: `/song/${songId}/history`, - }), + API.fetch( + { + route: `/song/${songId}/history`, + }, + { handler: SongHistoryHandler } + ), }; } @@ -374,9 +392,12 @@ export default class API { return { key: ['search', 'song', query], exec: () => - API.fetch({ - route: `/search/songs/${query}`, - }), + API.fetch( + { + route: `/search/songs/${query}`, + }, + { handler: ListHandler(SongHandler) } + ), }; } @@ -388,9 +409,12 @@ export default class API { return { key: ['search', 'artist', query], exec: () => - API.fetch({ - route: `/search/artists/${query}`, - }), + API.fetch( + { + route: `/search/artists/${query}`, + }, + { handler: ListHandler(ArtistHandler) } + ), }; } @@ -398,31 +422,27 @@ export default class API { * Search Album by name * @param query the string used to find the album */ - public static searchAlbum( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - query: string - ): Query { + public static searchAlbum(query: string): Query { return { key: ['search', 'album', query], - exec: async () => - [ - { - id: 1, - name: 'Super Trooper', - }, - { - id: 2, - name: 'Kingdom Heart 365/2 OST', - }, - { - id: 3, - name: 'The Legend Of Zelda Ocarina Of Time OST', - }, - { - id: 4, - name: 'Random Access Memories', - }, - ] as Album[], + exec: async () => [ + { + id: 1, + name: 'Super Trooper', + }, + { + id: 2, + name: 'Kingdom Heart 365/2 OST', + }, + { + id: 3, + name: 'The Legend Of Zelda Ocarina Of Time OST', + }, + { + id: 4, + name: 'Random Access Memories', + }, + ], }; } @@ -433,9 +453,12 @@ export default class API { return { key: ['search', 'genre', query], exec: () => - API.fetch({ - route: `/search/genres/${query}`, - }), + API.fetch( + { + route: `/search/genres/${query}`, + }, + { handler: ListHandler(GenreHandler) } + ), }; } @@ -447,7 +470,7 @@ export default class API { return { key: ['lesson', lessonId], exec: async () => ({ - title: 'Song', + name: 'Song', description: 'A song', requiredLevel: 1, mainSkill: 'lead-head-change', @@ -466,22 +489,12 @@ export default class API { return { key: ['search', 'history', 'skip', skip, 'take', take], exec: () => - API.fetch({ - route: `/history/search?skip=${skip ?? 0}&take=${take ?? 5}`, - method: 'GET', - }).then((value) => - value.map( - // To be fixed with #168 - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (e: any) => - ({ - id: e.id, - query: e.query, - type: e.type, - userId: e.userId, - timestamp: new Date(e.searchDate), - } as SearchHistory) - ) + API.fetch( + { + route: `/history/search?skip=${skip ?? 0}&take=${take ?? 5}`, + method: 'GET', + }, + { handler: ListHandler(SearchHistoryHandler) } ), }; } @@ -516,13 +529,16 @@ export default class API { * Retrieve the authenticated user's play history * * @returns an array of songs */ - public static getUserPlayHistory(): Query { + public static getUserPlayHistory(): Query { return { key: ['history'], exec: () => - API.fetch({ - route: '/history', - }), + API.fetch( + { + route: '/history', + }, + { handler: ListHandler(SongHistoryItemHandler) } + ), }; } @@ -543,36 +559,32 @@ export default class API { } public static async updateUserEmail(newEmail: string): Promise { - const rep = await API.fetch({ - route: '/auth/me', - method: 'PUT', - body: { - email: newEmail, + return API.fetch( + { + route: '/auth/me', + method: 'PUT', + body: { + email: newEmail, + }, }, - }); - - if (rep.error) { - throw new Error(rep.error); - } - return rep; + { handler: UserHandler } + ); } public static async updateUserPassword( oldPassword: string, newPassword: string ): Promise { - const rep = await API.fetch({ - route: '/auth/me', - method: 'PUT', - body: { - oldPassword: oldPassword, - password: newPassword, + return API.fetch( + { + route: '/auth/me', + method: 'PUT', + body: { + oldPassword: oldPassword, + password: newPassword, + }, }, - }); - - if (rep.error) { - throw new Error(rep.error); - } - return rep; + { handler: UserHandler } + ); } } diff --git a/front/models/AccessTokenResponse.ts b/front/models/AccessTokenResponse.ts new file mode 100644 index 0000000..4089a54 --- /dev/null +++ b/front/models/AccessTokenResponse.ts @@ -0,0 +1,13 @@ +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +const AccessTokenResponseValidator = yup.object({ + access_token: yup.string().required(), +}); + +type AccessTokenResponse = yup.InferType; + +export const AccessTokenResponseHandler: ResponseHandler = { + validator: AccessTokenResponseValidator, + transformer: (value) => value, +}; diff --git a/front/models/Album.ts b/front/models/Album.ts index fc8afbb..3cf9129 100644 --- a/front/models/Album.ts +++ b/front/models/Album.ts @@ -1,4 +1,12 @@ -import Model from './Model'; +import Model, { ModelValidator } from './Model'; +import * as yup from 'yup'; + +export const AlbumValidator = yup + .object({ + name: yup.string().required(), + artistId: yup.number().required(), + }) + .concat(ModelValidator); interface Album extends Model { name: string; diff --git a/front/models/Artist.ts b/front/models/Artist.ts index 03c1d0d..1af8b55 100644 --- a/front/models/Artist.ts +++ b/front/models/Artist.ts @@ -1,8 +1,20 @@ -import Model from './Model'; +import Model, { ModelValidator } from './Model'; +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +export const ArtistValidator = yup + .object({ + name: yup.string().required(), + }) + .concat(ModelValidator); + +export const ArtistHandler: ResponseHandler = { + validator: ArtistValidator, + transformer: (value) => value, +}; interface Artist extends Model { name: string; - picture?: string; } export default Artist; diff --git a/front/models/Genre.ts b/front/models/Genre.ts index fc6456e..61d7a4e 100644 --- a/front/models/Genre.ts +++ b/front/models/Genre.ts @@ -1,4 +1,17 @@ -import Model from './Model'; +import Model, { ModelValidator } from './Model'; +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +export const GenreValidator = yup + .object({ + name: yup.string().required(), + }) + .concat(ModelValidator); + +export const GenreHandler: ResponseHandler = { + validator: GenreValidator, + transformer: (value) => value, +}; interface Genre extends Model { name: string; diff --git a/front/models/Lesson.ts b/front/models/Lesson.ts index ee4fbd9..3fea61b 100644 --- a/front/models/Lesson.ts +++ b/front/models/Lesson.ts @@ -1,26 +1,19 @@ -import Skill from './Skill'; -import Model from './Model'; +import { SkillValidator } from './Skill'; +import { ModelValidator } from './Model'; +import * as yup from 'yup'; + +export const LessonValidator = yup + .object({ + name: yup.string().required(), + description: yup.string().required(), + requiredLevel: yup.number().required(), + mainSkill: SkillValidator.required(), + }) + .concat(ModelValidator); /** * A Lesson is an exercice that the user can try to practice a skill */ -interface Lesson extends Model { - /** - * The title of the lesson - */ - title: string; - /** - * Short description of the lesson - */ - description: string; - /** - * The minimum level required for the user to access this lesson - */ - requiredLevel: number; - /** - * The main skill learnt in this lesson - */ - mainSkill: Skill; -} +type Lesson = yup.InferType; export default Lesson; diff --git a/front/models/List.ts b/front/models/List.ts new file mode 100644 index 0000000..9ac2142 --- /dev/null +++ b/front/models/List.ts @@ -0,0 +1,11 @@ +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +const ListValidator = (itemType: yup.Schema) => yup.array(itemType).required(); + +export const ListHandler = ( + itemHandler: ResponseHandler +): ResponseHandler => ({ + validator: ListValidator(itemHandler.validator), + transformer: (plage) => plage.map((item) => itemHandler.transformer(item)), +}); diff --git a/front/models/Model.ts b/front/models/Model.ts index 57fed04..b7afbb0 100644 --- a/front/models/Model.ts +++ b/front/models/Model.ts @@ -1,5 +1,9 @@ -interface Model { - id: number; -} +import * as yup from 'yup'; + +export const ModelValidator = yup.object({ + id: yup.number().required(), +}); + +type Model = yup.InferType; export default Model; diff --git a/front/models/Plage.ts b/front/models/Plage.ts new file mode 100644 index 0000000..a92cae0 --- /dev/null +++ b/front/models/Plage.ts @@ -0,0 +1,34 @@ +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +// Ty https://github.com/Arthi-chaud/Meelo/blob/master/front/src/models/pagination.ts +export const PlageValidator = (itemType: yup.Schema) => + yup.object({ + data: yup.array(itemType).required(), + metadata: yup.object({ + /** + * Current route + */ + this: yup.string().required(), + /** + * route to use for the next items + */ + next: yup.string().required().nullable(), + /** + * route to use for the previous items + */ + previous: yup.string().required().nullable(), + }), + }); + +type Plage = yup.InferType>>; + +export const PlageHandler = ( + itemHandler: ResponseHandler +): ResponseHandler, Plage> => ({ + validator: PlageValidator(itemHandler.validator), + transformer: (plage) => ({ + ...plage, + data: plage.data.map((item) => itemHandler.transformer(item)), + }), +}); diff --git a/front/models/ResponseHandler.ts b/front/models/ResponseHandler.ts new file mode 100644 index 0000000..f6bb5c4 --- /dev/null +++ b/front/models/ResponseHandler.ts @@ -0,0 +1,8 @@ +import * as yup from 'yup'; + +type ResponseHandler = { + validator: yup.Schema; + transformer: (value: APIType) => ModelType; +}; + +export default ResponseHandler; diff --git a/front/models/SearchHistory.ts b/front/models/SearchHistory.ts index a291dea..05c433b 100644 --- a/front/models/SearchHistory.ts +++ b/front/models/SearchHistory.ts @@ -1,4 +1,29 @@ -import Model from './Model'; +import Model, { ModelValidator } from './Model'; +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +export const SearchType = ['song', 'artist', 'album'] as const; +export type SearchType = (typeof SearchType)[number]; + +const SearchHistoryValidator = yup + .object({ + query: yup.string().required(), + type: yup.mixed().oneOf(SearchType).required(), + userId: yup.number().required(), + searchDate: yup.date().required(), + }) + .concat(ModelValidator); + +export const SearchHistoryHandler: ResponseHandler< + yup.InferType, + SearchHistory +> = { + validator: SearchHistoryValidator, + transformer: (value) => ({ + ...value, + timestamp: value.searchDate, + }), +}; interface SearchHistory extends Model { query: string; diff --git a/front/models/Skill.ts b/front/models/Skill.ts index d41564a..8604fc4 100644 --- a/front/models/Skill.ts +++ b/front/models/Skill.ts @@ -1,15 +1,21 @@ -type Skill = - | 'rhythm' - | 'two-hands' - | 'combos' - | 'arpeggio' - | 'distance' - | 'left-hand' - | 'right-hand' - | 'lead-head-change' - | 'chord-complexity' - | 'chord-timing' - | 'pedal' - | 'precision'; +import * as yup from 'yup'; + +const Skills = [ + 'rhythm', + 'two-hands', + 'combos', + 'arpeggio', + 'distance', + 'left-hand', + 'right-hand', + 'lead-head-change', + 'chord-complexity', + 'chord-timing', + 'pedal', + 'precision', +] as const; +type Skill = (typeof Skills)[number]; + +export const SkillValidator = yup.mixed().oneOf(Skills); export default Skill; diff --git a/front/models/Song.ts b/front/models/Song.ts index 19c0d6b..b8a181a 100644 --- a/front/models/Song.ts +++ b/front/models/Song.ts @@ -1,6 +1,35 @@ -import Model from './Model'; -import SongDetails from './SongDetails'; +import Model, { ModelValidator } from './Model'; +import SongDetails, { SongDetailsHandler, SongDetailsValidator } from './SongDetails'; import Artist from './Artist'; +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; +import API from '../API'; + +export const SongValidator = yup + .object({ + name: yup.string().required(), + midiPath: yup.string().required(), + musicXmlPath: yup.string().required(), + artistId: yup.number().required(), + albumId: yup.number().required().nullable(), + genreId: yup.number().required().nullable(), + difficulties: SongDetailsValidator.required(), + illustrationPath: yup.string().required(), + }) + .concat(ModelValidator); + +export const SongHandler: ResponseHandler, Song> = { + validator: SongValidator, + transformer: (song) => ({ + id: song.id, + name: song.name, + artistId: song.artistId, + albumId: song.albumId, + genreId: song.genreId, + details: SongDetailsHandler.transformer(song.difficulties), + cover: `${API.baseUrl}/song/${song.id}/illustration`, + }), +}; interface Song extends Model { id: number; diff --git a/front/models/SongDetails.ts b/front/models/SongDetails.ts index 527f387..5681fed 100644 --- a/front/models/SongDetails.ts +++ b/front/models/SongDetails.ts @@ -1,7 +1,34 @@ +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +export const SongDetailsValidator = yup.object({ + length: yup.number().required(), + rhythm: yup.number().required(), + arpeggio: yup.number().required(), + distance: yup.number().required(), + lefthand: yup.number().required(), + twohands: yup.number().required(), + notecombo: yup.number().required(), + precision: yup.number().required(), + righthand: yup.number().required(), + pedalpoint: yup.number().required(), + chordtiming: yup.number().required(), + leadhandchange: yup.number().required(), + chordcomplexity: yup.number().required(), +}); + +export const SongDetailsHandler: ResponseHandler< + yup.InferType, + SongDetails +> = { + validator: SongDetailsValidator, + transformer: (value) => value, +}; + interface SongDetails { length: number; rhythm: number; - arppegio: number; + arpeggio: number; distance: number; lefthand: number; righthand: number; @@ -10,7 +37,7 @@ interface SongDetails { precision: number; pedalpoint: number; chordtiming: number; - leadheadchange: number; + leadhandchange: number; chordcomplexity: number; } diff --git a/front/models/SongHistory.ts b/front/models/SongHistory.ts index 9796395..c08145b 100644 --- a/front/models/SongHistory.ts +++ b/front/models/SongHistory.ts @@ -1,8 +1,44 @@ -interface SongHistory { +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +export const SongHistoryItemValidator = yup.object({ + songID: yup.number().required(), + userID: yup.number().required(), + score: yup.number().required(), + difficulties: yup.mixed().required(), +}); + +export const SongHistoryItemHandler: ResponseHandler< + yup.InferType, + SongHistoryItem +> = { + validator: SongHistoryItemValidator, + transformer: (value) => ({ + ...value, + difficulties: value.difficulties, + }), +}; + +export const SongHistoryValidator = yup.object({ + best: yup.number().required().nullable(), + history: yup.array(SongHistoryItemValidator).required(), +}); + +export type SongHistory = yup.InferType; + +export const SongHistoryHandler: ResponseHandler = { + validator: SongHistoryValidator, + transformer: (value) => ({ + ...value, + history: value.history.map((item) => SongHistoryItemHandler.transformer(item)), + }), +}; + +export type SongHistoryItem = { songID: number; userID: number; score: number; - difficulties: JSON; -} + difficulties: object; +}; export default SongHistory; diff --git a/front/models/User.ts b/front/models/User.ts index 8543fb9..4c88922 100644 --- a/front/models/User.ts +++ b/front/models/User.ts @@ -1,6 +1,31 @@ -import UserData from './UserData'; -import Model from './Model'; -import UserSettings from './UserSettings'; +import Model, { ModelValidator } from './Model'; +import * as yup from 'yup'; +import ResponseHandler from './ResponseHandler'; + +export const UserValidator = yup + .object({ + username: yup.string().required(), + password: yup.string().required(), + email: yup.string().required(), + isGuest: yup.boolean().required(), + partyPlayed: yup.number().required(), + }) + .concat(ModelValidator); + +export const UserHandler: ResponseHandler, User> = { + validator: UserValidator, + transformer: (value) => ({ + ...value, + name: value.username, + premium: false, + data: { + gamesPlayed: value.partyPlayed as number, + xp: 0, + createdAt: new Date('2023-04-09T00:00:00.000Z'), + avatar: 'https://imgs.search.brave.com/RnQpFhmAFvuQsN_xTw7V-CN61VeHDBg2tkEXnKRYHAE/rs:fit:768:512:1/g:ce/aHR0cHM6Ly96b29h/c3Ryby5jb20vd3At/Y29udGVudC91cGxv/YWRzLzIwMjEvMDIv/Q2FzdG9yLTc2OHg1/MTIuanBn', + }, + }), +}; interface User extends Model { name: string; @@ -8,7 +33,13 @@ interface User extends Model { isGuest: boolean; premium: boolean; data: UserData; - settings: UserSettings; +} + +interface UserData { + gamesPlayed: number; + xp: number; + avatar: string | undefined; + createdAt: Date; } export default User; diff --git a/front/models/UserData.ts b/front/models/UserData.ts deleted file mode 100644 index 91bfde8..0000000 --- a/front/models/UserData.ts +++ /dev/null @@ -1,8 +0,0 @@ -interface UserData { - gamesPlayed: number; - xp: number; - avatar: string | undefined; - createdAt: Date; -} - -export default UserData; diff --git a/front/models/UserSettings.ts b/front/models/UserSettings.ts index 2bffa04..6c7181c 100644 --- a/front/models/UserSettings.ts +++ b/front/models/UserSettings.ts @@ -1,3 +1,40 @@ +import * as yup from 'yup'; +import { ModelValidator } from './Model'; +import ResponseHandler from './ResponseHandler'; + +export const UserSettingsValidator = yup + .object({ + userId: yup.number().required(), + pushNotification: yup.boolean().required(), + emailNotification: yup.boolean().required(), + trainingNotification: yup.boolean().required(), + newSongNotification: yup.boolean().required(), + recommendations: yup.boolean().required(), + weeklyReport: yup.boolean().required(), + leaderBoard: yup.boolean().required(), + showActivity: yup.boolean().required(), + }) + .concat(ModelValidator); + +export const UserSettingsHandler: ResponseHandler< + yup.InferType, + UserSettings +> = { + validator: UserSettingsValidator, + transformer: (settings) => ({ + notifications: { + pushNotif: settings.pushNotification, + emailNotif: settings.emailNotification, + trainNotif: settings.trainingNotification, + newSongNotif: settings.newSongNotification, + }, + recommendations: settings.recommendations, + weeklyReport: settings.weeklyReport, + leaderBoard: settings.leaderBoard, + showActivity: settings.showActivity, + }), +}; + interface UserSettings { notifications: { pushNotif: boolean; diff --git a/front/package.json b/front/package.json index e377171..4987f1d 100644 --- a/front/package.json +++ b/front/package.json @@ -68,7 +68,7 @@ "soundfont-player": "^0.12.0", "standardized-audio-context": "^25.3.51", "type-fest": "^3.6.0", - "yup": "^0.32.11" + "yup": "^1.2.0" }, "devDependencies": { "@babel/core": "^7.19.3", @@ -87,11 +87,11 @@ "@types/react": "~18.0.24", "@types/react-native": "~0.70.6", "@types/react-navigation": "^3.4.0", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.0.0", "babel-loader": "^8.3.0", "babel-plugin-transform-inline-environment-variables": "^0.4.4", "chromatic": "^6.14.0", - "@typescript-eslint/eslint-plugin": "^5.43.0", - "@typescript-eslint/parser": "^5.0.0", "eslint": "^8.42.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", diff --git a/front/yarn.lock b/front/yarn.lock index cbc5877..6760b25 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -1232,7 +1232,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.2", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== @@ -4743,7 +4743,7 @@ dependencies: "@types/node" "*" -"@types/lodash@^4.14.167", "@types/lodash@^4.14.175": +"@types/lodash@^4.14.167": version "4.14.191" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== @@ -12591,11 +12591,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - lodash.clone@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" @@ -13705,11 +13700,6 @@ nano-time@1.0.0: dependencies: big-integer "^1.6.16" -nanoclone@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" - integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== - nanoid@^3.1.23, nanoid@^3.3.1: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" @@ -15423,7 +15413,7 @@ prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -property-expr@^2.0.4: +property-expr@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== @@ -17931,6 +17921,11 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + tinycolor2@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.5.2.tgz#7d30b4584d8b7d62b9a94dacc505614a6516a95f" @@ -18165,6 +18160,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-fest@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.6.0.tgz#827c36c0e7fcff0cb2d55d091a5c4cf586432b8a" @@ -19366,18 +19366,15 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yup@^0.32.11: - version "0.32.11" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5" - integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== +yup@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/yup/-/yup-1.2.0.tgz#9e51af0c63bdfc9be0fdc6c10aa0710899d8aff6" + integrity sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ== dependencies: - "@babel/runtime" "^7.15.4" - "@types/lodash" "^4.14.175" - lodash "^4.17.21" - lodash-es "^4.17.21" - nanoclone "^0.2.1" - property-expr "^2.0.4" + property-expr "^2.0.5" + tiny-case "^1.0.3" toposort "^2.0.2" + type-fest "^2.19.0" zwitch@^1.0.0: version "1.0.5" From 87de52cae02922a84ca6627e825cec1bbed7fe5e Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Wed, 5 Jul 2023 14:18:31 +0100 Subject: [PATCH 011/133] Front: 'Get Song By Artist' Query: fix typings --- front/API.ts | 17 ++++++--- front/components/RowCustom.tsx | 20 +++++----- front/components/SongRow.tsx | 37 +++++++++--------- front/views/ArtistDetailsView.tsx | 62 ++++++++++++++----------------- 4 files changed, 67 insertions(+), 69 deletions(-) diff --git a/front/API.ts b/front/API.ts index 20f15cc..29b2c03 100644 --- a/front/API.ts +++ b/front/API.ts @@ -279,15 +279,22 @@ export default class API { }; } - /** + /** * @description retrieves songs from a specific artist * @param artistId is the id of the artist that composed the songs aimed * @returns a Promise of Songs type array */ - public static async getSongsByArtist(artistId: number): Promise { - return API.fetch({ - route: `/song?artistId=${artistId}`, - }); + public static getSongsByArtist(artistId: number): Query { + return { + key: ['artist', artistId, 'songs'], + exec: () => + API.fetch( + { + route: `/song?artistId=${artistId}`, + }, + { handler: PlageHandler(SongHandler) } + ).then(({ data }) => data), + }; } /** diff --git a/front/components/RowCustom.tsx b/front/components/RowCustom.tsx index f72cded..aa9d4e3 100644 --- a/front/components/RowCustom.tsx +++ b/front/components/RowCustom.tsx @@ -1,10 +1,8 @@ -import { useColorScheme } from "react-native"; -import { RootState, useSelector } from "../state/Store"; -import { Box, Pressable } from "native-base"; +import { useColorScheme } from 'react-native'; +import { RootState, useSelector } from '../state/Store'; +import { Box, Pressable } from 'native-base'; -const RowCustom = ( - props: Parameters[0] & { onPress?: () => void } -) => { +const RowCustom = (props: Parameters[0] & { onPress?: () => void }) => { const settings = useSelector((state: RootState) => state.settings.local); const systemColorMode = useColorScheme(); const colorScheme = settings.colorScheme; @@ -17,13 +15,13 @@ const RowCustom = ( py={3} my={1} bg={ - (colorScheme == "system" ? systemColorMode : colorScheme) == "dark" + (colorScheme == 'system' ? systemColorMode : colorScheme) == 'dark' ? isHovered || isPressed - ? "gray.800" + ? 'gray.800' : undefined : isHovered || isPressed - ? "coolGray.200" - : undefined + ? 'coolGray.200' + : undefined } > {props.children} @@ -33,4 +31,4 @@ const RowCustom = ( ); }; -export default RowCustom; \ No newline at end of file +export default RowCustom; diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx index a122e40..4a61c83 100644 --- a/front/components/SongRow.tsx +++ b/front/components/SongRow.tsx @@ -1,8 +1,7 @@ -import { HStack, Image, Text } from "native-base"; -import Song, { SongWithArtist } from "../models/Song"; -import RowCustom from "./RowCustom"; -import TextButton from "./TextButton"; - +import { HStack, Image, Text } from 'native-base'; +import Song, { SongWithArtist } from '../models/Song'; +import RowCustom from './RowCustom'; +import TextButton from './TextButton'; type SongRowProps = { song: Song | SongWithArtist; // TODO: remove Song @@ -11,8 +10,8 @@ type SongRowProps = { const SongRow = ({ song, onPress }: SongRowProps) => { return ( - - + + { style={{ zIndex: 0, aspectRatio: 1, borderRadius: 5 }} source={{ uri: song.cover }} alt={song.name} - borderColor={'white'} - borderWidth={1} + borderColor={'white'} + borderWidth={1} /> @@ -39,7 +38,7 @@ const SongRow = ({ song, onPress }: SongRowProps) => { }} isTruncated pl={5} - maxW={"100%"} + maxW={'100%'} bold fontSize="md" > @@ -49,19 +48,19 @@ const SongRow = ({ song, onPress }: SongRowProps) => { style={{ flexShrink: 0, }} - fontSize={"sm"} + fontSize={'sm'} > - {song.artistId ?? "artist"} + {song.artistId ?? 'artist'} @@ -69,4 +68,4 @@ const SongRow = ({ song, onPress }: SongRowProps) => { ); }; -export default SongRow; \ No newline at end of file +export default SongRow; diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 2e5e088..3bc9a4b 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -1,62 +1,56 @@ -import { VStack, Text, Box, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue } from 'native-base'; -import { Ionicons } from '@expo/vector-icons'; +import { Box, Image, Heading, useBreakpointValue } from 'native-base'; import { SafeAreaView } from 'react-native'; import { useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import API from '../API'; import Song, { SongWithArtist } from '../models/Song'; import SongRow from '../components/SongRow'; -import { Key, useEffect, useState } from 'react'; -import { useNavigation } from '../Navigation'; +import { Key } from 'react'; +import { RouteProps, useNavigation } from '../Navigation'; -const ArtistDetailsView = ({ artistId }: any) => { - const { isLoading, data: artistData, isError } = useQuery(API.getArtist(artistId)); - // const { isLoading: isLoadingSongs, data: songData = [], error: errorSongs } = useQuery(['songs', artistId], () => API.getSongsByArtist(artistId)) - const screenSize = useBreakpointValue({ base: "small", md: "big" }); - const isMobileView = screenSize == "small"; +type ArtistDetailsViewProps = { + artistId: number; +}; + +const ArtistDetailsView = ({ artistId }: RouteProps) => { + const artistQuery = useQuery(API.getArtist(artistId)); + const songsQuery = useQuery(API.getSongsByArtist(artistId)); + const screenSize = useBreakpointValue({ base: 'small', md: 'big' }); + const isMobileView = screenSize == 'small'; const navigation = useNavigation(); - const [merde, setMerde] = useState(null); - useEffect(() => { - // Code to be executed when the component is focused - console.warn('Component focused!'); - setMerde(API.getSongsByArtist(112)); - // Call your function or perform any other actions here - }, []); - - if (isLoading) { - return ; - } - - if (isError) { + if (artistQuery.isError || songsQuery.isError) { navigation.navigate('Error'); + return <>; + } + if (!artistQuery.data || songsQuery.data === undefined) { + return ; } return ( {artistData?.name} - Abba + Abba - {merde.map((comp: Song | SongWithArtist, index: Key | null | undefined) => ( + {songsQuery.data.map((comp: Song, index: Key | null | undefined) => ( { - API.createSearchHistoryEntry(comp.name, "song", Date.now()); - navigation.navigate("Song", { songId: comp.id }); + API.createSearchHistoryEntry(comp.name, 'song'); + navigation.navigate('Song', { songId: comp.id }); }} /> - )) - } + ))} From 3a09d10d3bdf683d9847bef86952f3104e99c833 Mon Sep 17 00:00:00 2001 From: danis Date: Sun, 9 Jul 2023 23:24:31 +0200 Subject: [PATCH 012/133] you miss 100% of the shots you dont take --- front/Navigation.tsx | 6 ++ front/components/SearchResult.tsx | 14 +-- front/views/ArtistDetailsView.tsx | 109 ++++++++++++++++++++-- front/views/GenreDetailsView.tsx | 145 ++++++++++++++++++++++++++++-- 4 files changed, 251 insertions(+), 23 deletions(-) diff --git a/front/Navigation.tsx b/front/Navigation.tsx index 011967b..fc64f15 100644 --- a/front/Navigation.tsx +++ b/front/Navigation.tsx @@ -28,6 +28,7 @@ import { Button, Center, VStack } from 'native-base'; import { unsetAccessToken } from './state/UserSlice'; import TextButton from './components/TextButton'; import ErrorView from './views/ErrorView'; +import GenreDetailsView from './views/GenreDetailsView'; // Util function to hide route props in URL const removeMe = () => ''; @@ -58,6 +59,11 @@ const protectedRoutes = () => options: { title: translate('artistFilter') }, link: '/artist/:artistId', }, + Genre: { + component: GenreDetailsView, + options: { title: translate('genreFilter')}, + link: '/genre/:genreId', + }, Score: { component: ScoreView, options: { title: translate('score'), headerLeft: null }, diff --git a/front/components/SearchResult.tsx b/front/components/SearchResult.tsx index 274cf54..aab02bf 100644 --- a/front/components/SearchResult.tsx +++ b/front/components/SearchResult.tsx @@ -252,13 +252,13 @@ const ArtistSearchComponent = (props: ItemSearchComponentProps) => { {artistData?.length ? ( ({ - image: API.getArtistIllustration(a.id), - name: a.name, - id: a.id, + content={artistData.slice(0, props.maxItems ?? artistData.length).map((artistData) => ({ + image: API.getArtistIllustration(artistData.id), + name: artistData.name, + id: artistData.id, onPress: () => { - API.createSearchHistoryEntry(a.name, 'artist'); - navigation.navigate('Artist', { artistId: a.id }); + API.createSearchHistoryEntry(artistData.name, 'artist'); + navigation.navigate('Artist', { artistId: artistData.id }); }, }))} cardComponent={ArtistCard} @@ -287,7 +287,7 @@ const GenreSearchComponent = (props: ItemSearchComponentProps) => { id: g.id, onPress: () => { API.createSearchHistoryEntry(g.name, 'genre'); - navigation.navigate('Home'); + navigation.navigate('Genre', {genreId: g.id}); }, }))} cardComponent={GenreCard} diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 9b07677..7baa1b4 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -1,4 +1,4 @@ -import { VStack, Text, Box, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue } from 'native-base'; +import { VStack, Text, Box, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue, ScrollView } from 'native-base'; import { Ionicons } from '@expo/vector-icons'; import { SafeAreaView } from 'react-native'; import { useQuery } from '../Queries'; @@ -9,6 +9,99 @@ import SongRow from '../components/SongRow'; import { Key, useEffect, useState } from 'react'; import { useNavigation } from '../Navigation'; +const songs: Song[] = [ + { + id: 1, + name: "Dancing Queen", + artistId: 1, + albumId: 1, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 2, + name: "Mamma Mia", + artistId: 1, + albumId: 1, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 3, + name: "Take a Chance on Me", + artistId: 1, + albumId: 2, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 4, + name: "Fernando", + artistId: 1, + albumId: 3, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 5, + name: "Waterloo", + artistId: 1, + albumId: 4, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 6, + name: "The Winner Takes It All", + artistId: 1, + albumId: 5, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 7, + name: "SOS", + artistId: 1, + albumId: 6, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 8, + name: "Knowing Me, Knowing You", + artistId: 1, + albumId: 7, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 9, + name: "Money, Money, Money", + artistId: 1, + albumId: 8, + genreId: 1, + cover: undefined, + details: undefined, + }, + { + id: 10, + name: "Gimme! Gimme! Gimme! (A Man After Midnight)", + artistId: 1, + albumId: 9, + genreId: 1, + cover: undefined, + details: undefined, + }, +]; + const ArtistDetailsView = ({ artistId }: any) => { const { isLoading: isLoadingArt, data: artistData, error: isErrorArt } = useQuery(API.getArtist(artistId)); const { isLoading: isLoadingSong, data: songData = [], error: isErrorSong } = useQuery(API.getSongsByArtist(artistId)); @@ -25,10 +118,10 @@ const ArtistDetailsView = ({ artistId }: any) => { } return ( - + {artistData?.name} { resizeMode='cover' /> - {artistData?.name} - - {songData.map((comp: Song | SongWithArtist, index: Key | null | undefined) => ( + {artistData?.name} + + {songs.map((comp: Song | SongWithArtist, index: Key | null | undefined) => ( { /> )) } - + - + ); }; diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index a4a78d0..4a8b3d8 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -1,14 +1,143 @@ import { SafeAreaView } from 'react-native'; -import { VStack, Text, Box, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue } from 'native-base'; +import { VStack, Text, Box, Flex, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue, ScrollView } from 'native-base'; +import { useQuery } from '../Queries'; +import { LoadingView } from '../components/Loading'; +import { useNavigation } from '../Navigation'; +import API from '../API'; +import Artist from '../models/Artist'; +const colorRange = [ + { + code: '#364fc7', + }, + { + code: '#5c940d', + }, + { + code: '#c92a2a', + }, + { + code: '#d6336c', + }, + { + code: '#20c997' + } +] +const rockArtists: Artist[] = [ + { + id: 1, + name: "Led Zeppelin", + picture: "https://picsum.photos/200", + }, + { + id: 2, + name: "Queen", + picture: "https://picsum.photos/200", + }, + { + id: 3, + name: "The Rolling Stones", + picture: "https://picsum.photos/200", + }, + { + id: 4, + name: "AC/DC", + picture: "https://picsum.photos/200", + }, + { + name: "Guns N' Roses", + id: 5, + picture: "https://picsum.photos/200", + }, +]; + +const rockSongs: Song[] = [ + { + id: 1, + name: "Stairway to Heaven", + artistId: 1, + albumId: 1, + genreId: 1, + cover: "https://picsum.photos/200", + details: { /* song details */ }, + }, + { + id: 2, + name: "Bohemian Rhapsody", + artistId: 2, + albumId: 2, + genreId: 1, + cover: "https://picsum.photos/200", + details: { /* song details */ }, + }, + { + id: 3, + name: "Paint It Black", + artistId: 3, + albumId: 3, + genreId: 1, + cover: "https://picsum.photos/200", + details: { /* song details */ }, + }, + { + id: 4, + name: "Highway to Hell", + artistId: 4, + albumId: 4, + genreId: 1, + cover: "https://picsum.photos/200", + details: { /* song details */ }, + }, + { + id: 5, + name: "Sweet Child o' Mine", + artistId: 5, + albumId: 5, + genreId: 1, + cover: "https://picsum.photos/200", + details: { /* song details */ }, + }, + // Add more songs as needed + ]; const GenreDetailsView = ({ genreId }: any) => { + // const { isLoading: isLoadingGenre, data: genreData, error: isErrorGenre } = useQuery(API.getArtist(genreId)); + const screenSize = useBreakpointValue({ base: "small", md: "big" }); + const isMobileView = screenSize == "small"; + const navigation = useNavigation(); + + // if (isLoadingGenre) { + // return ; + // } + + // if (isErrorGenre) { + // navigation.navigate('Error'); + // } + return ( - - - - - - ); -} \ No newline at end of file + + + + + + + + + + + +); +} + +export default GenreDetailsView; \ No newline at end of file From 373128ba5310d5d1d555109ee851ff4ffcd0c004 Mon Sep 17 00:00:00 2001 From: danis Date: Mon, 10 Jul 2023 23:12:37 +0200 Subject: [PATCH 013/133] broke my glasses --- front/components/SongRow.tsx | 6 +++--- front/views/GenreDetailsView.tsx | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx index a122e40..bc2dff2 100644 --- a/front/components/SongRow.tsx +++ b/front/components/SongRow.tsx @@ -20,8 +20,8 @@ const SongRow = ({ song, onPress }: SongRowProps) => { style={{ zIndex: 0, aspectRatio: 1, borderRadius: 5 }} source={{ uri: song.cover }} alt={song.name} - borderColor={'white'} - borderWidth={1} + borderColor={'white'} + borderWidth={1} /> { colorScheme="primary" variant={"outline"} size="sm" - mr={5} + mr={5} onPress={onPress} /> diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 4a8b3d8..ba4f42c 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -5,6 +5,9 @@ import { LoadingView } from '../components/Loading'; import { useNavigation } from '../Navigation'; import API from '../API'; import Artist from '../models/Artist'; +import ArtistCard from '../components/ArtistCard'; +import CardGridCustom from '../components/CardGridCustom'; +import { translate } from '../i18n/i18n'; const colorRange = [ { @@ -121,7 +124,7 @@ const GenreDetailsView = ({ genreId }: any) => { size={'100%'} height={isMobileView ? 200 : 300} width={'100%'} - backgroundColor={'#20c997'} + backgroundColor={colorRange[Math.floor(Math.random() * 5)]?.code ?? '#364fc7'} /> { mt={4} > - + {rockArtists?.length ? ( + ({ + image: API.getArtistIllustration(artistData.id), + name: artistData.name, + id: artistData.id, + onPress: () => { + API.createSearchHistoryEntry(artistData.name, 'artist'); + navigation.navigate('Artist', { artistId: artistData.id }); + }, + }))} + cardComponent={ArtistCard} + /> + ) : ( + {translate('errNoResults')} + )} From bf09a25eb54ffaf580dc5facc674ad983cea5333 Mon Sep 17 00:00:00 2001 From: danis Date: Tue, 11 Jul 2023 10:06:55 +0200 Subject: [PATCH 014/133] linear gradient --- front/Theme.tsx | 6 ++++++ front/package.json | 5 +++-- front/views/ArtistDetailsView.tsx | 32 ++++++++++++++++++++++++++++--- front/views/GenreDetailsView.tsx | 8 +++++++- front/yarn.lock | 5 +++++ 5 files changed, 50 insertions(+), 6 deletions(-) diff --git a/front/Theme.tsx b/front/Theme.tsx index 6d7fc57..9c19074 100644 --- a/front/Theme.tsx +++ b/front/Theme.tsx @@ -4,9 +4,15 @@ import { useEffect } from 'react'; const ThemeProvider = ({ children }: { children: JSX.Element }) => { const colorScheme = useColorScheme(); + const config = { + dependencies: { + "linear-gradient": require("expo-linear-gradient").LinearGradient, + }, + }; return ( { return ( - + + + + {/* {artistData?.name} { height={isMobileView ? 200 : 300} width={'100%'} resizeMode='cover' - /> + /> */} {artistData?.name} @@ -144,7 +170,7 @@ const ArtistDetailsView = ({ artistId }: any) => { } - + {/* */} ); }; diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index ba4f42c..53700bf 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -124,7 +124,13 @@ const GenreDetailsView = ({ genreId }: any) => { size={'100%'} height={isMobileView ? 200 : 300} width={'100%'} - backgroundColor={colorRange[Math.floor(Math.random() * 5)]?.code ?? '#364fc7'} + // backgroundColor={colorRange[Math.floor(Math.random() * 5)]?.code ?? '#364fc7'} + bg={{ + linearGradient: { + colors: [colorRange[Math.floor(Math.random() * 5)]?.code ?? '#364fc7', 'black'], + start: [0, 0], + end: [0, 1], + },}} /> Date: Mon, 24 Jul 2023 14:44:42 +0900 Subject: [PATCH 015/133] rename musics --- .../Bach: Minuet in G Minor (BWV Anh. 115).ini | 0 .../Bach: Minuet in G Minor (BWV Anh. 115).midi | Bin .../Bach: Minuet in G Minor (BWV Anh. 115).mxl | Bin .../illustration.png | Bin .../Bach: Polonaise in g Minor (BWV Anh. 119).ini | 0 .../Bach: Polonaise in g Minor (BWV Anh. 119).midi | Bin .../Bach: Polonaise in g Minor (BWV Anh. 119).mxl | Bin .../illustration.png | Bin .../French National Anthem \"La Marseillaise\".ini" | 0 ...French National Anthem \"La Marseillaise\".midi" | Bin .../French National Anthem \"La Marseillaise\".mxl" | Bin .../illustration.png | Bin ...National Anthem \" Das Lied der Deutschen\".ini" | 0 ...ational Anthem \" Das Lied der Deutschen\".midi" | Bin ...National Anthem \" Das Lied der Deutschen\".mxl" | Bin .../illustration.png | Bin .../Mary, Did You Know?.ini | 0 .../Mary, Did You Know?.midi | Bin .../Mary, Did You Know?.mxl | Bin .../illustration.png | Bin 20 files changed, 0 insertions(+), 0 deletions(-) rename assets/musics/{Bach: Minuet in G Minor (BWV Anh. 115) => Bach Minuet in G Minor (BWV Anh. 115)}/Bach: Minuet in G Minor (BWV Anh. 115).ini (100%) rename assets/musics/{Bach: Minuet in G Minor (BWV Anh. 115) => Bach Minuet in G Minor (BWV Anh. 115)}/Bach: Minuet in G Minor (BWV Anh. 115).midi (100%) rename assets/musics/{Bach: Minuet in G Minor (BWV Anh. 115) => Bach Minuet in G Minor (BWV Anh. 115)}/Bach: Minuet in G Minor (BWV Anh. 115).mxl (100%) rename assets/musics/{Bach: Minuet in G Minor (BWV Anh. 115) => Bach Minuet in G Minor (BWV Anh. 115)}/illustration.png (100%) rename assets/musics/{Bach: Polonaise in g Minor (BWV Anh. 119) => Bach Polonaise in g Minor (BWV Anh. 119)}/Bach: Polonaise in g Minor (BWV Anh. 119).ini (100%) rename assets/musics/{Bach: Polonaise in g Minor (BWV Anh. 119) => Bach Polonaise in g Minor (BWV Anh. 119)}/Bach: Polonaise in g Minor (BWV Anh. 119).midi (100%) rename assets/musics/{Bach: Polonaise in g Minor (BWV Anh. 119) => Bach Polonaise in g Minor (BWV Anh. 119)}/Bach: Polonaise in g Minor (BWV Anh. 119).mxl (100%) rename assets/musics/{Bach: Polonaise in g Minor (BWV Anh. 119) => Bach Polonaise in g Minor (BWV Anh. 119)}/illustration.png (100%) rename "assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".ini" => "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".ini" (100%) rename "assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".midi" => "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".midi" (100%) rename "assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".mxl" => "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".mxl" (100%) rename "assets/musics/French National Anthem \"La Marseillaise\"/illustration.png" => assets/musics/French National Anthem La Marseillaise/illustration.png (100%) rename "assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".ini" => "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".ini" (100%) rename "assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".midi" => "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".midi" (100%) rename "assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".mxl" => "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".mxl" (100%) rename "assets/musics/German National Anthem \" Das Lied der Deutschen\"/illustration.png" => assets/musics/German National Anthem Das Lied der Deutschen/illustration.png (100%) rename assets/musics/{Mary, Did You Know? => Mary, Did You Know}/Mary, Did You Know?.ini (100%) rename assets/musics/{Mary, Did You Know? => Mary, Did You Know}/Mary, Did You Know?.midi (100%) rename assets/musics/{Mary, Did You Know? => Mary, Did You Know}/Mary, Did You Know?.mxl (100%) rename assets/musics/{Mary, Did You Know? => Mary, Did You Know}/illustration.png (100%) diff --git a/assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).ini b/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).ini similarity index 100% rename from assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).ini rename to assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).ini diff --git a/assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).midi b/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).midi similarity index 100% rename from assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).midi rename to assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).midi diff --git a/assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).mxl b/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).mxl similarity index 100% rename from assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).mxl rename to assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).mxl diff --git a/assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/illustration.png b/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/illustration.png similarity index 100% rename from assets/musics/Bach: Minuet in G Minor (BWV Anh. 115)/illustration.png rename to assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/illustration.png diff --git a/assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).ini b/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).ini similarity index 100% rename from assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).ini rename to assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).ini diff --git a/assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).midi b/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).midi similarity index 100% rename from assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).midi rename to assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).midi diff --git a/assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).mxl b/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).mxl similarity index 100% rename from assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).mxl rename to assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).mxl diff --git a/assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/illustration.png b/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/illustration.png similarity index 100% rename from assets/musics/Bach: Polonaise in g Minor (BWV Anh. 119)/illustration.png rename to assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/illustration.png diff --git "a/assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".ini" "b/assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".ini" similarity index 100% rename from "assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".ini" rename to "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".ini" diff --git "a/assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".midi" "b/assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".midi" similarity index 100% rename from "assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".midi" rename to "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".midi" diff --git "a/assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".mxl" "b/assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".mxl" similarity index 100% rename from "assets/musics/French National Anthem \"La Marseillaise\"/French National Anthem \"La Marseillaise\".mxl" rename to "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".mxl" diff --git "a/assets/musics/French National Anthem \"La Marseillaise\"/illustration.png" b/assets/musics/French National Anthem La Marseillaise/illustration.png similarity index 100% rename from "assets/musics/French National Anthem \"La Marseillaise\"/illustration.png" rename to assets/musics/French National Anthem La Marseillaise/illustration.png diff --git "a/assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".ini" "b/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".ini" similarity index 100% rename from "assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".ini" rename to "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".ini" diff --git "a/assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".midi" "b/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".midi" similarity index 100% rename from "assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".midi" rename to "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".midi" diff --git "a/assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".mxl" "b/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".mxl" similarity index 100% rename from "assets/musics/German National Anthem \" Das Lied der Deutschen\"/German National Anthem \" Das Lied der Deutschen\".mxl" rename to "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".mxl" diff --git "a/assets/musics/German National Anthem \" Das Lied der Deutschen\"/illustration.png" b/assets/musics/German National Anthem Das Lied der Deutschen/illustration.png similarity index 100% rename from "assets/musics/German National Anthem \" Das Lied der Deutschen\"/illustration.png" rename to assets/musics/German National Anthem Das Lied der Deutschen/illustration.png diff --git a/assets/musics/Mary, Did You Know?/Mary, Did You Know?.ini b/assets/musics/Mary, Did You Know/Mary, Did You Know?.ini similarity index 100% rename from assets/musics/Mary, Did You Know?/Mary, Did You Know?.ini rename to assets/musics/Mary, Did You Know/Mary, Did You Know?.ini diff --git a/assets/musics/Mary, Did You Know?/Mary, Did You Know?.midi b/assets/musics/Mary, Did You Know/Mary, Did You Know?.midi similarity index 100% rename from assets/musics/Mary, Did You Know?/Mary, Did You Know?.midi rename to assets/musics/Mary, Did You Know/Mary, Did You Know?.midi diff --git a/assets/musics/Mary, Did You Know?/Mary, Did You Know?.mxl b/assets/musics/Mary, Did You Know/Mary, Did You Know?.mxl similarity index 100% rename from assets/musics/Mary, Did You Know?/Mary, Did You Know?.mxl rename to assets/musics/Mary, Did You Know/Mary, Did You Know?.mxl diff --git a/assets/musics/Mary, Did You Know?/illustration.png b/assets/musics/Mary, Did You Know/illustration.png similarity index 100% rename from assets/musics/Mary, Did You Know?/illustration.png rename to assets/musics/Mary, Did You Know/illustration.png From 509cc5b9f890318210ba3b82e68e78c3a56ab643 Mon Sep 17 00:00:00 2001 From: GitBluub Date: Mon, 24 Jul 2023 14:51:19 +0900 Subject: [PATCH 016/133] rename musics --- ...ni => Bach Minuet in G Minor (BWV Anh. 115).ini} | 0 ...i => Bach Minuet in G Minor (BWV Anh. 115).midi} | Bin ...xl => Bach Minuet in G Minor (BWV Anh. 115).mxl} | Bin ...=> Bach Polonaise in g Minor (BWV Anh. 119).ini} | 0 ...> Bach Polonaise in g Minor (BWV Anh. 119).midi} | Bin ...=> Bach Polonaise in g Minor (BWV Anh. 119).mxl} | Bin .../French National Anthem La Marseillaise.ini | 0 .../French National Anthem La Marseillaise.midi | Bin .../French National Anthem La Marseillaise.mxl | Bin ...rman National Anthem Das Lied der Deutschen.ini | 0 ...man National Anthem Das Lied der Deutschen.midi | Bin ...rman National Anthem Das Lied der Deutschen.mxl | Bin ...ry, Did You Know?.ini => Mary, Did You Know.ini} | 0 ..., Did You Know?.midi => Mary, Did You Know.midi} | Bin ...ry, Did You Know?.mxl => Mary, Did You Know.mxl} | Bin 15 files changed, 0 insertions(+), 0 deletions(-) rename assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/{Bach: Minuet in G Minor (BWV Anh. 115).ini => Bach Minuet in G Minor (BWV Anh. 115).ini} (100%) rename assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/{Bach: Minuet in G Minor (BWV Anh. 115).midi => Bach Minuet in G Minor (BWV Anh. 115).midi} (100%) rename assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/{Bach: Minuet in G Minor (BWV Anh. 115).mxl => Bach Minuet in G Minor (BWV Anh. 115).mxl} (100%) rename assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/{Bach: Polonaise in g Minor (BWV Anh. 119).ini => Bach Polonaise in g Minor (BWV Anh. 119).ini} (100%) rename assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/{Bach: Polonaise in g Minor (BWV Anh. 119).midi => Bach Polonaise in g Minor (BWV Anh. 119).midi} (100%) rename assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/{Bach: Polonaise in g Minor (BWV Anh. 119).mxl => Bach Polonaise in g Minor (BWV Anh. 119).mxl} (100%) rename "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".ini" => assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.ini (100%) rename "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".midi" => assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.midi (100%) rename "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".mxl" => assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.mxl (100%) rename "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".ini" => assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.ini (100%) rename "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".midi" => assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.midi (100%) rename "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".mxl" => assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.mxl (100%) rename assets/musics/Mary, Did You Know/{Mary, Did You Know?.ini => Mary, Did You Know.ini} (100%) rename assets/musics/Mary, Did You Know/{Mary, Did You Know?.midi => Mary, Did You Know.midi} (100%) rename assets/musics/Mary, Did You Know/{Mary, Did You Know?.mxl => Mary, Did You Know.mxl} (100%) diff --git a/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).ini b/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach Minuet in G Minor (BWV Anh. 115).ini similarity index 100% rename from assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).ini rename to assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach Minuet in G Minor (BWV Anh. 115).ini diff --git a/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).midi b/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach Minuet in G Minor (BWV Anh. 115).midi similarity index 100% rename from assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).midi rename to assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach Minuet in G Minor (BWV Anh. 115).midi diff --git a/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).mxl b/assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach Minuet in G Minor (BWV Anh. 115).mxl similarity index 100% rename from assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach: Minuet in G Minor (BWV Anh. 115).mxl rename to assets/musics/Bach Minuet in G Minor (BWV Anh. 115)/Bach Minuet in G Minor (BWV Anh. 115).mxl diff --git a/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).ini b/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach Polonaise in g Minor (BWV Anh. 119).ini similarity index 100% rename from assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).ini rename to assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach Polonaise in g Minor (BWV Anh. 119).ini diff --git a/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).midi b/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach Polonaise in g Minor (BWV Anh. 119).midi similarity index 100% rename from assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).midi rename to assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach Polonaise in g Minor (BWV Anh. 119).midi diff --git a/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).mxl b/assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach Polonaise in g Minor (BWV Anh. 119).mxl similarity index 100% rename from assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach: Polonaise in g Minor (BWV Anh. 119).mxl rename to assets/musics/Bach Polonaise in g Minor (BWV Anh. 119)/Bach Polonaise in g Minor (BWV Anh. 119).mxl diff --git "a/assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".ini" b/assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.ini similarity index 100% rename from "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".ini" rename to assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.ini diff --git "a/assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".midi" b/assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.midi similarity index 100% rename from "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".midi" rename to assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.midi diff --git "a/assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".mxl" b/assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.mxl similarity index 100% rename from "assets/musics/French National Anthem La Marseillaise/French National Anthem \"La Marseillaise\".mxl" rename to assets/musics/French National Anthem La Marseillaise/French National Anthem La Marseillaise.mxl diff --git "a/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".ini" b/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.ini similarity index 100% rename from "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".ini" rename to assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.ini diff --git "a/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".midi" b/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.midi similarity index 100% rename from "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".midi" rename to assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.midi diff --git "a/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".mxl" b/assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.mxl similarity index 100% rename from "assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem \" Das Lied der Deutschen\".mxl" rename to assets/musics/German National Anthem Das Lied der Deutschen/German National Anthem Das Lied der Deutschen.mxl diff --git a/assets/musics/Mary, Did You Know/Mary, Did You Know?.ini b/assets/musics/Mary, Did You Know/Mary, Did You Know.ini similarity index 100% rename from assets/musics/Mary, Did You Know/Mary, Did You Know?.ini rename to assets/musics/Mary, Did You Know/Mary, Did You Know.ini diff --git a/assets/musics/Mary, Did You Know/Mary, Did You Know?.midi b/assets/musics/Mary, Did You Know/Mary, Did You Know.midi similarity index 100% rename from assets/musics/Mary, Did You Know/Mary, Did You Know?.midi rename to assets/musics/Mary, Did You Know/Mary, Did You Know.midi diff --git a/assets/musics/Mary, Did You Know/Mary, Did You Know?.mxl b/assets/musics/Mary, Did You Know/Mary, Did You Know.mxl similarity index 100% rename from assets/musics/Mary, Did You Know/Mary, Did You Know?.mxl rename to assets/musics/Mary, Did You Know/Mary, Did You Know.mxl From 4207d5ee50ef7b889d1bd16d974f5b191e78e99a Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 24 Jul 2023 19:18:49 +0900 Subject: [PATCH 017/133] Try to fix the CI --- .env.example | 4 +++- .github/workflows/CI.yml | 14 +++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/.env.example b/.env.example index 890b8ff..29a74c8 100644 --- a/.env.example +++ b/.env.example @@ -7,4 +7,6 @@ JWT_SECRET=wow POSTGRES_DB=chromacase API_URL=http://localhost:80/api SCORO_URL=ws://localhost:6543 - +GOOGLE_CLIENT_ID=toto +GOOGLE_SECRET=tata +GOOGLE_CALLBACK_URL=http://localhost:19006/logged/google diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 48dc008..5f4ba5e 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -42,7 +42,7 @@ jobs: - name: Install dependencies run: yarn install - + - name: Type Check run: yarn tsc - name: Check Prettier @@ -84,16 +84,7 @@ jobs: fetch-depth: 0 - name: Copy env file to github secret env file - run: | - touch .env - echo "POSTGRES_USER=user" >> .env - echo "POSTGRES_PASSWORD=eip" >> .env - echo "POSTGRES_NAME=chromacase" >> .env - echo "POSTGRES_HOST=db" >> .env - echo "DATABASE_URL=postgresql://user:eip@db:5432/chromacase" >> .env - echo "JWT_SECRET=wow" >> .env - echo "POSTGRES_DB=chromacase" >> .env - echo "API_URL=http://localhost:80/api" >> .env + run: cp .env.example .env - name: Start the service run: docker-compose up -d back db @@ -101,6 +92,7 @@ jobs: - name: Perform healthchecks run: | docker-compose ps -a + docker-compose logs wget --retry-connrefused http://localhost:3000 # /healthcheck - name: Run scorometer tests From 20eb62d19b203e513b869638d2ca0f8dad39b331 Mon Sep 17 00:00:00 2001 From: Arthur Jamet <60505370+Arthi-chaud@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:00:06 +0100 Subject: [PATCH 018/133] Front: Graphes de Score (#248) --- front/components/ScoreGraph.tsx | 78 +++++++++++++++++++++++++++++++++ front/models/SongHistory.ts | 2 + front/package.json | 3 +- front/views/ScoreView.tsx | 7 ++- front/views/SongLobbyView.tsx | 56 ++++------------------- front/yarn.lock | 27 ++++++++++-- 6 files changed, 120 insertions(+), 53 deletions(-) create mode 100644 front/components/ScoreGraph.tsx diff --git a/front/components/ScoreGraph.tsx b/front/components/ScoreGraph.tsx new file mode 100644 index 0000000..01f3565 --- /dev/null +++ b/front/components/ScoreGraph.tsx @@ -0,0 +1,78 @@ +import { Box, useBreakpointValue, useTheme } from 'native-base'; +import { LineChart } from 'react-native-chart-kit'; +import { CardBorderRadius } from './Card'; +import SongHistory from '../models/SongHistory'; +import { useState } from 'react'; + +type ScoreGraphProps = { + // The result of the call to API.getSongHistory + songHistory: SongHistory; +}; + +const formatScoreDate = (playDate: Date): string => { + const pad = (n: number) => n.toString().padStart(2, '0'); + const formattedDate = `${pad(playDate.getDay())}/${pad(playDate.getMonth())}`; + const formattedTime = `${pad(playDate.getHours())}:${pad(playDate.getMinutes())}`; + return `${formattedDate} ${formattedTime}`; +}; + +const ScoreGraph = (props: ScoreGraphProps) => { + const theme = useTheme(); + const [containerWidth, setContainerWidth] = useState(0); + // We sort the scores by date, asc. + // By default, the API returns them in desc. + // const pointsToDisplay = props.width / 100; + const isSmall = useBreakpointValue({ base: true, md: false }); + const scores = props.songHistory.history + .sort((a, b) => { + if (a.playDate < b.playDate) { + return -1; + } else if (a.playDate > b.playDate) { + return 1; + } + return 0; + }) + .slice(-10); + + return ( + setContainerWidth(event.nativeEvent.layout.width)} + > + formatScoreDate(playDate)), + datasets: [ + { + data: scores.map(({ score }) => score), + }, + ], + }} + width={containerWidth} + height={200} // Completely arbitrary + transparent={true} + yAxisSuffix=" pts" + chartConfig={{ + decimalPlaces: 0, + color: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, + labelColor: () => theme.colors.white, + propsForDots: { + r: '6', + strokeWidth: '2', + }, + }} + bezier + style={{ + margin: 3, + shadowColor: theme.colors.primary[400], + shadowOpacity: 1, + shadowRadius: 20, + borderRadius: CardBorderRadius, + }} + /> + + ); +}; + +export default ScoreGraph; diff --git a/front/models/SongHistory.ts b/front/models/SongHistory.ts index c08145b..d8a81ef 100644 --- a/front/models/SongHistory.ts +++ b/front/models/SongHistory.ts @@ -5,6 +5,7 @@ export const SongHistoryItemValidator = yup.object({ songID: yup.number().required(), userID: yup.number().required(), score: yup.number().required(), + playDate: yup.date().required(), difficulties: yup.mixed().required(), }); @@ -38,6 +39,7 @@ export type SongHistoryItem = { songID: number; userID: number; score: number; + playDate: Date; difficulties: object; }; diff --git a/front/package.json b/front/package.json index 4987f1d..42d4b5e 100644 --- a/front/package.json +++ b/front/package.json @@ -52,12 +52,13 @@ "react-dom": "18.1.0", "react-i18next": "^11.18.3", "react-native": "0.70.5", + "react-native-chart-kit": "^6.12.0", "react-native-paper": "^4.12.5", "react-native-reanimated": "~2.12.0", "react-native-safe-area-context": "4.4.1", "react-native-screens": "~3.18.0", "react-native-super-grid": "^4.6.1", - "react-native-svg": "13.4.0", + "react-native-svg": "^13.10.0", "react-native-testing-library": "^6.0.0", "react-native-url-polyfill": "^1.3.0", "react-native-web": "~0.18.7", diff --git a/front/views/ScoreView.tsx b/front/views/ScoreView.tsx index 359c179..15d204c 100644 --- a/front/views/ScoreView.tsx +++ b/front/views/ScoreView.tsx @@ -8,6 +8,7 @@ import CardGridCustom from '../components/CardGridCustom'; import SongCard from '../components/SongCard'; import { useQueries, useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; +import ScoreGraph from '../components/ScoreGraph'; type ScoreViewProps = { songId: number; @@ -32,6 +33,7 @@ const ScoreView = (props: RouteProps) => { const artistQuery = useQuery(() => API.getArtist(songQuery.data!.artistId!), { enabled: songQuery.data !== undefined, }); + const scoresQuery = useQuery(API.getSongHistory(props.songId), { refetchOnWindowFocus: true }); const recommendations = useQuery(API.getSongSuggestions); const artistRecommendations = useQueries( recommendations.data @@ -54,7 +56,7 @@ const ScoreView = (props: RouteProps) => { return ( - + {songQuery.data.name} @@ -137,6 +139,9 @@ const ScoreView = (props: RouteProps) => { + {scoresQuery.data && (scoresQuery.data?.history?.length ?? 0) > 1 && ( + + )} ({ diff --git a/front/views/SongLobbyView.tsx b/front/views/SongLobbyView.tsx index 7f278a9..ccae936 100644 --- a/front/views/SongLobbyView.tsx +++ b/front/views/SongLobbyView.tsx @@ -1,13 +1,12 @@ -import { Divider, Box, Image, Text, VStack, PresenceTransition, Icon, Stack } from 'native-base'; +import { Box, Image, Text, Icon, Stack } from 'native-base'; import { useQuery } from '../Queries'; -import LoadingComponent, { LoadingView } from '../components/Loading'; -import React, { useEffect, useState } from 'react'; -import { Translate, translate } from '../i18n/i18n'; -import formatDuration from 'format-duration'; +import { LoadingView } from '../components/Loading'; +import { Translate } from '../i18n/i18n'; import { Ionicons } from '@expo/vector-icons'; import API from '../API'; import TextButton from '../components/TextButton'; import { RouteProps, useNavigation } from '../Navigation'; +import ScoreGraph from '../components/ScoreGraph'; interface SongLobbyProps { // The unique identifier to find a song @@ -15,6 +14,7 @@ interface SongLobbyProps { } const SongLobbyView = (props: RouteProps) => { + const rootComponentPadding = 30; const navigation = useNavigation(); // Refetch to update score when coming back from score view const songQuery = useQuery(API.getSong(props.songId), { refetchOnWindowFocus: true }); @@ -22,18 +22,13 @@ const SongLobbyView = (props: RouteProps) => { refetchOnWindowFocus: true, }); const scoresQuery = useQuery(API.getSongHistory(props.songId), { refetchOnWindowFocus: true }); - const [chaptersOpen, setChaptersOpen] = useState(false); - useEffect(() => { - if (chaptersOpen && !chaptersQuery.data) chaptersQuery.refetch(); - }, [chaptersOpen]); - useEffect(() => {}, [songQuery.isLoading]); if (songQuery.isLoading || scoresQuery.isLoading) return ; if (songQuery.isError || scoresQuery.isError) { navigation.navigate('Error'); return <>; } return ( - + ) => { {scoresQuery.data?.history.at(0)?.score ?? 0} - {/* {songQuery.data!.description} */} - - setChaptersOpen(!chaptersOpen)} - endIcon={ - - } - /> - - - {chaptersQuery.isLoading && } - {!chaptersQuery.isLoading && ( - }> - {chaptersQuery.data!.map((chapter) => ( - - {chapter.name} - - {`${translate('level')} ${ - chapter.difficulty - } - ${formatDuration((chapter.end - chapter.start) * 1000)}`} - - - ))} - - )} - + {scoresQuery.data && (scoresQuery.data?.history?.length ?? 0) > 0 && ( + + )} ); }; diff --git a/front/yarn.lock b/front/yarn.lock index 6760b25..854e80c 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -14716,6 +14716,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +paths-js@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/paths-js/-/paths-js-0.4.11.tgz#b2a9d5f94ee9949aa8fee945f78a12abff44599e" + integrity sha512-3mqcLomDBXOo7Fo+UlaenG6f71bk1ZezPQy2JCmYHy2W2k5VKpP+Jbin9H0bjXynelTbglCqdFhSEkeIkKTYUA== + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -14839,6 +14844,11 @@ pnp-webpack-plugin@^1.5.0: dependencies: ts-pnp "^1.1.6" +point-in-polygon@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/point-in-polygon/-/point-in-polygon-1.1.0.tgz#b0af2616c01bdee341cbf2894df643387ca03357" + integrity sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw== + polished@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" @@ -15747,6 +15757,15 @@ react-merge-refs@^1.0.0: resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== +react-native-chart-kit@^6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/react-native-chart-kit/-/react-native-chart-kit-6.12.0.tgz#187a4987a668a85b7e93588c248ed2c33b3a06f6" + integrity sha512-nZLGyCFzZ7zmX0KjYeeSV1HKuPhl1wOMlTAqa0JhlyW62qV/1ZPXHgT8o9s8mkFaGxdqbspOeuaa6I9jUQDgnA== + dependencies: + lodash "^4.17.13" + paths-js "^0.4.10" + point-in-polygon "^1.0.1" + react-native-codegen@^0.70.6: version "0.70.6" resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.70.6.tgz#2ce17d1faad02ad4562345f8ee7cbe6397eda5cb" @@ -15816,10 +15835,10 @@ react-native-super-grid@^4.6.1: dependencies: prop-types "^15.6.0" -react-native-svg@13.4.0: - version "13.4.0" - resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-13.4.0.tgz#82399ba0956c454144618aa581e2d748dd3f010a" - integrity sha512-B3TwK+H0+JuRhYPzF21AgqMt4fjhCwDZ9QUtwNstT5XcslJBXC0FoTkdZo8IEb1Sv4suSqhZwlAY6lwOv3tHag== +react-native-svg@^13.10.0: + version "13.10.0" + resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-13.10.0.tgz#d3c6222ea9cc1e21e2af0fd59dfbeafe7a3d0dc1" + integrity sha512-D/oYTmUi5nsA/2Nw4WYlF1UUi3vZqhpESpiEhpYCIFB/EMd6vz4A/uq3tIzZFcfa5z2oAdGSxRU1TaYr8IcPlQ== dependencies: css-select "^5.1.0" css-tree "^1.1.3" From 04487c9b2425940f395edb7cff451bf176d2b63c Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 23 Jul 2023 15:56:48 +0900 Subject: [PATCH 019/133] Add get profile route that supports gravatar --- back/src/auth/auth.controller.ts | 40 +++++++++++++++++++----------- back/src/users/users.controller.ts | 5 ++++ back/src/users/users.service.ts | 32 +++++++++++++++++++++--- docker-compose.dev.yml | 4 +++ docker-compose.prod.yml | 4 +++ docker-compose.yml | 2 ++ 6 files changed, 69 insertions(+), 18 deletions(-) diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index d4320bf..bfc9463 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -44,16 +44,16 @@ export class AuthController { private settingsService: SettingsService, ) {} - @Get("login/google") + @Get('login/google') @UseGuards(AuthGuard('google')) - googleLogin() { } + googleLogin() {} - @Get("logged/google") + @Get('logged/google') @UseGuards(AuthGuard('google')) async googleLoginCallbakc(@Req() req: any) { - let user = await this.usersService.user({googleID: req.user.googleID}); + let user = await this.usersService.user({ googleID: req.user.googleID }); if (!user) { - user = await this.usersService.createUser(req.user) + user = await this.usersService.createUser(req.user); await this.settingsService.createUserSetting(user.id); } return this.authService.login(user); @@ -62,9 +62,9 @@ export class AuthController { @Post('register') async register(@Body() registerDto: RegisterDto): Promise { try { - const user = await this.usersService.createUser(registerDto) + const user = await this.usersService.createUser(registerDto); await this.settingsService.createUserSetting(user.id); - } catch(e) { + } catch (e) { console.error(e); throw new BadRequestException(); } @@ -86,6 +86,15 @@ export class AuthController { return this.authService.login(user); } + @UseGuards(JwtAuthGuard) + @ApiBearerAuth() + @ApiOkResponse({ description: 'The user profile picture' }) + @ApiUnauthorizedResponse({ description: 'Invalid token' }) + @Get('me/picture') + async getProfilePicture(@Request() req: any) { + return await this.usersService.getProfilePicture(req.user.id); + } + @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiOkResponse({ description: 'Successfully logged in', type: User }) @@ -133,25 +142,28 @@ export class AuthController { @UseGuards(JwtAuthGuard) @ApiBearerAuth() - @ApiOkResponse({description: 'Successfully edited settings', type: Setting}) - @ApiUnauthorizedResponse({description: 'Invalid token'}) + @ApiOkResponse({ description: 'Successfully edited settings', type: Setting }) + @ApiUnauthorizedResponse({ description: 'Invalid token' }) @Patch('me/settings') udpateSettings( @Request() req: any, - @Body() settingUserDto: UpdateSettingDto): Promise { + @Body() settingUserDto: UpdateSettingDto, + ): Promise { return this.settingsService.updateUserSettings({ - where: { userId: +req.user.id}, + where: { userId: +req.user.id }, data: settingUserDto, }); } @UseGuards(JwtAuthGuard) @ApiBearerAuth() - @ApiOkResponse({description: 'Successfully edited settings', type: Setting}) - @ApiUnauthorizedResponse({description: 'Invalid token'}) + @ApiOkResponse({ description: 'Successfully edited settings', type: Setting }) + @ApiUnauthorizedResponse({ description: 'Invalid token' }) @Get('me/settings') async getSettings(@Request() req: any): Promise { - const result = await this.settingsService.getUserSetting({ userId: +req.user.id }); + const result = await this.settingsService.getUserSetting({ + userId: +req.user.id, + }); if (!result) throw new NotFoundException(); return result; } diff --git a/back/src/users/users.controller.ts b/back/src/users/users.controller.ts index 257ebba..91e2975 100644 --- a/back/src/users/users.controller.ts +++ b/back/src/users/users.controller.ts @@ -20,4 +20,9 @@ export class UsersController { if (!ret) throw new NotFoundException(); return ret; } + + @Get(':id/picture') + async getPicture(@Param('id') id: number) { + return await this.usersService.getProfilePicture(+id); + } } diff --git a/back/src/users/users.service.ts b/back/src/users/users.service.ts index 1cbfc20..738dc0a 100644 --- a/back/src/users/users.service.ts +++ b/back/src/users/users.service.ts @@ -1,8 +1,14 @@ -import { Injectable } from '@nestjs/common'; +import { + Injectable, + InternalServerErrorException, + NotFoundException, + StreamableFile, +} from '@nestjs/common'; import { User, Prisma } from '@prisma/client'; import { PrismaService } from 'src/prisma/prisma.service'; import * as bcrypt from 'bcryptjs'; -import { randomUUID } from 'crypto'; +import { createHash, randomUUID } from 'crypto'; +import { createReadStream, existsSync } from 'fs'; @Injectable() export class UsersService { @@ -34,8 +40,7 @@ export class UsersService { } async createUser(data: Prisma.UserCreateInput): Promise { - if (data.password) - data.password = await bcrypt.hash(data.password, 8); + if (data.password) data.password = await bcrypt.hash(data.password, 8); return this.prisma.user.create({ data, }); @@ -73,4 +78,23 @@ export class UsersService { where, }); } + + async getProfilePicture(userId: number) { + const path = `/data/${userId}.png`; + if (existsSync(path)) { + const file = createReadStream(path); + return new StreamableFile(file); + } + // We could not find a profile icon locally, using gravatar instead. + const user = await this.user({ id: userId }); + if (!user) throw new InternalServerErrorException(); + const hash = createHash('md5') + .update(user.email.trim().toLowerCase()) + .digest('hex'); + const resp = await fetch( + `https://www.gravatar.com/avatar/${hash}.jpg?d=404`, + ); + if (!resp.ok) throw new NotFoundException('No image found for user'); + return resp.arrayBuffer(); + } } diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index c6e925e..e011bb6 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -9,6 +9,7 @@ services: volumes: - ./back:/app - ./assets:/assets + - data:/data depends_on: db: condition: service_healthy @@ -54,3 +55,6 @@ services: - "back" env_file: - .env + +volumes: + data: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 64cca51..bd901c4 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -10,6 +10,7 @@ services: - .env volumes: - ./assets:/assets + - data:/data scorometer: image: ghcr.io/chroma-case/scorometer:main ports: @@ -43,3 +44,6 @@ services: - "back" env_file: - .env + +volumes: + data: diff --git a/docker-compose.yml b/docker-compose.yml index aefda37..3ddf329 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,6 +10,7 @@ services: - .env volumes: - ./assets:/assets + - data:/data scorometer: build: ./scorometer ports: @@ -52,3 +53,4 @@ services: volumes: db: + data: From 95b08935cc7f20615d420f1d4540f649e46807bc Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 23 Jul 2023 16:15:41 +0900 Subject: [PATCH 020/133] Add file upload --- back/package-lock.json | 19 ++++++++++++++++++ back/package.json | 1 + back/src/auth/auth.controller.ts | 34 ++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/back/package-lock.json b/back/package-lock.json index 017de09..925868b 100644 --- a/back/package-lock.json +++ b/back/package-lock.json @@ -38,6 +38,7 @@ "@nestjs/testing": "^8.0.0", "@types/express": "^4.17.13", "@types/jest": "27.4.1", + "@types/multer": "^1.4.7", "@types/node": "^16.0.0", "@types/passport-google-oauth20": "^2.0.11", "@types/supertest": "^2.0.11", @@ -1959,6 +1960,15 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/node": { "version": "16.11.33", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", @@ -10767,6 +10777,15 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/node": { "version": "16.11.33", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", diff --git a/back/package.json b/back/package.json index 217d059..5dd4c39 100644 --- a/back/package.json +++ b/back/package.json @@ -50,6 +50,7 @@ "@nestjs/testing": "^8.0.0", "@types/express": "^4.17.13", "@types/jest": "27.4.1", + "@types/multer": "^1.4.7", "@types/node": "^16.0.0", "@types/passport-google-oauth20": "^2.0.11", "@types/supertest": "^2.0.11", diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index bfc9463..25eda08 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -13,6 +13,10 @@ import { Patch, NotFoundException, Req, + UseInterceptors, + UploadedFile, + HttpStatus, + ParseFilePipeBuilder, } from '@nestjs/common'; import { AuthService } from './auth.service'; import { JwtAuthGuard } from './jwt-auth.guard'; @@ -34,6 +38,8 @@ import { Setting } from 'src/models/setting'; import { UpdateSettingDto } from 'src/settings/dto/update-setting.dto'; import { SettingsService } from 'src/settings/settings.service'; import { AuthGuard } from '@nestjs/passport'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { writeFile } from 'fs'; @ApiTags('auth') @Controller('auth') @@ -95,6 +101,34 @@ export class AuthController { return await this.usersService.getProfilePicture(req.user.id); } + @UseGuards(JwtAuthGuard) + @ApiBearerAuth() + @ApiOkResponse({ description: 'The user profile picture' }) + @ApiUnauthorizedResponse({ description: 'Invalid token' }) + @Post('me/picture') + @UseInterceptors(FileInterceptor('file')) + async postProfilePicture( + @Request() req: any, + @UploadedFile( + new ParseFilePipeBuilder() + .addFileTypeValidator({ + fileType: 'jpeg', + }) + .addMaxSizeValidator({ + maxSize: 5000, + }) + .build({ + errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY, + }), + ) + file: Express.Multer.File, + ) { + const path = `/data/${req.user.id}.png`; + writeFile(path, file.buffer, (err) => { + if (err) throw err; + }); + } + @UseGuards(JwtAuthGuard) @ApiBearerAuth() @ApiOkResponse({ description: 'Successfully logged in', type: User }) From ebcc48cc5783cde22e0884d0a64a1d7880718710 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 23 Jul 2023 16:21:31 +0900 Subject: [PATCH 021/133] Upgrade back packages --- back/package-lock.json | 10867 +++++++++++++--------------- back/package.json | 72 +- back/src/main.ts | 4 +- back/src/prisma/prisma.service.ts | 8 +- 4 files changed, 5084 insertions(+), 5867 deletions(-) diff --git a/back/package-lock.json b/back/package-lock.json index 925868b..4d0d15c 100644 --- a/back/package-lock.json +++ b/back/package-lock.json @@ -9,63 +9,72 @@ "version": "0.0.1", "license": "UNLICENSED", "dependencies": { - "@nestjs/common": "^8.0.0", - "@nestjs/config": "^2.1.0", - "@nestjs/core": "^8.0.0", - "@nestjs/jwt": "^8.0.1", + "@nestjs/common": "^10.1.0", + "@nestjs/config": "^3.0.0", + "@nestjs/core": "^10.1.0", + "@nestjs/jwt": "^10.1.0", "@nestjs/mapped-types": "*", - "@nestjs/passport": "^8.2.2", - "@nestjs/platform-express": "^8.0.0", - "@nestjs/swagger": "^5.2.1", - "@prisma/client": "^4.4.0", + "@nestjs/passport": "^10.0.0", + "@nestjs/platform-express": "^10.1.0", + "@nestjs/swagger": "^7.1.2", + "@prisma/client": "^5.0.0", "@types/bcrypt": "^5.0.0", "@types/bcryptjs": "^2.4.2", - "@types/passport": "^1.0.9", + "@types/passport": "^1.0.12", "bcryptjs": "^2.4.3", "class-transformer": "^0.5.1", - "class-validator": "^0.13.2", + "class-validator": "^0.14.0", "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.0", + "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", "reflect-metadata": "^0.1.13", - "rimraf": "^3.0.2", - "rxjs": "^7.2.0", - "swagger-ui-express": "^4.5.0" + "rimraf": "^5.0.1", + "rxjs": "^7.8.1", + "swagger-ui-express": "^5.0.0" }, "devDependencies": { - "@nestjs/cli": "^8.0.0", - "@nestjs/schematics": "^8.0.0", - "@nestjs/testing": "^8.0.0", - "@types/express": "^4.17.13", - "@types/jest": "27.4.1", + "@nestjs/cli": "^10.1.10", + "@nestjs/schematics": "^10.0.1", + "@nestjs/testing": "^10.1.0", + "@types/express": "^4.17.17", + "@types/jest": "29.5.3", "@types/multer": "^1.4.7", - "@types/node": "^16.0.0", + "@types/node": "^20.4.4", "@types/passport-google-oauth20": "^2.0.11", - "@types/supertest": "^2.0.11", - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^8.0.1", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "jest": "^27.2.5", - "prettier": "^2.3.2", - "prisma": "^4.4.0", - "source-map-support": "^0.5.20", - "supertest": "^6.1.3", - "ts-jest": "^27.0.3", - "ts-loader": "^9.2.3", - "ts-node": "^10.0.0", - "tsconfig-paths": "^3.10.1", - "typescript": "^4.3.5" + "@types/supertest": "^2.0.12", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.1.0", + "eslint": "^8.45.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0", + "jest": "^29.6.1", + "prettier": "^3.0.0", + "prisma": "^5.0.0", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-loader": "^9.4.4", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "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" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "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.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -73,20 +82,19 @@ } }, "node_modules/@angular-devkit/core": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.2.tgz", - "integrity": "sha512-wav5plcnlxQAfZ+0EUt3dvVTJnJ1au2TlKVQ0jSQJdR1LA6N7QUI49N2Ua6ZnDMwruQaQkoynitMW2l1it3qYQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", + "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", "dev": true, "dependencies": { - "ajv": "8.9.0", + "ajv": "8.12.0", "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -99,84 +107,50 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/schematics": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.2.tgz", - "integrity": "sha512-XCLb23jmqHN0gJg9ZlICaFgfpfnCufIQp5SOsRKMKRkhjKycvDmKnfBTKDlkzb1IaUl6wQwP5k7Z69b9EX+CQw==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", + "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.3.2", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", + "@angular-devkit/core": "16.1.4", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", "ora": "5.4.1", - "rxjs": "6.6.7" + "rxjs": "7.8.1" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-13.3.2.tgz", - "integrity": "sha512-cUHZFNq2kaCaReJAU28MSu2D+WDFTqt2v03U79TryOutYdF8BV4FyfvKqCSW6WXna219GXSXPepVqDYcjvn7/w==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-16.1.4.tgz", + "integrity": "sha512-/m05+9jCV6jYcQZhDoQXo8neusE1HGU5oM+Jw2xtl3oube8vzbymhwq1SoDeMlnhMnhnxg4rMsghEgRROAq4bA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.3.2", - "@angular-devkit/schematics": "13.3.2", - "ansi-colors": "4.1.1", - "inquirer": "8.2.0", - "minimist": "1.2.6", - "symbol-observable": "4.0.0" + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "ansi-colors": "4.1.3", + "inquirer": "8.2.4", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" }, "bin": { "schematics": "bin/schematics.js" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics-cli/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -189,75 +163,58 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -267,23 +224,30 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/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==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" } }, "node_modules/@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -291,15 +255,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -308,155 +273,176 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "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" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "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.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "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" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "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.17.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "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.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "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" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -502,13 +488,13 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@babel/highlight/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -517,7 +503,7 @@ "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -536,9 +522,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -607,6 +593,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -695,12 +696,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz", - "integrity": "sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -710,33 +711,33 @@ } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -754,12 +755,13 @@ } }, "node_modules/@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -772,45 +774,83 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "optional": true, "engines": { - "node": ">= 12" + "node": ">=0.1.90" } }, "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.0.tgz", + "integrity": "sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", - "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { @@ -835,26 +875,137 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/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==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "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", @@ -880,6 +1031,19 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "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" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -893,6 +1057,45 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -912,75 +1115,59 @@ } }, "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "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", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.8.1", + "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "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", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "rimraf": "^3.0.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -991,102 +1178,111 @@ } } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/environment": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "node_modules/@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "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", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", + "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", - "source-map": "^0.6.0", "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1097,336 +1293,305 @@ } } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/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" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" + "graceful-fs": "^4.2.9" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/source-map/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" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "dependencies": { - "@jest/test-result": "^27.5.1", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "write-file-atomic": "^4.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/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" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^16.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "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.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "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" } }, + "node_modules/@jridgewell/source-map": { + "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" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz", - "integrity": "sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "engines": { + "node": ">=8" } }, "node_modules/@nestjs/cli": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-8.2.5.tgz", - "integrity": "sha512-b5DzZ08q/6iWvLz+n2DhEyZ3rsOurN1ec1jYQaWC5DCVQoZCwyOew48bVf01kevTK4eZyQxPwuErf7HnFAc0oQ==", + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.1.10.tgz", + "integrity": "sha512-5adPl6m2X0uOrK4IPUbzBJUqZ//UKsKi9c7yAR3uCu+moSDMieG/YeKt+zGLnF2gaCdHdgeWWoxI0nfMVE5uCA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.3.2", - "@angular-devkit/schematics": "13.3.2", - "@angular-devkit/schematics-cli": "13.3.2", - "@nestjs/schematics": "^8.0.3", - "chalk": "3.0.0", + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "@angular-devkit/schematics-cli": "16.1.4", + "@nestjs/schematics": "^10.0.1", + "chalk": "4.1.2", "chokidar": "3.5.3", - "cli-table3": "0.6.1", + "cli-table3": "0.6.3", "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "7.2.3", - "inquirer": "7.3.3", + "fork-ts-checker-webpack-plugin": "8.0.0", + "inquirer": "8.2.5", "node-emoji": "1.11.0", "ora": "5.4.1", "os-name": "4.0.1", - "rimraf": "3.0.2", + "rimraf": "4.4.1", "shelljs": "0.8.5", "source-map-support": "0.5.21", "tree-kill": "1.2.2", - "tsconfig-paths": "3.14.1", - "tsconfig-paths-webpack-plugin": "3.5.2", - "typescript": "4.6.2", - "webpack": "5.71.0", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.1.0", + "typescript": "5.1.6", + "webpack": "5.88.1", "webpack-node-externals": "3.0.0" }, "bin": { "nest": "bin/nest.js" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 6.11.0" - } - }, - "node_modules/@nestjs/cli/node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node": ">= 16" }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@nestjs/cli/node_modules/webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependencies": { + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.62" }, "peerDependenciesMeta": { - "webpack-cli": { + "@swc/cli": { + "optional": true + }, + "@swc/core": { "optional": true } } }, - "node_modules/@nestjs/common": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-8.4.4.tgz", - "integrity": "sha512-QHi7QcgH/5Jinz+SCfIZJkFHc6Cch1YsAEGFEhi6wSp6MILb0sJMQ1CX06e9tCOAjSlBwaJj4PH0eFCVau5v9Q==", + "node_modules/@nestjs/cli/node_modules/brace-expansion": { + "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" + } + }, + "node_modules/@nestjs/cli/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/common": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.1.0.tgz", + "integrity": "sha512-3GNOuDjeAqEVt5Zjia3ZSK55Jg80hIIkq52BOzU+LkCjFgbuEhDot80lCKu05WyntAMAq5wREoDRGEGlSVxENw==", "dependencies": { - "axios": "0.26.1", "iterare": "1.2.1", - "tslib": "2.3.1", - "uuid": "8.3.2" + "tslib": "2.6.0", + "uid": "2.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "cache-manager": "*", "class-transformer": "*", "class-validator": "*", "reflect-metadata": "^0.1.12", "rxjs": "^7.1.0" }, "peerDependenciesMeta": { - "cache-manager": { - "optional": true - }, "class-transformer": { "optional": true }, @@ -1436,44 +1601,42 @@ } }, "node_modules/@nestjs/config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.1.0.tgz", - "integrity": "sha512-wUpt1/QJEN7xnJl4pM3c9rHrY1widq2yPOZfjaMD1//XAP9LLHTaW+RxSEG6BSGIm3w4wGtjco+gKNB2WL7yRg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.0.0.tgz", + "integrity": "sha512-fzASk1Uv6AjdE6uA1na8zpqRCXAhRpcfgpCVv3SAKlgJ3VR3bEjcI4G17WHLgLBsmPzI1ofdkSI451WLD1F1Rw==", "dependencies": { - "dotenv": "16.0.1", - "dotenv-expand": "8.0.3", + "dotenv": "16.1.4", + "dotenv-expand": "10.0.0", "lodash": "4.17.21", - "uuid": "8.3.2" + "uuid": "9.0.0" }, "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0", - "reflect-metadata": "^0.1.13", - "rxjs": "^6.0.0 || ^7.2.0" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "reflect-metadata": "^0.1.13" } }, "node_modules/@nestjs/core": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.4.4.tgz", - "integrity": "sha512-Ef3yJPuzAttpNfehnGqIV5kHIL9SHptB5F4ERxoU7pT61H3xiYpZw6hSjx68cJO7cc6rm7/N+b4zeuJvFHtvBg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.1.0.tgz", + "integrity": "sha512-3ogHxrRAktQZNBSV709QxhNJQPsVInZRqxAK2fV7JDnfoBMu1lM3xI7cO498iViqq5xme3o/46+AdfjW9W2E2A==", "hasInstallScript": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", - "object-hash": "3.0.0", "path-to-regexp": "3.2.0", - "tslib": "2.3.1", - "uuid": "8.3.2" + "tslib": "2.6.0", + "uid": "2.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^8.0.0", - "@nestjs/microservices": "^8.0.0", - "@nestjs/platform-express": "^8.0.0", - "@nestjs/websockets": "^8.0.0", + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", "reflect-metadata": "^0.1.12", "rxjs": "^7.1.0" }, @@ -1490,25 +1653,25 @@ } }, "node_modules/@nestjs/jwt": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.1.tgz", - "integrity": "sha512-9WGfgngX8aclC/MC+CH35Ooo4iPVKc+7xLXaBV6o4ty8g2uZdPomry7cSdK/e6Lv623O/84WapThnPoAtW/jvA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.1.0.tgz", + "integrity": "sha512-iLwCGS25ybUxGS7i5j/Mwuyzvp/WxJftHlm8aLEBv5GV92apz6L1QVjxLdZrqXbzo++C8gdJauhzil8qitY+6w==", "dependencies": { - "@types/jsonwebtoken": "8.5.8", - "jsonwebtoken": "8.5.1" + "@types/jsonwebtoken": "9.0.2", + "jsonwebtoken": "9.0.0" }, "peerDependencies": { - "@nestjs/common": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/@nestjs/mapped-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz", - "integrity": "sha512-NFvofzSinp00j5rzUd4tf+xi9od6383iY0JP7o0Bnu1fuItAUkWBgc4EKuIQ3D+c2QI3i9pG1kDWAeY27EMGtg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", + "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", "peerDependencies": { - "@nestjs/common": "^7.0.8 || ^8.0.0", - "class-transformer": "^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0", - "class-validator": "^0.11.1 || ^0.12.0 || ^0.13.0", + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", "reflect-metadata": "^0.1.12" }, "peerDependenciesMeta": { @@ -1521,93 +1684,142 @@ } }, "node_modules/@nestjs/passport": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-8.2.2.tgz", - "integrity": "sha512-Ytbn8j7WZ4INmEntOpdJY1isTgdQqZkx5ADz8zsZ5wAp0t8tc5GF/A+GlXlmn9/yRPwZHSbmHpv7Qt2EIiNnrw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-10.0.0.tgz", + "integrity": "sha512-IlKKc6M7JOe+4dBbW6gZsXBSD05ZYgwfGf3GJhgCmUGYVqffpDdALQSS6JftnExrE+12rACoEmHkzYwKAGVK0Q==", "peerDependencies": { - "@nestjs/common": "^6.0.0 || ^7.0.0 || ^8.0.0", + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "passport": "^0.4.0 || ^0.5.0 || ^0.6.0" } }, "node_modules/@nestjs/platform-express": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.4.tgz", - "integrity": "sha512-n/H83uzw154v6NVVSg6mniZIvYWtYp0dtNpU9O1qdEmDO030p0tBkeIRoDtpeOVvL2fW5PsHiUYS7HY4tNfykQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.1.0.tgz", + "integrity": "sha512-wl3gsad9Zsv+Im8Fl+meXwpzPLNFRlLbrepGL6Y8za35xXsdx74oCv7NJbjptHMYdwzTZHvbyprfSxV+oHUaXg==", "dependencies": { - "body-parser": "1.20.0", + "body-parser": "1.20.2", "cors": "2.8.5", - "express": "4.17.3", - "multer": "1.4.4", - "tslib": "2.3.1" + "express": "4.18.2", + "multer": "1.4.4-lts.1", + "tslib": "2.6.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^8.0.0", - "@nestjs/core": "^8.0.0" + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0" } }, "node_modules/@nestjs/schematics": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.10.tgz", - "integrity": "sha512-gQq/8TYjtgum+5+QuPfHHKgKxDgNLGh8mH+EJ1skOKX+GTxgt5jmg1GFmwEfiOXZUcF9thT6GsOVNKWrdO3YMg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.0.1.tgz", + "integrity": "sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.3.2", - "@angular-devkit/schematics": "13.3.2", - "fs-extra": "10.0.1", - "jsonc-parser": "3.0.0", + "@angular-devkit/core": "16.1.0", + "@angular-devkit/schematics": "16.1.0", + "comment-json": "4.2.3", + "jsonc-parser": "3.2.0", "pluralize": "8.0.0" }, "peerDependencies": { - "typescript": "^3.4.5 || ^4.3.5" + "typescript": ">=4.8.2" + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.0.tgz", + "integrity": "sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.0.tgz", + "integrity": "sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.1.0", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, "node_modules/@nestjs/swagger": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-5.2.1.tgz", - "integrity": "sha512-7dNa08WCnTsW/oAk3Ujde+z64JMfNm19DhpXasFR8oJp/9pggYAbYU927HpA+GJsSFJX6adjIRZsCKUqaGWznw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.2.tgz", + "integrity": "sha512-/eWlV3YuMpvEAGi3FcP0SbRGI+gqIJ93mxXaRc/GRKAOHLj5UzQ22jsUVqmSLmNMCSmp6PTLNcRGoLW++SExJA==", "dependencies": { - "@nestjs/mapped-types": "1.0.1", + "@nestjs/mapped-types": "2.0.2", + "js-yaml": "4.1.0", "lodash": "4.17.21", - "path-to-regexp": "3.2.0" + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "5.1.0" }, "peerDependencies": { - "@nestjs/common": "^8.0.0", - "@nestjs/core": "^8.0.0", - "fastify-swagger": "*", - "reflect-metadata": "^0.1.12", - "swagger-ui-express": "*" + "@fastify/static": "^6.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12" }, "peerDependenciesMeta": { - "fastify-swagger": { + "@fastify/static": { "optional": true }, - "swagger-ui-express": { + "class-transformer": { + "optional": true + }, + "class-validator": { "optional": true } } }, "node_modules/@nestjs/testing": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.4.4.tgz", - "integrity": "sha512-eGj0Lbi0ONMkjDKbKQHoGX+ecGdrGRZ81I8i6fH4dx9jIR0p4MsBlW964f6Swn1MGkPm/xxomJmBWLPqZEjF7g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.1.0.tgz", + "integrity": "sha512-TqV/21PuU5GJ543oqLTrmQhWUiWwB7DDRcj5cknUdaOst+Kkwp0Sad3/5svcWgOB+QfFbwYlvIDeCkKJshZzPg==", "dev": true, "dependencies": { - "optional": "0.1.4", - "tslib": "2.3.1" + "tslib": "2.6.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^8.0.0", - "@nestjs/core": "^8.0.0", - "@nestjs/microservices": "^8.0.0", - "@nestjs/platform-express": "^8.0.0" + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0" }, "peerDependenciesMeta": { "@nestjs/microservices": { @@ -1670,31 +1882,45 @@ "npm": ">=5.0.0" } }, - "node_modules/@nuxtjs/opencollective/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/unts" } }, "node_modules/@prisma/client": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.4.0.tgz", - "integrity": "sha512-ciKOP246x1xwr04G9ajHlJ4pkmtu9Q6esVyqVBO0QJihaKQIUvbPjClp17IsRJyxqNpFm4ScbOc/s9DUzKHINQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.0.0.tgz", + "integrity": "sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6" + "@prisma/engines-version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584" }, "engines": { - "node": ">=14.17" + "node": ">=16.13" }, "peerDependencies": { "prisma": "*" @@ -1706,76 +1932,73 @@ } }, "node_modules/@prisma/engines": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.4.0.tgz", - "integrity": "sha512-Fpykccxlt9MHrAs/QpPGpI2nOiRxuLA+LiApgA59ibbf24YICZIMWd3SI2YD+q0IAIso0jCGiHhirAIbxK3RyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.0.0.tgz", + "integrity": "sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6.tgz", - "integrity": "sha512-P5v/PuEIJLYXZUZBvOLPqoyCW+m6StNqHdiR6te++gYVODpPdLakks5HVx3JaZIY+LwR02juJWFlwpc9Eog/ug==" + "version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz", + "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "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==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "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" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -1801,12 +2024,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/bcrypt": { @@ -1866,36 +2089,37 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "dependencies": { "@types/node": "*" @@ -1926,31 +2150,25 @@ } }, "node_modules/@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/jsonwebtoken": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", - "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", "dependencies": { "@types/node": "*" } @@ -1970,9 +2188,9 @@ } }, "node_modules/@types/node": { - "version": "16.11.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", - "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA==" + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" }, "node_modules/@types/oauth": { "version": "0.9.1", @@ -1990,9 +2208,9 @@ "dev": true }, "node_modules/@types/passport": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.9.tgz", - "integrity": "sha512-9+ilzUhmZQR4JP49GdC2O4UdDE3POPLwpmaTC/iLkW7l0TZCXOo1zsTnnlXPq6rP1UsUZPfbAV4IUdiwiXyC7g==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", + "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", "dependencies": { "@types/express": "*" } @@ -2020,9 +2238,9 @@ } }, "node_modules/@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "node_modules/@types/qs": { @@ -2035,6 +2253,21 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -2069,10 +2302,15 @@ "@types/superagent": "*" } }, + "node_modules/@types/validator": { + "version": "13.7.17", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", + "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" + }, "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -2085,31 +2323,34 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz", - "integrity": "sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.1.0.tgz", + "integrity": "sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.22.0", - "@typescript-eslint/type-utils": "5.22.0", - "@typescript-eslint/utils": "5.22.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/type-utils": "6.1.0", + "@typescript-eslint/utils": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -2118,25 +2359,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.22.0.tgz", - "integrity": "sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.1.0.tgz", + "integrity": "sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.22.0", - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/typescript-estree": "5.22.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/typescript-estree": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", + "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -2145,16 +2387,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz", - "integrity": "sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.1.0.tgz", + "integrity": "sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/visitor-keys": "5.22.0" + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2162,24 +2404,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz", - "integrity": "sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.1.0.tgz", + "integrity": "sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.22.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "@typescript-eslint/typescript-estree": "6.1.0", + "@typescript-eslint/utils": "6.1.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -2188,12 +2431,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.22.0.tgz", - "integrity": "sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.1.0.tgz", + "integrity": "sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2201,21 +2444,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz", - "integrity": "sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.1.0.tgz", + "integrity": "sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/visitor-keys": "5.22.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2228,40 +2471,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.22.0.tgz", - "integrity": "sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.1.0.tgz", + "integrity": "sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.22.0", - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/typescript-estree": "5.22.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/typescript-estree": "6.1.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz", - "integrity": "sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.1.0.tgz", + "integrity": "sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.22.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "6.1.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2269,148 +2513,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "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 }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "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 }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "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 }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -2426,12 +2670,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "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", @@ -2445,31 +2683,9 @@ } }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "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" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2479,9 +2695,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -2497,30 +2713,18 @@ } }, "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { "node": ">=0.4.0" } }, - "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==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "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", @@ -2551,9 +2755,9 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { "node": ">=6" @@ -2590,7 +2794,6 @@ "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" } @@ -2610,9 +2813,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "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", @@ -2625,7 +2828,7 @@ "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, "node_modules/arg": { "version": "4.1.3", @@ -2636,13 +2839,18 @@ "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==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true }, "node_modules/array-union": { "version": "2.1.0", @@ -2656,61 +2864,36 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", + "babel-preset-jest": "^29.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -2728,18 +2911,18 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "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==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -2766,16 +2949,16 @@ } }, "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", + "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -2819,6 +3002,15 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2840,9 +3032,9 @@ } }, "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "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", @@ -2853,30 +3045,21 @@ "node": ">= 6" } }, - "node_modules/bl/node_modules/string_decoder": { - "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" - } - }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "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.10.3", - "raw-body": "2.5.1", + "qs": "6.11.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -2896,12 +3079,25 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } }, "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" @@ -2919,16 +3115,10 @@ "node": ">=8" } }, - "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==", - "dev": true - }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -2938,14 +3128,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -3009,16 +3202,30 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, "dependencies": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" + "run-applescript": "^5.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" } }, "node_modules/bytes": { @@ -3060,9 +3267,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001335", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", - "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true, "funding": [ { @@ -3072,20 +3279,26 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { @@ -3140,15 +3353,24 @@ } }, "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/class-transformer": { @@ -3157,11 +3379,12 @@ "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" }, "node_modules/class-validator": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", - "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", + "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", "dependencies": { - "libphonenumber-js": "^1.9.43", + "@types/validator": "^13.7.10", + "libphonenumber-js": "^1.10.14", "validator": "^13.7.0" } }, @@ -3178,9 +3401,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, "engines": { "node": ">=6" @@ -3190,9 +3413,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -3201,7 +3424,7 @@ "node": "10.* || >= 12.*" }, "optionalDependencies": { - "colors": "1.4.0" + "@colors/colors": "1.5.0" } }, "node_modules/cli-width": { @@ -3214,20 +3437,23 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "engines": { "node": ">=0.8" @@ -3236,7 +3462,7 @@ "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "engines": { "iojs": ">= 1.0.0", @@ -3244,9 +3470,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "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==", "dev": true }, "node_modules/color-convert": { @@ -3265,16 +3491,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3296,6 +3512,22 @@ "node": ">= 6" } }, + "node_modules/comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dev": true, + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -3305,7 +3537,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3321,38 +3554,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/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==" - }, - "node_modules/concat-stream/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -3370,32 +3571,23 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/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==", + "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==", "dev": true }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -3403,12 +3595,12 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, "node_modules/core-util-is": { @@ -3429,9 +3621,9 @@ } }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "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", @@ -3454,7 +3646,6 @@ "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", @@ -3464,44 +3655,6 @@ "node": ">= 8" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "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" - }, - "engines": { - "node": ">=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==", - "dev": true - }, - "node_modules/data-urls": { - "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", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3519,16 +3672,10 @@ } } }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "node_modules/deep-is": { @@ -3538,27 +3685,186 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "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" } }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -3591,27 +3897,15 @@ } }, "node_modules/dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "dependencies": { "asap": "^2.0.0", "wrappy": "1" } }, - "node_modules/dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "dependencies": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -3622,12 +3916,12 @@ } }, "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==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -3654,43 +3948,30 @@ "node": ">=6.0.0" } }, - "node_modules/domexception": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "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" - } - }, "node_modules/dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dotenv-expand": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", - "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", "engines": { "node": ">=12" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -3702,21 +3983,21 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.131", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.131.tgz", - "integrity": "sha512-oi3YPmaP87hiHn0c4ePB67tXaF+ldGhxvZnT19tW9zX6/Ej+pLN0Afja5rQ6S+TND7I9EuwQTT8JYn1k7R7rrw==", + "version": "1.4.468", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", + "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==", "dev": true }, "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==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" @@ -3725,13 +4006,12 @@ "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==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -3746,9 +4026,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3768,9 +4048,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "node_modules/escalade": { @@ -3785,7 +4065,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -3799,139 +4079,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "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" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "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", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/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, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", - "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.2.2", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "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.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -3944,9 +4134,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -3956,21 +4146,29 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } @@ -3989,40 +4187,16 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "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" - } - }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ajv": { @@ -4041,26 +4215,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4068,6 +4226,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -4098,17 +4259,20 @@ "dev": true }, "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "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.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -4125,9 +4289,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "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" @@ -4187,7 +4351,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -4227,59 +4391,62 @@ "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -4289,23 +4456,26 @@ } }, "node_modules/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/express/node_modules/debug": { @@ -4316,68 +4486,23 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -4412,9 +4537,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4436,7 +4561,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fast-safe-stringify": { @@ -4445,18 +4570,18 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "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" } }, "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "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" @@ -4480,7 +4605,7 @@ "node_modules/figures/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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -4511,16 +4636,16 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -4538,30 +4663,22 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "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": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -4577,35 +4694,57 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/rimraf": { + "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" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.3.tgz", - "integrity": "sha512-9v308zIFTIFkWJBN/4N1A5oqm/ed9hWG6GH+KYTCBjYCEJOmHoVtDIWpfrJ0eD6cPB7V53HEVoJ6bL2In8QRaw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -4616,6 +4755,7 @@ "fs-extra": "^10.0.0", "memfs": "^3.4.1", "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", "schema-utils": "^3.1.1", "semver": "^7.3.5", "tapable": "^2.2.1" @@ -4626,35 +4766,13 @@ }, "peerDependencies": { "typescript": ">3.6.0", - "vue-template-compiler": "*", "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -4666,32 +4784,20 @@ } }, "node_modules/formidable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", - "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", "dev": true, "dependencies": { - "dezalgo": "1.0.3", - "hexoid": "1.0.0", - "once": "1.4.0", - "qs": "6.9.3" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/formidable/node_modules/qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", - "dev": true, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4703,15 +4809,15 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "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", @@ -4723,15 +4829,16 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "node_modules/fsevents": { "version": "2.3.2", @@ -4752,12 +4859,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4777,13 +4878,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4814,6 +4916,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4848,9 +4951,9 @@ "dev": true }, "node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4888,6 +4991,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4907,6 +5016,26 @@ "node": ">=8" } }, + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -4927,18 +5056,6 @@ "node": ">=8" } }, - "node_modules/html-encoding-sniffer": { - "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" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4960,41 +5077,6 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "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", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -5036,9 +5118,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -5092,6 +5174,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5103,63 +5186,31 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, - "node_modules/inquirer/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/inquirer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -5180,7 +5231,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-binary-path": { @@ -5207,6 +5258,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5220,7 +5286,6 @@ "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" } @@ -5246,6 +5311,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -5264,11 +5347,14 @@ "node": ">=0.12.0" } }, - "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==", - "dev": true + "node_modules/is-path-inside": { + "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" + } }, "node_modules/is-stream": { "version": "2.0.1", @@ -5282,12 +5368,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -5300,16 +5380,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-wsl": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -5321,9 +5427,9 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "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", @@ -5337,9 +5443,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" @@ -5383,9 +5489,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -5403,21 +5509,39 @@ "node": ">=6" } }, + "node_modules/jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "dependencies": { - "@jest/core": "^27.5.1", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^27.5.1" + "jest-cli": "^29.6.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -5429,89 +5553,73 @@ } }, "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", "execa": "^5.0.0", - "throat": "^6.0.1" + "p-limit": "^3.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.5.1", "is-generator-fn": "^2.0.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", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "stack-utils": "^2.0.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "prompts": "^2.0.1", - "yargs": "^16.2.0" + "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -5522,367 +5630,211 @@ } } }, - "node_modules/jest-cli/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", - "glob": "^7.1.1", + "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "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", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { + "@types/node": "*", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, "ts-node": { "optional": true } } }, - "node_modules/jest-config/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom": { - "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", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", - "walker": "^1.0.7" + "walker": "^1.0.8" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, - "node_modules/jest-jasmine2": { - "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", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.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.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "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==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "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==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "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" @@ -5897,231 +5849,170 @@ } }, "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "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", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.8.1", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "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.6", - "throat": "^6.0.1" + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-runner/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" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", "dev": true, "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", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "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", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-serializer": { - "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" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot": { - "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==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "dependencies": { - "@babel/core": "^7.7.2", + "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.5.1", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "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", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -6129,40 +6020,24 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", + "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "pretty-format": "^29.6.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { @@ -6177,68 +6052,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.5.1", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", "string-length": "^4.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { @@ -6266,7 +6111,6 @@ "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" }, @@ -6274,52 +6118,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "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", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "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.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6332,12 +6130,6 @@ "node": ">=4" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "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", @@ -6357,9 +6149,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "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" @@ -6369,9 +6161,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "node_modules/jsonfile": { @@ -6387,32 +6179,18 @@ } }, "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "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.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node": ">=12", + "npm": ">=6" } }, "node_modules/jwa": { @@ -6466,9 +6244,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.6.tgz", - "integrity": "sha512-CIjT100/SmntsUjsLVs2t3ufeN4KdNXUxhD07tH153pdbaCWuAjv0jK/gPuywR3IImB/U/MQM+x9RfhMs5XZiA==" + "version": "1.10.37", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz", + "integrity": "sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -6486,15 +6264,18 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -6502,36 +6283,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -6544,17 +6295,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -6571,27 +6311,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/lru-cache": { "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" }, @@ -6612,12 +6335,15 @@ } }, "node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.4" + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/make-dir": { @@ -6636,9 +6362,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" @@ -6662,18 +6388,18 @@ "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "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.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -6682,7 +6408,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -6702,7 +6428,7 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } @@ -6763,6 +6489,7 @@ "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" }, @@ -6771,9 +6498,21 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/mkdirp": { "version": "0.5.6", @@ -6792,21 +6531,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multer": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", - "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", "dependencies": { "append-field": "^1.0.0", - "busboy": "^0.2.11", + "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", - "on-finished": "^2.3.0", "type-is": "^1.6.4", "xtend": "^4.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 6.0.0" } }, "node_modules/mute-stream": { @@ -6821,6 +6559,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "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==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -6835,6 +6579,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -6885,13 +6635,13 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node_modules/node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -6915,12 +6665,6 @@ "node": ">=8" } }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -6934,18 +6678,10 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6965,6 +6701,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "dependencies": { "wrappy": "1" } @@ -6984,24 +6721,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "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", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -7030,22 +6779,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/os-name": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", @@ -7065,37 +6798,40 @@ "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "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": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -7137,12 +6873,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7181,11 +6911,11 @@ } }, "node_modules/passport-jwt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", - "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", "dependencies": { - "jsonwebtoken": "^8.2.0", + "jsonwebtoken": "^9.0.0", "passport-strategy": "^1.0.0" } }, @@ -7240,6 +6970,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -7248,7 +6979,6 @@ "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" } @@ -7259,6 +6989,37 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", @@ -7298,9 +7059,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "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" @@ -7318,6 +7079,58 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/find-up": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -7337,15 +7150,15 @@ } }, "node_modules/prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -7364,17 +7177,17 @@ } }, "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "react-is": "^18.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -7390,20 +7203,19 @@ } }, "node_modules/prisma": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.4.0.tgz", - "integrity": "sha512-l/QKLmLcKJQFuc+X02LyICo0NWTUVaNNZ00jKJBqwDyhwMAhboD1FWwYV50rkH4Wls0RviAJSFzkC2ZrfawpfA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.0.0.tgz", + "integrity": "sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "4.4.0" + "@prisma/engines": "5.0.0" }, "bin": { - "prisma": "build/index.js", - "prisma2": "build/index.js" + "prisma": "build/index.js" }, "engines": { - "node": ">=14.17" + "node": ">=16.13" } }, "node_modules/process-nextick-args": { @@ -7436,12 +7248,6 @@ "node": ">= 0.10" } }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -7461,10 +7267,26 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -7513,9 +7335,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -7527,22 +7349,30 @@ } }, "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==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/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==" + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -7572,22 +7402,19 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=0.10" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7650,9 +7477,9 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" @@ -7682,19 +7509,88 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", "dependencies": { - "glob": "^7.1.3" + "glob": "^10.2.5" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -7728,9 +7624,9 @@ } }, "node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { "tslib": "^2.1.0" } @@ -7759,22 +7655,10 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "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" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "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", @@ -7821,10 +7705,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7836,23 +7719,23 @@ } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "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": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -7869,70 +7752,31 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "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==" }, - "node_modules/send/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "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" } }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -7947,7 +7791,6 @@ "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" }, @@ -7959,7 +7802,6 @@ "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" } @@ -8016,9 +7858,9 @@ } }, "node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "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" @@ -8043,22 +7885,16 @@ "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "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" @@ -8077,25 +7913,33 @@ } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { - "node": ">=0.8.0" + "node": ">=10.0.0" } }, "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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==" }, "node_modules/string-length": { "version": "4.0.2", @@ -8114,7 +7958,20 @@ "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", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "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==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8128,7 +7985,18 @@ "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8167,41 +8035,26 @@ } }, "node_modules/superagent": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz", - "integrity": "sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==", + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", + "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", - "cookiejar": "^2.1.3", + "cookiejar": "^2.1.4", "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", - "formidable": "^2.0.1", + "formidable": "^2.1.2", "methods": "^1.1.2", - "mime": "^2.5.0", - "qs": "^6.10.3", - "readable-stream": "^3.6.0", - "semver": "^7.3.7" + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" }, "engines": { "node": ">=6.4.0 <13 || >=14" } }, - "node_modules/superagent/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==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -8214,40 +8067,17 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/superagent/node_modules/string_decoder": { - "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" - } - }, "node_modules/supertest": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz", - "integrity": "sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^7.1.3" + "superagent": "^8.0.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.4.0" } }, "node_modules/supports-color": { @@ -8261,19 +8091,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -8287,22 +8104,22 @@ } }, "node_modules/swagger-ui-dist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", - "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" }, "node_modules/swagger-ui-express": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz", - "integrity": "sha512-DHk3zFvsxrkcnurGvQlAcLuTDacAVN1JHKDgcba/gr2NFRE4HGwP1YeHIXMiGznkWR4AeS7X5vEblNn4QljuNA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", + "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", "dependencies": { - "swagger-ui-dist": ">=4.11.0" + "swagger-ui-dist": ">=5.0.0" }, "engines": { "node": ">= v0.10.32" }, "peerDependencies": { - "express": ">=4.0.0" + "express": ">=4.0.0 || >=5.0.0-beta" } }, "node_modules/symbol-observable": { @@ -8314,11 +8131,21 @@ "node": ">=0.10" } }, - "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==", - "dev": true + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, "node_modules/tapable": { "version": "2.2.1", @@ -8329,31 +8156,15 @@ "node": ">=6" } }, - "node_modules/terminal-link": { - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", - "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "dependencies": { - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "bin": { @@ -8364,16 +8175,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -8397,13 +8208,33 @@ } } }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "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", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/terser/node_modules/commander": { @@ -8412,44 +8243,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/terser/node_modules/source-map": { - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/terser/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/terser/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==", - "dev": true - }, - "node_modules/terser/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", - "webidl-conversions": "^4.0.2" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -8470,18 +8263,24 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -8503,7 +8302,7 @@ "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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" @@ -8529,41 +8328,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "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" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -8573,39 +8337,51 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@types/jest": "^27.0.0", - "babel-jest": ">=27.0.0 <28", - "jest": "^27.0.0", - "typescript": ">=3.8 <5.0" + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { "optional": true }, - "@types/jest": { + "@jest/types": { "optional": true }, "babel-jest": { @@ -8617,9 +8393,9 @@ } }, "node_modules/ts-loader": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.0.tgz", - "integrity": "sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -8635,29 +8411,13 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-loader/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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { - "@cspotcode/source-map-support": "0.7.0", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -8668,7 +8428,7 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { @@ -8694,100 +8454,47 @@ } } }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths-webpack-plugin": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", - "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^3.9.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/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" + "tsconfig-paths": "^4.1.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "node": ">=10.13.0" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "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" - }, - "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" - } - }, - "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==", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -8837,28 +8544,30 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/typedarray-to-buffer": { - "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" - } + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/uid2": { @@ -8878,11 +8587,50 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8895,7 +8643,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -8906,19 +8654,13 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -8926,19 +8668,25 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^1.6.0" }, "engines": { "node": ">=10.12.0" } }, + "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==", + "dev": true + }, "node_modules/validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -8955,27 +8703,6 @@ "node": ">= 0.8" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "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" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -8986,9 +8713,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -9001,51 +8728,41 @@ "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "dependencies": { "defaults": "^1.0.3" } }, - "node_modules/webidl-conversions": { - "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" - } - }, "node_modules/webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", "dev": true, - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -9082,40 +8799,10 @@ "node": ">=10.13.0" } }, - "node_modules/whatwg-encoding": { - "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" - } - }, - "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==", - "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", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/which": { "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" }, @@ -9188,15 +8875,6 @@ "node": ">=8.12.0" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9214,56 +8892,42 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, + "signal-exit": "^3.0.7" + }, "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 - } + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "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==", - "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==", - "dev": true - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9284,8 +8948,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "1.10.2", @@ -9297,30 +8960,30 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yn": { @@ -9331,108 +8994,81 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "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 + }, "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@angular-devkit/core": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.2.tgz", - "integrity": "sha512-wav5plcnlxQAfZ+0EUt3dvVTJnJ1au2TlKVQ0jSQJdR1LA6N7QUI49N2Ua6ZnDMwruQaQkoynitMW2l1it3qYQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", + "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", "dev": true, "requires": { - "ajv": "8.9.0", + "ajv": "8.12.0", "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" } }, "@angular-devkit/schematics": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.2.tgz", - "integrity": "sha512-XCLb23jmqHN0gJg9ZlICaFgfpfnCufIQp5SOsRKMKRkhjKycvDmKnfBTKDlkzb1IaUl6wQwP5k7Z69b9EX+CQw==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", + "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", "dev": true, "requires": { - "@angular-devkit/core": "13.3.2", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", + "@angular-devkit/core": "16.1.4", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "rxjs": "7.8.1" } }, "@angular-devkit/schematics-cli": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-13.3.2.tgz", - "integrity": "sha512-cUHZFNq2kaCaReJAU28MSu2D+WDFTqt2v03U79TryOutYdF8BV4FyfvKqCSW6WXna219GXSXPepVqDYcjvn7/w==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-16.1.4.tgz", + "integrity": "sha512-/m05+9jCV6jYcQZhDoQXo8neusE1HGU5oM+Jw2xtl3oube8vzbymhwq1SoDeMlnhMnhnxg4rMsghEgRROAq4bA==", "dev": true, "requires": { - "@angular-devkit/core": "13.3.2", - "@angular-devkit/schematics": "13.3.2", - "ansi-colors": "4.1.1", - "inquirer": "8.2.0", - "minimist": "1.2.6", - "symbol-observable": "4.0.0" + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "ansi-colors": "4.1.3", + "inquirer": "8.2.4", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -9445,198 +9081,222 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" } } } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.22.5" } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true }, "@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.2", + "semver": "^6.3.1" }, "dependencies": { + "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==", + "dev": true + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "requires": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "dependencies": { + "lru-cache": { + "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, + "requires": { + "yallist": "^3.0.2" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "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, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "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 }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "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, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "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, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "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 + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -9673,19 +9333,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { @@ -9700,9 +9360,9 @@ } }, "@babel/parser": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -9750,6 +9410,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -9814,39 +9483,39 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz", - "integrity": "sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -9860,12 +9529,13 @@ } }, "@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" } }, @@ -9875,35 +9545,63 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true }, "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "requires": { - "@cspotcode/source-map-consumer": "0.8.0" + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } } }, + "@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, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.0.tgz", + "integrity": "sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", - "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { @@ -9927,23 +9625,93 @@ } } }, + "@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -9966,6 +9734,16 @@ "sprintf-js": "~1.0.2" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -9976,6 +9754,33 @@ "esprima": "^4.0.0" } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "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, + "requires": { + "p-limit": "^2.2.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9991,484 +9796,485 @@ "dev": true }, "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "requires": { - "@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", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.8.1", + "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "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", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "rimraf": "^3.0.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^27.5.1" + "jest-mock": "^29.6.1" + } + }, + "@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "dev": true, + "requires": { + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" + } + }, + "@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3" } }, "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" } }, "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "requires": { "@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", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", + "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", - "source-map": "^0.6.0", "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - } + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "dependencies": { - "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 - } + "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "requires": { - "@jest/test-result": "^27.5.1", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" } }, "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - } + "write-file-atomic": "^4.0.2" } }, "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "requires": { + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^16.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "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, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, + "@jridgewell/source-map": { + "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, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/sourcemap-codec": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz", - "integrity": "sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } } }, + "@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==" + }, "@nestjs/cli": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-8.2.5.tgz", - "integrity": "sha512-b5DzZ08q/6iWvLz+n2DhEyZ3rsOurN1ec1jYQaWC5DCVQoZCwyOew48bVf01kevTK4eZyQxPwuErf7HnFAc0oQ==", + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.1.10.tgz", + "integrity": "sha512-5adPl6m2X0uOrK4IPUbzBJUqZ//UKsKi9c7yAR3uCu+moSDMieG/YeKt+zGLnF2gaCdHdgeWWoxI0nfMVE5uCA==", "dev": true, "requires": { - "@angular-devkit/core": "13.3.2", - "@angular-devkit/schematics": "13.3.2", - "@angular-devkit/schematics-cli": "13.3.2", - "@nestjs/schematics": "^8.0.3", - "chalk": "3.0.0", + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "@angular-devkit/schematics-cli": "16.1.4", + "@nestjs/schematics": "^10.0.1", + "chalk": "4.1.2", "chokidar": "3.5.3", - "cli-table3": "0.6.1", + "cli-table3": "0.6.3", "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "7.2.3", - "inquirer": "7.3.3", + "fork-ts-checker-webpack-plugin": "8.0.0", + "inquirer": "8.2.5", "node-emoji": "1.11.0", "ora": "5.4.1", "os-name": "4.0.1", - "rimraf": "3.0.2", + "rimraf": "4.4.1", "shelljs": "0.8.5", "source-map-support": "0.5.21", "tree-kill": "1.2.2", - "tsconfig-paths": "3.14.1", - "tsconfig-paths-webpack-plugin": "3.5.2", - "typescript": "4.6.2", - "webpack": "5.71.0", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.1.0", + "typescript": "5.1.6", + "webpack": "5.88.1", "webpack-node-externals": "3.0.0" }, "dependencies": { - "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true - }, - "webpack": { - "version": "5.71.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", - "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "requires": { + "glob": "^9.2.0" } } } }, "@nestjs/common": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-8.4.4.tgz", - "integrity": "sha512-QHi7QcgH/5Jinz+SCfIZJkFHc6Cch1YsAEGFEhi6wSp6MILb0sJMQ1CX06e9tCOAjSlBwaJj4PH0eFCVau5v9Q==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.1.0.tgz", + "integrity": "sha512-3GNOuDjeAqEVt5Zjia3ZSK55Jg80hIIkq52BOzU+LkCjFgbuEhDot80lCKu05WyntAMAq5wREoDRGEGlSVxENw==", "requires": { - "axios": "0.26.1", "iterare": "1.2.1", - "tslib": "2.3.1", - "uuid": "8.3.2" + "tslib": "2.6.0", + "uid": "2.0.2" } }, "@nestjs/config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.1.0.tgz", - "integrity": "sha512-wUpt1/QJEN7xnJl4pM3c9rHrY1widq2yPOZfjaMD1//XAP9LLHTaW+RxSEG6BSGIm3w4wGtjco+gKNB2WL7yRg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.0.0.tgz", + "integrity": "sha512-fzASk1Uv6AjdE6uA1na8zpqRCXAhRpcfgpCVv3SAKlgJ3VR3bEjcI4G17WHLgLBsmPzI1ofdkSI451WLD1F1Rw==", "requires": { - "dotenv": "16.0.1", - "dotenv-expand": "8.0.3", + "dotenv": "16.1.4", + "dotenv-expand": "10.0.0", "lodash": "4.17.21", - "uuid": "8.3.2" + "uuid": "9.0.0" } }, "@nestjs/core": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.4.4.tgz", - "integrity": "sha512-Ef3yJPuzAttpNfehnGqIV5kHIL9SHptB5F4ERxoU7pT61H3xiYpZw6hSjx68cJO7cc6rm7/N+b4zeuJvFHtvBg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.1.0.tgz", + "integrity": "sha512-3ogHxrRAktQZNBSV709QxhNJQPsVInZRqxAK2fV7JDnfoBMu1lM3xI7cO498iViqq5xme3o/46+AdfjW9W2E2A==", "requires": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", - "object-hash": "3.0.0", "path-to-regexp": "3.2.0", - "tslib": "2.3.1", - "uuid": "8.3.2" + "tslib": "2.6.0", + "uid": "2.0.2" } }, "@nestjs/jwt": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.1.tgz", - "integrity": "sha512-9WGfgngX8aclC/MC+CH35Ooo4iPVKc+7xLXaBV6o4ty8g2uZdPomry7cSdK/e6Lv623O/84WapThnPoAtW/jvA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.1.0.tgz", + "integrity": "sha512-iLwCGS25ybUxGS7i5j/Mwuyzvp/WxJftHlm8aLEBv5GV92apz6L1QVjxLdZrqXbzo++C8gdJauhzil8qitY+6w==", "requires": { - "@types/jsonwebtoken": "8.5.8", - "jsonwebtoken": "8.5.1" + "@types/jsonwebtoken": "9.0.2", + "jsonwebtoken": "9.0.0" } }, "@nestjs/mapped-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz", - "integrity": "sha512-NFvofzSinp00j5rzUd4tf+xi9od6383iY0JP7o0Bnu1fuItAUkWBgc4EKuIQ3D+c2QI3i9pG1kDWAeY27EMGtg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", + "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", "requires": {} }, "@nestjs/passport": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-8.2.2.tgz", - "integrity": "sha512-Ytbn8j7WZ4INmEntOpdJY1isTgdQqZkx5ADz8zsZ5wAp0t8tc5GF/A+GlXlmn9/yRPwZHSbmHpv7Qt2EIiNnrw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-10.0.0.tgz", + "integrity": "sha512-IlKKc6M7JOe+4dBbW6gZsXBSD05ZYgwfGf3GJhgCmUGYVqffpDdALQSS6JftnExrE+12rACoEmHkzYwKAGVK0Q==", "requires": {} }, "@nestjs/platform-express": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.4.tgz", - "integrity": "sha512-n/H83uzw154v6NVVSg6mniZIvYWtYp0dtNpU9O1qdEmDO030p0tBkeIRoDtpeOVvL2fW5PsHiUYS7HY4tNfykQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.1.0.tgz", + "integrity": "sha512-wl3gsad9Zsv+Im8Fl+meXwpzPLNFRlLbrepGL6Y8za35xXsdx74oCv7NJbjptHMYdwzTZHvbyprfSxV+oHUaXg==", "requires": { - "body-parser": "1.20.0", + "body-parser": "1.20.2", "cors": "2.8.5", - "express": "4.17.3", - "multer": "1.4.4", - "tslib": "2.3.1" + "express": "4.18.2", + "multer": "1.4.4-lts.1", + "tslib": "2.6.0" } }, "@nestjs/schematics": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.10.tgz", - "integrity": "sha512-gQq/8TYjtgum+5+QuPfHHKgKxDgNLGh8mH+EJ1skOKX+GTxgt5jmg1GFmwEfiOXZUcF9thT6GsOVNKWrdO3YMg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.0.1.tgz", + "integrity": "sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==", "dev": true, "requires": { - "@angular-devkit/core": "13.3.2", - "@angular-devkit/schematics": "13.3.2", - "fs-extra": "10.0.1", - "jsonc-parser": "3.0.0", + "@angular-devkit/core": "16.1.0", + "@angular-devkit/schematics": "16.1.0", + "comment-json": "4.2.3", + "jsonc-parser": "3.2.0", "pluralize": "8.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.0.tgz", + "integrity": "sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==", + "dev": true, + "requires": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + } + }, + "@angular-devkit/schematics": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.0.tgz", + "integrity": "sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==", + "dev": true, + "requires": { + "@angular-devkit/core": "16.1.0", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" + } + } } }, "@nestjs/swagger": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-5.2.1.tgz", - "integrity": "sha512-7dNa08WCnTsW/oAk3Ujde+z64JMfNm19DhpXasFR8oJp/9pggYAbYU927HpA+GJsSFJX6adjIRZsCKUqaGWznw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.2.tgz", + "integrity": "sha512-/eWlV3YuMpvEAGi3FcP0SbRGI+gqIJ93mxXaRc/GRKAOHLj5UzQ22jsUVqmSLmNMCSmp6PTLNcRGoLW++SExJA==", "requires": { - "@nestjs/mapped-types": "1.0.1", + "@nestjs/mapped-types": "2.0.2", + "js-yaml": "4.1.0", "lodash": "4.17.21", - "path-to-regexp": "3.2.0" + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "5.1.0" } }, "@nestjs/testing": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.4.4.tgz", - "integrity": "sha512-eGj0Lbi0ONMkjDKbKQHoGX+ecGdrGRZ81I8i6fH4dx9jIR0p4MsBlW964f6Swn1MGkPm/xxomJmBWLPqZEjF7g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.1.0.tgz", + "integrity": "sha512-TqV/21PuU5GJ543oqLTrmQhWUiWwB7DDRcj5cknUdaOst+Kkwp0Sad3/5svcWgOB+QfFbwYlvIDeCkKJshZzPg==", "dev": true, "requires": { - "optional": "0.1.4", - "tslib": "2.3.1" + "tslib": "2.6.0" } }, "@nodelib/fs.scandir": { @@ -10505,94 +10311,103 @@ "chalk": "^4.1.0", "consola": "^2.15.0", "node-fetch": "^2.6.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" } }, "@prisma/client": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.4.0.tgz", - "integrity": "sha512-ciKOP246x1xwr04G9ajHlJ4pkmtu9Q6esVyqVBO0QJihaKQIUvbPjClp17IsRJyxqNpFm4ScbOc/s9DUzKHINQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.0.0.tgz", + "integrity": "sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==", "requires": { - "@prisma/engines-version": "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6" + "@prisma/engines-version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584" } }, "@prisma/engines": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.4.0.tgz", - "integrity": "sha512-Fpykccxlt9MHrAs/QpPGpI2nOiRxuLA+LiApgA59ibbf24YICZIMWd3SI2YD+q0IAIso0jCGiHhirAIbxK3RyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.0.0.tgz", + "integrity": "sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==", "devOptional": true }, "@prisma/engines-version": { - "version": "4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.4.0-66.f352a33b70356f46311da8b00d83386dd9f145d6.tgz", - "integrity": "sha512-P5v/PuEIJLYXZUZBvOLPqoyCW+m6StNqHdiR6te++gYVODpPdLakks5HVx3JaZIY+LwR02juJWFlwpc9Eog/ug==" + "version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz", + "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==" + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "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==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -10618,12 +10433,12 @@ } }, "@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "@types/bcrypt": { @@ -10683,36 +10498,37 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "requires": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "requires": { "@types/node": "*" @@ -10743,31 +10559,25 @@ } }, "@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/jsonwebtoken": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", - "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", "requires": { "@types/node": "*" } @@ -10787,9 +10597,9 @@ } }, "@types/node": { - "version": "16.11.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", - "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA==" + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" }, "@types/oauth": { "version": "0.9.1", @@ -10807,9 +10617,9 @@ "dev": true }, "@types/passport": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.9.tgz", - "integrity": "sha512-9+ilzUhmZQR4JP49GdC2O4UdDE3POPLwpmaTC/iLkW7l0TZCXOo1zsTnnlXPq6rP1UsUZPfbAV4IUdiwiXyC7g==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", + "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", "requires": { "@types/express": "*" } @@ -10837,9 +10647,9 @@ } }, "@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "@types/qs": { @@ -10852,6 +10662,21 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -10886,10 +10711,15 @@ "@types/superagent": "*" } }, + "@types/validator": { + "version": "13.7.17", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", + "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" + }, "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -10902,243 +10732,249 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz", - "integrity": "sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.1.0.tgz", + "integrity": "sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.22.0", - "@typescript-eslint/type-utils": "5.22.0", - "@typescript-eslint/utils": "5.22.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/type-utils": "6.1.0", + "@typescript-eslint/utils": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.22.0.tgz", - "integrity": "sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.1.0.tgz", + "integrity": "sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.22.0", - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/typescript-estree": "5.22.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/typescript-estree": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", + "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz", - "integrity": "sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.1.0.tgz", + "integrity": "sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/visitor-keys": "5.22.0" + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0" } }, "@typescript-eslint/type-utils": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz", - "integrity": "sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.1.0.tgz", + "integrity": "sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.22.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "@typescript-eslint/typescript-estree": "6.1.0", + "@typescript-eslint/utils": "6.1.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.22.0.tgz", - "integrity": "sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.1.0.tgz", + "integrity": "sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz", - "integrity": "sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.1.0.tgz", + "integrity": "sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/visitor-keys": "5.22.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/utils": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.22.0.tgz", - "integrity": "sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.1.0.tgz", + "integrity": "sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.22.0", - "@typescript-eslint/types": "5.22.0", - "@typescript-eslint/typescript-estree": "5.22.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/typescript-estree": "6.1.0", + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz", - "integrity": "sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.1.0.tgz", + "integrity": "sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==", "dev": true, "requires": { - "@typescript-eslint/types": "5.22.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "6.1.0", + "eslint-visitor-keys": "^3.4.1" } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "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 }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "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 }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "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 }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -11154,12 +10990,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11170,33 +11000,15 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, - "acorn-globals": { - "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, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} }, @@ -11208,24 +11020,15 @@ "requires": {} }, "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, - "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==", - "dev": true, - "requires": { - "debug": "4" - } - }, "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -11244,9 +11047,9 @@ } }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-escapes": { @@ -11269,8 +11072,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -11281,9 +11083,9 @@ } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -11293,7 +11095,7 @@ "append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, "arg": { "version": "4.1.3", @@ -11304,13 +11106,18 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true }, "array-union": { "version": "2.1.0", @@ -11321,49 +11128,28 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "requires": { - "follow-redirects": "^1.14.8" - } - }, "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", + "babel-preset-jest": "^29.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "babel-plugin-istanbul": { @@ -11380,14 +11166,14 @@ } }, "babel-plugin-jest-hoist": { - "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==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, @@ -11412,12 +11198,12 @@ } }, "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^27.5.1", + "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -11442,6 +11228,12 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -11460,42 +11252,33 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "string_decoder": { - "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, - "requires": { - "safe-buffer": "~5.2.0" - } } } }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "requires": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "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.10.3", - "raw-body": "2.5.1", + "qs": "6.11.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -11511,14 +11294,24 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, "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, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11533,23 +11326,16 @@ "fill-range": "^7.0.1" } }, - "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==", - "dev": true - }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bs-logger": { @@ -11590,13 +11376,21 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" + "run-applescript": "^5.0.0" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" } }, "bytes": { @@ -11626,16 +11420,15 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001335", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz", - "integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11676,15 +11469,15 @@ "dev": true }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "class-transformer": { @@ -11693,11 +11486,12 @@ "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" }, "class-validator": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", - "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", + "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", "requires": { - "libphonenumber-js": "^1.9.43", + "@types/validator": "^13.7.10", + "libphonenumber-js": "^1.10.14", "validator": "^13.7.0" } }, @@ -11711,18 +11505,18 @@ } }, "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true }, "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "requires": { - "colors": "1.4.0", + "@colors/colors": "1.5.0", "string-width": "^4.2.0" } }, @@ -11733,32 +11527,32 @@ "dev": true }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "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==", "dev": true }, "color-convert": { @@ -11774,13 +11568,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -11796,6 +11583,19 @@ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, + "comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dev": true, + "requires": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -11805,7 +11605,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -11816,40 +11617,6 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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==" - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "consola": { @@ -11866,41 +11633,30 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "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==", - "dev": true - } - } + "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==", + "dev": true }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, "core-util-is": { @@ -11918,9 +11674,9 @@ } }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -11940,47 +11696,12 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11990,16 +11711,10 @@ "ms": "2.1.2" } }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "deep-is": { @@ -12009,24 +11724,119 @@ "dev": true }, "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "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 }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" } }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "depd": { @@ -12046,24 +11856,15 @@ "dev": true }, "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "requires": { "asap": "^2.0.0", "wrappy": "1" } }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -12071,9 +11872,9 @@ "dev": true }, "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==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true }, "dir-glob": { @@ -12094,32 +11895,20 @@ "esutils": "^2.0.2" } }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, "dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==" }, "dotenv-expand": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", - "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "ecdsa-sig-formatter": { "version": "1.0.11", @@ -12132,30 +11921,29 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.131", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.131.tgz", - "integrity": "sha512-oi3YPmaP87hiHn0c4ePB67tXaF+ldGhxvZnT19tW9zX6/Ej+pLN0Afja5rQ6S+TND7I9EuwQTT8JYn1k7R7rrw==", + "version": "1.4.468", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", + "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==", "dev": true }, "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "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==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "end-of-stream": { "version": "1.4.4", @@ -12167,9 +11955,9 @@ } }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -12186,9 +11974,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "escalade": { @@ -12200,7 +11988,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "4.0.0", @@ -12208,114 +11996,49 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "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, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, "eslint": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz", - "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.2", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "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.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "ajv": { @@ -12330,20 +12053,10 @@ "uri-js": "^4.2.2" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -12374,19 +12087,20 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "requires": {} }, "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" } }, "eslint-scope": { @@ -12399,38 +12113,21 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "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 - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -12440,9 +12137,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -12488,7 +12185,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "events": { "version": "3.3.0", @@ -12516,73 +12213,78 @@ "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" } }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, "debug": { @@ -12593,53 +12295,23 @@ "ms": "2.0.0" } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -12670,9 +12342,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -12691,7 +12363,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fast-safe-stringify": { @@ -12700,18 +12372,18 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" } }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" @@ -12729,7 +12401,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true } } @@ -12753,16 +12425,16 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -12777,25 +12449,17 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "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, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -12807,6 +12471,17 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { @@ -12815,15 +12490,26 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==" + } + } }, "fork-ts-checker-webpack-plugin": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.3.tgz", - "integrity": "sha512-9v308zIFTIFkWJBN/4N1A5oqm/ed9hWG6GH+KYTCBjYCEJOmHoVtDIWpfrJ0eD6cPB7V53HEVoJ6bL2In8QRaw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -12834,27 +12520,16 @@ "fs-extra": "^10.0.0", "memfs": "^3.4.1", "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", "schema-utils": "^3.1.1", "semver": "^7.3.5", "tapable": "^2.2.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -12863,23 +12538,15 @@ } }, "formidable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", - "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", "dev": true, "requires": { - "dezalgo": "1.0.3", - "hexoid": "1.0.0", - "once": "1.4.0", - "qs": "6.9.3" - }, - "dependencies": { - "qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", - "dev": true - } + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" } }, "forwarded": { @@ -12890,12 +12557,12 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "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, "requires": { "graceful-fs": "^4.2.0", @@ -12904,15 +12571,16 @@ } }, "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "dev": true }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { "version": "2.3.2", @@ -12926,12 +12594,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12945,13 +12607,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" } }, "get-package-type": { @@ -12970,6 +12633,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12995,9 +12659,9 @@ "dev": true }, "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -13023,6 +12687,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -13036,6 +12706,17 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "dev": true + }, + "has-proto": { + "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==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -13047,15 +12728,6 @@ "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, - "html-encoding-sniffer": { - "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, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -13072,34 +12744,6 @@ "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - } - } - }, - "http-proxy-agent": { - "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, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "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==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" } }, "human-signals": { @@ -13123,9 +12767,9 @@ "dev": true }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "import-fresh": { @@ -13158,6 +12802,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -13169,51 +12814,26 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" } }, "interpret": { @@ -13230,7 +12850,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-binary-path": { @@ -13251,6 +12871,12 @@ "has": "^1.0.3" } }, + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -13260,8 +12886,7 @@ "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==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -13278,6 +12903,15 @@ "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -13290,10 +12924,10 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "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==", + "is-path-inside": { + "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 }, "is-stream": { @@ -13302,28 +12936,38 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + } + } + }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -13332,9 +12976,9 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "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, "requires": { "@babel/core": "^7.12.3", @@ -13345,9 +12989,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -13383,9 +13027,9 @@ } }, "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -13397,594 +13041,411 @@ "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" }, + "jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "requires": { - "@jest/core": "^27.5.1", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^27.5.1" + "jest-cli": "^29.6.1" } }, "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, "requires": { - "@jest/types": "^27.5.1", "execa": "^5.0.0", - "throat": "^6.0.1" + "p-limit": "^3.1.0" } }, "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.5.1", "is-generator-fn": "^2.0.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", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "yargs": "^17.3.1" } }, "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", - "glob": "^7.1.1", + "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "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", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" } }, "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-environment-jsdom": { - "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, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" } }, "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true }, "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.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.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "walker": "^1.0.8" } }, "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" } }, "jest-matcher-utils": { - "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==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" } }, "jest-message-util": { - "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==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "requires": { - "@jest/types": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" } }, "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "requires": { - "@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", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.8.1", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "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.6", - "throat": "^6.0.1" + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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 + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } } } }, "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", "dev": true, "requires": { - "@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", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "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", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" } }, "jest-snapshot": { - "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==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "requires": { - "@babel/core": "^7.7.2", + "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.5.1", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "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", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "pretty-format": "^29.6.1", + "semver": "^7.5.3" } }, "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "requires": { - "@jest/types": "^27.5.1", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", + "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "pretty-format": "^29.6.1" }, "dependencies": { "camelcase": { @@ -13992,53 +13453,33 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } } } }, "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.5.1", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", "string-length": "^4.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "requires": { "@types/node": "*", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -14064,58 +13505,16 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } }, - "jsdom": { - "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, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "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.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "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", @@ -14135,15 +13534,15 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "jsonfile": { @@ -14157,27 +13556,14 @@ } }, "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "requires": { "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.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "semver": "^7.3.8" } }, "jwa": { @@ -14222,9 +13608,9 @@ } }, "libphonenumber-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.6.tgz", - "integrity": "sha512-CIjT100/SmntsUjsLVs2t3ufeN4KdNXUxhD07tH153pdbaCWuAjv0jK/gPuywR3IImB/U/MQM+x9RfhMs5XZiA==" + "version": "1.10.37", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz", + "integrity": "sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==" }, "lines-and-columns": { "version": "1.2.4", @@ -14239,12 +13625,12 @@ "dev": true }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -14252,36 +13638,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -14294,17 +13650,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -14313,25 +13658,12 @@ "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "lru-cache": { "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, "requires": { "yallist": "^4.0.0" } @@ -14343,12 +13675,12 @@ "dev": true }, "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "@jridgewell/sourcemap-codec": "^1.4.13" } }, "make-dir": { @@ -14361,9 +13693,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -14386,21 +13718,21 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.4" } }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", @@ -14417,7 +13749,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { "version": "4.0.5", @@ -14457,14 +13789,21 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true }, "mkdirp": { "version": "0.5.6", @@ -14480,16 +13819,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multer": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", - "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", "requires": { "append-field": "^1.0.0", - "busboy": "^0.2.11", + "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", - "on-finished": "^2.3.0", "type-is": "^1.6.4", "xtend": "^4.0.0" } @@ -14506,6 +13844,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "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==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -14517,6 +13861,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, "node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -14558,13 +13908,13 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "normalize-path": { @@ -14582,12 +13932,6 @@ "path-key": "^3.0.0" } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -14598,15 +13942,10 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "on-finished": { "version": "2.4.1", @@ -14620,6 +13959,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -14633,24 +13973,30 @@ "mimic-fn": "^2.1.0" } }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "ora": { @@ -14668,18 +14014,6 @@ "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "os-name": { @@ -14695,25 +14029,25 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "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, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -14743,12 +14077,6 @@ "lines-and-columns": "^1.1.6" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -14774,11 +14102,11 @@ } }, "passport-jwt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", - "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", "requires": { - "jsonwebtoken": "^8.2.0", + "jsonwebtoken": "^9.0.0", "passport-strategy": "^1.0.0" } }, @@ -14816,13 +14144,13 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -14830,6 +14158,27 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==" + }, + "minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==" + } + } + }, "path-to-regexp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", @@ -14860,9 +14209,9 @@ "dev": true }, "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, "pkg-dir": { @@ -14872,6 +14221,45 @@ "dev": true, "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "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, + "requires": { + "p-limit": "^2.2.0" + } + } } }, "pluralize": { @@ -14887,9 +14275,9 @@ "dev": true }, "prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true }, "prettier-linter-helpers": { @@ -14902,14 +14290,14 @@ } }, "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "react-is": "^18.0.0" }, "dependencies": { "ansi-styles": { @@ -14921,12 +14309,12 @@ } }, "prisma": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.4.0.tgz", - "integrity": "sha512-l/QKLmLcKJQFuc+X02LyICo0NWTUVaNNZ00jKJBqwDyhwMAhboD1FWwYV50rkH4Wls0RviAJSFzkC2ZrfawpfA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.0.0.tgz", + "integrity": "sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==", "devOptional": true, "requires": { - "@prisma/engines": "4.4.0" + "@prisma/engines": "5.0.0" } }, "process-nextick-args": { @@ -14953,12 +14341,6 @@ "ipaddr.js": "1.9.1" } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -14975,10 +14357,16 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true + }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } @@ -15004,9 +14392,9 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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==", "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15015,20 +14403,30 @@ } }, "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==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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==" + } } }, "readdirp": { @@ -15054,16 +14452,16 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-from-string": { @@ -15107,9 +14505,9 @@ "dev": true }, "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "restore-cursor": { @@ -15129,11 +14527,55 @@ "dev": true }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", "requires": { - "glob": "^7.1.3" + "glob": "^10.2.5" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==" + } + } + }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" } }, "run-async": { @@ -15152,9 +14594,9 @@ } }, "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "requires": { "tslib": "^2.1.0" } @@ -15169,19 +14611,10 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "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, "requires": { "@types/json-schema": "^7.0.8", @@ -15217,32 +14650,31 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "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": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -15256,65 +14688,35 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } } } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "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, "requires": { "randombytes": "^2.1.0" } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "setprototypeof": { @@ -15326,7 +14728,6 @@ "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, "requires": { "shebang-regex": "^3.0.0" } @@ -15334,8 +14735,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shelljs": { "version": "0.8.5", @@ -15377,9 +14777,9 @@ "dev": true }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true }, "source-map-support": { @@ -15400,22 +14800,16 @@ } } }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -15430,19 +14824,29 @@ } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "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==" + } + } }, "string-length": { "version": "4.0.2", @@ -15458,7 +14862,16 @@ "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, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15469,7 +14882,14 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } @@ -15493,71 +14913,39 @@ "dev": true }, "superagent": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.3.tgz", - "integrity": "sha512-WA6et4nAvgBCS73lJvv1D0ssI5uk5Gh+TGN/kNe+B608EtcVs/yzfl+OLXTzDs7tOBDIpvgh/WUs1K2OK1zTeQ==", + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", + "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", "dev": true, "requires": { "component-emitter": "^1.3.0", - "cookiejar": "^2.1.3", + "cookiejar": "^2.1.4", "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", - "formidable": "^2.0.1", + "formidable": "^2.1.2", "methods": "^1.1.2", - "mime": "^2.5.0", - "qs": "^6.10.3", - "readable-stream": "^3.6.0", - "semver": "^7.3.7" + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" }, "dependencies": { - "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==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "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, - "requires": { - "safe-buffer": "~5.2.0" - } } } }, "supertest": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.3.tgz", - "integrity": "sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^7.1.3" + "superagent": "^8.0.5" } }, "supports-color": { @@ -15568,16 +14956,6 @@ "has-flag": "^4.0.0" } }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -15585,16 +14963,16 @@ "dev": true }, "swagger-ui-dist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", - "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" }, "swagger-ui-express": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz", - "integrity": "sha512-DHk3zFvsxrkcnurGvQlAcLuTDacAVN1JHKDgcba/gr2NFRE4HGwP1YeHIXMiGznkWR4AeS7X5vEblNn4QljuNA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", + "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", "requires": { - "swagger-ui-dist": ">=4.11.0" + "swagger-ui-dist": ">=5.0.0" } }, "symbol-observable": { @@ -15603,11 +14981,15 @@ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, - "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==", - "dev": true + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } }, "tapable": { "version": "2.2.1", @@ -15615,25 +14997,15 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "terminal-link": { - "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, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, "terser": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", - "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "requires": { - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "dependencies": { @@ -15642,62 +15014,41 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "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, - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "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==", - "dev": true - }, - "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, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } } } }, "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "dependencies": { - "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 + "jest-worker": { + "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, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -15718,16 +15069,16 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true }, "tmp": { @@ -15748,7 +15099,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { @@ -15765,87 +15116,54 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "requires": {} + }, "ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" } }, "ts-loader": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.0.tgz", - "integrity": "sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", "dev": true, "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "requires": { - "@cspotcode/source-map-support": "0.7.0", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -15856,91 +15174,44 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } } }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } }, "tsconfig-paths-webpack-plugin": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", - "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "tsconfig-paths": "^4.1.2" } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "type-check": { "version": "0.4.0", @@ -15975,23 +15246,22 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "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, - "requires": { - "is-typedarray": "^1.0.0" - } + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, + "uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "requires": { + "@lukeed/csprng": "^1.0.0" + } + }, "uid2": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", @@ -16006,7 +15276,23 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } }, "uri-js": { "version": "4.4.1", @@ -16020,7 +15306,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", @@ -16028,15 +15314,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -16045,14 +15325,22 @@ "dev": true }, "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "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==", + "dev": true + } } }, "validator": { @@ -16065,24 +15353,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "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, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -16093,9 +15363,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -16105,48 +15375,41 @@ "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, "webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", "dev": true, - "peer": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" } }, @@ -16162,37 +15425,10 @@ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true }, - "whatwg-encoding": { - "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, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "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==", - "dev": true - }, - "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, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -16240,12 +15476,6 @@ } } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -16257,42 +15487,32 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" } }, - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} - }, - "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==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -16307,8 +15527,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", @@ -16317,24 +15536,24 @@ "dev": true }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yn": { @@ -16342,6 +15561,12 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "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 } } } diff --git a/back/package.json b/back/package.json index 5dd4c39..31665fe 100644 --- a/back/package.json +++ b/back/package.json @@ -21,54 +21,54 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { - "@nestjs/common": "^8.0.0", - "@nestjs/config": "^2.1.0", - "@nestjs/core": "^8.0.0", - "@nestjs/jwt": "^8.0.1", + "@nestjs/common": "^10.1.0", + "@nestjs/config": "^3.0.0", + "@nestjs/core": "^10.1.0", + "@nestjs/jwt": "^10.1.0", "@nestjs/mapped-types": "*", - "@nestjs/passport": "^8.2.2", - "@nestjs/platform-express": "^8.0.0", - "@nestjs/swagger": "^5.2.1", - "@prisma/client": "^4.4.0", + "@nestjs/passport": "^10.0.0", + "@nestjs/platform-express": "^10.1.0", + "@nestjs/swagger": "^7.1.2", + "@prisma/client": "^5.0.0", "@types/bcrypt": "^5.0.0", "@types/bcryptjs": "^2.4.2", - "@types/passport": "^1.0.9", + "@types/passport": "^1.0.12", "bcryptjs": "^2.4.3", "class-transformer": "^0.5.1", - "class-validator": "^0.13.2", + "class-validator": "^0.14.0", "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.0", + "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", "reflect-metadata": "^0.1.13", - "rimraf": "^3.0.2", - "rxjs": "^7.2.0", - "swagger-ui-express": "^4.5.0" + "rimraf": "^5.0.1", + "rxjs": "^7.8.1", + "swagger-ui-express": "^5.0.0" }, "devDependencies": { - "@nestjs/cli": "^8.0.0", - "@nestjs/schematics": "^8.0.0", - "@nestjs/testing": "^8.0.0", - "@types/express": "^4.17.13", - "@types/jest": "27.4.1", + "@nestjs/cli": "^10.1.10", + "@nestjs/schematics": "^10.0.1", + "@nestjs/testing": "^10.1.0", + "@types/express": "^4.17.17", + "@types/jest": "29.5.3", "@types/multer": "^1.4.7", - "@types/node": "^16.0.0", + "@types/node": "^20.4.4", "@types/passport-google-oauth20": "^2.0.11", - "@types/supertest": "^2.0.11", - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^8.0.1", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "jest": "^27.2.5", - "prettier": "^2.3.2", - "prisma": "^4.4.0", - "source-map-support": "^0.5.20", - "supertest": "^6.1.3", - "ts-jest": "^27.0.3", - "ts-loader": "^9.2.3", - "ts-node": "^10.0.0", - "tsconfig-paths": "^3.10.1", - "typescript": "^4.3.5" + "@types/supertest": "^2.0.12", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.1.0", + "eslint": "^8.45.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0", + "jest": "^29.6.1", + "prettier": "^3.0.0", + "prisma": "^5.0.0", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-loader": "^9.4.4", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.6" }, "jest": { "moduleFileExtensions": [ diff --git a/back/src/main.ts b/back/src/main.ts index 354fbed..b85b6f9 100644 --- a/back/src/main.ts +++ b/back/src/main.ts @@ -1,13 +1,11 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; -import { PrismaService } from './prisma/prisma.service'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); - const prismaService = app.get(PrismaService); - await prismaService.enableShutdownHooks(app); + app.enableShutdownHooks(); const config = new DocumentBuilder() .setTitle('Chromacase') diff --git a/back/src/prisma/prisma.service.ts b/back/src/prisma/prisma.service.ts index 6feee25..59ade55 100644 --- a/back/src/prisma/prisma.service.ts +++ b/back/src/prisma/prisma.service.ts @@ -1,4 +1,4 @@ -import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; +import { Injectable, OnModuleInit } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() @@ -6,10 +6,4 @@ export class PrismaService extends PrismaClient implements OnModuleInit { async onModuleInit() { await this.$connect(); } - - async enableShutdownHooks(app: INestApplication) { - this.$on('beforeExit', async () => { - await app.close(); - }); - } } From d2642b4fb8c0f189be87356cf8f761920f11692a Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 23 Jul 2023 16:43:46 +0900 Subject: [PATCH 022/133] Fixing gravatar --- back/package-lock.json | 91 +++++++++++++++--------------- back/package.json | 1 + back/src/auth/auth.controller.ts | 5 +- back/src/users/users.controller.ts | 6 +- back/src/users/users.service.ts | 10 ++-- front/models/User.ts | 3 +- 6 files changed, 60 insertions(+), 56 deletions(-) diff --git a/back/package-lock.json b/back/package-lock.json index 4d0d15c..bf4a20e 100644 --- a/back/package-lock.json +++ b/back/package-lock.json @@ -24,6 +24,7 @@ "bcryptjs": "^2.4.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "node-fetch": "^2.6.12", "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -6595,9 +6596,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6613,25 +6614,6 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "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": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "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": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -8328,6 +8310,11 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -8734,6 +8721,11 @@ "defaults": "^1.0.3" } }, + "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==" + }, "node_modules/webpack": { "version": "5.88.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", @@ -8799,6 +8791,15 @@ "node": ">=10.13.0" } }, + "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==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -13877,32 +13878,11 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } } }, "node-int64": { @@ -15116,6 +15096,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -15381,6 +15366,11 @@ "defaults": "^1.0.3" } }, + "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==" + }, "webpack": { "version": "5.88.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", @@ -15425,6 +15415,15 @@ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/back/package.json b/back/package.json index 31665fe..c93489d 100644 --- a/back/package.json +++ b/back/package.json @@ -36,6 +36,7 @@ "bcryptjs": "^2.4.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "node-fetch": "^2.6.12", "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index 25eda08..80ba7a0 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -17,6 +17,7 @@ import { UploadedFile, HttpStatus, ParseFilePipeBuilder, + Response, } from '@nestjs/common'; import { AuthService } from './auth.service'; import { JwtAuthGuard } from './jwt-auth.guard'; @@ -97,8 +98,8 @@ export class AuthController { @ApiOkResponse({ description: 'The user profile picture' }) @ApiUnauthorizedResponse({ description: 'Invalid token' }) @Get('me/picture') - async getProfilePicture(@Request() req: any) { - return await this.usersService.getProfilePicture(req.user.id); + async getProfilePicture(@Request() req: any, @Response() res: any) { + return await this.usersService.getProfilePicture(req.user.id, res); } @UseGuards(JwtAuthGuard) diff --git a/back/src/users/users.controller.ts b/back/src/users/users.controller.ts index 91e2975..84bb003 100644 --- a/back/src/users/users.controller.ts +++ b/back/src/users/users.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Param, NotFoundException } from '@nestjs/common'; +import { Controller, Get, Param, NotFoundException, Response } from '@nestjs/common'; import { UsersService } from './users.service'; import { ApiNotFoundResponse, ApiTags } from '@nestjs/swagger'; import { User } from 'src/models/user'; @@ -22,7 +22,7 @@ export class UsersController { } @Get(':id/picture') - async getPicture(@Param('id') id: number) { - return await this.usersService.getProfilePicture(+id); + async getPicture(@Response() res: any, @Param('id') id: number) { + return await this.usersService.getProfilePicture(+id, res); } } diff --git a/back/src/users/users.service.ts b/back/src/users/users.service.ts index 738dc0a..ca65b8d 100644 --- a/back/src/users/users.service.ts +++ b/back/src/users/users.service.ts @@ -9,6 +9,7 @@ import { PrismaService } from 'src/prisma/prisma.service'; import * as bcrypt from 'bcryptjs'; import { createHash, randomUUID } from 'crypto'; import { createReadStream, existsSync } from 'fs'; +import fetch from 'node-fetch'; @Injectable() export class UsersService { @@ -79,7 +80,7 @@ export class UsersService { }); } - async getProfilePicture(userId: number) { + async getProfilePicture(userId: number, res: any) { const path = `/data/${userId}.png`; if (existsSync(path)) { const file = createReadStream(path); @@ -92,9 +93,10 @@ export class UsersService { .update(user.email.trim().toLowerCase()) .digest('hex'); const resp = await fetch( - `https://www.gravatar.com/avatar/${hash}.jpg?d=404`, + `https://www.gravatar.com/avatar/${hash}.jpg?d=404&s=200`, ); - if (!resp.ok) throw new NotFoundException('No image found for user'); - return resp.arrayBuffer(); + for (const [k, v] of resp.headers) + resp.headers.set(k, v); + resp.body!.pipe(res); } } diff --git a/front/models/User.ts b/front/models/User.ts index 0edcf41..49534eb 100644 --- a/front/models/User.ts +++ b/front/models/User.ts @@ -1,6 +1,7 @@ import Model, { ModelValidator } from './Model'; import * as yup from 'yup'; import ResponseHandler from './ResponseHandler'; +import API from '../API'; export const UserValidator = yup .object({ @@ -23,7 +24,7 @@ export const UserHandler: ResponseHandler, U gamesPlayed: value.partyPlayed as number, xp: 0, createdAt: new Date('2023-04-09T00:00:00.000Z'), - avatar: 'https://imgs.search.brave.com/RnQpFhmAFvuQsN_xTw7V-CN61VeHDBg2tkEXnKRYHAE/rs:fit:768:512:1/g:ce/aHR0cHM6Ly96b29h/c3Ryby5jb20vd3At/Y29udGVudC91cGxv/YWRzLzIwMjEvMDIv/Q2FzdG9yLTc2OHg1/MTIuanBn', + avatar: `${API.baseUrl}/users/${value.id}/picture`, }, }), }; From 74cd9c0df2a4bfe3d63949378a7d031151983881 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 23 Jul 2023 17:05:28 +0900 Subject: [PATCH 023/133] Remove a usless validator --- back/src/auth/auth.controller.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index 80ba7a0..2cd490d 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -115,16 +115,13 @@ export class AuthController { .addFileTypeValidator({ fileType: 'jpeg', }) - .addMaxSizeValidator({ - maxSize: 5000, - }) .build({ errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY, }), ) file: Express.Multer.File, ) { - const path = `/data/${req.user.id}.png`; + const path = `/data/${req.user.id}.jpg` writeFile(path, file.buffer, (err) => { if (err) throw err; }); From 930191569f12b89c5a18460f447e71c54358dfc8 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 23 Jul 2023 18:07:11 +0900 Subject: [PATCH 024/133] Fix upload file issue --- back/src/users/users.service.ts | 4 ++-- data/.gitignore | 1 + docker-compose.dev.yml | 5 +---- docker-compose.prod.yml | 5 +---- docker-compose.yml | 3 +-- 5 files changed, 6 insertions(+), 12 deletions(-) create mode 100644 data/.gitignore diff --git a/back/src/users/users.service.ts b/back/src/users/users.service.ts index ca65b8d..55c12b5 100644 --- a/back/src/users/users.service.ts +++ b/back/src/users/users.service.ts @@ -81,10 +81,10 @@ export class UsersService { } async getProfilePicture(userId: number, res: any) { - const path = `/data/${userId}.png`; + const path = `/data/${userId}.jpg`; if (existsSync(path)) { const file = createReadStream(path); - return new StreamableFile(file); + return file.pipe(res); } // We could not find a profile icon locally, using gravatar instead. const user = await this.user({ id: userId }); diff --git a/data/.gitignore b/data/.gitignore new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/data/.gitignore @@ -0,0 +1 @@ +* diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index e011bb6..f4b8398 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -9,7 +9,7 @@ services: volumes: - ./back:/app - ./assets:/assets - - data:/data + - ./data:/data depends_on: db: condition: service_healthy @@ -55,6 +55,3 @@ services: - "back" env_file: - .env - -volumes: - data: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index bd901c4..ed94396 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -10,7 +10,7 @@ services: - .env volumes: - ./assets:/assets - - data:/data + - ./data:/data scorometer: image: ghcr.io/chroma-case/scorometer:main ports: @@ -44,6 +44,3 @@ services: - "back" env_file: - .env - -volumes: - data: diff --git a/docker-compose.yml b/docker-compose.yml index 3ddf329..af5e44b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: - .env volumes: - ./assets:/assets - - data:/data + - ./data:/data scorometer: build: ./scorometer ports: @@ -53,4 +53,3 @@ services: volumes: db: - data: From 9f542fc9dd58349c5447f33b0a24b0ef23cc2866 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Mon, 24 Jul 2023 13:39:36 +0100 Subject: [PATCH 025/133] Front: User Avatar --- front/components/ProgressBar.tsx | 18 +--- front/components/UserAvatar.tsx | 24 ++++++ front/models/User.ts | 2 +- front/views/ProfileView.tsx | 90 ++------------------ front/views/settings/SettingsProfileView.tsx | 14 +-- 5 files changed, 38 insertions(+), 110 deletions(-) create mode 100644 front/components/UserAvatar.tsx diff --git a/front/components/ProgressBar.tsx b/front/components/ProgressBar.tsx index bf9ea72..82b24cd 100644 --- a/front/components/ProgressBar.tsx +++ b/front/components/ProgressBar.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { translate } from '../i18n/i18n'; -import { Box, Text, VStack, Progress, Stack, AspectRatio } from 'native-base'; +import { Box, Text, VStack, Progress, Stack } from 'native-base'; import { useNavigation } from '../Navigation'; -import { Image } from 'native-base'; import Card from '../components/Card'; +import UserAvatar from './UserAvatar'; const ProgressBar = ({ xp }: { xp: number }) => { const level = Math.floor(xp / 1000); @@ -15,18 +15,8 @@ const ProgressBar = ({ xp }: { xp: number }) => { return ( nav.navigate('User')}> - - - Profile picture - + + {`${translate('level')} ${level}`} diff --git a/front/components/UserAvatar.tsx b/front/components/UserAvatar.tsx new file mode 100644 index 0000000..8481c1d --- /dev/null +++ b/front/components/UserAvatar.tsx @@ -0,0 +1,24 @@ +import { Avatar } from 'native-base'; +import API from '../API'; +import { useQuery } from '../Queries'; + +const getInitials = (name: string) => { + return name + .split(' ') + .map((n) => n[0]) + .join(''); +}; + +type UserAvatarProps = Pick[0], 'size'>; + +const UserAvatar = ({ size }: UserAvatarProps) => { + const user = useQuery(API.getUserInfo); + + return ( + + {user.data !== undefined && getInitials(user.data.name)} + + ); +}; + +export default UserAvatar; diff --git a/front/models/User.ts b/front/models/User.ts index 49534eb..1f85df2 100644 --- a/front/models/User.ts +++ b/front/models/User.ts @@ -41,7 +41,7 @@ interface User extends Model { interface UserData { gamesPlayed: number; xp: number; - avatar: string | undefined; + avatar: string; createdAt: Date; } diff --git a/front/views/ProfileView.tsx b/front/views/ProfileView.tsx index 892909d..0dd12ad 100644 --- a/front/views/ProfileView.tsx +++ b/front/views/ProfileView.tsx @@ -1,81 +1,11 @@ import React from 'react'; import { Dimensions, View } from 'react-native'; -import { Box, Image, Heading, HStack, Card, Text } from 'native-base'; -import Translate from '../components/Translate'; +import { Box, Image, Heading, HStack } from 'native-base'; import { useNavigation } from '../Navigation'; import TextButton from '../components/TextButton'; - -const UserMedals = () => { - return ( - - - - - - Profile picture - Profile picture - Profile picture - Profile picture - - - ); -}; - -const PlayerStats = () => { - const answer = 'Answer from back'; - - return ( - - - {' '} - {' '} - - - {' '} - {answer}{' '} - - - {' '} - {answer}{' '} - - - {' '} - {answer}{' '} - - - {' '} - {answer}{' '} - - - ); -}; +import UserAvatar from '../components/UserAvatar'; const ProfilePictureBannerAndLevel = () => { - const profilePic = 'https://wallpaperaccess.com/full/317501.jpg'; const username = 'Username'; const level = '1'; @@ -93,19 +23,13 @@ const ProfilePictureBannerAndLevel = () => { size="lg" style={{ height: imageHeight, width: imageWidth, zIndex: 0, opacity: 0.5 }} /> - - Profile picture - + + + {username} Level : {level} - + ); }; @@ -116,8 +40,6 @@ const ProfileView = () => { return ( - - navigation.navigate('Settings', { screen: 'profile' })} diff --git a/front/views/settings/SettingsProfileView.tsx b/front/views/settings/SettingsProfileView.tsx index a2ff6a0..7d072d3 100644 --- a/front/views/settings/SettingsProfileView.tsx +++ b/front/views/settings/SettingsProfileView.tsx @@ -2,19 +2,13 @@ import API from '../../API'; import { useDispatch } from 'react-redux'; import { unsetAccessToken } from '../../state/UserSlice'; import React from 'react'; -import { Column, Text, Button, Box, Flex, Center, Heading, Avatar, Popover } from 'native-base'; +import { Column, Text, Button, Box, Flex, Center, Heading, Popover } from 'native-base'; import TextButton from '../../components/TextButton'; import { LoadingView } from '../../components/Loading'; import ElementList from '../../components/GtkUI/ElementList'; import { translate } from '../../i18n/i18n'; import { useQuery } from '../../Queries'; - -const getInitials = (name: string) => { - return name - .split(' ') - .map((n) => n[0]) - .join(''); -}; +import UserAvatar from '../../components/UserAvatar'; // Too painful to infer the settings-only, typed navigator. Gave up // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -41,9 +35,7 @@ const ProfileSettings = ({ navigation }: { navigation: any }) => { }} >
- - {getInitials(user.name)} - +
Date: Mon, 7 Aug 2023 10:28:55 +0200 Subject: [PATCH 026/133] Front: Update User Avatar (#250) * Front: Update User Avatar * Front: Fix expo-image-picker version --- front/API.ts | 29 ++++++++++++--- front/app.json | 10 +++++- front/components/UserAvatar.tsx | 16 ++++++++- front/i18n/Translations.ts | 7 ++++ front/package.json | 2 ++ front/views/settings/SettingsProfileView.tsx | 37 ++++++++++++++++++-- front/yarn.lock | 17 +++++++++ 7 files changed, 110 insertions(+), 8 deletions(-) diff --git a/front/API.ts b/front/API.ts index 9eff42c..6b3162f 100644 --- a/front/API.ts +++ b/front/API.ts @@ -21,6 +21,8 @@ import { PlageHandler } from './models/Plage'; import { ListHandler } from './models/List'; import { AccessTokenResponseHandler } from './models/AccessTokenResponse'; import * as yup from 'yup'; +import { base64ToBlob } from 'file64'; +import { ImagePickerAsset } from 'expo-image-picker'; type AuthenticationInput = { username: string; password: string }; type RegistrationInput = AuthenticationInput & { email: string }; @@ -30,6 +32,7 @@ export type AccessToken = string; type FetchParams = { route: string; body?: object; + formData?: FormData; method?: 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'PUT'; }; @@ -81,17 +84,22 @@ export default class API { public static async fetch(params: FetchParams): Promise; public static async fetch(params: FetchParams, handle?: HandleParams) { const jwtToken = store.getState().user.accessToken; - const header = { - 'Content-Type': 'application/json', + const headers = { + ...(params.formData == undefined && { 'Content-Type': 'application/json' }), + ...(jwtToken && { Authorization: `Bearer ${jwtToken}` }), }; const response = await fetch(`${API.baseUrl}${params.route}`, { - headers: (jwtToken && { ...header, Authorization: `Bearer ${jwtToken}` }) || header, - body: JSON.stringify(params.body), + headers: headers, + body: params.formData ?? JSON.stringify(params.body), method: params.method ?? 'GET', }).catch(() => { throw new Error('Error while fetching API: ' + API.baseUrl); }); if (!handle || handle.emptyResponse) { + if (!response.ok) { + console.log(await response.json()); + throw new APIError(response.statusText, response.status); + } return; } if (handle.raw) { @@ -164,6 +172,7 @@ export default class API { { route: '/auth/guest', method: 'POST', + body: undefined, }, { handler: AccessTokenResponseHandler } ) @@ -587,4 +596,16 @@ export default class API { { handler: UserHandler } ); } + + public static async updateProfileAvatar(image: ImagePickerAsset): Promise { + const data = await base64ToBlob(image.uri); + const formData = new FormData(); + + formData.append('file', data); + return API.fetch({ + route: '/auth/me/picture', + method: 'POST', + formData, + }); + } } diff --git a/front/app.json b/front/app.json index a1939e1..26b3474 100644 --- a/front/app.json +++ b/front/app.json @@ -32,6 +32,14 @@ "eas": { "projectId": "dade8e5e-3e2c-49f7-98c5-cf8834c7ebb2" } - } + }, + "plugins": [ + [ + "expo-image-picker", + { + "photosPermission": "The app accesses your photos to let you set your personal avatar." + } + ] + ] } } diff --git a/front/components/UserAvatar.tsx b/front/components/UserAvatar.tsx index 8481c1d..a2eb9c7 100644 --- a/front/components/UserAvatar.tsx +++ b/front/components/UserAvatar.tsx @@ -1,6 +1,7 @@ import { Avatar } from 'native-base'; import API from '../API'; import { useQuery } from '../Queries'; +import { useMemo } from 'react'; const getInitials = (name: string) => { return name @@ -13,9 +14,22 @@ type UserAvatarProps = Pick[0], 'size'>; const UserAvatar = ({ size }: UserAvatarProps) => { const user = useQuery(API.getUserInfo); + const avatarUrl = useMemo(() => { + if (!user.data) { + return null; + } + const url = new URL(user.data.data.avatar); + + url.searchParams.append('updatedAt', user.dataUpdatedAt.toString()); + return url; + }, [user.data]); return ( - + {user.data !== undefined && getInitials(user.data.name)} ); diff --git a/front/i18n/Translations.ts b/front/i18n/Translations.ts index 3b783ed..ac86413 100644 --- a/front/i18n/Translations.ts +++ b/front/i18n/Translations.ts @@ -180,6 +180,8 @@ export const en = { recentSearches: 'Recent searches', noRecentSearches: 'No recent searches', + avatar: 'Avatar', + changeIt: 'Change It', }; export const fr: typeof en = { @@ -362,6 +364,8 @@ export const fr: typeof en = { recentSearches: 'Recherches récentes', noRecentSearches: 'Aucune recherche récente', + avatar: 'Avatar', + changeIt: 'Modifier', }; export const sp: typeof en = { @@ -548,4 +552,7 @@ export const sp: typeof en = { recentSearches: 'Búsquedas recientes', noRecentSearches: 'No hay búsquedas recientes', continuewithgoogle: 'Continuar con Google', + + avatar: 'Avatar', + changeIt: 'Cambialo', }; diff --git a/front/package.json b/front/package.json index 42d4b5e..f097628 100644 --- a/front/package.json +++ b/front/package.json @@ -34,11 +34,13 @@ "expo": "^47.0.8", "expo-asset": "~8.7.0", "expo-dev-client": "~2.0.1", + "expo-image-picker": "~14.0.2", "expo-linking": "~3.3.1", "expo-screen-orientation": "~5.0.1", "expo-secure-store": "~12.0.0", "expo-splash-screen": "~0.17.5", "expo-status-bar": "~1.4.2", + "file64": "^1.0.2", "format-duration": "^2.0.0", "i18next": "^21.8.16", "install": "^0.13.0", diff --git a/front/views/settings/SettingsProfileView.tsx b/front/views/settings/SettingsProfileView.tsx index 7d072d3..bf946f4 100644 --- a/front/views/settings/SettingsProfileView.tsx +++ b/front/views/settings/SettingsProfileView.tsx @@ -2,13 +2,14 @@ import API from '../../API'; import { useDispatch } from 'react-redux'; import { unsetAccessToken } from '../../state/UserSlice'; import React from 'react'; -import { Column, Text, Button, Box, Flex, Center, Heading, Popover } from 'native-base'; +import { Column, Text, Button, Box, Flex, Center, Heading, Popover, Toast } from 'native-base'; import TextButton from '../../components/TextButton'; import { LoadingView } from '../../components/Loading'; import ElementList from '../../components/GtkUI/ElementList'; import { translate } from '../../i18n/i18n'; import { useQuery } from '../../Queries'; import UserAvatar from '../../components/UserAvatar'; +import * as ImagePicker from 'expo-image-picker'; // Too painful to infer the settings-only, typed navigator. Gave up // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -50,7 +51,39 @@ const ProfileSettings = ({ navigation }: { navigation: any }) => { data: { text: user.email || translate('NoAssociatedEmail'), onPress: () => { - navigation.navigate('ChangeEmail'); + navigation.navigate('changeEmail'); + }, + }, + }, + { + type: 'text', + title: translate('avatar'), + data: { + text: translate('changeIt'), + onPress: () => { + ImagePicker.launchImageLibraryAsync({ + mediaTypes: ImagePicker.MediaTypeOptions.Images, + aspect: [1, 1], + quality: 1, + base64: true, + }).then((result) => { + console.log(result); + const image = result.assets?.at(0); + + if (!result.canceled && image) { + API.updateProfileAvatar(image) + .then(() => { + userQuery.refetch(); + Toast.show({ + description: 'Update successful', + }); + }) + .catch((e) => { + console.error(e); + Toast.show({ description: 'Update failed' }); + }); + } + }); }, }, }, diff --git a/front/yarn.lock b/front/yarn.lock index 854e80c..224b678 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -9116,6 +9116,18 @@ expo-font@~11.0.1: dependencies: fontfaceobserver "^2.1.0" +expo-image-loader@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/expo-image-loader/-/expo-image-loader-4.0.0.tgz#a17e5f95a4c1671791168dd5dfc221bf2f88480c" + integrity sha512-hVMhXagsO1cSng5s70IEjuJAuHy2hX/inu5MM3T0ecJMf7L/7detKf22molQBRymerbk6Tzu+20h11eU0n/3jQ== + +expo-image-picker@~14.0.2: + version "14.0.3" + resolved "https://registry.yarnpkg.com/expo-image-picker/-/expo-image-picker-14.0.3.tgz#ea0bbe796ccc3bd5e58fc00487be22bac317afeb" + integrity sha512-VN5wMWzhYhIRhFq8I1pjMbn/ivjlhWfxzJpz5jUOf3mQ8vxrI5GcR8cJO9kyYwuCrI9W3GUzh/aDt7QRSTQDDA== + dependencies: + expo-image-loader "~4.0.0" + expo-json-utils@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/expo-json-utils/-/expo-json-utils-0.4.0.tgz#47ae83a1cc973101d62371f94790e9ad39491751" @@ -9459,6 +9471,11 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +file64@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/file64/-/file64-1.0.2.tgz#d3dde9bab142ccf0049e0bd407a2576e94894825" + integrity sha512-cDQefGBdb8OO7Pb2nXiRcZlVjwgzoG0uuJ/H2fxNdz3vbOZctp0iPJoHDQ4VZrirqGYc9n/p9+ZqptLZrcSGRA== + filesize@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" From f7562c18bdf181d16feda4d34201d28fd397405b Mon Sep 17 00:00:00 2001 From: danis Date: Sat, 12 Aug 2023 10:43:02 +0200 Subject: [PATCH 027/133] basic genre details view --- front/API.ts | 20 ++++++++++++ front/i18n/Translations.ts | 3 ++ front/views/GenreDetailsView.tsx | 52 +------------------------------- 3 files changed, 24 insertions(+), 51 deletions(-) diff --git a/front/API.ts b/front/API.ts index 5e30e63..f3a893d 100644 --- a/front/API.ts +++ b/front/API.ts @@ -337,6 +337,16 @@ export default class API { return `${baseAPIUrl}/genre/${genreId}/illustration`; } + public static getGenre(genreId: number): Query { + return { + key: ['genre', genreId], + exec: () => + API.fetch({ + route: `/genre/${genreId}`, + }), + } + } + /** * Retrive a song's musicXML partition * @param songId the id to find the song @@ -490,6 +500,16 @@ export default class API { }; } + public static getFavorites(): Query { + return { + key: 'favorites', + exec: () => + API.fetch({ + route: '/search/songs/o', + }), + }; + } + /** * Retrieve the authenticated user's search history * @param skip number of entries skipped before returning diff --git a/front/i18n/Translations.ts b/front/i18n/Translations.ts index 014ed86..739c78d 100644 --- a/front/i18n/Translations.ts +++ b/front/i18n/Translations.ts @@ -42,6 +42,7 @@ export const en = { artistFilter: 'Artists', songsFilter: 'Songs', genreFilter: 'Genres', + favoriteFilter: 'Favorites', // profile page user: 'Profile', @@ -227,6 +228,7 @@ export const fr: typeof en = { artistFilter: 'Artistes', songsFilter: 'Morceaux', genreFilter: 'Genres', + favoriteFilter: 'Favoris', // Difficulty settings diffBtn: 'Difficulté', @@ -422,6 +424,7 @@ export const sp: typeof en = { artistFilter: 'Artistas', songsFilter: 'canciones', genreFilter: 'géneros', + favoriteFilter: 'Favorites', // Difficulty settings diffBtn: 'Dificultad', diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 53700bf..7e42e24 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -55,57 +55,8 @@ const rockArtists: Artist[] = [ }, ]; -const rockSongs: Song[] = [ - { - id: 1, - name: "Stairway to Heaven", - artistId: 1, - albumId: 1, - genreId: 1, - cover: "https://picsum.photos/200", - details: { /* song details */ }, - }, - { - id: 2, - name: "Bohemian Rhapsody", - artistId: 2, - albumId: 2, - genreId: 1, - cover: "https://picsum.photos/200", - details: { /* song details */ }, - }, - { - id: 3, - name: "Paint It Black", - artistId: 3, - albumId: 3, - genreId: 1, - cover: "https://picsum.photos/200", - details: { /* song details */ }, - }, - { - id: 4, - name: "Highway to Hell", - artistId: 4, - albumId: 4, - genreId: 1, - cover: "https://picsum.photos/200", - details: { /* song details */ }, - }, - { - id: 5, - name: "Sweet Child o' Mine", - artistId: 5, - albumId: 5, - genreId: 1, - cover: "https://picsum.photos/200", - details: { /* song details */ }, - }, - // Add more songs as needed - ]; - const GenreDetailsView = ({ genreId }: any) => { - // const { isLoading: isLoadingGenre, data: genreData, error: isErrorGenre } = useQuery(API.getArtist(genreId)); + const { isLoading: isLoadingGenre, data: genreData, error: isErrorGenre } = useQuery(API.getArtist(genreId)); const screenSize = useBreakpointValue({ base: "small", md: "big" }); const isMobileView = screenSize == "small"; const navigation = useNavigation(); @@ -124,7 +75,6 @@ const GenreDetailsView = ({ genreId }: any) => { size={'100%'} height={isMobileView ? 200 : 300} width={'100%'} - // backgroundColor={colorRange[Math.floor(Math.random() * 5)]?.code ?? '#364fc7'} bg={{ linearGradient: { colors: [colorRange[Math.floor(Math.random() * 5)]?.code ?? '#364fc7', 'black'], From 1255343b9774ebf51dedee9a5eaa11167077ba4b Mon Sep 17 00:00:00 2001 From: danis Date: Sat, 12 Aug 2023 11:16:22 +0200 Subject: [PATCH 028/133] artist view + moved components --- front/components/SearchBar.tsx | 9 +- front/components/SearchResult.tsx | 156 ++++++++++++++++++------------ front/components/SongRow.tsx | 14 ++- front/views/ArtistDetailsView.tsx | 54 +++++------ front/views/SearchView.tsx | 12 ++- 5 files changed, 146 insertions(+), 99 deletions(-) diff --git a/front/components/SearchBar.tsx b/front/components/SearchBar.tsx index b04cc97..9bb568e 100644 --- a/front/components/SearchBar.tsx +++ b/front/components/SearchBar.tsx @@ -5,7 +5,7 @@ import { translate } from '../i18n/i18n'; import { SearchContext } from '../views/SearchView'; import { debounce } from 'lodash'; -export type Filter = 'artist' | 'song' | 'genre' | 'all'; +export type Filter = 'artist' | 'song' | 'genre' | 'all' | 'favorite'; type FilterButton = { name: string; @@ -16,7 +16,7 @@ type FilterButton = { const SearchBar = () => { const { filter, updateFilter } = React.useContext(SearchContext); const { stringQuery, updateStringQuery } = React.useContext(SearchContext); - const [barText, updateBarText] = React.useState(stringQuery); + const [ barText, updateBarText ] = React.useState(stringQuery); const debouncedUpdateStringQuery = debounce(updateStringQuery, 500); @@ -42,6 +42,11 @@ const SearchBar = () => { callback: () => updateFilter('all'), id: 'all', }, + { + name: translate('favoriteFilter'), + callback: () => updateFilter('favorite'), + id: 'favorite', + }, { name: translate('artistFilter'), callback: () => updateFilter('artist'), diff --git a/front/components/SearchResult.tsx b/front/components/SearchResult.tsx index aab02bf..8dd037c 100644 --- a/front/components/SearchResult.tsx +++ b/front/components/SearchResult.tsx @@ -29,6 +29,8 @@ import SearchHistoryCard from './HistoryCard'; import Song, { SongWithArtist } from '../models/Song'; import { useNavigation } from '../Navigation'; import Artist from '../models/Artist'; +import SongRow from '../components/SongRow'; + const swaToSongCardProps = (song: SongWithArtist) => ({ songId: song.id, @@ -66,67 +68,67 @@ const RowCustom = (props: Parameters[0] & { onPress?: () => void }) ); }; -type SongRowProps = { - song: Song | SongWithArtist; // TODO: remove Song - onPress: () => void; -}; +// type SongRowProps = { +// song: Song | SongWithArtist; // TODO: remove Song +// onPress: () => void; +// }; -const SongRow = ({ song, onPress }: SongRowProps) => { - return ( - - - {song.name} - - - {song.name} - - - {song.artistId ?? 'artist'} - - - - - - ); -}; +// const SongRow = ({ song, onPress }: SongRowProps) => { +// return ( +// +// +// {song.name} +// +// +// {song.name} +// +// +// {song.artistId ?? 'artist'} +// +// +// +// +// +// ); +// }; SongRow.defaultProps = { onPress: () => {}, @@ -299,6 +301,35 @@ const GenreSearchComponent = (props: ItemSearchComponentProps) => { ); }; +const FavoriteSearchComponent = (props: SongsSearchComponentProps) => { + const { favoriteData } = React.useContext(SearchContext); + const navigation = useNavigation(); + + return ( + + + {translate('favoriteFilter')} + + + {favoriteData?.length ? ( + favoriteData.slice(0, props.maxRows).map((comp, index) => ( + { + API.createSearchHistoryEntry(comp.name, 'song'); + navigation.navigate('Song', { songId: comp.id }); + }} + /> + )) + ) : ( + {translate('errNoResults')} + )} + + + ) +} + const AllComponent = () => { const screenSize = useBreakpointValue({ base: 'small', md: 'big' }); const isMobileView = screenSize == 'small'; @@ -344,6 +375,8 @@ const FilterSwitch = () => { return ; case 'genre': return ; + case 'favorite': + return ; default: return Something very bad happened: {currentFilter}; } @@ -351,7 +384,8 @@ const FilterSwitch = () => { export const SearchResultComponent = () => { const { stringQuery } = React.useContext(SearchContext); - const shouldOutput = !!stringQuery.trim(); + const { filter } = React.useContext(SearchContext); + const shouldOutput = !!stringQuery.trim() || filter == "favorite"; return shouldOutput ? ( diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx index bc2dff2..17b60c0 100644 --- a/front/components/SongRow.tsx +++ b/front/components/SongRow.tsx @@ -1,15 +1,21 @@ -import { HStack, Image, Text } from "native-base"; +import { HStack, IconButton, Image, Text } from "native-base"; import Song, { SongWithArtist } from "../models/Song"; import RowCustom from "./RowCustom"; import TextButton from "./TextButton"; +import { MaterialIcons } from "@expo/vector-icons"; +import API from "../API"; type SongRowProps = { + liked: boolean; song: Song | SongWithArtist; // TODO: remove Song onPress: () => void; }; -const SongRow = ({ song, onPress }: SongRowProps) => { +const handleLikeButton = { +} + +const SongRow = ({ song, onPress, liked }: SongRowProps) => { return ( @@ -23,6 +29,10 @@ const SongRow = ({ song, onPress }: SongRowProps) => { borderColor={'white'} borderWidth={1} /> + { return ( - - - {/* - {artistData?.name} */} - - {artistData?.name} - - {songs.map((comp: Song | SongWithArtist, index: Key | null | undefined) => ( - { - API.createSearchHistoryEntry(comp.name, "song", Date.now()); - navigation.navigate("Song", { songId: comp.id }); - }} - /> - )) - } - - - {/* */} + style={{width : '100%', height: isMobileView ? 200 : 300}} + source={{uri : "https://picsum.photos/720"}}> + + + + {artistData?.name} + + {songs.map((comp: Song | SongWithArtist, index: Key | null | undefined) => ( + { + API.createSearchHistoryEntry(comp.name, "song", Date.now()); + navigation.navigate("Song", { songId: comp.id }); + }} + /> + )) + } + + ); }; diff --git a/front/views/SearchView.tsx b/front/views/SearchView.tsx index 108ff54..5c10e0e 100644 --- a/front/views/SearchView.tsx +++ b/front/views/SearchView.tsx @@ -12,13 +12,14 @@ import { ScrollView } from 'native-base'; import { RouteProps } from '../Navigation'; interface SearchContextType { - filter: 'artist' | 'song' | 'genre' | 'all'; - updateFilter: (newData: 'artist' | 'song' | 'genre' | 'all') => void; + filter: 'artist' | 'song' | 'genre' | 'all' | 'favorite'; + updateFilter: (newData: 'artist' | 'song' | 'genre' | 'all' | 'favorite') => void; stringQuery: string; updateStringQuery: (newData: string) => void; songData: Song[]; artistData: Artist[]; genreData: Genre[]; + favoriteData: Song[]; isLoadingSong: boolean; isLoadingArtist: boolean; isLoadingGenre: boolean; @@ -32,6 +33,7 @@ export const SearchContext = React.createContext({ songData: [], artistData: [], genreData: [], + favoriteData: [], isLoadingSong: false, isLoadingArtist: false, isLoadingGenre: false, @@ -60,6 +62,11 @@ const SearchView = (props: RouteProps) => { { enabled: !!stringQuery } ); + const { isLoading: isLoadingFavorite, data: favoriteData = [] } = useQuery( + API.getFavorites(), + { enabled: true } + ) + const updateFilter = (newData: Filter) => { // called when the filter is changed setFilter(newData); @@ -80,6 +87,7 @@ const SearchView = (props: RouteProps) => { songData, artistData, genreData, + favoriteData, isLoadingSong, isLoadingArtist, isLoadingGenre, From 1396fcb39c304784707c72a2b5ec9839c317ac95 Mon Sep 17 00:00:00 2001 From: danis Date: Mon, 4 Sep 2023 11:05:33 +0200 Subject: [PATCH 029/133] artist name fix --- front/views/ArtistDetailsView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 3bc9a4b..56f3c06 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -39,7 +39,7 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => resizeMode="cover" /> - Abba + {artistQuery.data.name} {songsQuery.data.map((comp: Song, index: Key | null | undefined) => ( Date: Tue, 5 Sep 2023 09:33:31 +0200 Subject: [PATCH 030/133] actual data from db tho needs better design care --- back/src/song/song.controller.ts | 6 -- front/API.ts | 43 +++++++++++--- front/views/GenreDetailsView.tsx | 97 ++++++++++++-------------------- front/views/SearchView.tsx | 14 ++--- 4 files changed, 78 insertions(+), 82 deletions(-) diff --git a/back/src/song/song.controller.ts b/back/src/song/song.controller.ts index be725ed..a80a31b 100644 --- a/back/src/song/song.controller.ts +++ b/back/src/song/song.controller.ts @@ -146,10 +146,4 @@ export class SongController { songId: id, }); } - - @Get('/artist/:artistId') - async getSongByArtist(@Param('artistId', ParseIntPipe) artistId: number) { - const res = await this.songService.songByArtist(artistId) - return res; - } } diff --git a/front/API.ts b/front/API.ts index 25dd3dc..35c413c 100644 --- a/front/API.ts +++ b/front/API.ts @@ -297,6 +297,24 @@ export default class API { }; } + /** + * Retrieves all songs corresponding to the given genre ID + * @param genreId the id of the genre we're aiming + * @returns a promise of an array of Songs + */ + public static getSongsByGenre(genreId: number): Query { + return { + key: ['genre', genreId, 'songs'], + exec: () => + API.fetch( + { + route: `/song?genreId=${genreId}`, + }, + { handler: PlageHandler(SongHandler) } + ).then(({ data }) => data), + }; + } + /** * Retrive a song's midi partition * @param songId the id to find the song @@ -332,15 +350,22 @@ export default class API { return `${API.baseUrl}/genre/${genreId}/illustration`; } - // public static getGenre(genreId: number): Query { - // return { - // key: ['genre', genreId], - // exec: () => - // API.fetch({ - // route: `/genre/${genreId}`, - // }), - // } - // } + /** + * Retrieves a genre + * @param genreId the id of the aimed genre + */ + public static getGenre(genreId: number): Query { + return { + key: ['genre', genreId], + exec: () => + API.fetch( + { + route: `/genre/${genreId}`, + }, + { handler: GenreHandler } + ), + }; + } /** * Retrive a song's musicXML partition diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 7e42e24..1b62caa 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -2,72 +2,52 @@ import { SafeAreaView } from 'react-native'; import { VStack, Text, Box, Flex, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue, ScrollView } from 'native-base'; import { useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; -import { useNavigation } from '../Navigation'; +import { RouteProps, useNavigation } from '../Navigation'; import API from '../API'; import Artist from '../models/Artist'; import ArtistCard from '../components/ArtistCard'; import CardGridCustom from '../components/CardGridCustom'; import { translate } from '../i18n/i18n'; -const colorRange = [ - { - code: '#364fc7', - }, - { - code: '#5c940d', - }, - { - code: '#c92a2a', - }, - { - code: '#d6336c', - }, - { - code: '#20c997' - } -] +const colorRange = ['#364fc7', '#5c940d', '#c92a2a', '#d6336c', '#20c997']; +// { +// code: '#364fc7', +// }, +// { +// code: '#5c940d', +// }, +// { +// code: '#c92a2a', +// }, +// { +// code: '#d6336c', +// }, +// { +// code: '#20c997' +// } +// ] -const rockArtists: Artist[] = [ - { - id: 1, - name: "Led Zeppelin", - picture: "https://picsum.photos/200", - }, - { - id: 2, - name: "Queen", - picture: "https://picsum.photos/200", - }, - { - id: 3, - name: "The Rolling Stones", - picture: "https://picsum.photos/200", - }, - { - id: 4, - name: "AC/DC", - picture: "https://picsum.photos/200", - }, - { - name: "Guns N' Roses", - id: 5, - picture: "https://picsum.photos/200", - }, -]; +type GenreDetailsViewProps = { + genreId: number; +} -const GenreDetailsView = ({ genreId }: any) => { - const { isLoading: isLoadingGenre, data: genreData, error: isErrorGenre } = useQuery(API.getArtist(genreId)); +const rockArtists: any[] = []; + +const GenreDetailsView = ({ genreId }: RouteProps) => { + // const { isLoading: isLoadingGenre, data: genreData, error: isErrorGenre } = useQuery(API.getArtist(genreId)); + const genreQuery = useQuery(API.getGenre(genreId)) + const songsQuery = useQuery(API.getSongsByGenre(genreId)) const screenSize = useBreakpointValue({ base: "small", md: "big" }); const isMobileView = screenSize == "small"; const navigation = useNavigation(); - // if (isLoadingGenre) { - // return ; - // } - - // if (isErrorGenre) { - // navigation.navigate('Error'); - // } + if (genreQuery.isError || songsQuery.isError) { + navigation.navigate('Error'); + return <>; + } + if (!genreQuery.data || songsQuery.data === undefined) { + return ; + } return ( @@ -77,11 +57,12 @@ const GenreDetailsView = ({ genreId }: any) => { width={'100%'} bg={{ linearGradient: { - colors: [colorRange[Math.floor(Math.random() * 5)]?.code ?? '#364fc7', 'black'], + colors: [colorRange[Math.floor(Math.random() * 5)] ?? '#364fc7', 'black'], start: [0, 0], end: [0, 1], },}} /> + {genreQuery.data.name} { mt={4} > - {rockArtists?.length ? ( ({ + content={songsQuery.data.slice(0, songsQuery.data.length).map((artistData) => ({ image: API.getArtistIllustration(artistData.id), name: artistData.name, id: artistData.id, @@ -102,9 +82,6 @@ const GenreDetailsView = ({ genreId }: any) => { }))} cardComponent={ArtistCard} /> - ) : ( - {translate('errNoResults')} - )} diff --git a/front/views/SearchView.tsx b/front/views/SearchView.tsx index 5c10e0e..b3b84bf 100644 --- a/front/views/SearchView.tsx +++ b/front/views/SearchView.tsx @@ -19,7 +19,7 @@ interface SearchContextType { songData: Song[]; artistData: Artist[]; genreData: Genre[]; - favoriteData: Song[]; + // favoriteData: Song[]; isLoadingSong: boolean; isLoadingArtist: boolean; isLoadingGenre: boolean; @@ -33,7 +33,7 @@ export const SearchContext = React.createContext({ songData: [], artistData: [], genreData: [], - favoriteData: [], + // favoriteData: [], isLoadingSong: false, isLoadingArtist: false, isLoadingGenre: false, @@ -62,10 +62,10 @@ const SearchView = (props: RouteProps) => { { enabled: !!stringQuery } ); - const { isLoading: isLoadingFavorite, data: favoriteData = [] } = useQuery( - API.getFavorites(), - { enabled: true } - ) + // const { isLoading: isLoadingFavorite, data: favoriteData = [] } = useQuery( + // API.getFavorites(), + // { enabled: true } + // ) const updateFilter = (newData: Filter) => { // called when the filter is changed @@ -87,7 +87,7 @@ const SearchView = (props: RouteProps) => { songData, artistData, genreData, - favoriteData, + // favoriteData, isLoadingSong, isLoadingArtist, isLoadingGenre, From 539c35c90364884a1741d9202cf50a9fb12c0bd5 Mon Sep 17 00:00:00 2001 From: danis Date: Tue, 5 Sep 2023 09:36:11 +0200 Subject: [PATCH 031/133] song cards routing fix --- front/views/GenreDetailsView.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 1b62caa..e7bf15a 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -71,13 +71,13 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { > ({ - image: API.getArtistIllustration(artistData.id), - name: artistData.name, - id: artistData.id, + content={songsQuery.data.slice(0, songsQuery.data.length).map((songData) => ({ + image: API.getArtistIllustration(songData.id), + name: songData.name, + id: songData.id, onPress: () => { - API.createSearchHistoryEntry(artistData.name, 'artist'); - navigation.navigate('Artist', { artistId: artistData.id }); + API.createSearchHistoryEntry(songData.name, 'artist'); + navigation.navigate('Song', { songId: songData.id }); }, }))} cardComponent={ArtistCard} From c9d3ef88e7ecb22da79f8da121079e4cefca9391 Mon Sep 17 00:00:00 2001 From: danis Date: Tue, 5 Sep 2023 13:44:30 +0200 Subject: [PATCH 032/133] clean code + search history handler fix --- front/models/SearchHistory.ts | 2 +- front/views/GenreDetailsView.tsx | 24 ------------------------ 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/front/models/SearchHistory.ts b/front/models/SearchHistory.ts index 05c433b..779be6c 100644 --- a/front/models/SearchHistory.ts +++ b/front/models/SearchHistory.ts @@ -2,7 +2,7 @@ import Model, { ModelValidator } from './Model'; import * as yup from 'yup'; import ResponseHandler from './ResponseHandler'; -export const SearchType = ['song', 'artist', 'album'] as const; +export const SearchType = ['song', 'artist', 'album', 'genre'] as const; export type SearchType = (typeof SearchType)[number]; const SearchHistoryValidator = yup diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index e7bf15a..694b129 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -10,31 +10,12 @@ import CardGridCustom from '../components/CardGridCustom'; import { translate } from '../i18n/i18n'; const colorRange = ['#364fc7', '#5c940d', '#c92a2a', '#d6336c', '#20c997']; -// { -// code: '#364fc7', -// }, -// { -// code: '#5c940d', -// }, -// { -// code: '#c92a2a', -// }, -// { -// code: '#d6336c', -// }, -// { -// code: '#20c997' -// } -// ] type GenreDetailsViewProps = { genreId: number; } -const rockArtists: any[] = []; - const GenreDetailsView = ({ genreId }: RouteProps) => { - // const { isLoading: isLoadingGenre, data: genreData, error: isErrorGenre } = useQuery(API.getArtist(genreId)); const genreQuery = useQuery(API.getGenre(genreId)) const songsQuery = useQuery(API.getSongsByGenre(genreId)) const screenSize = useBreakpointValue({ base: "small", md: "big" }); @@ -69,7 +50,6 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { justifyContent={['flex-start']} mt={4} > - ({ image: API.getArtistIllustration(songData.id), @@ -82,10 +62,6 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { }))} cardComponent={ArtistCard} /> - - - - ); From 125a7faf02a123b7cf47b4640acbc02bc6def8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 20 Jul 2023 00:08:20 +0200 Subject: [PATCH 033/133] early Experiment working --- front/components/PartitionCoord.tsx | 40 +++++++ front/components/PartitionView.tsx | 42 +++++--- .../PartitionVisualizer/PhaserCanvas.tsx | 101 ++++++++++++++++++ front/package.json | 1 + front/views/HomeView.tsx | 6 ++ front/views/PlayView.tsx | 11 +- front/yarn.lock | 12 +++ 7 files changed, 198 insertions(+), 15 deletions(-) create mode 100644 front/components/PartitionCoord.tsx create mode 100644 front/components/PartitionVisualizer/PhaserCanvas.tsx diff --git a/front/components/PartitionCoord.tsx b/front/components/PartitionCoord.tsx new file mode 100644 index 0000000..eb5eac3 --- /dev/null +++ b/front/components/PartitionCoord.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import PartitionView from './PartitionView'; +import PhaserCanvas from './PartitionVisualizer/PhaserCanvas'; + +type PartitionCoordProps = { + // The Buffer of the MusicXML file retreived from the API + file: string; + onPartitionReady: () => void; + onEndReached: () => void; + // Timestamp of the play session, in milisecond + timestamp: number; +}; + +const PartitionCoord = ({ + file, + onPartitionReady, + onEndReached, + timestamp, +}: PartitionCoordProps) => { + const [partitionB64, setPartitionB64] = React.useState(null); + + return ( + <> + {!partitionB64 && ( + { + setPartitionB64(base64data); + onPartitionReady(); + }} + onEndReached={onEndReached} + timestamp={timestamp} + /> + )} + {partitionB64 && } + + ); +}; + +export default PartitionCoord; \ No newline at end of file diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index b162fa6..1eed6b1 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -17,7 +17,7 @@ import * as SAC from 'standardized-audio-context'; type PartitionViewProps = { // The Buffer of the MusicXML file retreived from the API file: string; - onPartitionReady: () => void; + onPartitionReady: (base64data: string) => void; onEndReached: () => void; // Timestamp of the play session, in milisecond timestamp: number; @@ -33,6 +33,7 @@ const PartitionView = (props: PartitionViewProps) => { const OSMD_DIV_ID = 'osmd-div'; const options: IOSMDOptions = { darkMode: colorScheme == 'dark', + backend: 'canvas', drawComposer: false, drawCredits: false, drawLyrics: false, @@ -68,14 +69,14 @@ const PartitionView = (props: PartitionViewProps) => { // Put your hands together for https://github.com/jimutt/osmd-audio-player/blob/master/src/internals/noteHelpers.ts const fixedKey = note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments.at(0)?.fixedKey ?? 0; - const midiNumber = note.halfTone - fixedKey * 12; - // console.log('Expecting midi ' + midiNumber); - const duration = getActualNoteLength(note); - const gain = note.ParentVoiceEntry.ParentVoice.Volume; - soundPlayer!.play(midiNumber.toString(), audioContext.currentTime, { - duration, - gain, - }); + // const midiNumber = note.halfTone - fixedKey * 12; + // // console.log('Expecting midi ' + midiNumber); + // const duration = getActualNoteLength(note); + // const gain = note.ParentVoiceEntry.ParentVoice.Volume; + // soundPlayer!.play(midiNumber.toString(), audioContext.currentTime, { + // duration, + // gain, + // }); }); }; const getShortedNoteUnderCursor = () => { @@ -88,16 +89,29 @@ const PartitionView = (props: PartitionViewProps) => { useEffect(() => { const _osmd = new OSMD(OSMD_DIV_ID, options); Promise.all([ - SoundFont.instrument(audioContext as unknown as AudioContext, 'electric_piano_1'), + // SoundFont.instrument(audioContext as unknown as AudioContext, 'electric_piano_1'), _osmd.load(props.file), ]).then(([player]) => { - setSoundPlayer(player); + // setSoundPlayer(player); _osmd.render(); + _osmd.cursor.show(); + // get the current cursor position + const curPos = []; + while (!_osmd.cursor.iterator.EndReached) { + curPos.push(_osmd.cursor.cursorElement.offsetLeft); + _osmd.cursor.next(); + } + console.log('curPos', curPos); + _osmd.cursor.reset(); _osmd.cursor.hide(); + console.log("timestamp cursor", _osmd.cursor.iterator.CurrentSourceTimestamp); + console.log("timestamp cursor", _osmd.cursor.iterator.CurrentVoiceEntries); + console.log("current measure index", _osmd.cursor.iterator.CurrentMeasureIndex); + const osmdCanvas = document.querySelector( "#" + OSMD_DIV_ID + " canvas"); // Ty https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL77C12-L77C63 const bpm = _osmd.Sheet.HasBPMInfo ? _osmd.Sheet.getExpressionsStartTempoInBPM() : 60; setWholeNoteLength(Math.round((60 / bpm) * 4000)); - props.onPartitionReady(); + props.onPartitionReady(osmdCanvas.toDataURL()); // Do not show cursor before actuall start }); setOsmd(_osmd); @@ -114,7 +128,7 @@ const PartitionView = (props: PartitionViewProps) => { }, [dimensions]); useEffect(() => { - if (!osmd || !soundPlayer) { + if (!osmd) { return; } if (props.timestamp > 0 && osmd.cursor.hidden && !osmd.cursor.iterator.EndReached) { @@ -138,7 +152,7 @@ const PartitionView = (props: PartitionViewProps) => { osmd.cursor.next(); if (osmd.cursor.iterator.EndReached) { osmd.cursor.hide(); // Lousy fix for https://github.com/opensheetmusicdisplay/opensheetmusicdisplay/issues/1338 - soundPlayer.stop(); + // soundPlayer.stop(); props.onEndReached(); } else { // Shamelessly stolen from https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL223C7-L224C1 diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx new file mode 100644 index 0000000..1456c3f --- /dev/null +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -0,0 +1,101 @@ +// create a simple phaser effect with a canvas that can be easily imported as a react component + +import * as React from 'react'; +import { useEffect, useRef } from 'react'; +import Phaser from 'phaser'; +import { Asset, useAssets } from 'expo-asset'; +import { use } from 'matter'; + +const b64data = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAGKDAGaAAAFgUlEQVRYw7WXa2wUVRTH/20p7fZBW0p5iAplaUELCqEFlUCMYKwJKMYgaEwIUpQYNCIWRYgvQtTS6AeiKEqIQDBIAEFAEEm1DUVUoIqPVqhCC/IoammhC9vt/vywM7szu7NLLfHMl7n3nP/533vuPefMSHap8wNIoG57pxIYSErZDyCgB8qogTYUeKT+v2C+SlLanqA3v4EBwSdAasAI4CUUcA7wRsiBMbDIjQDQd4M0ogimtkrbMWSgAVzibUIouTIwfc4kJaVIkpT+PTxLiGplkHCo6Wq+uSOydlrYl3jD1xOSAQ5zdzcA1CJJK/ygOEk91kIhAMsQmeMDq9MRg7ojGExIINkrOAm8D4DHSg9QwiQApiDmeQzFWaDE2LUQ4DXjedimsAQaShgbqXj4NM4ISZpmVeTbdt6vGISrWtElfs76Fuig9+9hij7qFjbTs6GecEnxSdKa4DjbK0nFrzWFTI4yE/jVsvDsMaauP0JxX0ARviBgOg0A3GnZaVpO4N3llZRYYZrez8dhC/KRxrBVYSt37TPVgSh6GQN8FFxSQPLOqbsBSP3Wy2gLwJIRQcC91mPIOGyaTaTKARBxbllH7EtqZkJsgCRlvrTbF21JQiS3KN7pkFNH/BMOiJ+nq8vQTTNI8ChZnZabXJs7bxzf9zjAO/8kTLfNxynXwTpze6PlnG8/o16B+fzTfqCRgq1W62nXtYff1X1orjRiqzn2M8TgySlqAFjNuqDxFdIRKpWeag/Vo7zfJWXXei1ep3AaKDYDWypNvhLQnETk1+kWf/hC3iUrdGil0i3lAE8iRM/r1cpm3g0aNzAdgB8sACnvm8Bo0AuSLgLwKMeBQjosTEuCAJu0BSPgjsjo5WS0KyUM4Amqf6aO2cFRPUKU0cLAOhvgsgUAUM4u/PQz9lAGwC5/75eDgFlhAHuxKzNmynGtMwDtvMWOmIBahEjbYAACBWYCzY6A18kx3jI2WXolQJvRKMLqb6g5bbO0AnMPlbwSFdBrpwMA4FkOOwJ6mw08q/J8jChZnhtCR9HdfTo2IP6JyGQrfKbVGZBeETWdB723PwzQ/ZISr1IDchs9IcCtnasbWWMvCC3SNUhm2ophJ2raq9pyjycvjbju1yTje/604IzHllMXmH0256BGRBoPTipaO/jv4ktTPaNaC+rd02I5dqUsdTdUXiaGfOYbdKbPi2bnLkjLO3cszGJx+00fRLoemXlg1qkLVDOOxVyM6v4MM4kLlpQh6cObI22OIcatNh0nJj3X/8S2S3aTFhZwJ9/Z5raTZ71npZKUOWVxhPtDuBD5jZI7c+8DJ8/Giga7GcObzCMxMkFKJWlUYm6ztU0cYbihH7lccbv3cw9z+Tuq+yrG8gptNDGHBEcCSXGDjz7NDG6zWQyYLylhTyDSl1nK7VRYHLfxKmOpjCDcaH5dR5T1obPddekel9f95/BPs/ubwa+wB76acTzPRJ6hOWbYGnkEEb/wqlc96eu2CHAJ1cznLg5Fdf8lBQjxBqv87qbcx2MQJFd5HAjMyrSD0bxN6ABbWUiSQ9f4jQnNA7epjwNBSvWVGATmrX+M+xjjUGbLbHbtLLvU7w/dYf/0OrCV0ZTjjUEQ/WOxzJYh+QiRut5GkP6dz/jBms0kartA0ByWIekbbQQ9DnXYHG2gkIJOE7gc5jK32AgyavwOZ/A504N/AjG/px2entvtxf5Hoh5yByspZMN/JMjZbQ/RwRrf1W5RLZMY3Pkd7Ii8q5N71y9rae/CLbI/PY5qfKyk7ttvy13nj3aBIN6XslwZnW2TcX1KMlre8vk7RZB6QsVd7ccD3dUPXTwVhSCuI+lD80fi2iQhb1H+X5ssBEmn9KD+B7k54yut0XX/HfgvpUkmTvPggOsAAAAASUVORK5CYII='; + +const getPianoScene = (partitionB64: string) => { + class PianoScene extends Phaser.Scene { + async preload() { + // this.load.setBaseURL('http://labs.phaser.io'); + // this.load.setPath('content://assets/'); + // const imageData = await Asset.fromModule('./assets/raster-bw-64.png').downloadAsync(); + // this.load.image('raster', imageData.localUri); + } + + create() { + this.textures.addBase64('cursor', b64data); + this.textures.addBase64('raster', partitionB64); + + // wait for the image to be loaded, then create the sprites + this.textures.on('onload', () => { + const raster = this.add.image(300, 400, 'raster'); + const group = this.add.group(); + + group.createMultiple({ key: 'cursor', repeat: 8 }); + + let ci = 0; + const colors = [ + 0xef658c, 0xff9a52, 0xffdf00, 0x31ef8c, 0x21dfff, 0x31aade, 0x5275de, 0x9c55ad, + 0xbd208c, + ]; + + const _this = this; + + group.children.iterate((child) => { + child.x = 100; + child.y = 300; + child.depth = 9 - ci; + + child.tint = colors[ci]; + + ci++; + + _this.tweens.add({ + targets: child, + x: 900, + yoyo: true, + repeat: -1, + ease: 'Sine.easeInOut', + duration: 1500, + delay: 100 * ci, + }); + }); + }); + } + } + return PianoScene; +}; + +type PianoCursorPosition = { + // offset in pixels + x: number; + // timestamp in ms + timing: number; +}; + +type PhaserCanvasProps = { + partitionB64: string; + cursorPositions: PianoCursorPosition[]; +}; + +const PhaserCanvas = ({ partitionB64 }: PhaserCanvasProps) => { + const [game, setGame] = React.useState(null); + + useEffect(() => { + const PianoScene = getPianoScene(partitionB64); + + const config = { + type: Phaser.AUTO, + parent: 'phaser-canvas', + width: 1000, + height: 900, + scene: PianoScene, + scale: { + mode: Phaser.Scale.FIT, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + }; + + setGame(new Phaser.Game(config)); + }, []); + + return
; +}; + +export default PhaserCanvas; diff --git a/front/package.json b/front/package.json index f097628..380f499 100644 --- a/front/package.json +++ b/front/package.json @@ -50,6 +50,7 @@ "moti": "^0.22.0", "native-base": "^3.4.17", "opensheetmusicdisplay": "^1.7.5", + "phaser": "^3.60.0", "react": "18.1.0", "react-dom": "18.1.0", "react-i18next": "^11.18.3", diff --git a/front/views/HomeView.tsx b/front/views/HomeView.tsx index 131b74f..c4d2620 100644 --- a/front/views/HomeView.tsx +++ b/front/views/HomeView.tsx @@ -11,8 +11,14 @@ import Translate from '../components/Translate'; import TextButton from '../components/TextButton'; import Song from '../models/Song'; import { FontAwesome5 } from '@expo/vector-icons'; +import PhaserCanvas from '../components/PartitionVisualizer/PhaserCanvas'; + +const b64data = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAGKDAGaAAAFgUlEQVRYw7WXa2wUVRTH/20p7fZBW0p5iAplaUELCqEFlUCMYKwJKMYgaEwIUpQYNCIWRYgvQtTS6AeiKEqIQDBIAEFAEEm1DUVUoIqPVqhCC/IoammhC9vt/vywM7szu7NLLfHMl7n3nP/533vuPefMSHap8wNIoG57pxIYSErZDyCgB8qogTYUeKT+v2C+SlLanqA3v4EBwSdAasAI4CUUcA7wRsiBMbDIjQDQd4M0ogimtkrbMWSgAVzibUIouTIwfc4kJaVIkpT+PTxLiGplkHCo6Wq+uSOydlrYl3jD1xOSAQ5zdzcA1CJJK/ygOEk91kIhAMsQmeMDq9MRg7ojGExIINkrOAm8D4DHSg9QwiQApiDmeQzFWaDE2LUQ4DXjedimsAQaShgbqXj4NM4ISZpmVeTbdt6vGISrWtElfs76Fuig9+9hij7qFjbTs6GecEnxSdKa4DjbK0nFrzWFTI4yE/jVsvDsMaauP0JxX0ARviBgOg0A3GnZaVpO4N3llZRYYZrez8dhC/KRxrBVYSt37TPVgSh6GQN8FFxSQPLOqbsBSP3Wy2gLwJIRQcC91mPIOGyaTaTKARBxbllH7EtqZkJsgCRlvrTbF21JQiS3KN7pkFNH/BMOiJ+nq8vQTTNI8ChZnZabXJs7bxzf9zjAO/8kTLfNxynXwTpze6PlnG8/o16B+fzTfqCRgq1W62nXtYff1X1orjRiqzn2M8TgySlqAFjNuqDxFdIRKpWeag/Vo7zfJWXXei1ep3AaKDYDWypNvhLQnETk1+kWf/hC3iUrdGil0i3lAE8iRM/r1cpm3g0aNzAdgB8sACnvm8Bo0AuSLgLwKMeBQjosTEuCAJu0BSPgjsjo5WS0KyUM4Amqf6aO2cFRPUKU0cLAOhvgsgUAUM4u/PQz9lAGwC5/75eDgFlhAHuxKzNmynGtMwDtvMWOmIBahEjbYAACBWYCzY6A18kx3jI2WXolQJvRKMLqb6g5bbO0AnMPlbwSFdBrpwMA4FkOOwJ6mw08q/J8jChZnhtCR9HdfTo2IP6JyGQrfKbVGZBeETWdB723PwzQ/ZISr1IDchs9IcCtnasbWWMvCC3SNUhm2ophJ2raq9pyjycvjbju1yTje/604IzHllMXmH0256BGRBoPTipaO/jv4ktTPaNaC+rd02I5dqUsdTdUXiaGfOYbdKbPi2bnLkjLO3cszGJx+00fRLoemXlg1qkLVDOOxVyM6v4MM4kLlpQh6cObI22OIcatNh0nJj3X/8S2S3aTFhZwJ9/Z5raTZ71npZKUOWVxhPtDuBD5jZI7c+8DJ8/Giga7GcObzCMxMkFKJWlUYm6ztU0cYbihH7lccbv3cw9z+Tuq+yrG8gptNDGHBEcCSXGDjz7NDG6zWQyYLylhTyDSl1nK7VRYHLfxKmOpjCDcaH5dR5T1obPddekel9f95/BPs/ubwa+wB76acTzPRJ6hOWbYGnkEEb/wqlc96eu2CHAJ1cznLg5Fdf8lBQjxBqv87qbcx2MQJFd5HAjMyrSD0bxN6ABbWUiSQ9f4jQnNA7epjwNBSvWVGATmrX+M+xjjUGbLbHbtLLvU7w/dYf/0OrCV0ZTjjUEQ/WOxzJYh+QiRut5GkP6dz/jBms0kartA0ByWIekbbQQ9DnXYHG2gkIJOE7gc5jK32AgyavwOZ/A504N/AjG/px2entvtxf5Hoh5yByspZMN/JMjZbQ/RwRrf1W5RLZMY3Pkd7Ii8q5N71y9rae/CLbI/PY5qfKyk7ttvy13nj3aBIN6XslwZnW2TcX1KMlre8vk7RZB6QsVd7ccD3dUPXTwVhSCuI+lD80fi2iQhb1H+X5ssBEmn9KD+B7k54yut0XX/HfgvpUkmTvPggOsAAAAASUVORK5CYII='; + const HomeView = () => { + // return ; const navigation = useNavigation(); const userQuery = useQuery(API.getUserInfo); const playHistoryQuery = useQuery(API.getUserPlayHistory); diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 652b61e..1920cf4 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -29,6 +29,7 @@ import { translate } from '../i18n/i18n'; import { ColorSchemeType } from 'native-base/lib/typescript/components/types'; import { useStopwatch } from 'react-use-precision-timer'; import PartitionView from '../components/PartitionView'; +import PartitionCoord from '../components/PartitionCoord'; import TextButton from '../components/TextButton'; import { MIDIAccess, MIDIMessageEvent, requestMIDIAccess } from '@motiz88/react-native-midi'; import * as Linking from 'expo-linking'; @@ -268,13 +269,21 @@ const PlayView = ({ songId, type, route }: RouteProps) => {
- setPartitionRendered(true)} timestamp={Math.max(0, time)} onEndReached={() => { onEnd(); }} + /> */} + { + onEnd(); + }} + onPartitionReady={() => setPartitionRendered(true)} /> {!partitionRendered && } diff --git a/front/yarn.lock b/front/yarn.lock index 224b678..ae32b09 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -8921,6 +8921,11 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.0.0, events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -14749,6 +14754,13 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +phaser@^3.60.0: + version "3.60.0" + resolved "https://registry.yarnpkg.com/phaser/-/phaser-3.60.0.tgz#8a555623e64c707482e6321485b4bda84604590d" + integrity sha512-IKUy35EnoEVcl2EmJ8WOyK4X8OoxHYdlhZLgRGpNrvD1fEagYffhVmwHcapE/tGiLgyrnezmXIo5RrH2NcrTHw== + dependencies: + eventemitter3 "^5.0.0" + picocolors@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" From 8e5cc1bc440a66c7aa63e78953b73aa90971bad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Thu, 20 Jul 2023 00:33:32 +0200 Subject: [PATCH 034/133] Added sliding to the partition but some issues --- .../PartitionVisualizer/PhaserCanvas.tsx | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 1456c3f..6d65a10 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -3,13 +3,14 @@ import * as React from 'react'; import { useEffect, useRef } from 'react'; import Phaser from 'phaser'; +import useColorScheme from '../../hooks/colorScheme'; import { Asset, useAssets } from 'expo-asset'; import { use } from 'matter'; const b64data = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAGKDAGaAAAFgUlEQVRYw7WXa2wUVRTH/20p7fZBW0p5iAplaUELCqEFlUCMYKwJKMYgaEwIUpQYNCIWRYgvQtTS6AeiKEqIQDBIAEFAEEm1DUVUoIqPVqhCC/IoammhC9vt/vywM7szu7NLLfHMl7n3nP/533vuPefMSHap8wNIoG57pxIYSErZDyCgB8qogTYUeKT+v2C+SlLanqA3v4EBwSdAasAI4CUUcA7wRsiBMbDIjQDQd4M0ogimtkrbMWSgAVzibUIouTIwfc4kJaVIkpT+PTxLiGplkHCo6Wq+uSOydlrYl3jD1xOSAQ5zdzcA1CJJK/ygOEk91kIhAMsQmeMDq9MRg7ojGExIINkrOAm8D4DHSg9QwiQApiDmeQzFWaDE2LUQ4DXjedimsAQaShgbqXj4NM4ISZpmVeTbdt6vGISrWtElfs76Fuig9+9hij7qFjbTs6GecEnxSdKa4DjbK0nFrzWFTI4yE/jVsvDsMaauP0JxX0ARviBgOg0A3GnZaVpO4N3llZRYYZrez8dhC/KRxrBVYSt37TPVgSh6GQN8FFxSQPLOqbsBSP3Wy2gLwJIRQcC91mPIOGyaTaTKARBxbllH7EtqZkJsgCRlvrTbF21JQiS3KN7pkFNH/BMOiJ+nq8vQTTNI8ChZnZabXJs7bxzf9zjAO/8kTLfNxynXwTpze6PlnG8/o16B+fzTfqCRgq1W62nXtYff1X1orjRiqzn2M8TgySlqAFjNuqDxFdIRKpWeag/Vo7zfJWXXei1ep3AaKDYDWypNvhLQnETk1+kWf/hC3iUrdGil0i3lAE8iRM/r1cpm3g0aNzAdgB8sACnvm8Bo0AuSLgLwKMeBQjosTEuCAJu0BSPgjsjo5WS0KyUM4Amqf6aO2cFRPUKU0cLAOhvgsgUAUM4u/PQz9lAGwC5/75eDgFlhAHuxKzNmynGtMwDtvMWOmIBahEjbYAACBWYCzY6A18kx3jI2WXolQJvRKMLqb6g5bbO0AnMPlbwSFdBrpwMA4FkOOwJ6mw08q/J8jChZnhtCR9HdfTo2IP6JyGQrfKbVGZBeETWdB723PwzQ/ZISr1IDchs9IcCtnasbWWMvCC3SNUhm2ophJ2raq9pyjycvjbju1yTje/604IzHllMXmH0256BGRBoPTipaO/jv4ktTPaNaC+rd02I5dqUsdTdUXiaGfOYbdKbPi2bnLkjLO3cszGJx+00fRLoemXlg1qkLVDOOxVyM6v4MM4kLlpQh6cObI22OIcatNh0nJj3X/8S2S3aTFhZwJ9/Z5raTZ71npZKUOWVxhPtDuBD5jZI7c+8DJ8/Giga7GcObzCMxMkFKJWlUYm6ztU0cYbihH7lccbv3cw9z+Tuq+yrG8gptNDGHBEcCSXGDjz7NDG6zWQyYLylhTyDSl1nK7VRYHLfxKmOpjCDcaH5dR5T1obPddekel9f95/BPs/ubwa+wB76acTzPRJ6hOWbYGnkEEb/wqlc96eu2CHAJ1cznLg5Fdf8lBQjxBqv87qbcx2MQJFd5HAjMyrSD0bxN6ABbWUiSQ9f4jQnNA7epjwNBSvWVGATmrX+M+xjjUGbLbHbtLLvU7w/dYf/0OrCV0ZTjjUEQ/WOxzJYh+QiRut5GkP6dz/jBms0kartA0ByWIekbbQQ9DnXYHG2gkIJOE7gc5jK32AgyavwOZ/A504N/AjG/px2entvtxf5Hoh5yByspZMN/JMjZbQ/RwRrf1W5RLZMY3Pkd7Ii8q5N71y9rae/CLbI/PY5qfKyk7ttvy13nj3aBIN6XslwZnW2TcX1KMlre8vk7RZB6QsVd7ccD3dUPXTwVhSCuI+lD80fi2iQhb1H+X5ssBEmn9KD+B7k54yut0XX/HfgvpUkmTvPggOsAAAAASUVORK5CYII='; -const getPianoScene = (partitionB64: string) => { +const getPianoScene = (partitionB64: string, colorScheme: 'light' | 'dark') => { class PianoScene extends Phaser.Scene { async preload() { // this.load.setBaseURL('http://labs.phaser.io'); @@ -22,9 +23,24 @@ const getPianoScene = (partitionB64: string) => { this.textures.addBase64('cursor', b64data); this.textures.addBase64('raster', partitionB64); + //background color + this.cameras.main.setBackgroundColor(colorScheme === 'light' ? '#FFFFFF' : '#000000'); + // wait for the image to be loaded, then create the sprites this.textures.on('onload', () => { - const raster = this.add.image(300, 400, 'raster'); + //set the origin to the top-left of the sprite + const ras = this.add.image(0, 0, 'raster'); + ras.setOrigin(0, 0); + // add a sliding animation to the raster image + this.tweens.add({ + targets: ras, + x: ras.width * -1, + duration: 4000, + ease: 'Sine.easeInOut', + repeat: -1, + }); + + // const raster = this.add.image(0, 0, 'raster'); const group = this.add.group(); group.createMultiple({ key: 'cursor', repeat: 8 }); @@ -75,10 +91,11 @@ type PhaserCanvasProps = { }; const PhaserCanvas = ({ partitionB64 }: PhaserCanvasProps) => { + const colorScheme = useColorScheme(); const [game, setGame] = React.useState(null); useEffect(() => { - const PianoScene = getPianoScene(partitionB64); + const PianoScene = getPianoScene(partitionB64, colorScheme); const config = { type: Phaser.AUTO, @@ -90,6 +107,7 @@ const PhaserCanvas = ({ partitionB64 }: PhaserCanvasProps) => { mode: Phaser.Scale.FIT, autoCenter: Phaser.Scale.CENTER_BOTH, }, + debugger: true, }; setGame(new Phaser.Game(config)); From 3ac017a5f0eb440dc9f0e235af717bae0ca5301d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Fri, 21 Jul 2023 00:55:30 +0200 Subject: [PATCH 035/133] Cursor with cam follow is moving to correct notes, timing is fake --- front/components/PartitionCoord.tsx | 20 ++- front/components/PartitionView.tsx | 21 ++- .../PartitionVisualizer/PhaserCanvas.tsx | 124 ++++++++++-------- 3 files changed, 98 insertions(+), 67 deletions(-) diff --git a/front/components/PartitionCoord.tsx b/front/components/PartitionCoord.tsx index eb5eac3..76216b1 100644 --- a/front/components/PartitionCoord.tsx +++ b/front/components/PartitionCoord.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import PartitionView from './PartitionView'; import PhaserCanvas from './PartitionVisualizer/PhaserCanvas'; +import { PianoCursorPosition } from './PartitionVisualizer/PhaserCanvas'; type PartitionCoordProps = { // The Buffer of the MusicXML file retreived from the API @@ -17,24 +18,31 @@ const PartitionCoord = ({ onEndReached, timestamp, }: PartitionCoordProps) => { - const [partitionB64, setPartitionB64] = React.useState(null); + const [partitionData, setPartitionData] = React.useState< + [string, PianoCursorPosition[]] | null + >(null); return ( <> - {!partitionB64 && ( + {!partitionData && ( { - setPartitionB64(base64data); + onPartitionReady={(base64data, a) => { + setPartitionData([base64data, a]); onPartitionReady(); }} onEndReached={onEndReached} timestamp={timestamp} /> )} - {partitionB64 && } + {partitionData && ( + + )} ); }; -export default PartitionCoord; \ No newline at end of file +export default PartitionCoord; diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index 1eed6b1..c985daf 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -13,11 +13,12 @@ import useColorScheme from '../hooks/colorScheme'; import { useWindowDimensions } from 'react-native'; import SoundFont from 'soundfont-player'; import * as SAC from 'standardized-audio-context'; +import { PianoCursorPosition } from './PartitionVisualizer/PhaserCanvas'; type PartitionViewProps = { // The Buffer of the MusicXML file retreived from the API file: string; - onPartitionReady: (base64data: string) => void; + onPartitionReady: (base64data: string, cursorInfos: PianoCursorPosition[]) => void; onEndReached: () => void; // Timestamp of the play session, in milisecond timestamp: number; @@ -104,14 +105,22 @@ const PartitionView = (props: PartitionViewProps) => { console.log('curPos', curPos); _osmd.cursor.reset(); _osmd.cursor.hide(); - console.log("timestamp cursor", _osmd.cursor.iterator.CurrentSourceTimestamp); - console.log("timestamp cursor", _osmd.cursor.iterator.CurrentVoiceEntries); - console.log("current measure index", _osmd.cursor.iterator.CurrentMeasureIndex); - const osmdCanvas = document.querySelector( "#" + OSMD_DIV_ID + " canvas"); + console.log('timestamp cursor', _osmd.cursor.iterator.CurrentSourceTimestamp); + console.log('timestamp cursor', _osmd.cursor.iterator.CurrentVoiceEntries); + console.log('current measure index', _osmd.cursor.iterator.CurrentMeasureIndex); + const osmdCanvas = document.querySelector('#' + OSMD_DIV_ID + ' canvas'); // Ty https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL77C12-L77C63 const bpm = _osmd.Sheet.HasBPMInfo ? _osmd.Sheet.getExpressionsStartTempoInBPM() : 60; setWholeNoteLength(Math.round((60 / bpm) * 4000)); - props.onPartitionReady(osmdCanvas.toDataURL()); + props.onPartitionReady( + osmdCanvas.toDataURL(), + curPos.map((pos) => { + return { + x: pos, + timing: Math.floor(Math.random() * 600) + 100, + }; + }) + ); // Do not show cursor before actuall start }); setOsmd(_osmd); diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 6d65a10..2cf2b74 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -4,81 +4,96 @@ import * as React from 'react'; import { useEffect, useRef } from 'react'; import Phaser from 'phaser'; import useColorScheme from '../../hooks/colorScheme'; -import { Asset, useAssets } from 'expo-asset'; -import { use } from 'matter'; const b64data = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAGKDAGaAAAFgUlEQVRYw7WXa2wUVRTH/20p7fZBW0p5iAplaUELCqEFlUCMYKwJKMYgaEwIUpQYNCIWRYgvQtTS6AeiKEqIQDBIAEFAEEm1DUVUoIqPVqhCC/IoammhC9vt/vywM7szu7NLLfHMl7n3nP/533vuPefMSHap8wNIoG57pxIYSErZDyCgB8qogTYUeKT+v2C+SlLanqA3v4EBwSdAasAI4CUUcA7wRsiBMbDIjQDQd4M0ogimtkrbMWSgAVzibUIouTIwfc4kJaVIkpT+PTxLiGplkHCo6Wq+uSOydlrYl3jD1xOSAQ5zdzcA1CJJK/ygOEk91kIhAMsQmeMDq9MRg7ojGExIINkrOAm8D4DHSg9QwiQApiDmeQzFWaDE2LUQ4DXjedimsAQaShgbqXj4NM4ISZpmVeTbdt6vGISrWtElfs76Fuig9+9hij7qFjbTs6GecEnxSdKa4DjbK0nFrzWFTI4yE/jVsvDsMaauP0JxX0ARviBgOg0A3GnZaVpO4N3llZRYYZrez8dhC/KRxrBVYSt37TPVgSh6GQN8FFxSQPLOqbsBSP3Wy2gLwJIRQcC91mPIOGyaTaTKARBxbllH7EtqZkJsgCRlvrTbF21JQiS3KN7pkFNH/BMOiJ+nq8vQTTNI8ChZnZabXJs7bxzf9zjAO/8kTLfNxynXwTpze6PlnG8/o16B+fzTfqCRgq1W62nXtYff1X1orjRiqzn2M8TgySlqAFjNuqDxFdIRKpWeag/Vo7zfJWXXei1ep3AaKDYDWypNvhLQnETk1+kWf/hC3iUrdGil0i3lAE8iRM/r1cpm3g0aNzAdgB8sACnvm8Bo0AuSLgLwKMeBQjosTEuCAJu0BSPgjsjo5WS0KyUM4Amqf6aO2cFRPUKU0cLAOhvgsgUAUM4u/PQz9lAGwC5/75eDgFlhAHuxKzNmynGtMwDtvMWOmIBahEjbYAACBWYCzY6A18kx3jI2WXolQJvRKMLqb6g5bbO0AnMPlbwSFdBrpwMA4FkOOwJ6mw08q/J8jChZnhtCR9HdfTo2IP6JyGQrfKbVGZBeETWdB723PwzQ/ZISr1IDchs9IcCtnasbWWMvCC3SNUhm2ophJ2raq9pyjycvjbju1yTje/604IzHllMXmH0256BGRBoPTipaO/jv4ktTPaNaC+rd02I5dqUsdTdUXiaGfOYbdKbPi2bnLkjLO3cszGJx+00fRLoemXlg1qkLVDOOxVyM6v4MM4kLlpQh6cObI22OIcatNh0nJj3X/8S2S3aTFhZwJ9/Z5raTZ71npZKUOWVxhPtDuBD5jZI7c+8DJ8/Giga7GcObzCMxMkFKJWlUYm6ztU0cYbihH7lccbv3cw9z+Tuq+yrG8gptNDGHBEcCSXGDjz7NDG6zWQyYLylhTyDSl1nK7VRYHLfxKmOpjCDcaH5dR5T1obPddekel9f95/BPs/ubwa+wB76acTzPRJ6hOWbYGnkEEb/wqlc96eu2CHAJ1cznLg5Fdf8lBQjxBqv87qbcx2MQJFd5HAjMyrSD0bxN6ABbWUiSQ9f4jQnNA7epjwNBSvWVGATmrX+M+xjjUGbLbHbtLLvU7w/dYf/0OrCV0ZTjjUEQ/WOxzJYh+QiRut5GkP6dz/jBms0kartA0ByWIekbbQQ9DnXYHG2gkIJOE7gc5jK32AgyavwOZ/A504N/AjG/px2entvtxf5Hoh5yByspZMN/JMjZbQ/RwRrf1W5RLZMY3Pkd7Ii8q5N71y9rae/CLbI/PY5qfKyk7ttvy13nj3aBIN6XslwZnW2TcX1KMlre8vk7RZB6QsVd7ccD3dUPXTwVhSCuI+lD80fi2iQhb1H+X5ssBEmn9KD+B7k54yut0XX/HfgvpUkmTvPggOsAAAAASUVORK5CYII='; -const getPianoScene = (partitionB64: string, colorScheme: 'light' | 'dark') => { +const cursorB64 = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAJYCAIAAABdEXdWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY0NDUxRDFFOTUwODExRTdCMUJEQjg0NTEzM0EzMTY2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjY0NDUxRDFGOTUwODExRTdCMUJEQjg0NTEzM0EzMTY2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjQ0NTFEMUM5NTA4MTFFN0IxQkRCODQ1MTMzQTMxNjYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjQ0NTFEMUQ5NTA4MTFFN0IxQkRCODQ1MTMzQTMxNjYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4+DXQ3AAAy2UlEQVR42qxd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'; + +const getPianoScene = ( + partitionB64: string, + cursorPositions: PianoCursorPosition[], + colorScheme: 'light' | 'dark' +) => { class PianoScene extends Phaser.Scene { - async preload() { - // this.load.setBaseURL('http://labs.phaser.io'); - // this.load.setPath('content://assets/'); - // const imageData = await Asset.fromModule('./assets/raster-bw-64.png').downloadAsync(); - // this.load.image('raster', imageData.localUri); - } + async preload() {} create() { - this.textures.addBase64('cursor', b64data); - this.textures.addBase64('raster', partitionB64); + this.textures.addBase64('partition', partitionB64); + this.cursorPositionsIdx = -1; - //background color this.cameras.main.setBackgroundColor(colorScheme === 'light' ? '#FFFFFF' : '#000000'); - - // wait for the image to be loaded, then create the sprites this.textures.on('onload', () => { - //set the origin to the top-left of the sprite - const ras = this.add.image(0, 0, 'raster'); - ras.setOrigin(0, 0); - // add a sliding animation to the raster image - this.tweens.add({ - targets: ras, - x: ras.width * -1, - duration: 4000, - ease: 'Sine.easeInOut', - repeat: -1, - }); + this.partition = this.add.image(0, 0, 'partition').setOrigin(0, 0); + this.cameras.main.setBounds(0, 0, this.partition.width, this.partition.height); - // const raster = this.add.image(0, 0, 'raster'); - const group = this.add.group(); + this.cursor = this.add.rectangle(0, 0, 30, 350, 0x31ef8c, 0.5).setOrigin(0, 0); + this.cameras.main.startFollow(this.cursor, true, 0.05, 0.05); - group.createMultiple({ key: 'cursor', repeat: 8 }); + this.cursorMoveNext(); - let ci = 0; - const colors = [ - 0xef658c, 0xff9a52, 0xffdf00, 0x31ef8c, 0x21dfff, 0x31aade, 0x5275de, 0x9c55ad, - 0xbd208c, - ]; + // // const raster = this.add.image(0, 0, 'raster'); + // const group = this.add.group(); - const _this = this; + // group.createMultiple({ key: 'expo', repeat: 8 }); - group.children.iterate((child) => { - child.x = 100; - child.y = 300; - child.depth = 9 - ci; + // let ci = 0; + // const colors = [ + // 0xef658c, 0xff9a52, 0xffdf00, 0x31ef8c, 0x21dfff, 0x31aade, 0x5275de, 0x9c55ad, + // 0xbd208c, + // ]; - child.tint = colors[ci]; + // const _this = this; - ci++; + // group.children.iterate((child) => { + // child.x = 100; + // child.y = 300; + // child.depth = 9 - ci; - _this.tweens.add({ - targets: child, - x: 900, - yoyo: true, - repeat: -1, - ease: 'Sine.easeInOut', - duration: 1500, - delay: 100 * ci, - }); - }); + // child.tint = colors[ci]; + + // ci++; + + // _this.tweens.add({ + // targets: child, + // x: 900, + // yoyo: true, + // repeat: -1, + // ease: 'Sine.easeInOut', + // duration: 1500, + // delay: 100 * ci, + // }); + // }); }); } + + cursorMoveNext(gameobject) { + if (this.cursorPositionsIdx >= cursorPositions.length) { + return; + } + this.cursorPositionsIdx++; + const cursorPosition = cursorPositions[this.cursorPositionsIdx]; + if (cursorPosition) { + this.tweens.add({ + targets: this.cursor, + x: cursorPosition.x, + duration: 200, + ease: 'Sine.easeInOut', + onComplete: () => { + // wait cursorPosition.timing + setTimeout(() => { + this.cursorMoveNext(); + }, cursorPosition.timing); + }, + }); + } + } } return PianoScene; }; -type PianoCursorPosition = { +export type PianoCursorPosition = { // offset in pixels x: number; // timestamp in ms @@ -90,24 +105,23 @@ type PhaserCanvasProps = { cursorPositions: PianoCursorPosition[]; }; -const PhaserCanvas = ({ partitionB64 }: PhaserCanvasProps) => { +const PhaserCanvas = ({ partitionB64, cursorPositions }: PhaserCanvasProps) => { const colorScheme = useColorScheme(); const [game, setGame] = React.useState(null); useEffect(() => { - const PianoScene = getPianoScene(partitionB64, colorScheme); + const pianoScene = getPianoScene(partitionB64, cursorPositions, colorScheme); const config = { type: Phaser.AUTO, parent: 'phaser-canvas', width: 1000, height: 900, - scene: PianoScene, + scene: pianoScene, scale: { mode: Phaser.Scale.FIT, autoCenter: Phaser.Scale.CENTER_BOTH, }, - debugger: true, }; setGame(new Phaser.Game(config)); From 7438986bcdc4fca7ee246014e26e5736fc5e1ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Mon, 24 Jul 2023 17:30:39 +0200 Subject: [PATCH 036/133] Cursor is controlled by partition timestamps provided by playview and can thus be paused and onEndReached is now called --- front/components/PartitionCoord.tsx | 7 +- front/components/PartitionView.tsx | 49 ++++++-- .../PartitionVisualizer/PhaserCanvas.tsx | 114 ++++++++---------- front/views/PlayView.tsx | 68 +++-------- 4 files changed, 114 insertions(+), 124 deletions(-) diff --git a/front/components/PartitionCoord.tsx b/front/components/PartitionCoord.tsx index 76216b1..1ad6a28 100644 --- a/front/components/PartitionCoord.tsx +++ b/front/components/PartitionCoord.tsx @@ -31,7 +31,9 @@ const PartitionCoord = ({ setPartitionData([base64data, a]); onPartitionReady(); }} - onEndReached={onEndReached} + onEndReached={() => { + console.log('osmd end reached'); + }} timestamp={timestamp} /> )} @@ -39,6 +41,9 @@ const PartitionCoord = ({ { + onEndReached(); + }} /> )} diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index c985daf..20e3781 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -28,7 +28,7 @@ const PartitionView = (props: PartitionViewProps) => { const [osmd, setOsmd] = useState(); const [soundPlayer, setSoundPlayer] = useState(); const audioContext = new SAC.AudioContext(); - const [wholeNoteLength, setWholeNoteLength] = useState(0); // Length of Whole note, in ms (?) + // const [wholeNoteLength, setWholeNoteLength] = useState(0); // Length of Whole note, in ms (?) const colorScheme = useColorScheme(); const dimensions = useWindowDimensions(); const OSMD_DIV_ID = 'osmd-div'; @@ -45,15 +45,15 @@ const PartitionView = (props: PartitionViewProps) => { autoResize: false, }; // Turns note.Length or timestamp in ms - const timestampToMs = (timestamp: Fraction) => { + const timestampToMs = (timestamp: Fraction, wholeNoteLength: number) => { return timestamp.RealValue * wholeNoteLength; }; - const getActualNoteLength = (note: Note) => { - let duration = timestampToMs(note.Length); + const getActualNoteLength = (note: Note, wholeNoteLength: number) => { + let duration = timestampToMs(note.Length, wholeNoteLength); if (note.NoteTie) { const firstNote = note.NoteTie.Notes.at(1); if (Object.is(note.NoteTie.StartNote, note) && firstNote) { - duration += timestampToMs(firstNote.Length); + duration += timestampToMs(firstNote.Length, wholeNoteLength); } else { duration = 0; } @@ -97,9 +97,38 @@ const PartitionView = (props: PartitionViewProps) => { _osmd.render(); _osmd.cursor.show(); // get the current cursor position + const bpm = _osmd.Sheet.HasBPMInfo ? _osmd.Sheet.getExpressionsStartTempoInBPM() : 60; + // setWholeNoteLength(Math.round((60 / bpm) * 4000)); + const wholeNoteLength = Math.round((60 / bpm) * 4000); const curPos = []; while (!_osmd.cursor.iterator.EndReached) { - curPos.push(_osmd.cursor.cursorElement.offsetLeft); + const notesToPlay = _osmd.cursor + .NotesUnderCursor() + .filter((note) => { + return note.isRest() == false && note.Pitch; + }) + .map((note) => { + return { + note: note, + duration: getActualNoteLength(note, wholeNoteLength), + }; + }); + const shortestNotes = _osmd!.cursor + .NotesUnderCursor() + .sort((n1, n2) => n1.Length.CompareTo(n2.Length)) + .at(0); + const ts = timestampToMs(shortestNotes?.getAbsoluteTimestamp() ?? new Fraction(-1), wholeNoteLength); + const sNL = timestampToMs(shortestNotes?.Length ?? new Fraction(-1), wholeNoteLength); + curPos.push({ + offset: _osmd.cursor.cursorElement.offsetLeft, + notes: notesToPlay, + shortedNotes: shortestNotes, + sNinfos: { + ts, + sNL, + isRest: shortestNotes?.isRest(), + } + }); _osmd.cursor.next(); } console.log('curPos', curPos); @@ -110,14 +139,14 @@ const PartitionView = (props: PartitionViewProps) => { console.log('current measure index', _osmd.cursor.iterator.CurrentMeasureIndex); const osmdCanvas = document.querySelector('#' + OSMD_DIV_ID + ' canvas'); // Ty https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL77C12-L77C63 - const bpm = _osmd.Sheet.HasBPMInfo ? _osmd.Sheet.getExpressionsStartTempoInBPM() : 60; - setWholeNoteLength(Math.round((60 / bpm) * 4000)); props.onPartitionReady( osmdCanvas.toDataURL(), curPos.map((pos) => { return { - x: pos, - timing: Math.floor(Math.random() * 600) + 100, + x: pos.offset, + timing: pos.sNinfos.sNL, + timestamp: pos.sNinfos.ts, + notes: pos.notes, }; }) ); diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 2cf2b74..dccc9b2 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -4,16 +4,16 @@ import * as React from 'react'; import { useEffect, useRef } from 'react'; import Phaser from 'phaser'; import useColorScheme from '../../hooks/colorScheme'; +import { PartitionContext } from '../../views/PlayView'; +import { on } from 'events'; -const b64data = - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAGKDAGaAAAFgUlEQVRYw7WXa2wUVRTH/20p7fZBW0p5iAplaUELCqEFlUCMYKwJKMYgaEwIUpQYNCIWRYgvQtTS6AeiKEqIQDBIAEFAEEm1DUVUoIqPVqhCC/IoammhC9vt/vywM7szu7NLLfHMl7n3nP/533vuPefMSHap8wNIoG57pxIYSErZDyCgB8qogTYUeKT+v2C+SlLanqA3v4EBwSdAasAI4CUUcA7wRsiBMbDIjQDQd4M0ogimtkrbMWSgAVzibUIouTIwfc4kJaVIkpT+PTxLiGplkHCo6Wq+uSOydlrYl3jD1xOSAQ5zdzcA1CJJK/ygOEk91kIhAMsQmeMDq9MRg7ojGExIINkrOAm8D4DHSg9QwiQApiDmeQzFWaDE2LUQ4DXjedimsAQaShgbqXj4NM4ISZpmVeTbdt6vGISrWtElfs76Fuig9+9hij7qFjbTs6GecEnxSdKa4DjbK0nFrzWFTI4yE/jVsvDsMaauP0JxX0ARviBgOg0A3GnZaVpO4N3llZRYYZrez8dhC/KRxrBVYSt37TPVgSh6GQN8FFxSQPLOqbsBSP3Wy2gLwJIRQcC91mPIOGyaTaTKARBxbllH7EtqZkJsgCRlvrTbF21JQiS3KN7pkFNH/BMOiJ+nq8vQTTNI8ChZnZabXJs7bxzf9zjAO/8kTLfNxynXwTpze6PlnG8/o16B+fzTfqCRgq1W62nXtYff1X1orjRiqzn2M8TgySlqAFjNuqDxFdIRKpWeag/Vo7zfJWXXei1ep3AaKDYDWypNvhLQnETk1+kWf/hC3iUrdGil0i3lAE8iRM/r1cpm3g0aNzAdgB8sACnvm8Bo0AuSLgLwKMeBQjosTEuCAJu0BSPgjsjo5WS0KyUM4Amqf6aO2cFRPUKU0cLAOhvgsgUAUM4u/PQz9lAGwC5/75eDgFlhAHuxKzNmynGtMwDtvMWOmIBahEjbYAACBWYCzY6A18kx3jI2WXolQJvRKMLqb6g5bbO0AnMPlbwSFdBrpwMA4FkOOwJ6mw08q/J8jChZnhtCR9HdfTo2IP6JyGQrfKbVGZBeETWdB723PwzQ/ZISr1IDchs9IcCtnasbWWMvCC3SNUhm2ophJ2raq9pyjycvjbju1yTje/604IzHllMXmH0256BGRBoPTipaO/jv4ktTPaNaC+rd02I5dqUsdTdUXiaGfOYbdKbPi2bnLkjLO3cszGJx+00fRLoemXlg1qkLVDOOxVyM6v4MM4kLlpQh6cObI22OIcatNh0nJj3X/8S2S3aTFhZwJ9/Z5raTZ71npZKUOWVxhPtDuBD5jZI7c+8DJ8/Giga7GcObzCMxMkFKJWlUYm6ztU0cYbihH7lccbv3cw9z+Tuq+yrG8gptNDGHBEcCSXGDjz7NDG6zWQyYLylhTyDSl1nK7VRYHLfxKmOpjCDcaH5dR5T1obPddekel9f95/BPs/ubwa+wB76acTzPRJ6hOWbYGnkEEb/wqlc96eu2CHAJ1cznLg5Fdf8lBQjxBqv87qbcx2MQJFd5HAjMyrSD0bxN6ABbWUiSQ9f4jQnNA7epjwNBSvWVGATmrX+M+xjjUGbLbHbtLLvU7w/dYf/0OrCV0ZTjjUEQ/WOxzJYh+QiRut5GkP6dz/jBms0kartA0ByWIekbbQQ9DnXYHG2gkIJOE7gc5jK32AgyavwOZ/A504N/AjG/px2entvtxf5Hoh5yByspZMN/JMjZbQ/RwRrf1W5RLZMY3Pkd7Ii8q5N71y9rae/CLbI/PY5qfKyk7ttvy13nj3aBIN6XslwZnW2TcX1KMlre8vk7RZB6QsVd7ccD3dUPXTwVhSCuI+lD80fi2iQhb1H+X5ssBEmn9KD+B7k54yut0XX/HfgvpUkmTvPggOsAAAAASUVORK5CYII='; - -const cursorB64 = - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAJYCAIAAABdEXdWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY0NDUxRDFFOTUwODExRTdCMUJEQjg0NTEzM0EzMTY2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjY0NDUxRDFGOTUwODExRTdCMUJEQjg0NTEzM0EzMTY2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjQ0NTFEMUM5NTA4MTFFN0IxQkRCODQ1MTMzQTMxNjYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjQ0NTFEMUQ5NTA4MTFFN0IxQkRCODQ1MTMzQTMxNjYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4+DXQ3AAAy2UlEQVR42qxd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'; +let globalTimestamp = 0; +let globalStatus: 'playing' | 'paused' | 'stopped' = 'playing'; const getPianoScene = ( partitionB64: string, cursorPositions: PianoCursorPosition[], + onEndReached: () => void, colorScheme: 'light' | 'dark' ) => { class PianoScene extends Phaser.Scene { @@ -30,63 +30,39 @@ const getPianoScene = ( this.cursor = this.add.rectangle(0, 0, 30, 350, 0x31ef8c, 0.5).setOrigin(0, 0); this.cameras.main.startFollow(this.cursor, true, 0.05, 0.05); - - this.cursorMoveNext(); - - // // const raster = this.add.image(0, 0, 'raster'); - // const group = this.add.group(); - - // group.createMultiple({ key: 'expo', repeat: 8 }); - - // let ci = 0; - // const colors = [ - // 0xef658c, 0xff9a52, 0xffdf00, 0x31ef8c, 0x21dfff, 0x31aade, 0x5275de, 0x9c55ad, - // 0xbd208c, - // ]; - - // const _this = this; - - // group.children.iterate((child) => { - // child.x = 100; - // child.y = 300; - // child.depth = 9 - ci; - - // child.tint = colors[ci]; - - // ci++; - - // _this.tweens.add({ - // targets: child, - // x: 900, - // yoyo: true, - // repeat: -1, - // ease: 'Sine.easeInOut', - // duration: 1500, - // delay: 100 * ci, - // }); - // }); }); } - cursorMoveNext(gameobject) { - if (this.cursorPositionsIdx >= cursorPositions.length) { - return; - } - this.cursorPositionsIdx++; - const cursorPosition = cursorPositions[this.cursorPositionsIdx]; - if (cursorPosition) { - this.tweens.add({ - targets: this.cursor, - x: cursorPosition.x, - duration: 200, - ease: 'Sine.easeInOut', - onComplete: () => { - // wait cursorPosition.timing - setTimeout(() => { - this.cursorMoveNext(); - }, cursorPosition.timing); - }, + override update() { + const currentTimestamp = globalTimestamp; + const status = globalStatus; + + if (status === 'playing') { + const transitionTime = 75; + const cP = cursorPositions.findLast((cP, idx) => { + if ( + cP.timestamp < currentTimestamp + transitionTime && + idx > this.cursorPositionsIdx + ) { + this.cursorPositionsIdx = idx; + return true; + } + return false; }); + if (cP) { + const tw = { + targets: this!.cursor, + x: cP!.x, + duration: transitionTime, + ease: 'Sine.easeInOut', + }; + if (this.cursorPositionsIdx === cursorPositions.length - 1) { + tw.onComplete = () => { + onEndReached(); + }; + } + this.tweens.add(tw); + } } } } @@ -98,25 +74,39 @@ export type PianoCursorPosition = { x: number; // timestamp in ms timing: number; + timestamp: number; + notes: any[]; }; -type PhaserCanvasProps = { +export type UpdateInfo = { + currentTimestamp: number; + status: 'playing' | 'paused' | 'stopped'; +}; + +export type PhaserCanvasProps = { partitionB64: string; cursorPositions: PianoCursorPosition[]; + onEndReached: () => void; }; -const PhaserCanvas = ({ partitionB64, cursorPositions }: PhaserCanvasProps) => { +const PhaserCanvas = ({ + partitionB64, + cursorPositions, + onEndReached, +}: PhaserCanvasProps) => { const colorScheme = useColorScheme(); + const { timestamp } = React.useContext(PartitionContext); const [game, setGame] = React.useState(null); + globalTimestamp = timestamp; useEffect(() => { - const pianoScene = getPianoScene(partitionB64, cursorPositions, colorScheme); + const pianoScene = getPianoScene(partitionB64, cursorPositions, onEndReached, colorScheme); const config = { type: Phaser.AUTO, parent: 'phaser-canvas', width: 1000, - height: 900, + height: 400, scene: pianoScene, scale: { mode: Phaser.Scale.FIT, diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 1920cf4..f85e044 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -21,7 +21,6 @@ import { transformQuery, useQuery } from '../Queries'; import API from '../API'; import LoadingComponent, { LoadingView } from '../components/Loading'; import Constants from 'expo-constants'; -import VirtualPiano from '../components/VirtualPiano/VirtualPiano'; import { strToKey, keyToStr, Note } from '../models/Piano'; import { useSelector } from 'react-redux'; import { RootState } from '../state/Store'; @@ -70,6 +69,14 @@ function parseMidiMessage(message: MIDIMessageEvent) { }; } +export const PartitionContext = React.createContext<{ + // Timestamp of the play session, in milisecond + timestamp: number; +}>({ + timestamp: 0, +}); + + const PlayView = ({ songId, type, route }: RouteProps) => { const accessToken = useSelector((state: RootState) => state.user.accessToken); const navigation = useNavigation(); @@ -79,7 +86,6 @@ const PlayView = ({ songId, type, route }: RouteProps) => { const webSocket = useRef(); const [paused, setPause] = useState(true); const stopwatch = useStopwatch(); - const [isVirtualPianoVisible, setVirtualPianoVisible] = useState(false); const [time, setTime] = useState(0); const [partitionRendered, setPartitionRendered] = useState(false); // Used to know when partitionview can render const [score, setScore] = useState(0); // Between 0 and 100 @@ -218,7 +224,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { useEffect(() => { ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.LANDSCAPE).catch(() => {}); const interval = setInterval(() => { - setTime(() => getElapsedTime()); // Countdown + setTime(() =>getElapsedTime()); // Countdown }, 1); return () => { @@ -253,6 +259,11 @@ const PlayView = ({ songId, type, route }: RouteProps) => { } return ( + ) => { /> */} { onEnd(); }} @@ -288,39 +300,6 @@ const PlayView = ({ songId, type, route }: RouteProps) => { {!partitionRendered && }
- {isVirtualPianoVisible && ( - - { - console.log('On note down', keyToStr(note)); - }} - onNoteUp={(note) => { - console.log('On note up', keyToStr(note)); - }} - showOctaveNumbers={true} - startNote={Note.C} - endNote={Note.B} - startOctave={2} - endOctave={5} - style={{ - width: '80%', - height: '100%', - }} - highlightedNotes={[ - { key: strToKey('D3') }, - { key: strToKey('A#'), bgColor: '#00FF00' }, - ]} - /> - - )} ) => { } }} /> - - } - onPress={() => { - setVirtualPianoVisible(!isVirtualPianoVisible); - }} - /> {time < 0 ? paused @@ -406,6 +371,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { + ); }; From 7c3289ccec59525081f084ac4419799a14498a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 25 Jul 2023 16:04:08 +0200 Subject: [PATCH 037/133] now phasercanvas makes sounds used the same stack as previously and ram issue spotted --- front/components/PartitionView.tsx | 6 +- .../PartitionVisualizer/PhaserCanvas.tsx | 66 +++-- front/views/PlayView.tsx | 242 +++++++++--------- 3 files changed, 178 insertions(+), 136 deletions(-) diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index 20e3781..765f9ae 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -27,7 +27,7 @@ type PartitionViewProps = { const PartitionView = (props: PartitionViewProps) => { const [osmd, setOsmd] = useState(); const [soundPlayer, setSoundPlayer] = useState(); - const audioContext = new SAC.AudioContext(); + // const audioContext = new SAC.AudioContext(); // const [wholeNoteLength, setWholeNoteLength] = useState(0); // Length of Whole note, in ms (?) const colorScheme = useColorScheme(); const dimensions = useWindowDimensions(); @@ -68,8 +68,8 @@ const PartitionView = (props: PartitionViewProps) => { .filter((note) => note.Pitch) // Pitch Can be null, avoiding them .forEach((note) => { // Put your hands together for https://github.com/jimutt/osmd-audio-player/blob/master/src/internals/noteHelpers.ts - const fixedKey = - note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments.at(0)?.fixedKey ?? 0; + // const fixedKey = + // note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments.at(0)?.fixedKey ?? 0; // const midiNumber = note.halfTone - fixedKey * 12; // // console.log('Expecting midi ' + midiNumber); // const duration = getActualNoteLength(note); diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index dccc9b2..51fbbf7 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -6,14 +6,31 @@ import Phaser from 'phaser'; import useColorScheme from '../../hooks/colorScheme'; import { PartitionContext } from '../../views/PlayView'; import { on } from 'events'; +import SoundFont from 'soundfont-player'; +import * as SAC from 'standardized-audio-context'; let globalTimestamp = 0; let globalStatus: 'playing' | 'paused' | 'stopped' = 'playing'; +const playNotes = (notes: any[], soundPlayer: SoundFont.Player, audioContext: SAC.AudioContext) => { + notes.forEach(({ note, duration }) => { + const fixedKey = + note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments.at(0)?.fixedKey ?? 0; + const midiNumber = note.halfTone - fixedKey * 12; + const gain = note.ParentVoiceEntry.ParentVoice.Volume; + soundPlayer!.play(midiNumber.toString(), audioContext.currentTime, { + duration, + gain, + }); + }); +}; + const getPianoScene = ( partitionB64: string, cursorPositions: PianoCursorPosition[], onEndReached: () => void, + soundPlayer: SoundFont.Player, + audioContext: SAC.AudioContext, colorScheme: 'light' | 'dark' ) => { class PianoScene extends Phaser.Scene { @@ -50,6 +67,7 @@ const getPianoScene = ( return false; }); if (cP) { + playNotes(cP.notes, soundPlayer, audioContext); const tw = { targets: this!.cursor, x: cP!.x, @@ -58,6 +76,7 @@ const getPianoScene = ( }; if (this.cursorPositionsIdx === cursorPositions.length - 1) { tw.onComplete = () => { + soundPlayer.stop(); onEndReached(); }; } @@ -89,32 +108,43 @@ export type PhaserCanvasProps = { onEndReached: () => void; }; -const PhaserCanvas = ({ - partitionB64, - cursorPositions, - onEndReached, -}: PhaserCanvasProps) => { +const PhaserCanvas = ({ partitionB64, cursorPositions, onEndReached }: PhaserCanvasProps) => { const colorScheme = useColorScheme(); + const audioContext = new SAC.AudioContext(); + const [soundPlayer, setSoundPlayer] = React.useState(); const { timestamp } = React.useContext(PartitionContext); const [game, setGame] = React.useState(null); globalTimestamp = timestamp; useEffect(() => { - const pianoScene = getPianoScene(partitionB64, cursorPositions, onEndReached, colorScheme); + Promise.resolve( + SoundFont.instrument(audioContext as unknown as AudioContext, 'electric_piano_1') + ).then((sound) => { + setSoundPlayer(sound); - const config = { - type: Phaser.AUTO, - parent: 'phaser-canvas', - width: 1000, - height: 400, - scene: pianoScene, - scale: { - mode: Phaser.Scale.FIT, - autoCenter: Phaser.Scale.CENTER_BOTH, - }, - }; + const pianoScene = getPianoScene( + partitionB64, + cursorPositions, + onEndReached, + sound, + audioContext, + colorScheme + ); - setGame(new Phaser.Game(config)); + const config = { + type: Phaser.AUTO, + parent: 'phaser-canvas', + width: 1000, + height: 400, + scene: pianoScene, + scale: { + mode: Phaser.Scale.FIT, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + }; + + setGame(new Phaser.Game(config)); + }); }, []); return
; diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index f85e044..63e7afc 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -76,7 +76,6 @@ export const PartitionContext = React.createContext<{ timestamp: 0, }); - const PlayView = ({ songId, type, route }: RouteProps) => { const accessToken = useSelector((state: RootState) => state.user.accessToken); const navigation = useNavigation(); @@ -100,13 +99,15 @@ const PlayView = ({ songId, type, route }: RouteProps) => { const onPause = () => { stopwatch.pause(); setPause(true); - webSocket.current?.send( - JSON.stringify({ - type: 'pause', - paused: true, - time: getElapsedTime(), - }) - ); + if (webSocket.current?.readyState == WebSocket.OPEN) { + webSocket.current?.send( + JSON.stringify({ + type: 'pause', + paused: true, + time: getElapsedTime(), + }) + ); + } }; const onResume = () => { if (stopwatch.isStarted()) { @@ -115,20 +116,26 @@ const PlayView = ({ songId, type, route }: RouteProps) => { stopwatch.start(); } setPause(false); - webSocket.current?.send( - JSON.stringify({ - type: 'pause', - paused: false, - time: getElapsedTime(), - }) - ); + if (webSocket.current?.readyState == WebSocket.OPEN) { + webSocket.current?.send( + JSON.stringify({ + type: 'pause', + paused: false, + time: getElapsedTime(), + }) + ); + } }; const onEnd = () => { - webSocket.current?.send( - JSON.stringify({ - type: 'end', - }) - ); + setTime(0); + stopwatch.stop(); + if (webSocket.current?.readyState == WebSocket.OPEN) { + webSocket.current?.send( + JSON.stringify({ + type: 'end', + }) + ); + } }; const onMIDISuccess = (access: MIDIAccess) => { @@ -224,7 +231,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { useEffect(() => { ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.LANDSCAPE).catch(() => {}); const interval = setInterval(() => { - setTime(() =>getElapsedTime()); // Countdown + setTime(() => getElapsedTime()); // Countdown }, 1); return () => { @@ -264,23 +271,23 @@ const PlayView = ({ songId, type, route }: RouteProps) => { timestamp: time, }} > - - - - - - - {/* + + + + + + {/* setPartitionRendered(true)} timestamp={Math.max(0, time)} @@ -288,89 +295,94 @@ const PlayView = ({ songId, type, route }: RouteProps) => { onEnd(); }} /> */} - { - onEnd(); - }} - onPartitionReady={() => setPartitionRendered(true)} - /> - {!partitionRendered && } - - - - - - Score: {score}% - - -
- {song.data.name} -
- { + onEnd(); }} + onPartitionReady={() => setPartitionRendered(true)} + /> + {!partitionRendered && } +
+ + + - {midiKeyboardFound && ( - <> - } - onPress={() => { - if (paused) { - onResume(); - } else { - onPause(); + + Score: {score}% + + +
+ {song.data.name} +
+ + {midiKeyboardFound && ( + <> + } - }} - /> - - {time < 0 - ? paused - ? '0:00' - : Math.floor((time % 60000) / 1000) + onPress={() => { + if (paused) { + onResume(); + } else { + onPause(); + } + }} + /> + + {time < 0 + ? paused + ? '0:00' + : Math.floor((time % 60000) / 1000) + .toFixed(0) + .toString() + : `${Math.floor(time / 60000)}:${Math.floor( + (time % 60000) / 1000 + ) .toFixed(0) .toString() - : `${Math.floor(time / 60000)}:${Math.floor( - (time % 60000) / 1000 - ) - .toFixed(0) - .toString() - .padStart(2, '0')}`} - - } - onPress={() => { - onEnd(); - }} - /> - - )} + .padStart(2, '0')}`} + + } + onPress={() => { + onEnd(); + }} + /> + + )} +
- -
+
); From 30fcacbec6eecf9d07eb14a033499d75ff5ac5d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Mon, 4 Sep 2023 15:23:52 +0200 Subject: [PATCH 038/133] Now using redux to not create sound player every time the phaser is also implicitely cached --- .../PartitionVisualizer/PhaserCanvas.tsx | 117 ++++++++----- front/models/SearchHistory.ts | 4 +- front/package.json | 2 + front/state/SoundPlayerSlice.ts | 19 +++ front/state/Store.ts | 6 +- front/views/PlayView.tsx | 156 +++++++++--------- front/yarn.lock | 42 +++++ 7 files changed, 220 insertions(+), 126 deletions(-) create mode 100644 front/state/SoundPlayerSlice.ts diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 51fbbf7..ea0e6b4 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -5,23 +5,28 @@ import { useEffect, useRef } from 'react'; import Phaser from 'phaser'; import useColorScheme from '../../hooks/colorScheme'; import { PartitionContext } from '../../views/PlayView'; -import { on } from 'events'; +import store, { RootState, useSelector } from '../../state/Store'; +import { setSoundPlayer as setSPStore } from '../../state/SoundPlayerSlice'; +import { useDispatch } from 'react-redux'; import SoundFont from 'soundfont-player'; import * as SAC from 'standardized-audio-context'; +import { SplendidGrandPiano, CacheStorage } from 'smplr'; +// import * as Tone from 'tone'; let globalTimestamp = 0; let globalStatus: 'playing' | 'paused' | 'stopped' = 'playing'; -const playNotes = (notes: any[], soundPlayer: SoundFont.Player, audioContext: SAC.AudioContext) => { +const isValidSoundPlayer = (soundPlayer: SplendidGrandPiano | undefined) => { + return soundPlayer && soundPlayer.loaded; +} + +const playNotes = (notes: any[], soundPlayer: SplendidGrandPiano) => { notes.forEach(({ note, duration }) => { const fixedKey = note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments.at(0)?.fixedKey ?? 0; const midiNumber = note.halfTone - fixedKey * 12; const gain = note.ParentVoiceEntry.ParentVoice.Volume; - soundPlayer!.play(midiNumber.toString(), audioContext.currentTime, { - duration, - gain, - }); + soundPlayer.start({ note: midiNumber, duration, velocity: gain * 127 }); }); }; @@ -29,8 +34,7 @@ const getPianoScene = ( partitionB64: string, cursorPositions: PianoCursorPosition[], onEndReached: () => void, - soundPlayer: SoundFont.Player, - audioContext: SAC.AudioContext, + soundPlayer: SplendidGrandPiano, colorScheme: 'light' | 'dark' ) => { class PianoScene extends Phaser.Scene { @@ -67,7 +71,7 @@ const getPianoScene = ( return false; }); if (cP) { - playNotes(cP.notes, soundPlayer, audioContext); + playNotes(cP.notes, soundPlayer); const tw = { targets: this!.cursor, x: cP!.x, @@ -76,7 +80,6 @@ const getPianoScene = ( }; if (this.cursorPositionsIdx === cursorPositions.length - 1) { tw.onComplete = () => { - soundPlayer.stop(); onEndReached(); }; } @@ -88,6 +91,21 @@ const getPianoScene = ( return PianoScene; }; +const getSoundPlayer = async (audioContext: AudioContext) => { + const soundPlayerStore = store.getState().soundPlayer.soundPlayer; + if (soundPlayerStore) { + console.log('csp', soundPlayerStore); + return soundPlayerStore as unknown as SplendidGrandPiano; + } + const soundPlayer = await new SplendidGrandPiano(audioContext, { + storage: new CacheStorage(), + }).loaded(); + console.log('sp', soundPlayer); + setSPStore(soundPlayer); + console.log('asp', soundPlayer); + return soundPlayer; +}; + export type PianoCursorPosition = { // offset in pixels x: number; @@ -110,43 +128,62 @@ export type PhaserCanvasProps = { const PhaserCanvas = ({ partitionB64, cursorPositions, onEndReached }: PhaserCanvasProps) => { const colorScheme = useColorScheme(); - const audioContext = new SAC.AudioContext(); - const [soundPlayer, setSoundPlayer] = React.useState(); + const dispatch = useDispatch(); + const soundPlayer = useSelector((state: RootState) => state.soundPlayer.soundPlayer); const { timestamp } = React.useContext(PartitionContext); const [game, setGame] = React.useState(null); globalTimestamp = timestamp; + useEffect(() => { - Promise.resolve( - SoundFont.instrument(audioContext as unknown as AudioContext, 'electric_piano_1') - ).then((sound) => { - setSoundPlayer(sound); - - const pianoScene = getPianoScene( - partitionB64, - cursorPositions, - onEndReached, - sound, - audioContext, - colorScheme - ); - - const config = { - type: Phaser.AUTO, - parent: 'phaser-canvas', - width: 1000, - height: 400, - scene: pianoScene, - scale: { - mode: Phaser.Scale.FIT, - autoCenter: Phaser.Scale.CENTER_BOTH, - }, - }; - - setGame(new Phaser.Game(config)); - }); + if (isValidSoundPlayer(soundPlayer)) { + console.log('cache soundplayer', soundPlayer); + return; + } + console.log('creating soundplayer'); + new SplendidGrandPiano(new AudioContext(), { + storage: new CacheStorage(), + }) + .loaded() + .then((sp) => { + console.log('sp', sp); + dispatch(setSPStore(sp)); + }); }, []); + useEffect(() => { + console.log('soundPlayer', soundPlayer); + if (!isValidSoundPlayer(soundPlayer) || !soundPlayer) return; + const pianoScene = getPianoScene( + partitionB64, + cursorPositions, + onEndReached, + soundPlayer, + colorScheme + ); + + const config = { + type: Phaser.AUTO, + parent: 'phaser-canvas', + width: 1000, + height: 400, + scene: pianoScene, + scale: { + mode: Phaser.Scale.FIT, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + }; + + setGame(new Phaser.Game(config)); + return () => { + console.log('destroying phaser game sp'); + if (game) { + // currently the condition is always false + game.destroy(true); + } + } + }, [soundPlayer]); + return
; }; diff --git a/front/models/SearchHistory.ts b/front/models/SearchHistory.ts index 05c433b..a7a995c 100644 --- a/front/models/SearchHistory.ts +++ b/front/models/SearchHistory.ts @@ -2,7 +2,7 @@ import Model, { ModelValidator } from './Model'; import * as yup from 'yup'; import ResponseHandler from './ResponseHandler'; -export const SearchType = ['song', 'artist', 'album'] as const; +export const SearchType = ['song', 'artist', 'album', 'genre'] as const; export type SearchType = (typeof SearchType)[number]; const SearchHistoryValidator = yup @@ -27,7 +27,7 @@ export const SearchHistoryHandler: ResponseHandler< interface SearchHistory extends Model { query: string; - type: 'song' | 'artist' | 'album' | 'genre'; + type: SearchType; userId: number; timestamp: Date; } diff --git a/front/package.json b/front/package.json index 380f499..de6499c 100644 --- a/front/package.json +++ b/front/package.json @@ -69,8 +69,10 @@ "react-timer-hook": "^3.0.5", "react-use-precision-timer": "^3.3.1", "redux-persist": "^6.0.0", + "smplr": "^0.6.1", "soundfont-player": "^0.12.0", "standardized-audio-context": "^25.3.51", + "tone": "^14.7.77", "type-fest": "^3.6.0", "yup": "^1.2.0" }, diff --git a/front/state/SoundPlayerSlice.ts b/front/state/SoundPlayerSlice.ts new file mode 100644 index 0000000..c45fc9f --- /dev/null +++ b/front/state/SoundPlayerSlice.ts @@ -0,0 +1,19 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { SplendidGrandPiano } from 'smplr'; + +export const soundPlayerSlice = createSlice({ + name: 'soundPlayer', + initialState: { + soundPlayer: undefined as SplendidGrandPiano | undefined, + }, + reducers: { + setSoundPlayer: (state, action: PayloadAction) => { + state.soundPlayer = action.payload; + }, + unsetSoundPlayer: (state) => { + state.soundPlayer = undefined; + }, + }, +}); +export const { setSoundPlayer, unsetSoundPlayer } = soundPlayerSlice.actions; +export default soundPlayerSlice.reducer; diff --git a/front/state/Store.ts b/front/state/Store.ts index a113422..853871b 100644 --- a/front/state/Store.ts +++ b/front/state/Store.ts @@ -1,5 +1,6 @@ import userReducer from '../state/UserSlice'; -import settingsReduder from './SettingsSlice'; +import settingsReducer from './SettingsSlice'; +import SoundPlayerSliceReducer from './SoundPlayerSlice'; import { StateFromReducersMapObject, configureStore } from '@reduxjs/toolkit'; import languageReducer from './LanguageSlice'; import { @@ -28,7 +29,8 @@ const persistConfig = { const reducers = { user: userReducer, language: languageReducer, - settings: settingsReduder, + settings: settingsReducer, + soundPlayer: SoundPlayerSliceReducer, }; type State = StateFromReducersMapObject; diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 63e7afc..d54890e 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -99,15 +99,13 @@ const PlayView = ({ songId, type, route }: RouteProps) => { const onPause = () => { stopwatch.pause(); setPause(true); - if (webSocket.current?.readyState == WebSocket.OPEN) { - webSocket.current?.send( - JSON.stringify({ - type: 'pause', - paused: true, - time: getElapsedTime(), - }) - ); - } + webSocket.current?.send( + JSON.stringify({ + type: 'pause', + paused: true, + time: getElapsedTime(), + }) + ); }; const onResume = () => { if (stopwatch.isStarted()) { @@ -116,26 +114,20 @@ const PlayView = ({ songId, type, route }: RouteProps) => { stopwatch.start(); } setPause(false); - if (webSocket.current?.readyState == WebSocket.OPEN) { - webSocket.current?.send( - JSON.stringify({ - type: 'pause', - paused: false, - time: getElapsedTime(), - }) - ); - } + webSocket.current?.send( + JSON.stringify({ + type: 'pause', + paused: false, + time: getElapsedTime(), + }) + ); }; const onEnd = () => { - setTime(0); - stopwatch.stop(); - if (webSocket.current?.readyState == WebSocket.OPEN) { - webSocket.current?.send( - JSON.stringify({ - type: 'end', - }) - ); - } + // webSocket.current?.send( + // JSON.stringify({ + // type: 'end', + // }) + // ); }; const onMIDISuccess = (access: MIDIAccess) => { @@ -147,63 +139,63 @@ const PlayView = ({ songId, type, route }: RouteProps) => { } setMidiKeyboardFound(true); let inputIndex = 0; - webSocket.current = new WebSocket(scoroBaseApiUrl); - webSocket.current.onopen = () => { - webSocket.current!.send( - JSON.stringify({ - type: 'start', - id: song.data!.id, - mode: type, - bearer: accessToken, - }) - ); - }; - webSocket.current.onmessage = (message) => { - try { - const data = JSON.parse(message.data); - if (data.type == 'end') { - navigation.navigate('Score', { songId: song.data!.id, ...data }); - return; - } - const points = data.info.score; - const maxPoints = data.info.max_score || 1; + //webSocket.current = new WebSocket(scoroBaseApiUrl); + // webSocket.current.onopen = () => { + // webSocket.current!.send( + // JSON.stringify({ + // type: 'start', + // id: song.data!.id, + // mode: type, + // bearer: accessToken, + // }) + // ); + // }; + // webSocket.current.onmessage = (message) => { + // try { + // const data = JSON.parse(message.data); + // if (data.type == 'end') { + // navigation.navigate('Score', { songId: song.data!.id, ...data }); + // return; + // } + // const points = data.info.score; + // const maxPoints = data.info.max_score || 1; - setScore(Math.floor((Math.max(points, 0) * 100) / maxPoints)); + // setScore(Math.floor((Math.max(points, 0) * 100) / maxPoints)); - let formattedMessage = ''; - let messageColor: ColorSchemeType | undefined; + // let formattedMessage = ''; + // let messageColor: ColorSchemeType | undefined; - if (data.type == 'miss') { - formattedMessage = translate('missed'); - messageColor = 'black'; - } else if (data.type == 'timing' || data.type == 'duration') { - formattedMessage = translate(data[data.type]); - switch (data[data.type]) { - case 'perfect': - messageColor = 'green'; - break; - case 'great': - messageColor = 'blue'; - break; - case 'short': - case 'long': - case 'good': - messageColor = 'lightBlue'; - break; - case 'too short': - case 'too long': - case 'wrong': - messageColor = 'trueGray'; - break; - default: - break; - } - } - setLastScoreMessage({ content: formattedMessage, color: messageColor }); - } catch (e) { - console.error(e); - } - }; + // if (data.type == 'miss') { + // formattedMessage = translate('missed'); + // messageColor = 'black'; + // } else if (data.type == 'timing' || data.type == 'duration') { + // formattedMessage = translate(data[data.type]); + // switch (data[data.type]) { + // case 'perfect': + // messageColor = 'green'; + // break; + // case 'great': + // messageColor = 'blue'; + // break; + // case 'short': + // case 'long': + // case 'good': + // messageColor = 'lightBlue'; + // break; + // case 'too short': + // case 'too long': + // case 'wrong': + // messageColor = 'trueGray'; + // break; + // default: + // break; + // } + // } + // setLastScoreMessage({ content: formattedMessage, color: messageColor }); + // } catch (e) { + // console.error(e); + // } + // }; inputs.forEach((input) => { if (inputIndex != 0) { return; @@ -232,7 +224,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.LANDSCAPE).catch(() => {}); const interval = setInterval(() => { setTime(() => getElapsedTime()); // Countdown - }, 1); + }, 10); return () => { ScreenOrientation.unlockAsync().catch(() => {}); diff --git a/front/yarn.lock b/front/yarn.lock index ae32b09..e95f432 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -1246,6 +1246,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/runtime@~7.5.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" @@ -6027,6 +6034,14 @@ automation-events@^6.0.4: "@babel/runtime" "^7.22.3" tslib "^2.5.3" +automation-events@^6.0.8: + version "6.0.8" + resolved "https://registry.yarnpkg.com/automation-events/-/automation-events-6.0.8.tgz#52929699924cd791eaefc51916ffc033c4d0f42f" + integrity sha512-OXI9rEbA0LwWr+Tmvka4EHtVHBIVw8KD2NM7fIGjd4dyGnuiM3ULZL+Jlo4aKXZDY98raT4R4rEDOHAbz8Jm9A== + dependencies: + "@babel/runtime" "^7.22.6" + tslib "^2.6.1" + autoprefixer@^9.8.6: version "9.8.8" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" @@ -16987,6 +17002,11 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +smplr@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/smplr/-/smplr-0.6.1.tgz#f24cbe7ce3ad318bb6ce226d9aa933d1cab7dc56" + integrity sha512-040QDtYRavqIje9346zWBYDc3oN/ARSZmheOGELAujQVYr3p4e8nrOsojH3VQsE0zcrAhjJ4MDeg74qIHQCC7A== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -17266,6 +17286,15 @@ stacktrace-parser@^0.1.3: dependencies: type-fest "^0.7.1" +standardized-audio-context@^25.1.8: + version "25.3.55" + resolved "https://registry.yarnpkg.com/standardized-audio-context/-/standardized-audio-context-25.3.55.tgz#4d87ea6052de80ecf5abf56eb71ecd71f7e52e4e" + integrity sha512-ym9g7FZ5S1FykbQ1///ktTJgk+zTtGF1hGR/BFRQjRkN6G2Xy9GbL5kOcM7DlzflV2yJtqVwfU2gL042b1oHwg== + dependencies: + "@babel/runtime" "^7.22.6" + automation-events "^6.0.8" + tslib "^2.6.1" + standardized-audio-context@^25.3.51: version "25.3.51" resolved "https://registry.yarnpkg.com/standardized-audio-context/-/standardized-audio-context-25.3.51.tgz#0eb54629355d1ddf2070897e586eaa8dfec8c0f5" @@ -18038,6 +18067,14 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +tone@^14.7.77: + version "14.7.77" + resolved "https://registry.yarnpkg.com/tone/-/tone-14.7.77.tgz#12a2a9f033952ccdb552275a6384ca5d36d4b5ed" + integrity sha512-tCfK73IkLHyzoKUvGq47gyDyxiKLFvKiVCOobynGgBB9Dl0NkxTM2p+eRJXyCYrjJwy9Y0XCMqD3uOYsYt2Fdg== + dependencies: + standardized-audio-context "^25.1.8" + tslib "^2.0.1" + toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" @@ -18125,6 +18162,11 @@ tslib@^2.5.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== +tslib@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" From 2ca3fcb81af8b92de6e3b716a7310a770cad3956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Mon, 4 Sep 2023 17:40:02 +0200 Subject: [PATCH 039/133] reactivating websocket connection but error view appear when it shouldn't --- .../PartitionVisualizer/PhaserCanvas.tsx | 18 --- front/views/PlayView.tsx | 132 ++++++++++-------- 2 files changed, 73 insertions(+), 77 deletions(-) diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index ea0e6b4..221b6d0 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -8,10 +8,7 @@ import { PartitionContext } from '../../views/PlayView'; import store, { RootState, useSelector } from '../../state/Store'; import { setSoundPlayer as setSPStore } from '../../state/SoundPlayerSlice'; import { useDispatch } from 'react-redux'; -import SoundFont from 'soundfont-player'; -import * as SAC from 'standardized-audio-context'; import { SplendidGrandPiano, CacheStorage } from 'smplr'; -// import * as Tone from 'tone'; let globalTimestamp = 0; let globalStatus: 'playing' | 'paused' | 'stopped' = 'playing'; @@ -91,21 +88,6 @@ const getPianoScene = ( return PianoScene; }; -const getSoundPlayer = async (audioContext: AudioContext) => { - const soundPlayerStore = store.getState().soundPlayer.soundPlayer; - if (soundPlayerStore) { - console.log('csp', soundPlayerStore); - return soundPlayerStore as unknown as SplendidGrandPiano; - } - const soundPlayer = await new SplendidGrandPiano(audioContext, { - storage: new CacheStorage(), - }).loaded(); - console.log('sp', soundPlayer); - setSPStore(soundPlayer); - console.log('asp', soundPlayer); - return soundPlayer; -}; - export type PianoCursorPosition = { // offset in pixels x: number; diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index d54890e..50bde7a 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -88,6 +88,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { const [time, setTime] = useState(0); const [partitionRendered, setPartitionRendered] = useState(false); // Used to know when partitionview can render const [score, setScore] = useState(0); // Between 0 and 100 + // const [endMsgReceived, setEndMsgReceived] = useState(false); // Used to know if to go to error screen when websocket closes const fadeAnim = useRef(new Animated.Value(0)).current; const musixml = useQuery( transformQuery(API.getSongMusicXML(songId), (data) => new TextDecoder().decode(data)), @@ -123,15 +124,19 @@ const PlayView = ({ songId, type, route }: RouteProps) => { ); }; const onEnd = () => { - // webSocket.current?.send( - // JSON.stringify({ - // type: 'end', - // }) - // ); + if (webSocket.current?.readyState != WebSocket.OPEN) { + navigation.navigate('Error'); + } + webSocket.current?.send( + JSON.stringify({ + type: 'end', + }) + ); }; const onMIDISuccess = (access: MIDIAccess) => { const inputs = access.inputs; + let endMsgReceived = false; // Used to know if to go to error screen when websocket closes if (inputs.size < 2) { toast.show({ description: 'No MIDI Keyboard found' }); @@ -139,63 +144,72 @@ const PlayView = ({ songId, type, route }: RouteProps) => { } setMidiKeyboardFound(true); let inputIndex = 0; - //webSocket.current = new WebSocket(scoroBaseApiUrl); - // webSocket.current.onopen = () => { - // webSocket.current!.send( - // JSON.stringify({ - // type: 'start', - // id: song.data!.id, - // mode: type, - // bearer: accessToken, - // }) - // ); - // }; - // webSocket.current.onmessage = (message) => { - // try { - // const data = JSON.parse(message.data); - // if (data.type == 'end') { - // navigation.navigate('Score', { songId: song.data!.id, ...data }); - // return; - // } - // const points = data.info.score; - // const maxPoints = data.info.max_score || 1; + webSocket.current = new WebSocket(scoroBaseApiUrl); + webSocket.current.onopen = () => { + webSocket.current!.send( + JSON.stringify({ + type: 'start', + id: song.data!.id, + mode: type, + bearer: accessToken, + }) + ); + }; + webSocket.current.onclose = () => { + console.log('Websocket closed', endMsgReceived); + if (!endMsgReceived) { + navigation.replace('Error'); + return; + } + }; + webSocket.current.onmessage = (message) => { + try { + const data = JSON.parse(message.data); + if (data.type == 'end') { + endMsgReceived = true; + webSocket.current?.close(); + navigation.replace('Score', { songId: song.data!.id, ...data }); + return; + } + const points = data.info.score; + const maxPoints = data.info.max_score || 1; - // setScore(Math.floor((Math.max(points, 0) * 100) / maxPoints)); + setScore(Math.floor((Math.max(points, 0) * 100) / maxPoints)); - // let formattedMessage = ''; - // let messageColor: ColorSchemeType | undefined; + let formattedMessage = ''; + let messageColor: ColorSchemeType | undefined; - // if (data.type == 'miss') { - // formattedMessage = translate('missed'); - // messageColor = 'black'; - // } else if (data.type == 'timing' || data.type == 'duration') { - // formattedMessage = translate(data[data.type]); - // switch (data[data.type]) { - // case 'perfect': - // messageColor = 'green'; - // break; - // case 'great': - // messageColor = 'blue'; - // break; - // case 'short': - // case 'long': - // case 'good': - // messageColor = 'lightBlue'; - // break; - // case 'too short': - // case 'too long': - // case 'wrong': - // messageColor = 'trueGray'; - // break; - // default: - // break; - // } - // } - // setLastScoreMessage({ content: formattedMessage, color: messageColor }); - // } catch (e) { - // console.error(e); - // } - // }; + if (data.type == 'miss') { + formattedMessage = translate('missed'); + messageColor = 'black'; + } else if (data.type == 'timing' || data.type == 'duration') { + formattedMessage = translate(data[data.type]); + switch (data[data.type]) { + case 'perfect': + messageColor = 'green'; + break; + case 'great': + messageColor = 'blue'; + break; + case 'short': + case 'long': + case 'good': + messageColor = 'lightBlue'; + break; + case 'too short': + case 'too long': + case 'wrong': + messageColor = 'trueGray'; + break; + default: + break; + } + } + setLastScoreMessage({ content: formattedMessage, color: messageColor }); + } catch (e) { + console.error(e); + } + }; inputs.forEach((input) => { if (inputIndex != 0) { return; From 40581f4a459333eb33004e77db9245843086f54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 11:14:37 +0200 Subject: [PATCH 040/133] Removed the timestamp partition context to reuse normal props clean up console logs and now displaying a toast to tell is the scorometer crashed --- front/components/PartitionCoord.tsx | 7 ++++ .../PartitionVisualizer/PhaserCanvas.tsx | 19 ++++----- front/views/PlayView.tsx | 39 +++++++------------ 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/front/components/PartitionCoord.tsx b/front/components/PartitionCoord.tsx index 1ad6a28..210382e 100644 --- a/front/components/PartitionCoord.tsx +++ b/front/components/PartitionCoord.tsx @@ -8,6 +8,8 @@ type PartitionCoordProps = { file: string; onPartitionReady: () => void; onEndReached: () => void; + onResume: () => void; + onPause: () => void; // Timestamp of the play session, in milisecond timestamp: number; }; @@ -16,6 +18,8 @@ const PartitionCoord = ({ file, onPartitionReady, onEndReached, + onPause, + onResume, timestamp, }: PartitionCoordProps) => { const [partitionData, setPartitionData] = React.useState< @@ -41,6 +45,9 @@ const PartitionCoord = ({ { onEndReached(); }} diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 221b6d0..e6725b9 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -1,11 +1,10 @@ // create a simple phaser effect with a canvas that can be easily imported as a react component import * as React from 'react'; -import { useEffect, useRef } from 'react'; +import { useEffect } from 'react'; import Phaser from 'phaser'; import useColorScheme from '../../hooks/colorScheme'; -import { PartitionContext } from '../../views/PlayView'; -import store, { RootState, useSelector } from '../../state/Store'; +import { RootState, useSelector } from '../../state/Store'; import { setSoundPlayer as setSPStore } from '../../state/SoundPlayerSlice'; import { useDispatch } from 'react-redux'; import { SplendidGrandPiano, CacheStorage } from 'smplr'; @@ -106,35 +105,34 @@ export type PhaserCanvasProps = { partitionB64: string; cursorPositions: PianoCursorPosition[]; onEndReached: () => void; + onPause: () => void; + onResume: () => void; + // Timestamp of the play session, in milisecond + timestamp: number; }; -const PhaserCanvas = ({ partitionB64, cursorPositions, onEndReached }: PhaserCanvasProps) => { +const PhaserCanvas = ({ partitionB64, cursorPositions, onEndReached, timestamp }: PhaserCanvasProps) => { const colorScheme = useColorScheme(); const dispatch = useDispatch(); const soundPlayer = useSelector((state: RootState) => state.soundPlayer.soundPlayer); - const { timestamp } = React.useContext(PartitionContext); const [game, setGame] = React.useState(null); globalTimestamp = timestamp; useEffect(() => { if (isValidSoundPlayer(soundPlayer)) { - console.log('cache soundplayer', soundPlayer); return; } - console.log('creating soundplayer'); new SplendidGrandPiano(new AudioContext(), { storage: new CacheStorage(), }) .loaded() .then((sp) => { - console.log('sp', sp); dispatch(setSPStore(sp)); }); }, []); useEffect(() => { - console.log('soundPlayer', soundPlayer); if (!isValidSoundPlayer(soundPlayer) || !soundPlayer) return; const pianoScene = getPianoScene( partitionB64, @@ -152,13 +150,12 @@ const PhaserCanvas = ({ partitionB64, cursorPositions, onEndReached }: PhaserCan scene: pianoScene, scale: { mode: Phaser.Scale.FIT, - autoCenter: Phaser.Scale.CENTER_BOTH, + autoCenter: Phaser.Scale.CENTER_HORIZONTALLY, }, }; setGame(new Phaser.Game(config)); return () => { - console.log('destroying phaser game sp'); if (game) { // currently the condition is always false game.destroy(true); diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 50bde7a..9dc0c9d 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -15,19 +15,17 @@ import { HStack, } from 'native-base'; import IconButton from '../components/IconButton'; -import { Ionicons, MaterialCommunityIcons } from '@expo/vector-icons'; +import { Ionicons } from '@expo/vector-icons'; import { RouteProps, useNavigation } from '../Navigation'; import { transformQuery, useQuery } from '../Queries'; import API from '../API'; import LoadingComponent, { LoadingView } from '../components/Loading'; import Constants from 'expo-constants'; -import { strToKey, keyToStr, Note } from '../models/Piano'; import { useSelector } from 'react-redux'; import { RootState } from '../state/Store'; import { translate } from '../i18n/i18n'; import { ColorSchemeType } from 'native-base/lib/typescript/components/types'; import { useStopwatch } from 'react-use-precision-timer'; -import PartitionView from '../components/PartitionView'; import PartitionCoord from '../components/PartitionCoord'; import TextButton from '../components/TextButton'; import { MIDIAccess, MIDIMessageEvent, requestMIDIAccess } from '@motiz88/react-native-midi'; @@ -124,8 +122,11 @@ const PlayView = ({ songId, type, route }: RouteProps) => { ); }; const onEnd = () => { + stopwatch.stop(); if (webSocket.current?.readyState != WebSocket.OPEN) { - navigation.navigate('Error'); + console.warn('onEnd: Websocket not open'); + navigation.navigate('Home'); + return; } webSocket.current?.send( JSON.stringify({ @@ -158,7 +159,10 @@ const PlayView = ({ songId, type, route }: RouteProps) => { webSocket.current.onclose = () => { console.log('Websocket closed', endMsgReceived); if (!endMsgReceived) { - navigation.replace('Error'); + toast.show({ description: 'Connection lost with Scorometer' }); + // the special case when the front send the end message succesfully + // but the websocket is closed before the end message is received + // is not handled return; } }; @@ -168,7 +172,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { if (data.type == 'end') { endMsgReceived = true; webSocket.current?.close(); - navigation.replace('Score', { songId: song.data!.id, ...data }); + navigation.navigate('Score', { songId: song.data!.id, ...data }); return; } const points = data.info.score; @@ -272,11 +276,6 @@ const PlayView = ({ songId, type, route }: RouteProps) => { } return ( - ) => { - {/* setPartitionRendered(true)} - timestamp={Math.max(0, time)} - onEndReached={() => { - onEnd(); - }} - /> */} { - onEnd(); - }} + timestamp={time} + onEndReached={onEnd} + onPause={onPause} + onResume={onResume} onPartitionReady={() => setPartitionRendered(true)} /> {!partitionRendered && } @@ -389,7 +379,6 @@ const PlayView = ({ songId, type, route }: RouteProps) => {
- ); }; From 66d792715ee28c4d51909055415e47120ed2b938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 11:15:13 +0200 Subject: [PATCH 041/133] Removed Parition context declaration/init --- front/views/PlayView.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 9dc0c9d..eac110a 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -67,13 +67,6 @@ function parseMidiMessage(message: MIDIMessageEvent) { }; } -export const PartitionContext = React.createContext<{ - // Timestamp of the play session, in milisecond - timestamp: number; -}>({ - timestamp: 0, -}); - const PlayView = ({ songId, type, route }: RouteProps) => { const accessToken = useSelector((state: RootState) => state.user.accessToken); const navigation = useNavigation(); From 7d33f85cbc049ee346a4372c1b931bdff9d38e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 11:24:43 +0200 Subject: [PATCH 042/133] Cleanup parition view --- front/components/PartitionView.tsx | 94 ++---------------------------- 1 file changed, 5 insertions(+), 89 deletions(-) diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index 765f9ae..2a5b626 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -1,7 +1,7 @@ /* eslint-disable no-mixed-spaces-and-tabs */ // Inspired from OSMD example project // https://github.com/opensheetmusicdisplay/react-opensheetmusicdisplay/blob/master/src/lib/OpenSheetMusicDisplay.jsx -import React, { useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import { CursorType, Fraction, @@ -10,9 +10,6 @@ import { Note, } from 'opensheetmusicdisplay'; import useColorScheme from '../hooks/colorScheme'; -import { useWindowDimensions } from 'react-native'; -import SoundFont from 'soundfont-player'; -import * as SAC from 'standardized-audio-context'; import { PianoCursorPosition } from './PartitionVisualizer/PhaserCanvas'; type PartitionViewProps = { @@ -25,12 +22,7 @@ type PartitionViewProps = { }; const PartitionView = (props: PartitionViewProps) => { - const [osmd, setOsmd] = useState(); - const [soundPlayer, setSoundPlayer] = useState(); - // const audioContext = new SAC.AudioContext(); - // const [wholeNoteLength, setWholeNoteLength] = useState(0); // Length of Whole note, in ms (?) const colorScheme = useColorScheme(); - const dimensions = useWindowDimensions(); const OSMD_DIV_ID = 'osmd-div'; const options: IOSMDOptions = { darkMode: colorScheme == 'dark', @@ -61,32 +53,6 @@ const PartitionView = (props: PartitionViewProps) => { return duration; }; - const playNotesUnderCursor = () => { - osmd!.cursor - .NotesUnderCursor() - .filter((note) => note.isRest() == false) - .filter((note) => note.Pitch) // Pitch Can be null, avoiding them - .forEach((note) => { - // Put your hands together for https://github.com/jimutt/osmd-audio-player/blob/master/src/internals/noteHelpers.ts - // const fixedKey = - // note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments.at(0)?.fixedKey ?? 0; - // const midiNumber = note.halfTone - fixedKey * 12; - // // console.log('Expecting midi ' + midiNumber); - // const duration = getActualNoteLength(note); - // const gain = note.ParentVoiceEntry.ParentVoice.Volume; - // soundPlayer!.play(midiNumber.toString(), audioContext.currentTime, { - // duration, - // gain, - // }); - }); - }; - const getShortedNoteUnderCursor = () => { - return osmd!.cursor - .NotesUnderCursor() - .sort((n1, n2) => n1.Length.CompareTo(n2.Length)) - .at(0); - }; - useEffect(() => { const _osmd = new OSMD(OSMD_DIV_ID, options); Promise.all([ @@ -131,12 +97,12 @@ const PartitionView = (props: PartitionViewProps) => { }); _osmd.cursor.next(); } - console.log('curPos', curPos); + // console.log('curPos', curPos); _osmd.cursor.reset(); _osmd.cursor.hide(); - console.log('timestamp cursor', _osmd.cursor.iterator.CurrentSourceTimestamp); - console.log('timestamp cursor', _osmd.cursor.iterator.CurrentVoiceEntries); - console.log('current measure index', _osmd.cursor.iterator.CurrentMeasureIndex); + // console.log('timestamp cursor', _osmd.cursor.iterator.CurrentSourceTimestamp); + // console.log('timestamp cursor', _osmd.cursor.iterator.CurrentVoiceEntries); + // console.log('current measure index', _osmd.cursor.iterator.CurrentMeasureIndex); const osmdCanvas = document.querySelector('#' + OSMD_DIV_ID + ' canvas'); // Ty https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL77C12-L77C63 props.onPartitionReady( @@ -152,58 +118,8 @@ const PartitionView = (props: PartitionViewProps) => { ); // Do not show cursor before actuall start }); - setOsmd(_osmd); }, []); - // Re-render manually (otherwise done by 'autoResize' option), to fix disappearing cursor - useEffect(() => { - if (osmd && osmd.IsReadyToRender()) { - osmd.render(); - if (!osmd.cursor.hidden) { - osmd.cursor.show(); - } - } - }, [dimensions]); - - useEffect(() => { - if (!osmd) { - return; - } - if (props.timestamp > 0 && osmd.cursor.hidden && !osmd.cursor.iterator.EndReached) { - osmd.cursor.show(); - playNotesUnderCursor(); - return; - } - let previousCursorPosition = -1; - let currentCursorPosition = osmd.cursor.cursorElement.offsetLeft; - let shortestNote = getShortedNoteUnderCursor(); - while ( - !osmd.cursor.iterator.EndReached && - (shortestNote?.isRest - ? timestampToMs(shortestNote?.getAbsoluteTimestamp() ?? new Fraction(-1)) + - timestampToMs(shortestNote?.Length ?? new Fraction(-1)) < - props.timestamp - : timestampToMs(shortestNote?.getAbsoluteTimestamp() ?? new Fraction(-1)) < - props.timestamp) - ) { - previousCursorPosition = currentCursorPosition; - osmd.cursor.next(); - if (osmd.cursor.iterator.EndReached) { - osmd.cursor.hide(); // Lousy fix for https://github.com/opensheetmusicdisplay/opensheetmusicdisplay/issues/1338 - // soundPlayer.stop(); - props.onEndReached(); - } else { - // Shamelessly stolen from https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL223C7-L224C1 - playNotesUnderCursor(); - currentCursorPosition = osmd.cursor.cursorElement.offsetLeft; - document - .getElementById(OSMD_DIV_ID) - ?.scrollBy(currentCursorPosition - previousCursorPosition, 0); - shortestNote = getShortedNoteUnderCursor(); - } - } - }, [props.timestamp]); - return
; }; From 101ea8498b177c662954538876c5686ebfae7348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 11:31:03 +0200 Subject: [PATCH 043/133] removing old code commented and unused dependancies --- front/components/PartitionView.tsx | 6 +- front/package.json | 3 - front/yarn.lock | 109 ----------------------------- 3 files changed, 1 insertion(+), 117 deletions(-) diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index 2a5b626..2312d78 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -56,15 +56,11 @@ const PartitionView = (props: PartitionViewProps) => { useEffect(() => { const _osmd = new OSMD(OSMD_DIV_ID, options); Promise.all([ - // SoundFont.instrument(audioContext as unknown as AudioContext, 'electric_piano_1'), _osmd.load(props.file), - ]).then(([player]) => { - // setSoundPlayer(player); + ]).then(() => { _osmd.render(); _osmd.cursor.show(); - // get the current cursor position const bpm = _osmd.Sheet.HasBPMInfo ? _osmd.Sheet.getExpressionsStartTempoInBPM() : 60; - // setWholeNoteLength(Math.round((60 / bpm) * 4000)); const wholeNoteLength = Math.round((60 / bpm) * 4000); const curPos = []; while (!_osmd.cursor.iterator.EndReached) { diff --git a/front/package.json b/front/package.json index de6499c..4e35b22 100644 --- a/front/package.json +++ b/front/package.json @@ -70,9 +70,6 @@ "react-use-precision-timer": "^3.3.1", "redux-persist": "^6.0.0", "smplr": "^0.6.1", - "soundfont-player": "^0.12.0", - "standardized-audio-context": "^25.3.51", - "tone": "^14.7.77", "type-fest": "^3.6.0", "yup": "^1.2.0" }, diff --git a/front/yarn.lock b/front/yarn.lock index e95f432..d7b9acf 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -1239,20 +1239,6 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/runtime@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== - dependencies: - regenerator-runtime "^0.13.11" - "@babel/runtime@~7.5.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" @@ -5563,11 +5549,6 @@ address@^1.0.1: resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== -adsr@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/adsr/-/adsr-1.0.1.tgz#a7bc08e5ef8a71e6364abc96fce7df1c44881cc3" - integrity sha512-thr9LK4jxApOzBA33IWOA83bXJFbyfbeozpHXyrMQOIhUni198uRxXqDhobW0S/51iokqty2Yz2WbLZbE6tntQ== - agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -6021,27 +6002,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -audio-loader@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/audio-loader/-/audio-loader-0.5.0.tgz#9c125d1b25c33cd9626084054d9f6b7f31ddc908" - integrity sha512-mEoYRjZhqkBSen/X9i2PNosqvafEsur8bI5MNoPr0wsJu9Nzlul3Yv1elYeMPsXxTxYhXLY8AZlScBvaK4mydg== - -automation-events@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/automation-events/-/automation-events-6.0.4.tgz#a308501319b9f921de7165e0b1a201b46cd1ab59" - integrity sha512-3C/7GtIB1rEwXfSEMUaJRZJFaDJWyiZ3g+Z1HWVAZj+SYZDGKZiZKTZ+Kfq0Lmnb0hL5RXtJ5prfMXbC10evzA== - dependencies: - "@babel/runtime" "^7.22.3" - tslib "^2.5.3" - -automation-events@^6.0.8: - version "6.0.8" - resolved "https://registry.yarnpkg.com/automation-events/-/automation-events-6.0.8.tgz#52929699924cd791eaefc51916ffc033c4d0f42f" - integrity sha512-OXI9rEbA0LwWr+Tmvka4EHtVHBIVw8KD2NM7fIGjd4dyGnuiM3ULZL+Jlo4aKXZDY98raT4R4rEDOHAbz8Jm9A== - dependencies: - "@babel/runtime" "^7.22.6" - tslib "^2.6.1" - autoprefixer@^9.8.6: version "9.8.8" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" @@ -13429,11 +13389,6 @@ midi-player-js@^2.0.16: resolved "https://registry.yarnpkg.com/midi-player-js/-/midi-player-js-2.0.16.tgz#41167859e3f430e55eeb962887cb498726d6c570" integrity sha512-Y1yCRvvSjJjT5J4U8T4XTCDF1FLXtw8Otvq5BAmIob/2cj10aQUDrPDFByTWeuMRPu6/nLhusROc1DuTLCzRnw== -midimessage@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/midimessage/-/midimessage-1.0.5.tgz#ad99f04d863a053a2563d553c5bf35070b48802c" - integrity sha512-MPJ2tDupFOfZB5/PLp8fri1IS4fd9hPj0Bio//FBhWRQ+TsJA7/49CF1aJyraDxa0Jq8zMHAwrwXl2GINvLvgw== - miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -14036,16 +13991,6 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -note-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/note-parser/-/note-parser-1.1.0.tgz#12e9f17e51450ec994f1364a01982c22667b8e6b" - integrity sha512-YTqWQBsRp40EFrEznnkGtmx68gcgOQ8CdoBspqGBA3G1/4mJwIYbDe/vuNpX3oGX2DhP7b1dBgTmj7p3Zr0P1Q== - -note-parser@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/note-parser/-/note-parser-2.0.1.tgz#2438fd57a46894b402b3a2071798660129c8fbc1" - integrity sha512-w9o6Fv46y3NsFxeezTZSmftBtUM/ypme6iZWVrTJvvsD5RN+w0XNDePWtfreNrZFL3jSjBFhadPoXb+pJO4UdA== - npm-package-arg@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-7.0.0.tgz#52cdf08b491c0c59df687c4c925a89102ef794a5" @@ -16626,15 +16571,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sample-player@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/sample-player/-/sample-player-0.5.5.tgz#bc35bea3449c6fa972528f022a9bbc2872195637" - integrity sha512-VQ9pXPJ1m/eTH8QK6OQ8Dn/HSVToNyY9w9vnv+y/yjkJeRm87tJ/gBEm66jItfSLhKe6VG1DfX8+oT+Mg7QUpg== - dependencies: - adsr "^1.0.0" - midimessage "^1.0.5" - note-parser "^1.1.0" - sane@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" @@ -17105,15 +17041,6 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" -soundfont-player@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/soundfont-player/-/soundfont-player-0.12.0.tgz#2b26149f28aba471d2285d3df9a2e1e5793ceaf1" - integrity sha512-8BJIsAt7h1PK3thSZDgF6zecgGhYkK74JnZO8WRZi3h34qG6H/DYlnv7cpRvL7Q9C8N6qld4Qwj7nJsX1gYjEA== - dependencies: - audio-loader "^0.5.0" - note-parser "^2.0.0" - sample-player "^0.5.5" - source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -17286,24 +17213,6 @@ stacktrace-parser@^0.1.3: dependencies: type-fest "^0.7.1" -standardized-audio-context@^25.1.8: - version "25.3.55" - resolved "https://registry.yarnpkg.com/standardized-audio-context/-/standardized-audio-context-25.3.55.tgz#4d87ea6052de80ecf5abf56eb71ecd71f7e52e4e" - integrity sha512-ym9g7FZ5S1FykbQ1///ktTJgk+zTtGF1hGR/BFRQjRkN6G2Xy9GbL5kOcM7DlzflV2yJtqVwfU2gL042b1oHwg== - dependencies: - "@babel/runtime" "^7.22.6" - automation-events "^6.0.8" - tslib "^2.6.1" - -standardized-audio-context@^25.3.51: - version "25.3.51" - resolved "https://registry.yarnpkg.com/standardized-audio-context/-/standardized-audio-context-25.3.51.tgz#0eb54629355d1ddf2070897e586eaa8dfec8c0f5" - integrity sha512-+YPccvetw8wqWo0pv6lo5aDeUq+2WHL/S+8AWdrLKG1jMlhJZqK/GjNF/88q6jXAHal32Msc1xPx3uGrx8RPdQ== - dependencies: - "@babel/runtime" "^7.22.3" - automation-events "^6.0.4" - tslib "^2.5.3" - state-toggle@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" @@ -18067,14 +17976,6 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tone@^14.7.77: - version "14.7.77" - resolved "https://registry.yarnpkg.com/tone/-/tone-14.7.77.tgz#12a2a9f033952ccdb552275a6384ca5d36d4b5ed" - integrity sha512-tCfK73IkLHyzoKUvGq47gyDyxiKLFvKiVCOobynGgBB9Dl0NkxTM2p+eRJXyCYrjJwy9Y0XCMqD3uOYsYt2Fdg== - dependencies: - standardized-audio-context "^25.1.8" - tslib "^2.0.1" - toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" @@ -18157,16 +18058,6 @@ tslib@^2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== -tslib@^2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tslib@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" - integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== - tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" From 9655e986ffdd62f14c8bd896c1785767de88aff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 11:34:11 +0200 Subject: [PATCH 044/133] Removed old code from HomeView and auto format some files --- front/components/PartitionView.tsx | 16 ++++++++++------ .../PartitionVisualizer/PhaserCanvas.tsx | 11 ++++++++--- front/views/HomeView.tsx | 6 ------ 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index 2312d78..7bf129f 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -55,9 +55,7 @@ const PartitionView = (props: PartitionViewProps) => { useEffect(() => { const _osmd = new OSMD(OSMD_DIV_ID, options); - Promise.all([ - _osmd.load(props.file), - ]).then(() => { + Promise.all([_osmd.load(props.file)]).then(() => { _osmd.render(); _osmd.cursor.show(); const bpm = _osmd.Sheet.HasBPMInfo ? _osmd.Sheet.getExpressionsStartTempoInBPM() : 60; @@ -79,8 +77,14 @@ const PartitionView = (props: PartitionViewProps) => { .NotesUnderCursor() .sort((n1, n2) => n1.Length.CompareTo(n2.Length)) .at(0); - const ts = timestampToMs(shortestNotes?.getAbsoluteTimestamp() ?? new Fraction(-1), wholeNoteLength); - const sNL = timestampToMs(shortestNotes?.Length ?? new Fraction(-1), wholeNoteLength); + const ts = timestampToMs( + shortestNotes?.getAbsoluteTimestamp() ?? new Fraction(-1), + wholeNoteLength + ); + const sNL = timestampToMs( + shortestNotes?.Length ?? new Fraction(-1), + wholeNoteLength + ); curPos.push({ offset: _osmd.cursor.cursorElement.offsetLeft, notes: notesToPlay, @@ -89,7 +93,7 @@ const PartitionView = (props: PartitionViewProps) => { ts, sNL, isRest: shortestNotes?.isRest(), - } + }, }); _osmd.cursor.next(); } diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index e6725b9..3398a7b 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -14,7 +14,7 @@ let globalStatus: 'playing' | 'paused' | 'stopped' = 'playing'; const isValidSoundPlayer = (soundPlayer: SplendidGrandPiano | undefined) => { return soundPlayer && soundPlayer.loaded; -} +}; const playNotes = (notes: any[], soundPlayer: SplendidGrandPiano) => { notes.forEach(({ note, duration }) => { @@ -111,7 +111,12 @@ export type PhaserCanvasProps = { timestamp: number; }; -const PhaserCanvas = ({ partitionB64, cursorPositions, onEndReached, timestamp }: PhaserCanvasProps) => { +const PhaserCanvas = ({ + partitionB64, + cursorPositions, + onEndReached, + timestamp, +}: PhaserCanvasProps) => { const colorScheme = useColorScheme(); const dispatch = useDispatch(); const soundPlayer = useSelector((state: RootState) => state.soundPlayer.soundPlayer); @@ -160,7 +165,7 @@ const PhaserCanvas = ({ partitionB64, cursorPositions, onEndReached, timestamp } // currently the condition is always false game.destroy(true); } - } + }; }, [soundPlayer]); return
; diff --git a/front/views/HomeView.tsx b/front/views/HomeView.tsx index c4d2620..131b74f 100644 --- a/front/views/HomeView.tsx +++ b/front/views/HomeView.tsx @@ -11,14 +11,8 @@ import Translate from '../components/Translate'; import TextButton from '../components/TextButton'; import Song from '../models/Song'; import { FontAwesome5 } from '@expo/vector-icons'; -import PhaserCanvas from '../components/PartitionVisualizer/PhaserCanvas'; - -const b64data = - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAGKDAGaAAAFgUlEQVRYw7WXa2wUVRTH/20p7fZBW0p5iAplaUELCqEFlUCMYKwJKMYgaEwIUpQYNCIWRYgvQtTS6AeiKEqIQDBIAEFAEEm1DUVUoIqPVqhCC/IoammhC9vt/vywM7szu7NLLfHMl7n3nP/533vuPefMSHap8wNIoG57pxIYSErZDyCgB8qogTYUeKT+v2C+SlLanqA3v4EBwSdAasAI4CUUcA7wRsiBMbDIjQDQd4M0ogimtkrbMWSgAVzibUIouTIwfc4kJaVIkpT+PTxLiGplkHCo6Wq+uSOydlrYl3jD1xOSAQ5zdzcA1CJJK/ygOEk91kIhAMsQmeMDq9MRg7ojGExIINkrOAm8D4DHSg9QwiQApiDmeQzFWaDE2LUQ4DXjedimsAQaShgbqXj4NM4ISZpmVeTbdt6vGISrWtElfs76Fuig9+9hij7qFjbTs6GecEnxSdKa4DjbK0nFrzWFTI4yE/jVsvDsMaauP0JxX0ARviBgOg0A3GnZaVpO4N3llZRYYZrez8dhC/KRxrBVYSt37TPVgSh6GQN8FFxSQPLOqbsBSP3Wy2gLwJIRQcC91mPIOGyaTaTKARBxbllH7EtqZkJsgCRlvrTbF21JQiS3KN7pkFNH/BMOiJ+nq8vQTTNI8ChZnZabXJs7bxzf9zjAO/8kTLfNxynXwTpze6PlnG8/o16B+fzTfqCRgq1W62nXtYff1X1orjRiqzn2M8TgySlqAFjNuqDxFdIRKpWeag/Vo7zfJWXXei1ep3AaKDYDWypNvhLQnETk1+kWf/hC3iUrdGil0i3lAE8iRM/r1cpm3g0aNzAdgB8sACnvm8Bo0AuSLgLwKMeBQjosTEuCAJu0BSPgjsjo5WS0KyUM4Amqf6aO2cFRPUKU0cLAOhvgsgUAUM4u/PQz9lAGwC5/75eDgFlhAHuxKzNmynGtMwDtvMWOmIBahEjbYAACBWYCzY6A18kx3jI2WXolQJvRKMLqb6g5bbO0AnMPlbwSFdBrpwMA4FkOOwJ6mw08q/J8jChZnhtCR9HdfTo2IP6JyGQrfKbVGZBeETWdB723PwzQ/ZISr1IDchs9IcCtnasbWWMvCC3SNUhm2ophJ2raq9pyjycvjbju1yTje/604IzHllMXmH0256BGRBoPTipaO/jv4ktTPaNaC+rd02I5dqUsdTdUXiaGfOYbdKbPi2bnLkjLO3cszGJx+00fRLoemXlg1qkLVDOOxVyM6v4MM4kLlpQh6cObI22OIcatNh0nJj3X/8S2S3aTFhZwJ9/Z5raTZ71npZKUOWVxhPtDuBD5jZI7c+8DJ8/Giga7GcObzCMxMkFKJWlUYm6ztU0cYbihH7lccbv3cw9z+Tuq+yrG8gptNDGHBEcCSXGDjz7NDG6zWQyYLylhTyDSl1nK7VRYHLfxKmOpjCDcaH5dR5T1obPddekel9f95/BPs/ubwa+wB76acTzPRJ6hOWbYGnkEEb/wqlc96eu2CHAJ1cznLg5Fdf8lBQjxBqv87qbcx2MQJFd5HAjMyrSD0bxN6ABbWUiSQ9f4jQnNA7epjwNBSvWVGATmrX+M+xjjUGbLbHbtLLvU7w/dYf/0OrCV0ZTjjUEQ/WOxzJYh+QiRut5GkP6dz/jBms0kartA0ByWIekbbQQ9DnXYHG2gkIJOE7gc5jK32AgyavwOZ/A504N/AjG/px2entvtxf5Hoh5yByspZMN/JMjZbQ/RwRrf1W5RLZMY3Pkd7Ii8q5N71y9rae/CLbI/PY5qfKyk7ttvy13nj3aBIN6XslwZnW2TcX1KMlre8vk7RZB6QsVd7ccD3dUPXTwVhSCuI+lD80fi2iQhb1H+X5ssBEmn9KD+B7k54yut0XX/HfgvpUkmTvPggOsAAAAASUVORK5CYII='; - const HomeView = () => { - // return ; const navigation = useNavigation(); const userQuery = useQuery(API.getUserInfo); const playHistoryQuery = useQuery(API.getUserPlayHistory); From 85473ae492f923c4f02d1b39269954ac039f7d5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 11:37:35 +0200 Subject: [PATCH 045/133] Removed old commented react useState --- front/views/PlayView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index eac110a..5977e6a 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -79,7 +79,6 @@ const PlayView = ({ songId, type, route }: RouteProps) => { const [time, setTime] = useState(0); const [partitionRendered, setPartitionRendered] = useState(false); // Used to know when partitionview can render const [score, setScore] = useState(0); // Between 0 and 100 - // const [endMsgReceived, setEndMsgReceived] = useState(false); // Used to know if to go to error screen when websocket closes const fadeAnim = useRef(new Animated.Value(0)).current; const musixml = useQuery( transformQuery(API.getSongMusicXML(songId), (data) => new TextDecoder().decode(data)), From a81d3ee34dfc3e103b11211bcf3c7a6a05904ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 15:08:56 +0200 Subject: [PATCH 046/133] fixed ts type issue --- front/components/PartitionView.tsx | 6 +++++- .../components/PartitionVisualizer/PhaserCanvas.tsx | 12 ++++++++---- front/tsconfig.json | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index 7bf129f..9103028 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -103,7 +103,11 @@ const PartitionView = (props: PartitionViewProps) => { // console.log('timestamp cursor', _osmd.cursor.iterator.CurrentSourceTimestamp); // console.log('timestamp cursor', _osmd.cursor.iterator.CurrentVoiceEntries); // console.log('current measure index', _osmd.cursor.iterator.CurrentMeasureIndex); - const osmdCanvas = document.querySelector('#' + OSMD_DIV_ID + ' canvas'); + const osmdCanvas = document.querySelector('#' + OSMD_DIV_ID + ' canvas'); + if (!osmdCanvas) { + // this should never happen this is done to silent ts linter about maybe null + throw new Error('No canvas found'); + } // Ty https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL77C12-L77C63 props.onPartitionReady( osmdCanvas.toDataURL(), diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 3398a7b..5d57591 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -8,9 +8,10 @@ import { RootState, useSelector } from '../../state/Store'; import { setSoundPlayer as setSPStore } from '../../state/SoundPlayerSlice'; import { useDispatch } from 'react-redux'; import { SplendidGrandPiano, CacheStorage } from 'smplr'; +import { Note } from 'opensheetmusicdisplay'; let globalTimestamp = 0; -let globalStatus: 'playing' | 'paused' | 'stopped' = 'playing'; +const globalStatus: 'playing' | 'paused' | 'stopped' = 'playing'; const isValidSoundPlayer = (soundPlayer: SplendidGrandPiano | undefined) => { return soundPlayer && soundPlayer.loaded; @@ -35,7 +36,9 @@ const getPianoScene = ( ) => { class PianoScene extends Phaser.Scene { async preload() {} - + private cursorPositionsIdx = -1; + private partition!: Phaser.GameObjects.Image; + private cursor!: Phaser.GameObjects.Rectangle; create() { this.textures.addBase64('partition', partitionB64); this.cursorPositionsIdx = -1; @@ -56,7 +59,7 @@ const getPianoScene = ( if (status === 'playing') { const transitionTime = 75; - const cP = cursorPositions.findLast((cP, idx) => { + const cP = cursorPositions.findLast((cP: { timestamp: number; }, idx: number) => { if ( cP.timestamp < currentTimestamp + transitionTime && idx > this.cursorPositionsIdx @@ -73,6 +76,7 @@ const getPianoScene = ( x: cP!.x, duration: transitionTime, ease: 'Sine.easeInOut', + onComplete: undefined as (() => void) | undefined, }; if (this.cursorPositionsIdx === cursorPositions.length - 1) { tw.onComplete = () => { @@ -93,7 +97,7 @@ export type PianoCursorPosition = { // timestamp in ms timing: number; timestamp: number; - notes: any[]; + notes: Note[]; }; export type UpdateInfo = { diff --git a/front/tsconfig.json b/front/tsconfig.json index bb42897..30d5af8 100644 --- a/front/tsconfig.json +++ b/front/tsconfig.json @@ -14,7 +14,7 @@ /* Language and Environment */ "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, "lib": [ - "es2019", + "es2023", "DOM" ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, "jsx": "react-native" /* Specify what JSX code is generated. */, From b76d4960341edbf6df06f016b9e52a25134d3d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 15:29:35 +0200 Subject: [PATCH 047/133] fix ts issues 2 --- front/components/PartitionView.tsx | 6 ++++-- .../PartitionVisualizer/PhaserCanvas.tsx | 20 ++++++++++++++++--- front/tsconfig.json | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/front/components/PartitionView.tsx b/front/components/PartitionView.tsx index 9103028..e9a6ed1 100644 --- a/front/components/PartitionView.tsx +++ b/front/components/PartitionView.tsx @@ -103,9 +103,11 @@ const PartitionView = (props: PartitionViewProps) => { // console.log('timestamp cursor', _osmd.cursor.iterator.CurrentSourceTimestamp); // console.log('timestamp cursor', _osmd.cursor.iterator.CurrentVoiceEntries); // console.log('current measure index', _osmd.cursor.iterator.CurrentMeasureIndex); - const osmdCanvas = document.querySelector('#' + OSMD_DIV_ID + ' canvas'); + const osmdCanvas = document.querySelector( + '#' + OSMD_DIV_ID + ' canvas' + ); + // this should never happen this is done to silent ts linter about maybe null if (!osmdCanvas) { - // this should never happen this is done to silent ts linter about maybe null throw new Error('No canvas found'); } // Ty https://github.com/jimutt/osmd-audio-player/blob/ec205a6e46ee50002c1fa8f5999389447bba7bbf/src/PlaybackEngine.ts#LL77C12-L77C63 diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 5d57591..41d7d2e 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -17,7 +17,16 @@ const isValidSoundPlayer = (soundPlayer: SplendidGrandPiano | undefined) => { return soundPlayer && soundPlayer.loaded; }; -const playNotes = (notes: any[], soundPlayer: SplendidGrandPiano) => { +const myFindLast = (a: T[], p: (_: T, _2: number) => boolean) => { + for (let i = a.length - 1; i >= 0; i--) { + if (p(a[i]!, i)) { + return a[i]; + } + } + return undefined; +} + +const playNotes = (notes: PianoCursorNote[], soundPlayer: SplendidGrandPiano) => { notes.forEach(({ note, duration }) => { const fixedKey = note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments.at(0)?.fixedKey ?? 0; @@ -59,7 +68,7 @@ const getPianoScene = ( if (status === 'playing') { const transitionTime = 75; - const cP = cursorPositions.findLast((cP: { timestamp: number; }, idx: number) => { + const cP = myFindLast(cursorPositions, (cP: { timestamp: number; }, idx: number) => { if ( cP.timestamp < currentTimestamp + transitionTime && idx > this.cursorPositionsIdx @@ -91,13 +100,18 @@ const getPianoScene = ( return PianoScene; }; +type PianoCursorNote = { + note: Note; + duration: number; +}; + export type PianoCursorPosition = { // offset in pixels x: number; // timestamp in ms timing: number; timestamp: number; - notes: Note[]; + notes: PianoCursorNote[]; }; export type UpdateInfo = { diff --git a/front/tsconfig.json b/front/tsconfig.json index 30d5af8..b28b02b 100644 --- a/front/tsconfig.json +++ b/front/tsconfig.json @@ -14,7 +14,7 @@ /* Language and Environment */ "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, "lib": [ - "es2023", + "es2022", "DOM" ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, "jsx": "react-native" /* Specify what JSX code is generated. */, From a2494ce4984db4e8399a56a08e397c824b8133bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 15:37:55 +0200 Subject: [PATCH 048/133] prettied --- .../PartitionVisualizer/PhaserCanvas.tsx | 4 +- front/views/PlayView.tsx | 189 +++++++++--------- 2 files changed, 94 insertions(+), 99 deletions(-) diff --git a/front/components/PartitionVisualizer/PhaserCanvas.tsx b/front/components/PartitionVisualizer/PhaserCanvas.tsx index 41d7d2e..eb7b4fa 100644 --- a/front/components/PartitionVisualizer/PhaserCanvas.tsx +++ b/front/components/PartitionVisualizer/PhaserCanvas.tsx @@ -24,7 +24,7 @@ const myFindLast = (a: T[], p: (_: T, _2: number) => boolean) => { } } return undefined; -} +}; const playNotes = (notes: PianoCursorNote[], soundPlayer: SplendidGrandPiano) => { notes.forEach(({ note, duration }) => { @@ -68,7 +68,7 @@ const getPianoScene = ( if (status === 'playing') { const transitionTime = 75; - const cP = myFindLast(cursorPositions, (cP: { timestamp: number; }, idx: number) => { + const cP = myFindLast(cursorPositions, (cP: { timestamp: number }, idx: number) => { if ( cP.timestamp < currentTimestamp + transitionTime && idx > this.cursorPositionsIdx diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 5977e6a..d3f0bf0 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -152,7 +152,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { console.log('Websocket closed', endMsgReceived); if (!endMsgReceived) { toast.show({ description: 'Connection lost with Scorometer' }); - // the special case when the front send the end message succesfully + // the special case when the front send the end message succesfully // but the websocket is closed before the end message is received // is not handled return; @@ -268,109 +268,104 @@ const PlayView = ({ songId, type, route }: RouteProps) => { } return ( - - - - - - - setPartitionRendered(true)} + + + - {!partitionRendered && } - + + + + setPartitionRendered(true)} + /> + {!partitionRendered && } + - - + + - - Score: {score}% - - -
- {song.data.name} -
- - {midiKeyboardFound && ( - <> - + Score: {score}% + +
+
+ {song.data.name} +
+ + {midiKeyboardFound && ( + <> + } + onPress={() => { + if (paused) { + onResume(); + } else { + onPause(); } - onPress={() => { - if (paused) { - onResume(); - } else { - onPause(); - } - }} - /> - - {time < 0 - ? paused - ? '0:00' - : Math.floor((time % 60000) / 1000) - .toFixed(0) - .toString() - : `${Math.floor(time / 60000)}:${Math.floor( - (time % 60000) / 1000 - ) + }} + /> + + {time < 0 + ? paused + ? '0:00' + : Math.floor((time % 60000) / 1000) .toFixed(0) .toString() - .padStart(2, '0')}`} - - } - onPress={() => { - onEnd(); - }} - /> - - )} - + : `${Math.floor(time / 60000)}:${Math.floor( + (time % 60000) / 1000 + ) + .toFixed(0) + .toString() + .padStart(2, '0')}`} + + } + onPress={() => { + onEnd(); + }} + /> + + )}
-
+ +
); }; From b84ee11f45fa7cc8056a2d4217d1cc0e47844ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Tue, 5 Sep 2023 18:05:15 +0200 Subject: [PATCH 049/133] Fix de arthur --- front/views/PlayView.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index d3f0bf0..2e9c0d6 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -1,4 +1,5 @@ /* eslint-disable no-mixed-spaces-and-tabs */ +import { StackActions } from '@react-navigation/native'; import React, { useEffect, useRef, useState } from 'react'; import { SafeAreaView, Platform, Animated } from 'react-native'; import * as ScreenOrientation from 'expo-screen-orientation'; @@ -117,7 +118,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { stopwatch.stop(); if (webSocket.current?.readyState != WebSocket.OPEN) { console.warn('onEnd: Websocket not open'); - navigation.navigate('Home'); + navigation.dispatch(StackActions.replace('Home')); return; } webSocket.current?.send( @@ -164,7 +165,10 @@ const PlayView = ({ songId, type, route }: RouteProps) => { if (data.type == 'end') { endMsgReceived = true; webSocket.current?.close(); - navigation.navigate('Score', { songId: song.data!.id, ...data }); + console.log('End message received stack action'); + navigation.dispatch( + StackActions.replace('Score', { songId: song.data!.id, ...data }) + ); return; } const points = data.info.score; @@ -238,7 +242,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { return () => { ScreenOrientation.unlockAsync().catch(() => {}); - onEnd(); + stopwatch.stop(); clearInterval(interval); }; }, []); From e0f26748112d46eff692761e403899408d87498a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Le=20Bihan?= Date: Wed, 6 Sep 2023 14:28:41 +0200 Subject: [PATCH 050/133] fix pr --- front/views/PlayView.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/front/views/PlayView.tsx b/front/views/PlayView.tsx index 2e9c0d6..2648052 100644 --- a/front/views/PlayView.tsx +++ b/front/views/PlayView.tsx @@ -165,7 +165,6 @@ const PlayView = ({ songId, type, route }: RouteProps) => { if (data.type == 'end') { endMsgReceived = true; webSocket.current?.close(); - console.log('End message received stack action'); navigation.dispatch( StackActions.replace('Score', { songId: song.data!.id, ...data }) ); @@ -238,7 +237,7 @@ const PlayView = ({ songId, type, route }: RouteProps) => { ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.LANDSCAPE).catch(() => {}); const interval = setInterval(() => { setTime(() => getElapsedTime()); // Countdown - }, 10); + }, 1); return () => { ScreenOrientation.unlockAsync().catch(() => {}); From 2f50f694f371794ca3d6662560f4e91752715f65 Mon Sep 17 00:00:00 2001 From: danis Date: Wed, 6 Sep 2023 15:57:38 +0200 Subject: [PATCH 051/133] clean code --- front/views/GenreDetailsView.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 694b129..f206199 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -1,6 +1,6 @@ import { SafeAreaView } from 'react-native'; import { VStack, Text, Box, Flex, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue, ScrollView } from 'native-base'; -import { useQuery } from '../Queries'; +import { useQueries, useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import { RouteProps, useNavigation } from '../Navigation'; import API from '../API'; @@ -8,6 +8,7 @@ import Artist from '../models/Artist'; import ArtistCard from '../components/ArtistCard'; import CardGridCustom from '../components/CardGridCustom'; import { translate } from '../i18n/i18n'; +import SongCard from '../components/SongCard'; const colorRange = ['#364fc7', '#5c940d', '#c92a2a', '#d6336c', '#20c997']; @@ -22,6 +23,7 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { const isMobileView = screenSize == "small"; const navigation = useNavigation(); + if (genreQuery.isError || songsQuery.isError) { navigation.navigate('Error'); return <>; @@ -51,16 +53,17 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { mt={4} > ({ - image: API.getArtistIllustration(songData.id), + content={songsQuery.data.map((songData) => ({ name: songData.name, - id: songData.id, + cover: songData.cover, + artistName: songData.artistId.toString(), + songId: songData.id, onPress: () => { - API.createSearchHistoryEntry(songData.name, 'artist'); + API.createSearchHistoryEntry(songData.name, 'song'); navigation.navigate('Song', { songId: songData.id }); }, }))} - cardComponent={ArtistCard} + cardComponent={SongCard} /> From 7e866f98269233c18c8e109f5241c51dbe18e496 Mon Sep 17 00:00:00 2001 From: danis Date: Wed, 6 Sep 2023 15:59:50 +0200 Subject: [PATCH 052/133] clean code III --- front/views/ArtistDetailsView.tsx | 5 +---- front/views/GenreDetailsView.tsx | 7 +------ 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 3fc9dbf..442e86f 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -1,7 +1,4 @@ -import { VStack, Text, Box, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue, ScrollView } from 'native-base'; -import { Ionicons } from '@expo/vector-icons'; -// import { Box, Image, Heading, useBreakpointValue } from 'native-base'; -import { SafeAreaView } from 'react-native'; +import { Box, Heading, useBreakpointValue, ScrollView } from 'native-base'; import { useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import API from '../API'; diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index f206199..aaea0be 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -1,13 +1,9 @@ -import { SafeAreaView } from 'react-native'; -import { VStack, Text, Box, Flex, Image, Heading, IconButton, Icon, Container, Center, useBreakpointValue, ScrollView } from 'native-base'; +import { Box, Flex, Heading, useBreakpointValue, ScrollView } from 'native-base'; import { useQueries, useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import { RouteProps, useNavigation } from '../Navigation'; import API from '../API'; -import Artist from '../models/Artist'; -import ArtistCard from '../components/ArtistCard'; import CardGridCustom from '../components/CardGridCustom'; -import { translate } from '../i18n/i18n'; import SongCard from '../components/SongCard'; const colorRange = ['#364fc7', '#5c940d', '#c92a2a', '#d6336c', '#20c997']; @@ -23,7 +19,6 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { const isMobileView = screenSize == "small"; const navigation = useNavigation(); - if (genreQuery.isError || songsQuery.isError) { navigation.navigate('Error'); return <>; From 852fbd5c8711c2466107231ad06aeedad0f8dbd7 Mon Sep 17 00:00:00 2001 From: danis Date: Wed, 6 Sep 2023 16:39:38 +0200 Subject: [PATCH 053/133] clean code IV --- front/views/SearchView.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/front/views/SearchView.tsx b/front/views/SearchView.tsx index b3b84bf..1de10fb 100644 --- a/front/views/SearchView.tsx +++ b/front/views/SearchView.tsx @@ -19,7 +19,6 @@ interface SearchContextType { songData: Song[]; artistData: Artist[]; genreData: Genre[]; - // favoriteData: Song[]; isLoadingSong: boolean; isLoadingArtist: boolean; isLoadingGenre: boolean; @@ -33,7 +32,6 @@ export const SearchContext = React.createContext({ songData: [], artistData: [], genreData: [], - // favoriteData: [], isLoadingSong: false, isLoadingArtist: false, isLoadingGenre: false, @@ -62,11 +60,6 @@ const SearchView = (props: RouteProps) => { { enabled: !!stringQuery } ); - // const { isLoading: isLoadingFavorite, data: favoriteData = [] } = useQuery( - // API.getFavorites(), - // { enabled: true } - // ) - const updateFilter = (newData: Filter) => { // called when the filter is changed setFilter(newData); @@ -87,7 +80,6 @@ const SearchView = (props: RouteProps) => { songData, artistData, genreData, - // favoriteData, isLoadingSong, isLoadingArtist, isLoadingGenre, From 6da96ed886f760d6c1ccb7792ea7798d220fb4ac Mon Sep 17 00:00:00 2001 From: danis Date: Wed, 6 Sep 2023 17:00:36 +0200 Subject: [PATCH 054/133] clean code V --- front/components/SearchBar.tsx | 5 -- front/components/SearchResult.tsx | 126 ------------------------------ front/components/SongRow.tsx | 11 +-- 3 files changed, 1 insertion(+), 141 deletions(-) diff --git a/front/components/SearchBar.tsx b/front/components/SearchBar.tsx index 9bb568e..3ef7d71 100644 --- a/front/components/SearchBar.tsx +++ b/front/components/SearchBar.tsx @@ -42,11 +42,6 @@ const SearchBar = () => { callback: () => updateFilter('all'), id: 'all', }, - { - name: translate('favoriteFilter'), - callback: () => updateFilter('favorite'), - id: 'favorite', - }, { name: translate('artistFilter'), callback: () => updateFilter('artist'), diff --git a/front/components/SearchResult.tsx b/front/components/SearchResult.tsx index 8dd037c..42d031a 100644 --- a/front/components/SearchResult.tsx +++ b/front/components/SearchResult.tsx @@ -39,101 +39,6 @@ const swaToSongCardProps = (song: SongWithArtist) => ({ cover: song.cover ?? 'https://picsum.photos/200', }); -const RowCustom = (props: Parameters[0] & { onPress?: () => void }) => { - const settings = useSelector((state: RootState) => state.settings.local); - const systemColorMode = useColorScheme(); - const colorScheme = settings.colorScheme; - - return ( - - {({ isHovered, isPressed }) => ( - - {props.children} - - )} - - ); -}; - -// type SongRowProps = { -// song: Song | SongWithArtist; // TODO: remove Song -// onPress: () => void; -// }; - -// const SongRow = ({ song, onPress }: SongRowProps) => { -// return ( -// -// -// {song.name} -// -// -// {song.name} -// -// -// {song.artistId ?? 'artist'} -// -// -// -// -// -// ); -// }; - -SongRow.defaultProps = { - onPress: () => {}, -}; - const HomeSearchComponent = () => { const { updateStringQuery } = React.useContext(SearchContext); const { isLoading: isLoadingHistory, data: historyData = [] } = useQuery( @@ -301,35 +206,6 @@ const GenreSearchComponent = (props: ItemSearchComponentProps) => { ); }; -const FavoriteSearchComponent = (props: SongsSearchComponentProps) => { - const { favoriteData } = React.useContext(SearchContext); - const navigation = useNavigation(); - - return ( - - - {translate('favoriteFilter')} - - - {favoriteData?.length ? ( - favoriteData.slice(0, props.maxRows).map((comp, index) => ( - { - API.createSearchHistoryEntry(comp.name, 'song'); - navigation.navigate('Song', { songId: comp.id }); - }} - /> - )) - ) : ( - {translate('errNoResults')} - )} - - - ) -} - const AllComponent = () => { const screenSize = useBreakpointValue({ base: 'small', md: 'big' }); const isMobileView = screenSize == 'small'; @@ -375,8 +251,6 @@ const FilterSwitch = () => { return ; case 'genre': return ; - case 'favorite': - return ; default: return Something very bad happened: {currentFilter}; } diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx index 57d1746..5ac3189 100644 --- a/front/components/SongRow.tsx +++ b/front/components/SongRow.tsx @@ -3,18 +3,13 @@ import Song, { SongWithArtist } from "../models/Song"; import RowCustom from "./RowCustom"; import TextButton from "./TextButton"; import { MaterialIcons } from "@expo/vector-icons"; -import API from "../API"; type SongRowProps = { - liked: boolean; song: Song | SongWithArtist; // TODO: remove Song onPress: () => void; }; -const handleLikeButton = { -} - -const SongRow = ({ song, onPress, liked }: SongRowProps) => { +const SongRow = ({ song, onPress }: SongRowProps) => { return ( @@ -28,10 +23,6 @@ const SongRow = ({ song, onPress, liked }: SongRowProps) => { borderColor={'white'} borderWidth={1} /> - Date: Wed, 6 Sep 2023 17:07:16 +0200 Subject: [PATCH 055/133] clean code VI --- front/views/ArtistDetailsView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 442e86f..7d2dae9 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -45,7 +45,6 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => { API.createSearchHistoryEntry(comp.name, 'song'); navigation.navigate('Song', { songId: comp.id }); From 16cd794e3b10271d83b60d1a1e33c5105900d1c8 Mon Sep 17 00:00:00 2001 From: danis Date: Thu, 7 Sep 2023 10:31:03 +0200 Subject: [PATCH 056/133] trial for artist name --- front/views/GenreDetailsView.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index aaea0be..9d75337 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -15,6 +15,12 @@ type GenreDetailsViewProps = { const GenreDetailsView = ({ genreId }: RouteProps) => { const genreQuery = useQuery(API.getGenre(genreId)) const songsQuery = useQuery(API.getSongsByGenre(genreId)) + const artistQueries = useQueries(songsQuery.data.map((song) => song.artistId).map((artistId) => API.getArtist(artistId))); + const songWithArtist = songsQuery.data.map((song) => ({ + ...song, + artist: artistQueries.find((query) => query.data.id == song.artistId) + })).filter((song) => song.artist !== undefined); + const screenSize = useBreakpointValue({ base: "small", md: "big" }); const isMobileView = screenSize == "small"; const navigation = useNavigation(); @@ -48,10 +54,10 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { mt={4} > ({ + content={songWithArtist.map((songData) => ({ name: songData.name, cover: songData.cover, - artistName: songData.artistId.toString(), + artistName: songData.artist.name, songId: songData.id, onPress: () => { API.createSearchHistoryEntry(songData.name, 'song'); From 8ab85ab6895673030187a44063e58e8af662c5f0 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Thu, 7 Sep 2023 16:45:36 +0200 Subject: [PATCH 057/133] Front: remove file64 dependency --- front/API.ts | 2 +- front/package.json | 1 - front/utils/base64ToBlob.ts | 23 +++++++++++++++++++++++ front/yarn.lock | 5 ----- 4 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 front/utils/base64ToBlob.ts diff --git a/front/API.ts b/front/API.ts index 6b3162f..1cc9fe2 100644 --- a/front/API.ts +++ b/front/API.ts @@ -21,7 +21,7 @@ import { PlageHandler } from './models/Plage'; import { ListHandler } from './models/List'; import { AccessTokenResponseHandler } from './models/AccessTokenResponse'; import * as yup from 'yup'; -import { base64ToBlob } from 'file64'; +import { base64ToBlob } from './utils/base64ToBlob'; import { ImagePickerAsset } from 'expo-image-picker'; type AuthenticationInput = { username: string; password: string }; diff --git a/front/package.json b/front/package.json index 4e35b22..eccad8f 100644 --- a/front/package.json +++ b/front/package.json @@ -40,7 +40,6 @@ "expo-secure-store": "~12.0.0", "expo-splash-screen": "~0.17.5", "expo-status-bar": "~1.4.2", - "file64": "^1.0.2", "format-duration": "^2.0.0", "i18next": "^21.8.16", "install": "^0.13.0", diff --git a/front/utils/base64ToBlob.ts b/front/utils/base64ToBlob.ts new file mode 100644 index 0000000..3edf730 --- /dev/null +++ b/front/utils/base64ToBlob.ts @@ -0,0 +1,23 @@ +// SRC: https://github.com/encrypit/file64/blob/master/src/base64-to-blob.ts +export async function base64ToBlob(base64: string): Promise { + const response = await fetch(base64); + let blob = await response.blob(); + const mimeType = getMimeType(base64); + if (mimeType) { + // https://stackoverflow.com/a/50875615 + blob = blob.slice(0, blob.size, mimeType); + } + return blob; +} + +const mimeRegex = /^data:(.+);base64,/; + +/** + * Gets MIME type from Base64. + * + * @param base64 - Base64. + * @returns - MIME type. + */ +function getMimeType(base64: string) { + return base64.match(mimeRegex)?.slice(1, 2).pop(); +} diff --git a/front/yarn.lock b/front/yarn.lock index d7b9acf..dc19c3a 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -9451,11 +9451,6 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -file64@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/file64/-/file64-1.0.2.tgz#d3dde9bab142ccf0049e0bd407a2576e94894825" - integrity sha512-cDQefGBdb8OO7Pb2nXiRcZlVjwgzoG0uuJ/H2fxNdz3vbOZctp0iPJoHDQ4VZrirqGYc9n/p9+ZqptLZrcSGRA== - filesize@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" From b1d0415ba00cdeec175af4a4e4742df7a7c73322 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Thu, 7 Sep 2023 17:10:18 +0200 Subject: [PATCH 058/133] Front: Fix genre view --- front/views/GenreDetailsView.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 9d75337..a0ff410 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -15,10 +15,11 @@ type GenreDetailsViewProps = { const GenreDetailsView = ({ genreId }: RouteProps) => { const genreQuery = useQuery(API.getGenre(genreId)) const songsQuery = useQuery(API.getSongsByGenre(genreId)) - const artistQueries = useQueries(songsQuery.data.map((song) => song.artistId).map((artistId) => API.getArtist(artistId))); - const songWithArtist = songsQuery.data.map((song) => ({ + const artistQueries = useQueries(songsQuery.data?.map((song) => song.artistId).map((artistId) => API.getArtist(artistId)) ?? []); + // Here, .artist will always be defined + const songWithArtist = songsQuery?.data?.map((song) => ({ ...song, - artist: artistQueries.find((query) => query.data.id == song.artistId) + artist: artistQueries.find((query) => query.data?.id == song.artistId)?.data })).filter((song) => song.artist !== undefined); const screenSize = useBreakpointValue({ base: "small", md: "big" }); @@ -29,7 +30,7 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { navigation.navigate('Error'); return <>; } - if (!genreQuery.data || songsQuery.data === undefined) { + if (!genreQuery.data || songsQuery.data === undefined || songWithArtist === undefined) { return ; } @@ -57,7 +58,7 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { content={songWithArtist.map((songData) => ({ name: songData.name, cover: songData.cover, - artistName: songData.artist.name, + artistName: songData.artist!.name, songId: songData.id, onPress: () => { API.createSearchHistoryEntry(songData.name, 'song'); From e1ab9fe1188e0d2ea77ba3e41a02a6eef5d16bb1 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Fri, 8 Sep 2023 09:09:18 +0200 Subject: [PATCH 059/133] Front: Fix an error that occured on prod, caused by the avatar's url --- .gitignore | 1 + front/components/UserAvatar.tsx | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 378d91e..50e2bf1 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ log.html node_modules/ ./front/coverage .venv +.DS_Store \ No newline at end of file diff --git a/front/components/UserAvatar.tsx b/front/components/UserAvatar.tsx index a2eb9c7..4fd7313 100644 --- a/front/components/UserAvatar.tsx +++ b/front/components/UserAvatar.tsx @@ -18,10 +18,9 @@ const UserAvatar = ({ size }: UserAvatarProps) => { if (!user.data) { return null; } - const url = new URL(user.data.data.avatar); - - url.searchParams.append('updatedAt', user.dataUpdatedAt.toString()); - return url; + // NOTE: We do this to avoid parsing URL with `new URL`, which is not compatible with related path + // (which is used for production, on web) + return `${user.data.data.avatar}?updatedAt=${user.dataUpdatedAt.toString()}` }, [user.data]); return ( From 2f27278d3aa100156ecc71c79ca9bbadf6375976 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Fri, 8 Sep 2023 09:13:25 +0200 Subject: [PATCH 060/133] Front: Pretty --- front/components/UserAvatar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/components/UserAvatar.tsx b/front/components/UserAvatar.tsx index 4fd7313..b1d04d9 100644 --- a/front/components/UserAvatar.tsx +++ b/front/components/UserAvatar.tsx @@ -20,7 +20,7 @@ const UserAvatar = ({ size }: UserAvatarProps) => { } // NOTE: We do this to avoid parsing URL with `new URL`, which is not compatible with related path // (which is used for production, on web) - return `${user.data.data.avatar}?updatedAt=${user.dataUpdatedAt.toString()}` + return `${user.data.data.avatar}?updatedAt=${user.dataUpdatedAt.toString()}`; }, [user.data]); return ( From b61968706dfd9f06455e87d30aded29f991be48d Mon Sep 17 00:00:00 2001 From: danis Date: Sat, 9 Sep 2023 14:25:03 +0200 Subject: [PATCH 061/133] fix PR I --- front/API.ts | 10 ---------- front/Theme.tsx | 12 ++++++------ front/components/SearchBar.tsx | 2 +- front/components/SearchResult.tsx | 2 +- front/views/ArtistDetailsView.tsx | 7 ++++--- front/views/GenreDetailsView.tsx | 5 +++-- 6 files changed, 15 insertions(+), 23 deletions(-) diff --git a/front/API.ts b/front/API.ts index 4ef5531..54ac0e5 100644 --- a/front/API.ts +++ b/front/API.ts @@ -542,16 +542,6 @@ export default class API { }; } - // public static getFavorites(): Query { - // return { - // key: 'favorites', - // exec: () => - // API.fetch({ - // route: '/search/songs/o', - // }), - // }; - // } - /** * Retrieve the authenticated user's search history * @param skip number of entries skipped before returning diff --git a/front/Theme.tsx b/front/Theme.tsx index 9c19074..b6e61ed 100644 --- a/front/Theme.tsx +++ b/front/Theme.tsx @@ -4,15 +4,15 @@ import { useEffect } from 'react'; const ThemeProvider = ({ children }: { children: JSX.Element }) => { const colorScheme = useColorScheme(); - const config = { - dependencies: { - "linear-gradient": require("expo-linear-gradient").LinearGradient, - }, - }; + const config = { + dependencies: { + "linear-gradient": require("expo-linear-gradient").LinearGradient, + }, + }; return ( { export const SearchResultComponent = () => { const { stringQuery } = React.useContext(SearchContext); const { filter } = React.useContext(SearchContext); - const shouldOutput = !!stringQuery.trim() || filter == "favorite"; + const shouldOutput = !!stringQuery.trim(); return shouldOutput ? ( diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 7d2dae9..a3ddfb7 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -1,4 +1,4 @@ -import { Box, Heading, useBreakpointValue, ScrollView } from 'native-base'; +import { Box, Heading, useBreakpointValue, ScrollView, useColorModeValue } from 'native-base'; import { useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import API from '../API'; @@ -17,6 +17,7 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => const artistQuery = useQuery(API.getArtist(artistId)); const songsQuery = useQuery(API.getSongsByArtist(artistId)); const screenSize = useBreakpointValue({ base: 'small', md: 'big' }); + const fadeColor = useColorModeValue('#ffffff', '#000000'); const isMobileView = screenSize == 'small'; const navigation = useNavigation(); @@ -32,9 +33,9 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => + source={{uri : API.getArtistIllustration(artistQuery.data.id)}}> diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index a0ff410..5dd6e52 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -1,4 +1,4 @@ -import { Box, Flex, Heading, useBreakpointValue, ScrollView } from 'native-base'; +import { Box, Flex, Heading, useBreakpointValue, ScrollView, useColorModeValue } from 'native-base'; import { useQueries, useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import { RouteProps, useNavigation } from '../Navigation'; @@ -24,6 +24,7 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { const screenSize = useBreakpointValue({ base: "small", md: "big" }); const isMobileView = screenSize == "small"; + const fadeColor = useColorModeValue('#ffffff', '#000000'); const navigation = useNavigation(); if (genreQuery.isError || songsQuery.isError) { @@ -42,7 +43,7 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { width={'100%'} bg={{ linearGradient: { - colors: [colorRange[Math.floor(Math.random() * 5)] ?? '#364fc7', 'black'], + colors: [colorRange[Math.floor(Math.random() * 5)] ?? '#364fc7', fadeColor], start: [0, 0], end: [0, 1], },}} From 3ff523560b8897b7653ecc67e44fcfd0de2729fc Mon Sep 17 00:00:00 2001 From: danis Date: Sat, 9 Sep 2023 17:51:18 +0200 Subject: [PATCH 062/133] fix PR II --- front/views/ArtistDetailsView.tsx | 2 +- front/views/GenreDetailsView.tsx | 22 +++++++++------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index a3ddfb7..eae2ee4 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -59,4 +59,4 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => ); }; -export default ArtistDetailsView; +export default ArtistDetailsView; \ No newline at end of file diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 5dd6e52..df3655b 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -5,8 +5,8 @@ import { RouteProps, useNavigation } from '../Navigation'; import API from '../API'; import CardGridCustom from '../components/CardGridCustom'; import SongCard from '../components/SongCard'; - -const colorRange = ['#364fc7', '#5c940d', '#c92a2a', '#d6336c', '#20c997']; +import { ImageBackground } from 'react-native'; +import { LinearGradient } from 'expo-linear-gradient'; type GenreDetailsViewProps = { genreId: number; @@ -37,17 +37,13 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { return ( - + + + {genreQuery.data.name} Date: Sat, 9 Sep 2023 17:52:22 +0200 Subject: [PATCH 063/133] fix PR III --- front/views/SearchView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/front/views/SearchView.tsx b/front/views/SearchView.tsx index 1de10fb..108ff54 100644 --- a/front/views/SearchView.tsx +++ b/front/views/SearchView.tsx @@ -12,8 +12,8 @@ import { ScrollView } from 'native-base'; import { RouteProps } from '../Navigation'; interface SearchContextType { - filter: 'artist' | 'song' | 'genre' | 'all' | 'favorite'; - updateFilter: (newData: 'artist' | 'song' | 'genre' | 'all' | 'favorite') => void; + filter: 'artist' | 'song' | 'genre' | 'all'; + updateFilter: (newData: 'artist' | 'song' | 'genre' | 'all') => void; stringQuery: string; updateStringQuery: (newData: string) => void; songData: Song[]; From a6d9cb3b409fb79667b8f0a505a75f8e7e9b47d2 Mon Sep 17 00:00:00 2001 From: danis Date: Sat, 9 Sep 2023 18:55:32 +0200 Subject: [PATCH 064/133] run prettier --- front/Navigation.tsx | 2 +- front/Theme.tsx | 2 +- front/components/SearchBar.tsx | 2 +- front/components/SearchResult.tsx | 23 +++++++++-------- front/components/SongRow.tsx | 10 +++---- front/i18n/Translations.ts | 6 ++--- front/views/ArtistDetailsView.tsx | 16 +++++++----- front/views/GenreDetailsView.tsx | 43 +++++++++++++++++++------------ 8 files changed, 59 insertions(+), 45 deletions(-) diff --git a/front/Navigation.tsx b/front/Navigation.tsx index f5fc58b..1e12973 100644 --- a/front/Navigation.tsx +++ b/front/Navigation.tsx @@ -62,7 +62,7 @@ const protectedRoutes = () => }, Genre: { component: GenreDetailsView, - options: { title: translate('genreFilter')}, + options: { title: translate('genreFilter') }, link: '/genre/:genreId', }, Score: { diff --git a/front/Theme.tsx b/front/Theme.tsx index b6e61ed..ab23d2d 100644 --- a/front/Theme.tsx +++ b/front/Theme.tsx @@ -6,7 +6,7 @@ const ThemeProvider = ({ children }: { children: JSX.Element }) => { const colorScheme = useColorScheme(); const config = { dependencies: { - "linear-gradient": require("expo-linear-gradient").LinearGradient, + 'linear-gradient': require('expo-linear-gradient').LinearGradient, }, }; diff --git a/front/components/SearchBar.tsx b/front/components/SearchBar.tsx index dc70c58..b04cc97 100644 --- a/front/components/SearchBar.tsx +++ b/front/components/SearchBar.tsx @@ -16,7 +16,7 @@ type FilterButton = { const SearchBar = () => { const { filter, updateFilter } = React.useContext(SearchContext); const { stringQuery, updateStringQuery } = React.useContext(SearchContext); - const [ barText, updateBarText ] = React.useState(stringQuery); + const [barText, updateBarText] = React.useState(stringQuery); const debouncedUpdateStringQuery = debounce(updateStringQuery, 500); diff --git a/front/components/SearchResult.tsx b/front/components/SearchResult.tsx index 962d916..85e371f 100644 --- a/front/components/SearchResult.tsx +++ b/front/components/SearchResult.tsx @@ -31,7 +31,6 @@ import { useNavigation } from '../Navigation'; import Artist from '../models/Artist'; import SongRow from '../components/SongRow'; - const swaToSongCardProps = (song: SongWithArtist) => ({ songId: song.id, name: song.name, @@ -159,15 +158,17 @@ const ArtistSearchComponent = (props: ItemSearchComponentProps) => { {artistData?.length ? ( ({ - image: API.getArtistIllustration(artistData.id), - name: artistData.name, - id: artistData.id, - onPress: () => { - API.createSearchHistoryEntry(artistData.name, 'artist'); - navigation.navigate('Artist', { artistId: artistData.id }); - }, - }))} + content={artistData + .slice(0, props.maxItems ?? artistData.length) + .map((artistData) => ({ + image: API.getArtistIllustration(artistData.id), + name: artistData.name, + id: artistData.id, + onPress: () => { + API.createSearchHistoryEntry(artistData.name, 'artist'); + navigation.navigate('Artist', { artistId: artistData.id }); + }, + }))} cardComponent={ArtistCard} /> ) : ( @@ -194,7 +195,7 @@ const GenreSearchComponent = (props: ItemSearchComponentProps) => { id: g.id, onPress: () => { API.createSearchHistoryEntry(g.name, 'genre'); - navigation.navigate('Genre', {genreId: g.id}); + navigation.navigate('Genre', { genreId: g.id }); }, }))} cardComponent={GenreCard} diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx index 5ac3189..d88eaf6 100644 --- a/front/components/SongRow.tsx +++ b/front/components/SongRow.tsx @@ -1,8 +1,8 @@ -import { HStack, IconButton, Image, Text } from "native-base"; -import Song, { SongWithArtist } from "../models/Song"; -import RowCustom from "./RowCustom"; -import TextButton from "./TextButton"; -import { MaterialIcons } from "@expo/vector-icons"; +import { HStack, IconButton, Image, Text } from 'native-base'; +import Song, { SongWithArtist } from '../models/Song'; +import RowCustom from './RowCustom'; +import TextButton from './TextButton'; +import { MaterialIcons } from '@expo/vector-icons'; type SongRowProps = { song: Song | SongWithArtist; // TODO: remove Song diff --git a/front/i18n/Translations.ts b/front/i18n/Translations.ts index 040fe5c..07684ea 100644 --- a/front/i18n/Translations.ts +++ b/front/i18n/Translations.ts @@ -43,7 +43,7 @@ export const en = { artistFilter: 'Artists', songsFilter: 'Songs', genreFilter: 'Genres', - favoriteFilter: 'Favorites', + favoriteFilter: 'Favorites', // profile page user: 'Profile', @@ -232,7 +232,7 @@ export const fr: typeof en = { artistFilter: 'Artistes', songsFilter: 'Morceaux', genreFilter: 'Genres', - favoriteFilter: 'Favoris', + favoriteFilter: 'Favoris', // Difficulty settings diffBtn: 'Difficulté', @@ -430,7 +430,7 @@ export const sp: typeof en = { artistFilter: 'Artistas', songsFilter: 'canciones', genreFilter: 'géneros', - favoriteFilter: 'Favorites', + favoriteFilter: 'Favorites', // Difficulty settings diffBtn: 'Dificultad', diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index eae2ee4..555157e 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -32,14 +32,18 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => return ( - + + style={{ height: '100%', width: '100%' }} + /> - {artistQuery.data.name} + + {artistQuery.data.name} + {songsQuery.data.map((comp: Song, index: Key | null | undefined) => ( @@ -59,4 +63,4 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => ); }; -export default ArtistDetailsView; \ No newline at end of file +export default ArtistDetailsView; diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index df3655b..8ee28ee 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -10,20 +10,25 @@ import { LinearGradient } from 'expo-linear-gradient'; type GenreDetailsViewProps = { genreId: number; -} +}; const GenreDetailsView = ({ genreId }: RouteProps) => { - const genreQuery = useQuery(API.getGenre(genreId)) - const songsQuery = useQuery(API.getSongsByGenre(genreId)) - const artistQueries = useQueries(songsQuery.data?.map((song) => song.artistId).map((artistId) => API.getArtist(artistId)) ?? []); + const genreQuery = useQuery(API.getGenre(genreId)); + const songsQuery = useQuery(API.getSongsByGenre(genreId)); + const artistQueries = useQueries( + songsQuery.data?.map((song) => song.artistId).map((artistId) => API.getArtist(artistId)) ?? + [] + ); // Here, .artist will always be defined - const songWithArtist = songsQuery?.data?.map((song) => ({ - ...song, - artist: artistQueries.find((query) => query.data?.id == song.artistId)?.data - })).filter((song) => song.artist !== undefined); + const songWithArtist = songsQuery?.data + ?.map((song) => ({ + ...song, + artist: artistQueries.find((query) => query.data?.id == song.artistId)?.data, + })) + .filter((song) => song.artist !== undefined); - const screenSize = useBreakpointValue({ base: "small", md: "big" }); - const isMobileView = screenSize == "small"; + const screenSize = useBreakpointValue({ base: 'small', md: 'big' }); + const isMobileView = screenSize == 'small'; const fadeColor = useColorModeValue('#ffffff', '#000000'); const navigation = useNavigation(); @@ -38,13 +43,17 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { return ( + style={{ width: '100%', height: isMobileView ? 200 : 300 }} + source={{ uri: API.getGenreIllustration(genreQuery.data.id) }} + > + style={{ height: '100%', width: '100%' }} + /> - {genreQuery.data.name} + + {genreQuery.data.name} + ) => { /> -); -} + ); +}; -export default GenreDetailsView; \ No newline at end of file +export default GenreDetailsView; From 64640eda55d3a8c0a3cb2d26832aca1aaac162ac Mon Sep 17 00:00:00 2001 From: danis Date: Sat, 9 Sep 2023 19:18:30 +0200 Subject: [PATCH 065/133] lints fix --- front/Theme.tsx | 6 ------ front/components/SearchResult.tsx | 8 +------- front/components/SongRow.tsx | 3 +-- front/views/ArtistDetailsView.tsx | 2 +- front/views/GenreDetailsView.tsx | 2 +- 5 files changed, 4 insertions(+), 17 deletions(-) diff --git a/front/Theme.tsx b/front/Theme.tsx index ab23d2d..6d7fc57 100644 --- a/front/Theme.tsx +++ b/front/Theme.tsx @@ -4,15 +4,9 @@ import { useEffect } from 'react'; const ThemeProvider = ({ children }: { children: JSX.Element }) => { const colorScheme = useColorScheme(); - const config = { - dependencies: { - 'linear-gradient': require('expo-linear-gradient').LinearGradient, - }, - }; return ( { export const SearchResultComponent = () => { const { stringQuery } = React.useContext(SearchContext); - const { filter } = React.useContext(SearchContext); const shouldOutput = !!stringQuery.trim(); return shouldOutput ? ( diff --git a/front/components/SongRow.tsx b/front/components/SongRow.tsx index d88eaf6..4a61c83 100644 --- a/front/components/SongRow.tsx +++ b/front/components/SongRow.tsx @@ -1,8 +1,7 @@ -import { HStack, IconButton, Image, Text } from 'native-base'; +import { HStack, Image, Text } from 'native-base'; import Song, { SongWithArtist } from '../models/Song'; import RowCustom from './RowCustom'; import TextButton from './TextButton'; -import { MaterialIcons } from '@expo/vector-icons'; type SongRowProps = { song: Song | SongWithArtist; // TODO: remove Song diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 555157e..e7a7b03 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -2,7 +2,7 @@ import { Box, Heading, useBreakpointValue, ScrollView, useColorModeValue } from import { useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import API from '../API'; -import Song, { SongWithArtist } from '../models/Song'; +import Song from '../models/Song'; import SongRow from '../components/SongRow'; import { Key } from 'react'; import { RouteProps, useNavigation } from '../Navigation'; diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 8ee28ee..8161f8c 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -1,4 +1,4 @@ -import { Box, Flex, Heading, useBreakpointValue, ScrollView, useColorModeValue } from 'native-base'; +import { Flex, Heading, useBreakpointValue, ScrollView, useColorModeValue } from 'native-base'; import { useQueries, useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import { RouteProps, useNavigation } from '../Navigation'; From 46ef0a7f1bf93fe77fea91e6fc5bc21c3f9ae00f Mon Sep 17 00:00:00 2001 From: danis Date: Tue, 12 Sep 2023 22:05:31 +0200 Subject: [PATCH 066/133] remove expo-linear-gradient --- front/package.json | 1 - front/views/ArtistDetailsView.tsx | 5 ----- front/views/GenreDetailsView.tsx | 5 ----- 3 files changed, 11 deletions(-) diff --git a/front/package.json b/front/package.json index cc75dac..f097628 100644 --- a/front/package.json +++ b/front/package.json @@ -34,7 +34,6 @@ "expo": "^47.0.8", "expo-asset": "~8.7.0", "expo-dev-client": "~2.0.1", - "expo-linear-gradient": "^12.3.0", "expo-image-picker": "~14.0.2", "expo-linking": "~3.3.1", "expo-screen-orientation": "~5.0.1", diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index e7a7b03..8a88062 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -7,7 +7,6 @@ import SongRow from '../components/SongRow'; import { Key } from 'react'; import { RouteProps, useNavigation } from '../Navigation'; import { ImageBackground } from 'react-native'; -import { LinearGradient } from 'expo-linear-gradient'; type ArtistDetailsViewProps = { artistId: number; @@ -35,10 +34,6 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => style={{ width: '100%', height: isMobileView ? 200 : 300 }} source={{ uri: API.getArtistIllustration(artistQuery.data.id) }} > - diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index 8161f8c..c9f4486 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -6,7 +6,6 @@ import API from '../API'; import CardGridCustom from '../components/CardGridCustom'; import SongCard from '../components/SongCard'; import { ImageBackground } from 'react-native'; -import { LinearGradient } from 'expo-linear-gradient'; type GenreDetailsViewProps = { genreId: number; @@ -46,10 +45,6 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { style={{ width: '100%', height: isMobileView ? 200 : 300 }} source={{ uri: API.getGenreIllustration(genreQuery.data.id) }} > - {genreQuery.data.name} From 1fefe7912da56a1870cb047b614b5242f6d212f8 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Thu, 14 Sep 2023 11:37:50 +0200 Subject: [PATCH 067/133] Front: Run Pretty --- front/views/ArtistDetailsView.tsx | 3 +-- front/views/GenreDetailsView.tsx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 8a88062..15026b1 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -33,8 +33,7 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => - + > {artistQuery.data.name} diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index c9f4486..d1d3990 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -44,8 +44,7 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { - + > {genreQuery.data.name} From 70ab56ce3a69da665a0ffba1a84f52d6fa82c47a Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Thu, 14 Sep 2023 11:41:38 +0200 Subject: [PATCH 068/133] Front: Remove unused value --- front/views/ArtistDetailsView.tsx | 3 +-- front/views/GenreDetailsView.tsx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/front/views/ArtistDetailsView.tsx b/front/views/ArtistDetailsView.tsx index 15026b1..61a0328 100644 --- a/front/views/ArtistDetailsView.tsx +++ b/front/views/ArtistDetailsView.tsx @@ -1,4 +1,4 @@ -import { Box, Heading, useBreakpointValue, ScrollView, useColorModeValue } from 'native-base'; +import { Box, Heading, useBreakpointValue, ScrollView } from 'native-base'; import { useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import API from '../API'; @@ -16,7 +16,6 @@ const ArtistDetailsView = ({ artistId }: RouteProps) => const artistQuery = useQuery(API.getArtist(artistId)); const songsQuery = useQuery(API.getSongsByArtist(artistId)); const screenSize = useBreakpointValue({ base: 'small', md: 'big' }); - const fadeColor = useColorModeValue('#ffffff', '#000000'); const isMobileView = screenSize == 'small'; const navigation = useNavigation(); diff --git a/front/views/GenreDetailsView.tsx b/front/views/GenreDetailsView.tsx index d1d3990..e9c632e 100644 --- a/front/views/GenreDetailsView.tsx +++ b/front/views/GenreDetailsView.tsx @@ -1,4 +1,4 @@ -import { Flex, Heading, useBreakpointValue, ScrollView, useColorModeValue } from 'native-base'; +import { Flex, Heading, useBreakpointValue, ScrollView } from 'native-base'; import { useQueries, useQuery } from '../Queries'; import { LoadingView } from '../components/Loading'; import { RouteProps, useNavigation } from '../Navigation'; @@ -28,7 +28,6 @@ const GenreDetailsView = ({ genreId }: RouteProps) => { const screenSize = useBreakpointValue({ base: 'small', md: 'big' }); const isMobileView = screenSize == 'small'; - const fadeColor = useColorModeValue('#ffffff', '#000000'); const navigation = useNavigation(); if (genreQuery.isError || songsQuery.isError) { From 02fc8175f48f9d0ea58dde9d58060c22f9616eab Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 7 Sep 2023 16:58:18 +0200 Subject: [PATCH 069/133] Send mails on account creation --- .envrc | 5 +- back/package-lock.json | 4994 ++++++++++++++++- back/package.json | 3 + .../migrations/20230907141258_/migration.sql | 2 + back/prisma/schema.prisma | 1 + back/src/app.module.ts | 7 + back/src/auth/auth.controller.ts | 9 + flake.lock | 43 - flake.nix | 31 - shell.nix | 21 + 10 files changed, 4852 insertions(+), 264 deletions(-) create mode 100644 back/prisma/migrations/20230907141258_/migration.sql delete mode 100644 flake.lock delete mode 100644 flake.nix create mode 100644 shell.nix diff --git a/.envrc b/.envrc index e31c306..1d953f4 100644 --- a/.envrc +++ b/.envrc @@ -1,4 +1 @@ -if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then - source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs=" -fi -use flake +use nix diff --git a/back/package-lock.json b/back/package-lock.json index bf4a20e..2fcdb92 100644 --- a/back/package-lock.json +++ b/back/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "license": "UNLICENSED", "dependencies": { + "@nestjs-modules/mailer": "^1.9.1", "@nestjs/common": "^10.1.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.1.0", @@ -25,6 +26,7 @@ "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "node-fetch": "^2.6.12", + "nodemailer": "^6.9.5", "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -41,6 +43,7 @@ "@types/jest": "29.5.3", "@types/multer": "^1.4.7", "@types/node": "^20.4.4", + "@types/nodemailer": "^6.4.9", "@types/passport-google-oauth20": "^2.0.11", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.1.0", @@ -400,7 +403,6 @@ "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" } @@ -409,7 +411,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -526,7 +527,6 @@ "version": "7.22.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -711,6 +711,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", @@ -759,7 +770,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -1393,6 +1403,11 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jonkemp/package-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", + "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -1465,6 +1480,85 @@ "node": ">=8" } }, + "node_modules/@nestjs-modules/mailer": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@nestjs-modules/mailer/-/mailer-1.9.1.tgz", + "integrity": "sha512-9kSDgg4qA6+2BXOzfY4IltL70uMGXDeE8u/dhkzM2gnCCOKu8Y+wIxWmh8xyLGYcrFHQ3Mke+ap0O1T98Tyjaw==", + "dependencies": { + "glob": "10.3.3", + "inline-css": "4.0.2", + "mjml": "^4.14.1", + "preview-email": "3.0.19" + }, + "optionalDependencies": { + "@types/ejs": "^3.1.2", + "@types/pug": "2.0.6", + "ejs": "^3.1.9", + "handlebars": "^4.7.7", + "pug": "^3.0.2" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.9 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^7.0.9 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "@types/ejs": "^3.0.3", + "@types/pug": "2.0.6", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "nodemailer": "^6.4.6", + "pug": "^3.0.1" + } + }, + "node_modules/@nestjs-modules/mailer/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nestjs-modules/mailer/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs-modules/mailer/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs-modules/mailer/node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@nestjs/cli": { "version": "10.1.10", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.1.10.tgz", @@ -1883,6 +1977,11 @@ "npm": ">=5.0.0" } }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1944,6 +2043,18 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz", "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==" }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1968,6 +2079,14 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -2069,6 +2188,12 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "node_modules/@types/ejs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz", + "integrity": "sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==", + "optional": true + }, "node_modules/@types/eslint": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", @@ -2193,6 +2318,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" }, + "node_modules/@types/nodemailer": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.9.tgz", + "integrity": "sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/oauth": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", @@ -2244,6 +2378,12 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "optional": true + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -2671,6 +2811,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "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==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2687,7 +2832,6 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -2717,11 +2861,21 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, "engines": { "node": ">=0.4.0" } }, + "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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -2755,11 +2909,42 @@ } } }, + "node_modules/alce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/alce/-/alce-1.2.0.tgz", + "integrity": "sha512-XppPf2S42nO2WhvKzlwzlfcApcXHzjlod30pKmcWjRgLOtqoe5DMuqdiYoM6AgyXksc6A6pV4v1L/WW217e57w==", + "dependencies": { + "esprima": "^1.2.0", + "estraverse": "^1.5.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/alce/node_modules/esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alce/node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, "engines": { "node": ">=6" } @@ -2817,7 +3002,6 @@ "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" @@ -2865,14 +3049,34 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "optional": true }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/babel-jest": { "version": "29.6.1", @@ -2965,6 +3169,17 @@ "@babel/core": "^7.0.0" } }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2998,6 +3213,11 @@ "node": ">=6.0.0" } }, + "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==" + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -3016,7 +3236,6 @@ "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" } @@ -3082,6 +3301,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "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==" + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -3098,7 +3322,6 @@ "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" @@ -3108,7 +3331,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3258,6 +3480,15 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3311,17 +3542,60 @@ "node": ">=10" } }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dependencies": { + "is-regex": "^1.0.3" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "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", @@ -3357,7 +3631,6 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, "funding": [ { "type": "github", @@ -3389,6 +3662,25 @@ "validator": "^13.7.0" } }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/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==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3496,7 +3788,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3532,14 +3823,12 @@ "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3555,11 +3844,29 @@ "typedarray": "^0.0.6" } }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3601,8 +3908,7 @@ "node_modules/cookiejar": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "node_modules/core-util-is": { "version": "1.0.3", @@ -3656,11 +3962,57 @@ "node": ">= 8" } }, + "node_modules/css-rules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", + "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", + "dependencies": { + "cssom": "^0.5.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -3679,17 +4031,23 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "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==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "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" } @@ -3862,11 +4220,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/degenerator": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.4.tgz", + "integrity": "sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==", + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.17" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -3888,20 +4259,31 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "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" } }, + "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==" + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -3937,6 +4319,134 @@ "node": ">=8" } }, + "node_modules/display-notification": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/display-notification/-/display-notification-2.0.0.tgz", + "integrity": "sha512-TdmtlAcdqy1NU+j7zlkDdMnCL878zriLaBmoD9quOoq1ySSSGv03l0hXK5CvIFZlIfFI/hizqdQuW+Num7xuhw==", + "dependencies": { + "escape-string-applescript": "^1.0.0", + "run-applescript": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/display-notification/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/display-notification/node_modules/execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/display-notification/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/display-notification/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/display-notification/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/display-notification/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/display-notification/node_modules/run-applescript": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-3.2.0.tgz", + "integrity": "sha512-Ep0RsvAjnRcBX1p5vogbaBdAGu/8j/ewpvGqnQYunnLd9SM0vWcPJewPKNnWFggf0hF0pwIgwV5XK7qQ7UZ8Qg==", + "dependencies": { + "execa": "^0.10.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/display-notification/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/display-notification/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/display-notification/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/display-notification/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -3949,6 +4459,62 @@ "node": ">=6.0.0" } }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "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==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { "version": "16.1.4", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", @@ -3981,11 +4547,73 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "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==" }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "optional": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.468", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", @@ -4017,6 +4645,14 @@ "node": ">= 0.8" } }, + "node_modules/encoding-japanese": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.0.0.tgz", + "integrity": "sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==", + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -4039,6 +4675,17 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4058,16 +4705,34 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==" }, + "node_modules/escape-string-applescript": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/escape-string-applescript/-/escape-string-applescript-1.0.0.tgz", + "integrity": "sha512-4/hFwoYaC6TkpDn9A3pTC52zQPArFeXuIfhUtCGYdauTzXVP9H3BDr3oO/QzQehMpLDC7srvYgfwvImPFGfvBA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4080,6 +4745,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/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==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/eslint": { "version": "8.45.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", @@ -4280,7 +5022,6 @@ "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" @@ -4335,7 +5076,6 @@ "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" } @@ -4344,7 +5084,6 @@ "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" } @@ -4511,6 +5250,11 @@ "node": ">= 0.8" } }, + "node_modules/extend-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extend-object/-/extend-object-1.0.0.tgz", + "integrity": "sha512-0dHDIXC7y7LDmCh/lp1oYkmv73K25AMugQI07r8eFopkW6f7Ufn1q+ETMsJjnV9Am14SlElkqy3O92r6xEaxPw==" + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -4525,6 +5269,17 @@ "node": ">=4" } }, + "node_modules/extract-css": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-3.0.1.tgz", + "integrity": "sha512-mLNcMxYX7JVPcGUw7pgjczasLnvimYGlXFWuSx2YQ421sZDlBq4Dh0UzsSeXutf80Z0P2BtV5ZZt0FbaWTOxsQ==", + "dependencies": { + "batch": "^0.6.1", + "href-content": "^2.0.2", + "list-stylesheets": "^2.0.1", + "style-data": "^2.0.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4562,8 +5317,7 @@ "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==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -4624,11 +5378,48 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/filelist": { + "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==", + "optional": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4682,6 +5473,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fixpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fixpack/-/fixpack-4.0.0.tgz", + "integrity": "sha512-5SM1+H2CcuJ3gGEwTiVo/+nd/hYpNj9Ch3iMDOQ58ndY+VGQ2QdvaUTkd3otjZvYnd/8LF/HkJ5cx7PBq0orCQ==", + "dependencies": { + "alce": "1.2.0", + "chalk": "^3.0.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "extend-object": "^1.0.0", + "rc": "^1.2.8" + }, + "bin": { + "fixpack": "bin/fixpack" + } + }, + "node_modules/fixpack/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -4710,6 +5529,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/flat-util": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.9.tgz", + "integrity": "sha512-BOTMw/6rbbxVjv5JQvwgGMc2/6wWGd2VeyTvnzvvE49VRjS0tTxLbry/QVP1yPw8SaAOBYsnixmzruXoqjdUHA==" + }, "node_modules/flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", @@ -4774,7 +5598,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4788,7 +5611,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "dev": true, "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", @@ -4838,14 +5660,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -4855,6 +5675,39 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4873,7 +5726,6 @@ "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.*" } @@ -4901,6 +5753,17 @@ "node": ">=8.0.0" } }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -4913,11 +5776,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4937,7 +5844,6 @@ "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" }, @@ -4989,8 +5895,7 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -4998,6 +5903,36 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "optional": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/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==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5048,21 +5983,108 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/href-content": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.2.tgz", + "integrity": "sha512-f/e40VYI+KciPGfFzfdw1wu8dptpUA9rYQJNbpYVRI217lyuo7nBNO7BjYfTiQMhU/AthfvPDMvj46uAgzUccQ==", + "dependencies": { + "remote-content": "^3.0.1" + } + }, "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==", "dev": true }, + "node_modules/html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dependencies": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier/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==" + }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -5078,6 +6100,31 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -5175,7 +6222,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5186,6 +6232,28 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-css": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-4.0.2.tgz", + "integrity": "sha512-o8iZBpVRCs+v8RyEWKxB+4JRi6A4Wop6f3zzqEi0xVx2eIevbgcjXIKYDmQR2ZZ+DD5IVZ6JII0dt2GhJh8etw==", + "dependencies": { + "cheerio": "^1.0.0-rc.12", + "css-rules": "^1.1.0", + "extract-css": "^3.0.1", + "flat-util": "^1.1.9", + "pick-util": "^1.1.5", + "slick": "^1.12.2", + "specificity": "^0.4.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -5221,6 +6289,11 @@ "node": ">= 0.10" } }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5239,7 +6312,6 @@ "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" }, @@ -5251,7 +6323,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -5274,11 +6345,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5304,7 +6394,6 @@ "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" }, @@ -5343,7 +6432,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -5357,6 +6445,26 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "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==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -5385,7 +6493,6 @@ "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" }, @@ -5397,7 +6504,6 @@ "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" }, @@ -5527,6 +6633,24 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "optional": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", @@ -6102,6 +7226,67 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-beautify": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.9.tgz", + "integrity": "sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^8.1.0", + "nopt": "^6.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6194,6 +7379,41 @@ "npm": ">=6" } }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/juice": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-9.1.0.tgz", + "integrity": "sha512-odblShmPrUoHUwRuC8EmLji5bPP2MLO1GL+gt4XU3tT2ECmbSrrMjtMQaqg3wgMFP2zvUzdPZGfxc5Trk3Z+fQ==", + "dependencies": { + "cheerio": "^1.0.0-rc.12", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/juice/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -6222,6 +7442,14 @@ "node": ">=6" } }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6244,17 +7472,66 @@ "node": ">= 0.8.0" } }, + "node_modules/libbase64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", + "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==" + }, + "node_modules/libmime": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.2.1.tgz", + "integrity": "sha512-A0z9O4+5q+ZTj7QwNe/Juy1KARNb4WaviO4mYeFC4b8dBT2EEqK2pkM+GC8MVnkOjqhl5nYQxRgnPYRRTNmuSQ==", + "dependencies": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "2.0.1" + } + }, + "node_modules/libmime/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/libphonenumber-js": { "version": "1.10.37", "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz", "integrity": "sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==" }, + "node_modules/libqp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-2.0.1.tgz", + "integrity": "sha512-Ka0eC5LkF3IPNQHJmYBWljJsw0UvM6j+QdKRbWyCdTmYwvIDE6a7bCm0UkTAL/K+3KXK5qXT/ClcInU01OpdLg==" + }, "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==", "dev": true }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/list-stylesheets": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-2.0.1.tgz", + "integrity": "sha512-UUEFowqvgRKT1+OJ59Ga5gTfVOP3hkbFo7DwNIZcMuXzJRWndYMHyDYbuqKe6lrw8KCY7c/GN5mEoLx0c54HAw==", + "dependencies": { + "cheerio": "1.0.0-rc.12", + "pick-util": "^1.1.5" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -6312,6 +7589,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6347,6 +7629,73 @@ "node": ">=12" } }, + "node_modules/mailparser": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.6.5.tgz", + "integrity": "sha512-nteTpF0Khm5JLOnt4sigmzNdUH/6mO7PZ4KEnvxf4mckyXYFFhrtAWZzbq/V5aQMH+049gA7ZjfLdh+QiX2Uqg==", + "dependencies": { + "encoding-japanese": "2.0.0", + "he": "1.2.0", + "html-to-text": "9.0.5", + "iconv-lite": "0.6.3", + "libmime": "5.2.1", + "linkify-it": "4.0.1", + "mailsplit": "5.4.0", + "nodemailer": "6.9.3", + "tlds": "1.240.0" + } + }, + "node_modules/mailparser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mailparser/node_modules/nodemailer": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", + "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/mailsplit": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.4.0.tgz", + "integrity": "sha512-wnYxX5D5qymGIPYLwnp6h8n1+6P6vz/MJn5AzGjZ8pwICWssL+CCQjWBIToOVHASmATot4ktvlLo6CyLfOXWYA==", + "dependencies": { + "libbase64": "1.2.1", + "libmime": "5.2.0", + "libqp": "2.0.1" + } + }, + "node_modules/mailsplit/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mailsplit/node_modules/libmime": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.2.0.tgz", + "integrity": "sha512-X2U5Wx0YmK0rXFbk67ASMeqYIkZ6E5vY7pNWRKtnNzqjvdYYG8xtPDpCnuUEnPU9vlgNev+JoSrcaKSUaNvfsw==", + "dependencies": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "2.0.1" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -6394,6 +7743,14 @@ "node": ">= 0.6" } }, + "node_modules/mediaquery-text": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", + "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", + "dependencies": { + "cssom": "^0.5.0" + } + }, "node_modules/memfs": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", @@ -6406,6 +7763,11 @@ "node": ">= 4.0.0" } }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -6490,7 +7852,6 @@ "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" }, @@ -6515,6 +7876,454 @@ "node": ">=8" } }, + "node_modules/mjml": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml/-/mjml-4.14.1.tgz", + "integrity": "sha512-f/wnWWIVbeb/ge3ff7c/KYYizI13QbGIp03odwwkCThsJsacw4gpZZAU7V4gXY3HxSXP2/q3jxOfaHVbkfNpOQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "mjml-cli": "4.14.1", + "mjml-core": "4.14.1", + "mjml-migrate": "4.14.1", + "mjml-preset-core": "4.14.1", + "mjml-validator": "4.13.0" + }, + "bin": { + "mjml": "bin/mjml" + } + }, + "node_modules/mjml-accordion": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-accordion/-/mjml-accordion-4.14.1.tgz", + "integrity": "sha512-dpNXyjnhYwhM75JSjD4wFUa9JgHm86M2pa0CoTzdv1zOQz67ilc4BoK5mc2S0gOjJpjBShM5eOJuCyVIuAPC6w==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-body": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-body/-/mjml-body-4.14.1.tgz", + "integrity": "sha512-YpXcK3o2o1U+fhI8f60xahrhXuHmav6BZez9vIN3ZEJOxPFSr+qgr1cT2iyFz50L5+ZsLIVj2ZY+ALQjdsg8ig==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-button": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-button/-/mjml-button-4.14.1.tgz", + "integrity": "sha512-V1Tl1vQ3lXYvvqHJHvGcc8URr7V1l/ZOsv7iLV4QRrh7kjKBXaRS7uUJtz6/PzEbNsGQCiNtXrODqcijLWlgaw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-carousel": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-carousel/-/mjml-carousel-4.14.1.tgz", + "integrity": "sha512-Ku3MUWPk/TwHxVgKEUtzspy/ePaWtN/3z6/qvNik0KIn0ZUIZ4zvR2JtaVL5nd30LHSmUaNj30XMPkCjYiKkFA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-cli": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-cli/-/mjml-cli-4.14.1.tgz", + "integrity": "sha512-Gy6MnSygFXs0U1qOXTHqBg2vZX2VL/fAacgQzD4MHq4OuybWaTNSzXRwxBXYCxT3IJB874n2Q0Mxp+Xka+tnZg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "chokidar": "^3.0.0", + "glob": "^7.1.1", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.14.1", + "mjml-migrate": "4.14.1", + "mjml-parser-xml": "4.14.1", + "mjml-validator": "4.13.0", + "yargs": "^16.1.0" + }, + "bin": { + "mjml-cli": "bin/mjml" + } + }, + "node_modules/mjml-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mjml-cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-column": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-column/-/mjml-column-4.14.1.tgz", + "integrity": "sha512-iixVCIX1YJtpQuwG2WbDr7FqofQrlTtGQ4+YAZXGiLThs0En3xNIJFQX9xJ8sgLEGGltyooHiNICBRlzSp9fDg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-core": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-core/-/mjml-core-4.14.1.tgz", + "integrity": "sha512-di88rSfX+8r4r+cEqlQCO7CRM4mYZrfe2wSCu2je38i+ujjkLpF72cgLnjBlSG5aOUCZgYvlsZ85stqIz9LQfA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "cheerio": "1.0.0-rc.12", + "detect-node": "^2.0.4", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "juice": "^9.0.0", + "lodash": "^4.17.21", + "mjml-migrate": "4.14.1", + "mjml-parser-xml": "4.14.1", + "mjml-validator": "4.13.0" + } + }, + "node_modules/mjml-divider": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-divider/-/mjml-divider-4.14.1.tgz", + "integrity": "sha512-agqWY0aW2xaMiUOhYKDvcAAfOLalpbbtjKZAl1vWmNkURaoK4L7MgDilKHSJDFUlHGm2ZOArTrq8i6K0iyThBQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-group": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-group/-/mjml-group-4.14.1.tgz", + "integrity": "sha512-dJt5batgEJ7wxlxzqOfHOI94ABX+8DZBvAlHuddYO4CsLFHYv6XRIArLAMMnAKU76r6p3X8JxYeOjKZXdv49kg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head/-/mjml-head-4.14.1.tgz", + "integrity": "sha512-KoCbtSeTAhx05Ugn9TB2UYt5sQinSCb7RGRer5iPQ3CrXj8hT5B5Svn6qvf/GACPkWl4auExHQh+XgLB+r3OEA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head-attributes": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-attributes/-/mjml-head-attributes-4.14.1.tgz", + "integrity": "sha512-XdUNOp2csK28kBDSistInOyzWNwmu5HDNr4y1Z7vSQ1PfkmiuS6jWG7jHUjdoMhs27e6Leuyyc6a8gWSpqSWrg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head-breakpoint": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-breakpoint/-/mjml-head-breakpoint-4.14.1.tgz", + "integrity": "sha512-Qw9l/W/I5Z9p7I4ShgnEpAL9if4472ejcznbBnp+4Gq+sZoPa7iYoEPsa9UCGutlaCh3N3tIi2qKhl9qD8DFxA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head-font": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-font/-/mjml-head-font-4.14.1.tgz", + "integrity": "sha512-oBYm1gaOdEMjE5BoZouRRD4lCNZ1jcpz92NR/F7xDyMaKCGN6T/+r4S5dq1gOLm9zWqClRHaECdFJNEmrDpZqA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head-html-attributes": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-html-attributes/-/mjml-head-html-attributes-4.14.1.tgz", + "integrity": "sha512-vlJsJc1Sm4Ml2XvLmp01zsdmWmzm6+jNCO7X3eYi9ngEh8LjMCLIQOncnOgjqm9uGpQu2EgUhwvYFZP2luJOVg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head-preview": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-preview/-/mjml-head-preview-4.14.1.tgz", + "integrity": "sha512-89gQtt3fhl2dkYpHLF5HDQXz/RLpzecU6wmAIT7Dz6etjLGE1dgq2Ay6Bu/OeHjDcT1gbM131zvBwuXw8OydNw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head-style": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-style/-/mjml-head-style-4.14.1.tgz", + "integrity": "sha512-XryOuf32EDuUCBT2k99C1+H87IOM919oY6IqxKFJCDkmsbywKIum7ibhweJdcxiYGONKTC6xjuibGD3fQTTYNQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-head-title": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-title/-/mjml-head-title-4.14.1.tgz", + "integrity": "sha512-aIfpmlQdf1eJZSSrFodmlC4g5GudBti2eMyG42M7/3NeLM6anEWoe+UkF/6OG4Zy0tCQ40BDJ5iBZlMsjQICzw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-hero": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-hero/-/mjml-hero-4.14.1.tgz", + "integrity": "sha512-TQJ3yfjrKYGkdEWjHLHhL99u/meKFYgnfJvlo9xeBvRjSM696jIjdqaPHaunfw4CP6d2OpCIMuacgOsvqQMWOA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-image": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-image/-/mjml-image-4.14.1.tgz", + "integrity": "sha512-jfKLPHXuFq83okwlNM1Um/AEWeVDgs2JXIOsWp2TtvXosnRvGGMzA5stKLYdy1x6UfKF4c1ovpMS162aYGp+xQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-migrate": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-migrate/-/mjml-migrate-4.14.1.tgz", + "integrity": "sha512-d+9HKQOhZi3ZFAaFSDdjzJX9eDQGjMf3BArLWNm2okC4ZgfJSpOc77kgCyFV8ugvwc8fFegPnSV60Jl4xtvK2A==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.14.1", + "mjml-parser-xml": "4.14.1", + "yargs": "^16.1.0" + }, + "bin": { + "migrate": "lib/cli.js" + } + }, + "node_modules/mjml-migrate/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mjml-migrate/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-migrate/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-navbar": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-navbar/-/mjml-navbar-4.14.1.tgz", + "integrity": "sha512-rNy1Kw8CR3WQ+M55PFBAUDz2VEOjz+sk06OFnsnmNjoMVCjo1EV7OFLDAkmxAwqkC8h4zQWEOFY0MBqqoAg7+A==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-parser-xml": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-parser-xml/-/mjml-parser-xml-4.14.1.tgz", + "integrity": "sha512-9WQVeukbXfq9DUcZ8wOsHC6BTdhaVwTAJDYMIQglXLwKwN7I4pTCguDDHy5d0kbbzK5OCVxCdZe+bfVI6XANOQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "detect-node": "2.0.4", + "htmlparser2": "^8.0.1", + "lodash": "^4.17.15" + } + }, + "node_modules/mjml-parser-xml/node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "node_modules/mjml-preset-core": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-preset-core/-/mjml-preset-core-4.14.1.tgz", + "integrity": "sha512-uUCqK9Z9d39rwB/+JDV2KWSZGB46W7rPQpc9Xnw1DRP7wD7qAfJwK6AZFCwfTgWdSxw0PwquVNcrUS9yBa9uhw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "mjml-accordion": "4.14.1", + "mjml-body": "4.14.1", + "mjml-button": "4.14.1", + "mjml-carousel": "4.14.1", + "mjml-column": "4.14.1", + "mjml-divider": "4.14.1", + "mjml-group": "4.14.1", + "mjml-head": "4.14.1", + "mjml-head-attributes": "4.14.1", + "mjml-head-breakpoint": "4.14.1", + "mjml-head-font": "4.14.1", + "mjml-head-html-attributes": "4.14.1", + "mjml-head-preview": "4.14.1", + "mjml-head-style": "4.14.1", + "mjml-head-title": "4.14.1", + "mjml-hero": "4.14.1", + "mjml-image": "4.14.1", + "mjml-navbar": "4.14.1", + "mjml-raw": "4.14.1", + "mjml-section": "4.14.1", + "mjml-social": "4.14.1", + "mjml-spacer": "4.14.1", + "mjml-table": "4.14.1", + "mjml-text": "4.14.1", + "mjml-wrapper": "4.14.1" + } + }, + "node_modules/mjml-raw": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-raw/-/mjml-raw-4.14.1.tgz", + "integrity": "sha512-9+4wzoXnCtfV6QPmjfJkZ50hxFB4Z8QZnl2Ac0D1Cn3dUF46UkmO5NLMu7UDIlm5DdFyycZrMOwvZS4wv9ksPw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-section": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-section/-/mjml-section-4.14.1.tgz", + "integrity": "sha512-Ik5pTUhpT3DOfB3hEmAWp8rZ0ilWtIivnL8XdUJRfgYE9D+MCRn+reIO+DAoJHxiQoI6gyeKkIP4B9OrQ7cHQw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-social": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-social/-/mjml-social-4.14.1.tgz", + "integrity": "sha512-G44aOZXgZHukirjkeQWTTV36UywtE2YvSwWGNfo/8d+k5JdJJhCIrlwaahyKEAyH63G1B0Zt8b2lEWx0jigYUw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-spacer": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-spacer/-/mjml-spacer-4.14.1.tgz", + "integrity": "sha512-5SfQCXTd3JBgRH1pUy6NVZ0lXBiRqFJPVHBdtC3OFvUS3q1w16eaAXlIUWMKTfy8CKhQrCiE6m65kc662ZpYxA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-table": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-table/-/mjml-table-4.14.1.tgz", + "integrity": "sha512-aVBdX3WpyKVGh/PZNn2KgRem+PQhWlvnD00DKxDejRBsBSKYSwZ0t3EfFvZOoJ9DzfHsN0dHuwd6Z18Ps44NFQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-text": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-text/-/mjml-text-4.14.1.tgz", + "integrity": "sha512-yZuvf5z6qUxEo5CqOhCUltJlR6oySKVcQNHwoV5sneMaKdmBiaU4VDnlYFera9gMD9o3KBHIX6kUg7EHnCwBRQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "node_modules/mjml-validator": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-validator/-/mjml-validator-4.13.0.tgz", + "integrity": "sha512-uURYfyQYtHJ6Qz/1A7/+E9ezfcoISoLZhYK3olsxKRViwaA2Mm8gy/J3yggZXnsUXWUns7Qymycm5LglLEIiQg==", + "dependencies": { + "@babel/runtime": "^7.14.6" + } + }, + "node_modules/mjml-wrapper": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-wrapper/-/mjml-wrapper-4.14.1.tgz", + "integrity": "sha512-aA5Xlq6d0hZ5LY+RvSaBqmVcLkvPvdhyAv3vQf3G41Gfhel4oIPmkLnVpHselWhV14A0KwIOIAKVxHtSAxyOTQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1", + "mjml-section": "4.14.1" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -6578,7 +8387,28 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "devOptional": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } }, "node_modules/node-abort-controller": { "version": "3.1.1", @@ -6626,11 +8456,32 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, + "node_modules/nodemailer": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", + "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "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" } @@ -6647,6 +8498,17 @@ "node": ">=8" } }, + "node_modules/nth-check": { + "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==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -6683,7 +8545,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -6786,6 +8647,28 @@ "node": ">=0.10.0" } }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6816,6 +8699,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6825,6 +8719,60 @@ "node": ">=6" } }, + "node_modules/p-wait-for": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-3.2.0.tgz", + "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==", + "dependencies": { + "p-timeout": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6855,6 +8803,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6952,7 +8935,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6968,8 +8950,7 @@ "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==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.1", @@ -7022,6 +9003,22 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==", "peer": true }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/pick-util": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", + "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", + "dependencies": { + "@jonkemp/package-utils": "^1.0.8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -7032,7 +9029,6 @@ "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" }, @@ -7184,6 +9180,56 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/preview-email": { + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/preview-email/-/preview-email-3.0.19.tgz", + "integrity": "sha512-DBS3Nir18YtKc8loYCCOGitmiaQ0vTdahPoiXxwNweJDpmVZo+w3tppufOhoK0m8skpRxT56llYLs3VrORnmNQ==", + "dependencies": { + "ci-info": "^3.8.0", + "display-notification": "2.0.0", + "fixpack": "^4.0.0", + "get-port": "5.1.1", + "mailparser": "^3.6.4", + "nodemailer": "^6.9.2", + "open": "7", + "p-event": "4.2.0", + "p-wait-for": "3.2.0", + "pug": "^3.0.2", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/preview-email/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/preview-email/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prisma": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.0.0.tgz", @@ -7205,6 +9251,14 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -7218,6 +9272,11 @@ "node": ">= 6" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7230,6 +9289,154 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/proxy-agent/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "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==" + }, + "node_modules/pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dependencies": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -7330,6 +9537,28 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -7359,7 +9588,6 @@ "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" }, @@ -7384,6 +9612,29 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remote-content": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-3.0.1.tgz", + "integrity": "sha512-zEMsvb4GgxVKBBTHgy2tte67RYBZx2Kyg9mTYpg+JfATHDqYJqhuC3zG1VoiYhDVP5JaB5+mPKcAvdnT0n3jxA==", + "dependencies": { + "proxy-from-env": "^1.1.0", + "superagent": "^8.0.9", + "superagent-proxy": "^3.0.0" + } + }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -7397,7 +9648,6 @@ "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" } @@ -7415,7 +9665,6 @@ "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, "dependencies": { "is-core-module": "^2.8.1", "path-parse": "^1.0.7", @@ -7686,6 +9935,17 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -7821,8 +10081,7 @@ "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==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -7839,6 +10098,54 @@ "node": ">=8" } }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "engines": { + "node": "*" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -7867,6 +10174,14 @@ "node": ">=0.10.0" } }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "bin": { + "specificity": "bin/specificity" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7995,6 +10310,14 @@ "node": ">=8" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -8016,11 +10339,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-data": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/style-data/-/style-data-2.0.1.tgz", + "integrity": "sha512-frUbteLGDoNEJhbMIWtyNE1VRduZXmZozhct4F+qN++OzIQZNZJ8KToZlDEl3eaedRYlDfKvUoMFMyrZj4x/sg==", + "dependencies": { + "cheerio": "^1.0.0-rc.12", + "mediaquery-text": "^1.2.0", + "pick-util": "^1.1.5" + } + }, "node_modules/superagent": { "version": "8.0.9", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", - "dev": true, "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -8037,11 +10369,25 @@ "node": ">=6.4.0 <13 || >=14" } }, + "node_modules/superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "dependencies": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "superagent": ">= 0.15.4 || 1 || 2 || 3" + } + }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, "bin": { "mime": "cli.js" }, @@ -8077,7 +10423,6 @@ "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" }, @@ -8263,6 +10608,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tlds": { + "version": "1.240.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.240.0.tgz", + "integrity": "sha512-1OYJQenswGZSOdRw7Bql5Qu7uf75b+F3HFBXbqnG/ifHa0fev1XcG+3pJf3pA/KC6RtHQzfKgIf1vkMlMG7mtQ==", + "bin": { + "tlds": "bin.js" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -8285,7 +10638,6 @@ "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" } @@ -8294,7 +10646,6 @@ "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, "dependencies": { "is-number": "^7.0.0" }, @@ -8310,6 +10661,11 @@ "node": ">=0.6" } }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -8546,6 +10902,22 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/uid": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", @@ -8618,6 +10990,11 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8674,6 +11051,14 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "engines": { + "node": ">=10" + } + }, "node_modules/validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -8690,6 +11075,30 @@ "node": ">= 0.8" } }, + "node_modules/vm2": { + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -8721,6 +11130,123 @@ "defaults": "^1.0.3" } }, + "node_modules/web-resource-inliner": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", + "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -8876,11 +11402,38 @@ "node": ">=8.12.0" } }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "optional": true + }, "node_modules/wrap-ansi": { "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", @@ -8913,8 +11466,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -8929,6 +11481,14 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "engines": { + "node": "*" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -8941,7 +11501,6 @@ "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" } @@ -9265,14 +11824,12 @@ "@babel/helper-string-parser": { "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 + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" }, "@babel/helper-validator-option": { "version": "7.22.5", @@ -9363,8 +11920,7 @@ "@babel/parser": { "version": "7.22.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", - "dev": true + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -9492,6 +12048,14 @@ "@babel/helper-plugin-utils": "^7.22.5" } }, + "@babel/runtime": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, "@babel/template": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", @@ -9533,7 +12097,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -10016,6 +12579,11 @@ "chalk": "^4.0.0" } }, + "@jonkemp/package-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", + "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==" + }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -10078,6 +12646,57 @@ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==" }, + "@nestjs-modules/mailer": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@nestjs-modules/mailer/-/mailer-1.9.1.tgz", + "integrity": "sha512-9kSDgg4qA6+2BXOzfY4IltL70uMGXDeE8u/dhkzM2gnCCOKu8Y+wIxWmh8xyLGYcrFHQ3Mke+ap0O1T98Tyjaw==", + "requires": { + "@types/ejs": "^3.1.2", + "@types/pug": "2.0.6", + "ejs": "^3.1.9", + "glob": "10.3.3", + "handlebars": "^4.7.7", + "inline-css": "4.0.2", + "mjml": "^4.14.1", + "preview-email": "3.0.19", + "pug": "^3.0.2" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==" + } + } + }, "@nestjs/cli": { "version": "10.1.10", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.1.10.tgz", @@ -10314,6 +12933,11 @@ "node-fetch": "^2.6.1" } }, + "@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -10353,6 +12977,15 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz", "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==" }, + "@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "requires": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + } + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -10377,6 +13010,11 @@ "@sinonjs/commons": "^3.0.0" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -10478,6 +13116,12 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "@types/ejs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz", + "integrity": "sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==", + "optional": true + }, "@types/eslint": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", @@ -10602,6 +13246,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" }, + "@types/nodemailer": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.9.tgz", + "integrity": "sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/oauth": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz", @@ -10653,6 +13306,12 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "optional": true + }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -10991,6 +13650,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11003,8 +13667,7 @@ "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" }, "acorn-import-assertions": { "version": "1.9.0", @@ -11023,8 +13686,15 @@ "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "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==", + "requires": { + "debug": "4" + } }, "ajv": { "version": "8.12.0", @@ -11047,11 +13717,31 @@ "ajv": "^8.0.0" } }, + "alce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/alce/-/alce-1.2.0.tgz", + "integrity": "sha512-XppPf2S42nO2WhvKzlwzlfcApcXHzjlod30pKmcWjRgLOtqoe5DMuqdiYoM6AgyXksc6A6pV4v1L/WW217e57w==", + "requires": { + "esprima": "^1.2.0", + "estraverse": "^1.5.0" + }, + "dependencies": { + "esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==" + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==" + } + } + }, "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" }, "ansi-escapes": { "version": "4.3.2", @@ -11087,7 +13777,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -11129,14 +13818,31 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "requires": { + "tslib": "^2.0.1" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "optional": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "babel-jest": { "version": "29.6.1", @@ -11208,6 +13914,14 @@ "babel-preset-current-node-syntax": "^1.0.0" } }, + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "requires": { + "@babel/types": "^7.9.6" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -11224,6 +13938,11 @@ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" }, + "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==" + }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -11238,8 +13957,7 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bl": { "version": "4.1.0", @@ -11299,6 +14017,11 @@ } } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -11312,7 +14035,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11322,7 +14044,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -11414,6 +14135,15 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -11441,17 +14171,51 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "requires": { + "is-regex": "^1.0.3" + } + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -11472,8 +14236,7 @@ "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" }, "cjs-module-lexer": { "version": "1.2.3", @@ -11496,6 +14259,21 @@ "validator": "^13.7.0" } }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -11573,7 +14351,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -11600,14 +14377,12 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -11620,11 +14395,29 @@ "typedarray": "^0.0.6" } }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "requires": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -11657,8 +14450,7 @@ "cookiejar": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "core-util-is": { "version": "1.0.3", @@ -11703,11 +14495,45 @@ "which": "^2.0.1" } }, + "css-rules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", + "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", + "requires": { + "cssom": "^0.5.0" + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -11718,17 +14544,20 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "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==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "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 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, "default-browser": { "version": "4.0.0", @@ -11834,11 +14663,21 @@ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true }, + "degenerator": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.4.tgz", + "integrity": "sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==", + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.17" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "depd": { "version": "2.0.0", @@ -11850,17 +14689,25 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" + }, "detect-newline": { "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 + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, "requires": { "asap": "^2.0.0", "wrappy": "1" @@ -11887,6 +14734,100 @@ "path-type": "^4.0.0" } }, + "display-notification": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/display-notification/-/display-notification-2.0.0.tgz", + "integrity": "sha512-TdmtlAcdqy1NU+j7zlkDdMnCL878zriLaBmoD9quOoq1ySSSGv03l0hXK5CvIFZlIfFI/hizqdQuW+Num7xuhw==", + "requires": { + "escape-string-applescript": "^1.0.0", + "run-applescript": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + }, + "run-applescript": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-3.2.0.tgz", + "integrity": "sha512-Ep0RsvAjnRcBX1p5vogbaBdAGu/8j/ewpvGqnQYunnLd9SM0vWcPJewPKNnWFggf0hF0pwIgwV5XK7qQ7UZ8Qg==", + "requires": { + "execa": "^0.10.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -11896,6 +14837,44 @@ "esutils": "^2.0.2" } }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "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==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, "dotenv": { "version": "16.1.4", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", @@ -11919,11 +14898,54 @@ "safe-buffer": "^5.0.1" } }, + "editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "requires": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" + }, + "minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "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==" }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "optional": true, + "requires": { + "jake": "^10.8.5" + } + }, "electron-to-chromium": { "version": "1.4.468", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", @@ -11946,6 +14968,11 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, + "encoding-japanese": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.0.0.tgz", + "integrity": "sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==" + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -11965,6 +14992,11 @@ "tapable": "^2.2.0" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -11983,20 +15015,84 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==" }, "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==" }, + "escape-string-applescript": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/escape-string-applescript/-/escape-string-applescript-1.0.0.tgz", + "integrity": "sha512-4/hFwoYaC6TkpDn9A3pTC52zQPArFeXuIfhUtCGYdauTzXVP9H3BDr3oO/QzQehMpLDC7srvYgfwvImPFGfvBA==" + }, "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 }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "eslint": { "version": "8.45.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", @@ -12134,8 +15230,7 @@ "esprima": { "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 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.5.0", @@ -12174,14 +15269,12 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -12319,6 +15412,11 @@ } } }, + "extend-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extend-object/-/extend-object-1.0.0.tgz", + "integrity": "sha512-0dHDIXC7y7LDmCh/lp1oYkmv73K25AMugQI07r8eFopkW6f7Ufn1q+ETMsJjnV9Am14SlElkqy3O92r6xEaxPw==" + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -12330,6 +15428,17 @@ "tmp": "^0.0.33" } }, + "extract-css": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-3.0.1.tgz", + "integrity": "sha512-mLNcMxYX7JVPcGUw7pgjczasLnvimYGlXFWuSx2YQ421sZDlBq4Dh0UzsSeXutf80Z0P2BtV5ZZt0FbaWTOxsQ==", + "requires": { + "batch": "^0.6.1", + "href-content": "^2.0.2", + "list-stylesheets": "^2.0.1", + "style-data": "^2.0.1" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12364,8 +15473,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "fast-safe-stringify": { "version": "2.1.1", @@ -12416,11 +15524,44 @@ "flat-cache": "^3.0.4" } }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==" + }, + "filelist": { + "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==", + "optional": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "optional": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -12464,6 +15605,30 @@ "path-exists": "^4.0.0" } }, + "fixpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fixpack/-/fixpack-4.0.0.tgz", + "integrity": "sha512-5SM1+H2CcuJ3gGEwTiVo/+nd/hYpNj9Ch3iMDOQ58ndY+VGQ2QdvaUTkd3otjZvYnd/8LF/HkJ5cx7PBq0orCQ==", + "requires": { + "alce": "1.2.0", + "chalk": "^3.0.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "extend-object": "^1.0.0", + "rc": "^1.2.8" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -12485,6 +15650,11 @@ } } }, + "flat-util": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.9.tgz", + "integrity": "sha512-BOTMw/6rbbxVjv5JQvwgGMc2/6wWGd2VeyTvnzvvE49VRjS0tTxLbry/QVP1yPw8SaAOBYsnixmzruXoqjdUHA==" + }, "flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", @@ -12531,7 +15701,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -12542,7 +15711,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "dev": true, "requires": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", @@ -12580,16 +15748,46 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -12604,8 +15802,7 @@ "get-caller-file": { "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 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.2.1", @@ -12624,17 +15821,59 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, + "get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==" + }, "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 }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12648,7 +15887,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -12685,8 +15923,7 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "graphemer": { "version": "1.4.0", @@ -12694,6 +15931,27 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "optional": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -12723,11 +15981,31 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" + }, + "href-content": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.2.tgz", + "integrity": "sha512-f/e40VYI+KciPGfFzfdw1wu8dptpUA9rYQJNbpYVRI217lyuo7nBNO7BjYfTiQMhU/AthfvPDMvj46uAgzUccQ==", + "requires": { + "remote-content": "^3.0.1" + } }, "html-escaper": { "version": "2.0.2", @@ -12735,6 +16013,50 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "requires": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "dependencies": { + "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==" + } + } + }, + "html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "requires": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -12747,6 +16069,25 @@ "toidentifier": "1.0.1" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "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==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -12803,7 +16144,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -12814,6 +16154,25 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-css": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-4.0.2.tgz", + "integrity": "sha512-o8iZBpVRCs+v8RyEWKxB+4JRi6A4Wop6f3zzqEi0xVx2eIevbgcjXIKYDmQR2ZZ+DD5IVZ6JII0dt2GhJh8etw==", + "requires": { + "cheerio": "^1.0.0-rc.12", + "css-rules": "^1.1.0", + "extract-css": "^3.0.1", + "flat-util": "^1.1.9", + "pick-util": "^1.1.5", + "slick": "^1.12.2", + "specificity": "^0.4.1" + } + }, "inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -12843,6 +16202,11 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -12858,7 +16222,6 @@ "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, "requires": { "binary-extensions": "^2.0.0" } @@ -12867,7 +16230,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -12878,11 +16240,26 @@ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true }, + "is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -12899,7 +16276,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -12922,8 +16298,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-path-inside": { "version": "3.0.3", @@ -12931,6 +16306,20 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "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==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -12947,7 +16336,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "requires": { "is-docker": "^2.0.0" }, @@ -12955,8 +16343,7 @@ "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" } } }, @@ -13051,6 +16438,18 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "optional": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + } + }, "jest": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", @@ -13496,6 +16895,52 @@ } } }, + "js-beautify": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.9.tgz", + "integrity": "sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==", + "requires": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^8.1.0", + "nopt": "^6.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -13567,6 +17012,34 @@ "semver": "^7.3.8" } }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "juice": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-9.1.0.tgz", + "integrity": "sha512-odblShmPrUoHUwRuC8EmLji5bPP2MLO1GL+gt4XU3tT2ECmbSrrMjtMQaqg3wgMFP2zvUzdPZGfxc5Trk3Z+fQ==", + "requires": { + "cheerio": "^1.0.0-rc.12", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + } + } + }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -13592,6 +17065,11 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==" + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -13608,17 +17086,65 @@ "type-check": "~0.4.0" } }, + "libbase64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", + "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==" + }, + "libmime": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.2.1.tgz", + "integrity": "sha512-A0z9O4+5q+ZTj7QwNe/Juy1KARNb4WaviO4mYeFC4b8dBT2EEqK2pkM+GC8MVnkOjqhl5nYQxRgnPYRRTNmuSQ==", + "requires": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "2.0.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "libphonenumber-js": { "version": "1.10.37", "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz", "integrity": "sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==" }, + "libqp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-2.0.1.tgz", + "integrity": "sha512-Ka0eC5LkF3IPNQHJmYBWljJsw0UvM6j+QdKRbWyCdTmYwvIDE6a7bCm0UkTAL/K+3KXK5qXT/ClcInU01OpdLg==" + }, "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==", "dev": true }, + "linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "list-stylesheets": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-2.0.1.tgz", + "integrity": "sha512-UUEFowqvgRKT1+OJ59Ga5gTfVOP3hkbFo7DwNIZcMuXzJRWndYMHyDYbuqKe6lrw8KCY7c/GN5mEoLx0c54HAw==", + "requires": { + "cheerio": "1.0.0-rc.12", + "pick-util": "^1.1.5" + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -13661,6 +17187,11 @@ "is-unicode-supported": "^0.1.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -13684,6 +17215,68 @@ "@jridgewell/sourcemap-codec": "^1.4.13" } }, + "mailparser": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.6.5.tgz", + "integrity": "sha512-nteTpF0Khm5JLOnt4sigmzNdUH/6mO7PZ4KEnvxf4mckyXYFFhrtAWZzbq/V5aQMH+049gA7ZjfLdh+QiX2Uqg==", + "requires": { + "encoding-japanese": "2.0.0", + "he": "1.2.0", + "html-to-text": "9.0.5", + "iconv-lite": "0.6.3", + "libmime": "5.2.1", + "linkify-it": "4.0.1", + "mailsplit": "5.4.0", + "nodemailer": "6.9.3", + "tlds": "1.240.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "nodemailer": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", + "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==" + } + } + }, + "mailsplit": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.4.0.tgz", + "integrity": "sha512-wnYxX5D5qymGIPYLwnp6h8n1+6P6vz/MJn5AzGjZ8pwICWssL+CCQjWBIToOVHASmATot4ktvlLo6CyLfOXWYA==", + "requires": { + "libbase64": "1.2.1", + "libmime": "5.2.0", + "libqp": "2.0.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "libmime": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.2.0.tgz", + "integrity": "sha512-X2U5Wx0YmK0rXFbk67ASMeqYIkZ6E5vY7pNWRKtnNzqjvdYYG8xtPDpCnuUEnPU9vlgNev+JoSrcaKSUaNvfsw==", + "requires": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "2.0.1" + } + } + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -13721,6 +17314,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, + "mediaquery-text": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", + "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", + "requires": { + "cssom": "^0.5.0" + } + }, "memfs": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", @@ -13730,6 +17331,11 @@ "fs-monkey": "^1.0.4" } }, + "mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -13790,7 +17396,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -13806,6 +17411,439 @@ "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true }, + "mjml": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml/-/mjml-4.14.1.tgz", + "integrity": "sha512-f/wnWWIVbeb/ge3ff7c/KYYizI13QbGIp03odwwkCThsJsacw4gpZZAU7V4gXY3HxSXP2/q3jxOfaHVbkfNpOQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "mjml-cli": "4.14.1", + "mjml-core": "4.14.1", + "mjml-migrate": "4.14.1", + "mjml-preset-core": "4.14.1", + "mjml-validator": "4.13.0" + } + }, + "mjml-accordion": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-accordion/-/mjml-accordion-4.14.1.tgz", + "integrity": "sha512-dpNXyjnhYwhM75JSjD4wFUa9JgHm86M2pa0CoTzdv1zOQz67ilc4BoK5mc2S0gOjJpjBShM5eOJuCyVIuAPC6w==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-body": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-body/-/mjml-body-4.14.1.tgz", + "integrity": "sha512-YpXcK3o2o1U+fhI8f60xahrhXuHmav6BZez9vIN3ZEJOxPFSr+qgr1cT2iyFz50L5+ZsLIVj2ZY+ALQjdsg8ig==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-button": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-button/-/mjml-button-4.14.1.tgz", + "integrity": "sha512-V1Tl1vQ3lXYvvqHJHvGcc8URr7V1l/ZOsv7iLV4QRrh7kjKBXaRS7uUJtz6/PzEbNsGQCiNtXrODqcijLWlgaw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-carousel": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-carousel/-/mjml-carousel-4.14.1.tgz", + "integrity": "sha512-Ku3MUWPk/TwHxVgKEUtzspy/ePaWtN/3z6/qvNik0KIn0ZUIZ4zvR2JtaVL5nd30LHSmUaNj30XMPkCjYiKkFA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-cli": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-cli/-/mjml-cli-4.14.1.tgz", + "integrity": "sha512-Gy6MnSygFXs0U1qOXTHqBg2vZX2VL/fAacgQzD4MHq4OuybWaTNSzXRwxBXYCxT3IJB874n2Q0Mxp+Xka+tnZg==", + "requires": { + "@babel/runtime": "^7.14.6", + "chokidar": "^3.0.0", + "glob": "^7.1.1", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.14.1", + "mjml-migrate": "4.14.1", + "mjml-parser-xml": "4.14.1", + "mjml-validator": "4.13.0", + "yargs": "^16.1.0" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + } + } + }, + "mjml-column": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-column/-/mjml-column-4.14.1.tgz", + "integrity": "sha512-iixVCIX1YJtpQuwG2WbDr7FqofQrlTtGQ4+YAZXGiLThs0En3xNIJFQX9xJ8sgLEGGltyooHiNICBRlzSp9fDg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-core": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-core/-/mjml-core-4.14.1.tgz", + "integrity": "sha512-di88rSfX+8r4r+cEqlQCO7CRM4mYZrfe2wSCu2je38i+ujjkLpF72cgLnjBlSG5aOUCZgYvlsZ85stqIz9LQfA==", + "requires": { + "@babel/runtime": "^7.14.6", + "cheerio": "1.0.0-rc.12", + "detect-node": "^2.0.4", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "juice": "^9.0.0", + "lodash": "^4.17.21", + "mjml-migrate": "4.14.1", + "mjml-parser-xml": "4.14.1", + "mjml-validator": "4.13.0" + } + }, + "mjml-divider": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-divider/-/mjml-divider-4.14.1.tgz", + "integrity": "sha512-agqWY0aW2xaMiUOhYKDvcAAfOLalpbbtjKZAl1vWmNkURaoK4L7MgDilKHSJDFUlHGm2ZOArTrq8i6K0iyThBQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-group": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-group/-/mjml-group-4.14.1.tgz", + "integrity": "sha512-dJt5batgEJ7wxlxzqOfHOI94ABX+8DZBvAlHuddYO4CsLFHYv6XRIArLAMMnAKU76r6p3X8JxYeOjKZXdv49kg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head/-/mjml-head-4.14.1.tgz", + "integrity": "sha512-KoCbtSeTAhx05Ugn9TB2UYt5sQinSCb7RGRer5iPQ3CrXj8hT5B5Svn6qvf/GACPkWl4auExHQh+XgLB+r3OEA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head-attributes": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-attributes/-/mjml-head-attributes-4.14.1.tgz", + "integrity": "sha512-XdUNOp2csK28kBDSistInOyzWNwmu5HDNr4y1Z7vSQ1PfkmiuS6jWG7jHUjdoMhs27e6Leuyyc6a8gWSpqSWrg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head-breakpoint": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-breakpoint/-/mjml-head-breakpoint-4.14.1.tgz", + "integrity": "sha512-Qw9l/W/I5Z9p7I4ShgnEpAL9if4472ejcznbBnp+4Gq+sZoPa7iYoEPsa9UCGutlaCh3N3tIi2qKhl9qD8DFxA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head-font": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-font/-/mjml-head-font-4.14.1.tgz", + "integrity": "sha512-oBYm1gaOdEMjE5BoZouRRD4lCNZ1jcpz92NR/F7xDyMaKCGN6T/+r4S5dq1gOLm9zWqClRHaECdFJNEmrDpZqA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head-html-attributes": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-html-attributes/-/mjml-head-html-attributes-4.14.1.tgz", + "integrity": "sha512-vlJsJc1Sm4Ml2XvLmp01zsdmWmzm6+jNCO7X3eYi9ngEh8LjMCLIQOncnOgjqm9uGpQu2EgUhwvYFZP2luJOVg==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head-preview": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-preview/-/mjml-head-preview-4.14.1.tgz", + "integrity": "sha512-89gQtt3fhl2dkYpHLF5HDQXz/RLpzecU6wmAIT7Dz6etjLGE1dgq2Ay6Bu/OeHjDcT1gbM131zvBwuXw8OydNw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head-style": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-style/-/mjml-head-style-4.14.1.tgz", + "integrity": "sha512-XryOuf32EDuUCBT2k99C1+H87IOM919oY6IqxKFJCDkmsbywKIum7ibhweJdcxiYGONKTC6xjuibGD3fQTTYNQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-head-title": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-head-title/-/mjml-head-title-4.14.1.tgz", + "integrity": "sha512-aIfpmlQdf1eJZSSrFodmlC4g5GudBti2eMyG42M7/3NeLM6anEWoe+UkF/6OG4Zy0tCQ40BDJ5iBZlMsjQICzw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-hero": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-hero/-/mjml-hero-4.14.1.tgz", + "integrity": "sha512-TQJ3yfjrKYGkdEWjHLHhL99u/meKFYgnfJvlo9xeBvRjSM696jIjdqaPHaunfw4CP6d2OpCIMuacgOsvqQMWOA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-image": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-image/-/mjml-image-4.14.1.tgz", + "integrity": "sha512-jfKLPHXuFq83okwlNM1Um/AEWeVDgs2JXIOsWp2TtvXosnRvGGMzA5stKLYdy1x6UfKF4c1ovpMS162aYGp+xQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-migrate": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-migrate/-/mjml-migrate-4.14.1.tgz", + "integrity": "sha512-d+9HKQOhZi3ZFAaFSDdjzJX9eDQGjMf3BArLWNm2okC4ZgfJSpOc77kgCyFV8ugvwc8fFegPnSV60Jl4xtvK2A==", + "requires": { + "@babel/runtime": "^7.14.6", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.14.1", + "mjml-parser-xml": "4.14.1", + "yargs": "^16.1.0" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + } + } + }, + "mjml-navbar": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-navbar/-/mjml-navbar-4.14.1.tgz", + "integrity": "sha512-rNy1Kw8CR3WQ+M55PFBAUDz2VEOjz+sk06OFnsnmNjoMVCjo1EV7OFLDAkmxAwqkC8h4zQWEOFY0MBqqoAg7+A==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-parser-xml": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-parser-xml/-/mjml-parser-xml-4.14.1.tgz", + "integrity": "sha512-9WQVeukbXfq9DUcZ8wOsHC6BTdhaVwTAJDYMIQglXLwKwN7I4pTCguDDHy5d0kbbzK5OCVxCdZe+bfVI6XANOQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "detect-node": "2.0.4", + "htmlparser2": "^8.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + } + } + }, + "mjml-preset-core": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-preset-core/-/mjml-preset-core-4.14.1.tgz", + "integrity": "sha512-uUCqK9Z9d39rwB/+JDV2KWSZGB46W7rPQpc9Xnw1DRP7wD7qAfJwK6AZFCwfTgWdSxw0PwquVNcrUS9yBa9uhw==", + "requires": { + "@babel/runtime": "^7.14.6", + "mjml-accordion": "4.14.1", + "mjml-body": "4.14.1", + "mjml-button": "4.14.1", + "mjml-carousel": "4.14.1", + "mjml-column": "4.14.1", + "mjml-divider": "4.14.1", + "mjml-group": "4.14.1", + "mjml-head": "4.14.1", + "mjml-head-attributes": "4.14.1", + "mjml-head-breakpoint": "4.14.1", + "mjml-head-font": "4.14.1", + "mjml-head-html-attributes": "4.14.1", + "mjml-head-preview": "4.14.1", + "mjml-head-style": "4.14.1", + "mjml-head-title": "4.14.1", + "mjml-hero": "4.14.1", + "mjml-image": "4.14.1", + "mjml-navbar": "4.14.1", + "mjml-raw": "4.14.1", + "mjml-section": "4.14.1", + "mjml-social": "4.14.1", + "mjml-spacer": "4.14.1", + "mjml-table": "4.14.1", + "mjml-text": "4.14.1", + "mjml-wrapper": "4.14.1" + } + }, + "mjml-raw": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-raw/-/mjml-raw-4.14.1.tgz", + "integrity": "sha512-9+4wzoXnCtfV6QPmjfJkZ50hxFB4Z8QZnl2Ac0D1Cn3dUF46UkmO5NLMu7UDIlm5DdFyycZrMOwvZS4wv9ksPw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-section": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-section/-/mjml-section-4.14.1.tgz", + "integrity": "sha512-Ik5pTUhpT3DOfB3hEmAWp8rZ0ilWtIivnL8XdUJRfgYE9D+MCRn+reIO+DAoJHxiQoI6gyeKkIP4B9OrQ7cHQw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-social": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-social/-/mjml-social-4.14.1.tgz", + "integrity": "sha512-G44aOZXgZHukirjkeQWTTV36UywtE2YvSwWGNfo/8d+k5JdJJhCIrlwaahyKEAyH63G1B0Zt8b2lEWx0jigYUw==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-spacer": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-spacer/-/mjml-spacer-4.14.1.tgz", + "integrity": "sha512-5SfQCXTd3JBgRH1pUy6NVZ0lXBiRqFJPVHBdtC3OFvUS3q1w16eaAXlIUWMKTfy8CKhQrCiE6m65kc662ZpYxA==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-table": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-table/-/mjml-table-4.14.1.tgz", + "integrity": "sha512-aVBdX3WpyKVGh/PZNn2KgRem+PQhWlvnD00DKxDejRBsBSKYSwZ0t3EfFvZOoJ9DzfHsN0dHuwd6Z18Ps44NFQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-text": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-text/-/mjml-text-4.14.1.tgz", + "integrity": "sha512-yZuvf5z6qUxEo5CqOhCUltJlR6oySKVcQNHwoV5sneMaKdmBiaU4VDnlYFera9gMD9o3KBHIX6kUg7EHnCwBRQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1" + } + }, + "mjml-validator": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-validator/-/mjml-validator-4.13.0.tgz", + "integrity": "sha512-uURYfyQYtHJ6Qz/1A7/+E9ezfcoISoLZhYK3olsxKRViwaA2Mm8gy/J3yggZXnsUXWUns7Qymycm5LglLEIiQg==", + "requires": { + "@babel/runtime": "^7.14.6" + } + }, + "mjml-wrapper": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/mjml-wrapper/-/mjml-wrapper-4.14.1.tgz", + "integrity": "sha512-aA5Xlq6d0hZ5LY+RvSaBqmVcLkvPvdhyAv3vQf3G41Gfhel4oIPmkLnVpHselWhV14A0KwIOIAKVxHtSAxyOTQ==", + "requires": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.14.1", + "mjml-section": "4.14.1" + } + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -13860,7 +17898,25 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "devOptional": true + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } }, "node-abort-controller": { "version": "3.1.1", @@ -13897,11 +17953,23 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, + "nodemailer": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", + "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==" + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "requires": { + "abbrev": "^1.0.0" + } + }, "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 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "npm-run-path": { "version": "4.0.1", @@ -13912,6 +17980,14 @@ "path-key": "^3.0.0" } }, + "nth-check": { + "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==", + "requires": { + "boolbase": "^1.0.0" + } + }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -13939,7 +18015,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -14012,6 +18087,19 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "requires": { + "p-timeout": "^3.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -14030,12 +18118,62 @@ "p-limit": "^3.0.2" } }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "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 }, + "p-wait-for": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-3.2.0.tgz", + "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==", + "requires": { + "p-timeout": "^3.0.0" + } + }, + "pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + } + }, + "pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "requires": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "requires": { + "no-case": "^2.2.0" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14057,6 +18195,32 @@ "lines-and-columns": "^1.1.6" } }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "requires": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -14124,8 +18288,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -14135,8 +18298,7 @@ "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==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-scurry": { "version": "1.10.1", @@ -14176,6 +18338,19 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==", "peer": true }, + "peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==" + }, + "pick-util": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", + "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", + "requires": { + "@jonkemp/package-utils": "^1.0.8" + } + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -14185,8 +18360,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pirates": { "version": "4.0.6", @@ -14288,6 +18462,40 @@ } } }, + "preview-email": { + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/preview-email/-/preview-email-3.0.19.tgz", + "integrity": "sha512-DBS3Nir18YtKc8loYCCOGitmiaQ0vTdahPoiXxwNweJDpmVZo+w3tppufOhoK0m8skpRxT56llYLs3VrORnmNQ==", + "requires": { + "ci-info": "^3.8.0", + "display-notification": "2.0.0", + "fixpack": "^4.0.0", + "get-port": "5.1.1", + "mailparser": "^3.6.4", + "nodemailer": "^6.9.2", + "open": "7", + "p-event": "4.2.0", + "p-wait-for": "3.2.0", + "pug": "^3.0.2", + "uuid": "^9.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + } + } + }, "prisma": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.0.0.tgz", @@ -14302,6 +18510,14 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -14312,6 +18528,11 @@ "sisteransi": "^1.0.5" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -14321,6 +18542,153 @@ "ipaddr.js": "1.9.1" } }, + "proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "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==" + }, + "pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "requires": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "requires": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "requires": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "requires": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "requires": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "requires": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "requires": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "requires": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" + }, + "pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "requires": { + "pug-error": "^2.0.0" + } + }, + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -14382,6 +18750,24 @@ "unpipe": "1.0.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -14413,7 +18799,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -14432,6 +18817,26 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "remote-content": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-3.0.1.tgz", + "integrity": "sha512-zEMsvb4GgxVKBBTHgy2tte67RYBZx2Kyg9mTYpg+JfATHDqYJqhuC3zG1VoiYhDVP5JaB5+mPKcAvdnT0n3jxA==", + "requires": { + "proxy-from-env": "^1.1.0", + "superagent": "^8.0.9", + "superagent-proxy": "^3.0.0" + } + }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -14441,8 +18846,7 @@ "require-directory": { "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 + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", @@ -14454,7 +18858,6 @@ "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, "requires": { "is-core-module": "^2.8.1", "path-parse": "^1.0.7", @@ -14629,6 +19032,14 @@ } } }, + "selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "requires": { + "parseley": "^0.12.0" + } + }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -14741,8 +19152,7 @@ "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==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sisteransi": { "version": "1.0.5", @@ -14756,6 +19166,42 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==" + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + } + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -14780,6 +19226,11 @@ } } }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -14880,6 +19331,11 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" + }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -14892,11 +19348,20 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "style-data": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/style-data/-/style-data-2.0.1.tgz", + "integrity": "sha512-frUbteLGDoNEJhbMIWtyNE1VRduZXmZozhct4F+qN++OzIQZNZJ8KToZlDEl3eaedRYlDfKvUoMFMyrZj4x/sg==", + "requires": { + "cheerio": "^1.0.0-rc.12", + "mediaquery-text": "^1.2.0", + "pick-util": "^1.1.5" + } + }, "superagent": { "version": "8.0.9", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", - "dev": true, "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -14913,11 +19378,19 @@ "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" } } }, + "superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "requires": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + } + }, "supertest": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", @@ -14939,8 +19412,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "swagger-ui-dist": { "version": "5.1.0", @@ -15061,6 +19533,11 @@ "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true }, + "tlds": { + "version": "1.240.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.240.0.tgz", + "integrity": "sha512-1OYJQenswGZSOdRw7Bql5Qu7uf75b+F3HFBXbqnG/ifHa0fev1XcG+3pJf3pA/KC6RtHQzfKgIf1vkMlMG7mtQ==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -15079,14 +19556,12 @@ "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 + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-regex-range": { "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, "requires": { "is-number": "^7.0.0" } @@ -15096,6 +19571,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -15239,6 +19719,16 @@ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==" + }, "uid": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", @@ -15279,6 +19769,11 @@ "picocolors": "^1.0.0" } }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15328,6 +19823,11 @@ } } }, + "valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==" + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -15338,6 +19838,20 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vm2": { + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + } + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -15366,6 +19880,90 @@ "defaults": "^1.0.3" } }, + "web-resource-inliner": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", + "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", + "requires": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "dependencies": { + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + } + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -15475,11 +20073,32 @@ } } }, + "with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "requires": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "optional": true + }, "wrap-ansi": { "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, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15499,8 +20118,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "4.0.2", @@ -15512,6 +20130,11 @@ "signal-exit": "^3.0.7" } }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -15520,8 +20143,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", diff --git a/back/package.json b/back/package.json index c93489d..0ce3f9f 100644 --- a/back/package.json +++ b/back/package.json @@ -21,6 +21,7 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { + "@nestjs-modules/mailer": "^1.9.1", "@nestjs/common": "^10.1.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.1.0", @@ -37,6 +38,7 @@ "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "node-fetch": "^2.6.12", + "nodemailer": "^6.9.5", "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -53,6 +55,7 @@ "@types/jest": "29.5.3", "@types/multer": "^1.4.7", "@types/node": "^20.4.4", + "@types/nodemailer": "^6.4.9", "@types/passport-google-oauth20": "^2.0.11", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.1.0", diff --git a/back/prisma/migrations/20230907141258_/migration.sql b/back/prisma/migrations/20230907141258_/migration.sql new file mode 100644 index 0000000..d09a2d1 --- /dev/null +++ b/back/prisma/migrations/20230907141258_/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "emailVerified" BOOLEAN NOT NULL DEFAULT false; diff --git a/back/prisma/schema.prisma b/back/prisma/schema.prisma index 8eeed4a..f49f9b1 100644 --- a/back/prisma/schema.prisma +++ b/back/prisma/schema.prisma @@ -14,6 +14,7 @@ model User { username String @unique password String? email String + emailVerified Boolean @default(false) googleID String? @unique isGuest Boolean @default(false) partyPlayed Int @default(0) diff --git a/back/src/app.module.ts b/back/src/app.module.ts index 8142e0d..68493ec 100644 --- a/back/src/app.module.ts +++ b/back/src/app.module.ts @@ -14,6 +14,7 @@ import { ArtistModule } from './artist/artist.module'; import { AlbumModule } from './album/album.module'; import { SearchModule } from './search/search.module'; import { HistoryModule } from './history/history.module'; +import { MailerModule } from '@nestjs-modules/mailer'; @Module({ imports: [ @@ -28,6 +29,12 @@ import { HistoryModule } from './history/history.module'; SearchModule, SettingsModule, HistoryModule, + MailerModule.forRoot({ + transport: process.env.SMTP_TRANSPORT, + defaults: { + from: process.env.MAIL_AUTHOR, + }, + }), ], controllers: [AppController], providers: [AppService, PrismaService, ArtistService], diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index 2cd490d..ba91edd 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -41,6 +41,7 @@ import { SettingsService } from 'src/settings/settings.service'; import { AuthGuard } from '@nestjs/passport'; import { FileInterceptor } from '@nestjs/platform-express'; import { writeFile } from 'fs'; +import { MailerService } from '@nestjs-modules/mailer'; @ApiTags('auth') @Controller('auth') @@ -49,6 +50,7 @@ export class AuthController { private authService: AuthService, private usersService: UsersService, private settingsService: SettingsService, + private emailService: MailerService, ) {} @Get('login/google') @@ -71,6 +73,13 @@ export class AuthController { try { const user = await this.usersService.createUser(registerDto); await this.settingsService.createUserSetting(user.id); + await this.emailService.sendMail({ + to: user.email, + from: "chromacase@octohub.app", + subject: "Mail verification", + text: "To verify your mail click here", + html: "Verify", + }) } catch (e) { console.error(e); throw new BadRequestException(); diff --git a/flake.lock b/flake.lock deleted file mode 100644 index ea5eb0f..0000000 --- a/flake.lock +++ /dev/null @@ -1,43 +0,0 @@ -{ - "nodes": { - "flake-utils": { - "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1665573177, - "narHash": "sha256-Arkrf3zmi3lXYpbSe9H+HQxswQ6jxsAmeQVq5Sr/OZc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "d2afb051ffd904af5a825f58abee3c63b148c5f2", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "master", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 9721b18..0000000 --- a/flake.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ - description = "A prisma test project"; - inputs.nixpkgs.url = "github:NixOS/nixpkgs/master"; - inputs.flake-utils.url = "github:numtide/flake-utils"; - - outputs = { self, nixpkgs, flake-utils }: - flake-utils.lib.eachDefaultSystem (system: let - pkgs = nixpkgs.legacyPackages.${system}; - in { - devShell = pkgs.mkShell { - nativeBuildInputs = [ pkgs.bashInteractive ]; - buildInputs = with pkgs; [ - nodePackages.prisma - nodePackages."@nestjs/cli" - nodePackages.npm - nodejs-slim - yarn - python3 - pkg-config - ]; - shellHook = with pkgs; '' - export PRISMA_MIGRATION_ENGINE_BINARY="${prisma-engines}/bin/migration-engine" - export PRISMA_QUERY_ENGINE_BINARY="${prisma-engines}/bin/query-engine" - export PRISMA_QUERY_ENGINE_LIBRARY="${prisma-engines}/lib/libquery_engine.node" - export PRISMA_INTROSPECTION_ENGINE_BINARY="${prisma-engines}/bin/introspection-engine" - export PRISMA_FMT_BINARY="${prisma-engines}/bin/prisma-fmt" - export DATABASE_URL=postgresql://user:eip@localhost:5432/chromacase - ''; - }; - }); -} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..edc76e1 --- /dev/null +++ b/shell.nix @@ -0,0 +1,21 @@ +{pkgs ? import {}}: +pkgs.mkShell { + nativeBuildInputs = [pkgs.bashInteractive]; + buildInputs = with pkgs; [ + nodePackages.prisma + nodePackages."@nestjs/cli" + nodePackages.npm + nodejs_16 + yarn + python3 + pkg-config + ]; + shellHook = with pkgs; '' + # export PRISMA_MIGRATION_ENGINE_BINARY="${prisma-engines}/bin/migration-engine" + # export PRISMA_QUERY_ENGINE_BINARY="${prisma-engines}/bin/query-engine" + export PRISMA_QUERY_ENGINE_LIBRARY="${prisma-engines}/lib/libquery_engine.node" + export PRISMA_INTROSPECTION_ENGINE_BINARY="${prisma-engines}/bin/introspection-engine" + export PRISMA_FMT_BINARY="${prisma-engines}/bin/prisma-fmt" + export DATABASE_URL=postgresql://user:eip@localhost:5432/chromacase + ''; +} From f2ed59886546483b7023cf8a6df7f5e0ba39624c Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 11 Sep 2023 16:13:28 +0200 Subject: [PATCH 070/133] Use a fixed python version for the scorometer --- scorometer/Dockerfile | 2 +- scorometer/Dockerfile.dev | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scorometer/Dockerfile b/scorometer/Dockerfile index 07b279d..f7a2f45 100644 --- a/scorometer/Dockerfile +++ b/scorometer/Dockerfile @@ -1,4 +1,4 @@ -FROM python:latest +FROM python:3.10 RUN wget -q -O /tmp/websocketd.zip \ https://github.com/joewalnes/websocketd/releases/download/v0.4.1/websocketd-0.4.1-linux_amd64.zip \ && unzip /tmp/websocketd.zip -d /tmp/websocketd && mv /tmp/websocketd/websocketd /usr/bin \ diff --git a/scorometer/Dockerfile.dev b/scorometer/Dockerfile.dev index a1d6530..2075bd7 100644 --- a/scorometer/Dockerfile.dev +++ b/scorometer/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM python:latest +FROM python:3.10 RUN wget -q -O /tmp/websocketd.zip \ https://github.com/joewalnes/websocketd/releases/download/v0.4.1/websocketd-0.4.1-linux_amd64.zip \ && unzip /tmp/websocketd.zip -d /tmp/websocketd && mv /tmp/websocketd/websocketd /usr/bin \ From a52c10fc2c68d4667766c6922a2bf0a56be8a822 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 13 Sep 2023 17:25:01 +0200 Subject: [PATCH 071/133] Add verified badge and page on the front --- back/src/auth/auth.controller.ts | 29 ++++++++++------ back/src/auth/auth.service.ts | 34 ++++++++++++++++++- back/src/users/users.service.ts | 9 +++-- front/Navigation.tsx | 6 ++++ front/models/User.ts | 2 ++ front/views/VerifiedView.tsx | 35 ++++++++++++++++++++ front/views/settings/SettingsProfileView.tsx | 2 +- 7 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 front/views/VerifiedView.tsx diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts index ba91edd..bc48297 100644 --- a/back/src/auth/auth.controller.ts +++ b/back/src/auth/auth.controller.ts @@ -18,6 +18,7 @@ import { HttpStatus, ParseFilePipeBuilder, Response, + Query, } from '@nestjs/common'; import { AuthService } from './auth.service'; import { JwtAuthGuard } from './jwt-auth.guard'; @@ -41,7 +42,6 @@ import { SettingsService } from 'src/settings/settings.service'; import { AuthGuard } from '@nestjs/passport'; import { FileInterceptor } from '@nestjs/platform-express'; import { writeFile } from 'fs'; -import { MailerService } from '@nestjs-modules/mailer'; @ApiTags('auth') @Controller('auth') @@ -50,7 +50,6 @@ export class AuthController { private authService: AuthService, private usersService: UsersService, private settingsService: SettingsService, - private emailService: MailerService, ) {} @Get('login/google') @@ -73,19 +72,29 @@ export class AuthController { try { const user = await this.usersService.createUser(registerDto); await this.settingsService.createUserSetting(user.id); - await this.emailService.sendMail({ - to: user.email, - from: "chromacase@octohub.app", - subject: "Mail verification", - text: "To verify your mail click here", - html: "Verify", - }) + await this.authService.sendVerifyMail(user); } catch (e) { console.error(e); throw new BadRequestException(); } } + @HttpCode(200) + @UseGuards(JwtAuthGuard) + @Put('verify') + async verify(@Request() req: any, @Query('token') token: string): Promise { + if (await this.authService.verifyMail(req.user.id, token)) + return; + throw new BadRequestException("Invalid token. Expired or invalid."); + } + + @HttpCode(200) + @UseGuards(JwtAuthGuard) + @Put('reverify') + async reverify(@Request() req: any): Promise { + await this.authService.sendVerifyMail(req.user); + } + @ApiBody({ type: LoginDto }) @HttpCode(200) @UseGuards(LocalAuthGuard) @@ -130,7 +139,7 @@ export class AuthController { ) file: Express.Multer.File, ) { - const path = `/data/${req.user.id}.jpg` + const path = `/data/${req.user.id}.jpg`; writeFile(path, file.buffer, (err) => { if (err) throw err; }); diff --git a/back/src/auth/auth.service.ts b/back/src/auth/auth.service.ts index c733207..56f4679 100644 --- a/back/src/auth/auth.service.ts +++ b/back/src/auth/auth.service.ts @@ -1,13 +1,16 @@ -import { BadRequestException, Injectable } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import { JwtService } from '@nestjs/jwt'; import * as bcrypt from 'bcryptjs'; import PayloadInterface from './interface/payload.interface'; +import { User } from 'src/models/user'; +import { MailerService } from '@nestjs-modules/mailer'; @Injectable() export class AuthService { constructor( private userService: UsersService, private jwtService: JwtService, + private emailService: MailerService, ) {} async validateUser( @@ -31,4 +34,33 @@ export class AuthService { access_token, }; } + + async sendVerifyMail(user: User) { + const token = await this.jwtService.signAsync( + { + userId: user.id, + }, + { expiresIn: '10h' }, + ); + await this.emailService.sendMail({ + to: user.email, + from: 'chromacase@octohub.app', + subject: 'Mail verification for Chromacase', + html: `To verify your mail, please click on this link.`, + }); + } + + async verifyMail(userId: number, token: string): Promise { + try { + await this.jwtService.verifyAsync(token); + } catch(e) { + console.log("Verify mail token failure", e); + return false; + } + await this.userService.updateUser({ + where: { id: userId }, + data: { emailVerified: true }, + }); + return true; + } } diff --git a/back/src/users/users.service.ts b/back/src/users/users.service.ts index 55c12b5..62a4a31 100644 --- a/back/src/users/users.service.ts +++ b/back/src/users/users.service.ts @@ -1,8 +1,6 @@ import { Injectable, InternalServerErrorException, - NotFoundException, - StreamableFile, } from '@nestjs/common'; import { User, Prisma } from '@prisma/client'; import { PrismaService } from 'src/prisma/prisma.service'; @@ -13,7 +11,9 @@ import fetch from 'node-fetch'; @Injectable() export class UsersService { - constructor(private prisma: PrismaService) {} + constructor( + private prisma: PrismaService, + ) {} async user( userWhereUniqueInput: Prisma.UserWhereUniqueInput, @@ -95,8 +95,7 @@ export class UsersService { const resp = await fetch( `https://www.gravatar.com/avatar/${hash}.jpg?d=404&s=200`, ); - for (const [k, v] of resp.headers) - resp.headers.set(k, v); + for (const [k, v] of resp.headers) resp.headers.set(k, v); resp.body!.pipe(res); } } diff --git a/front/Navigation.tsx b/front/Navigation.tsx index 1e12973..486ac99 100644 --- a/front/Navigation.tsx +++ b/front/Navigation.tsx @@ -30,6 +30,7 @@ import TextButton from './components/TextButton'; import ErrorView from './views/ErrorView'; import GenreDetailsView from './views/GenreDetailsView'; import GoogleView from './views/GoogleView'; +import VerifiedView from './views/VerifiedView'; // Util function to hide route props in URL const removeMe = () => ''; @@ -81,6 +82,11 @@ const protectedRoutes = () => link: undefined, }, User: { component: ProfileView, options: { title: translate('user') }, link: '/user' }, + Verified: { + component: VerifiedView, + options: { title: 'Verify email', headerShown: false }, + link: '/verify', + }, } as const); const publicRoutes = () => diff --git a/front/models/User.ts b/front/models/User.ts index 1f85df2..a53a110 100644 --- a/front/models/User.ts +++ b/front/models/User.ts @@ -8,6 +8,7 @@ export const UserValidator = yup username: yup.string().required(), password: yup.string().required().nullable(), email: yup.string().required(), + emailVerified: yup.boolean().required(), googleID: yup.string().required().nullable(), isGuest: yup.boolean().required(), partyPlayed: yup.number().required(), @@ -32,6 +33,7 @@ export const UserHandler: ResponseHandler, U interface User extends Model { name: string; email: string; + emailVerified: boolean; googleID: string | null; isGuest: boolean; premium: boolean; diff --git a/front/views/VerifiedView.tsx b/front/views/VerifiedView.tsx new file mode 100644 index 0000000..37286c7 --- /dev/null +++ b/front/views/VerifiedView.tsx @@ -0,0 +1,35 @@ +import { useEffect, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import API from '../API'; +import { Text } from 'native-base'; +import { useNavigation } from '../Navigation'; +import { useRoute } from '@react-navigation/native'; + +const VerifiedView = () => { + const navigation = useNavigation(); + const route = useRoute(); + const [failed, setFailed] = useState(false); + + useEffect(() => { + async function run() { + try { + await API.fetch({ + route: `/auth/verify?token=${(route.params as any).token}`, + method: 'PUT', + }); + navigation.navigate('Home'); + } catch { + setFailed(true); + } + } + run(); + }, []); + + return failed ? ( + Email verification failed. The token has expired or is invalid. + ) : ( + Loading please wait + ); +}; + +export default VerifiedView; diff --git a/front/views/settings/SettingsProfileView.tsx b/front/views/settings/SettingsProfileView.tsx index bf946f4..bd4b199 100644 --- a/front/views/settings/SettingsProfileView.tsx +++ b/front/views/settings/SettingsProfileView.tsx @@ -49,7 +49,7 @@ const ProfileSettings = ({ navigation }: { navigation: any }) => { type: 'text', title: translate('email'), data: { - text: user.email || translate('NoAssociatedEmail'), + text: `${user.email} ${user.emailVerified ? "verified" : "not verified"}` || translate('NoAssociatedEmail'), onPress: () => { navigation.navigate('changeEmail'); }, From afab03baf8a96e9493a3e06c371ac4ec7ca25356 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 13 Sep 2023 17:30:34 +0200 Subject: [PATCH 072/133] Add a button to resend verified mail --- front/i18n/Translations.ts | 3 +++ front/views/settings/SettingsProfileView.tsx | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/front/i18n/Translations.ts b/front/i18n/Translations.ts index 07684ea..16e3a28 100644 --- a/front/i18n/Translations.ts +++ b/front/i18n/Translations.ts @@ -183,6 +183,7 @@ export const en = { noRecentSearches: 'No recent searches', avatar: 'Avatar', changeIt: 'Change It', + verified: "Verified", }; export const fr: typeof en = { @@ -368,6 +369,7 @@ export const fr: typeof en = { noRecentSearches: 'Aucune recherche récente', avatar: 'Avatar', changeIt: 'Modifier', + verified: "Verifié", }; export const sp: typeof en = { @@ -558,4 +560,5 @@ export const sp: typeof en = { avatar: 'Avatar', changeIt: 'Cambialo', + verified: "Verified" }; diff --git a/front/views/settings/SettingsProfileView.tsx b/front/views/settings/SettingsProfileView.tsx index bd4b199..fdf16d5 100644 --- a/front/views/settings/SettingsProfileView.tsx +++ b/front/views/settings/SettingsProfileView.tsx @@ -49,12 +49,22 @@ const ProfileSettings = ({ navigation }: { navigation: any }) => { type: 'text', title: translate('email'), data: { - text: `${user.email} ${user.emailVerified ? "verified" : "not verified"}` || translate('NoAssociatedEmail'), + text: user.email || translate('NoAssociatedEmail'), onPress: () => { navigation.navigate('changeEmail'); }, }, }, + { + type: 'text', + title: translate('verified'), + data: { + text: user.emailVerified ? 'verified' : 'not verified', + onPress: user.emailVerified + ? undefined + : () => API.fetch({ route: '/auth/reverify', method: 'PUT' }), + }, + }, { type: 'text', title: translate('avatar'), From 654022b48a838ba355c3003d46e470bc10b880e8 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 13 Sep 2023 17:32:10 +0200 Subject: [PATCH 073/133] Update .env.example --- .env.example | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.env.example b/.env.example index 29a74c8..578ca33 100644 --- a/.env.example +++ b/.env.example @@ -10,3 +10,5 @@ SCORO_URL=ws://localhost:6543 GOOGLE_CLIENT_ID=toto GOOGLE_SECRET=tata GOOGLE_CALLBACK_URL=http://localhost:19006/logged/google +SMTP_TRANSPORT= +MAIL_AUTHOR='"Chromacase" ' From 585be2aa1907531f9f7b9e7b7fc257a6cae4c323 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 15 Sep 2023 14:42:43 +0200 Subject: [PATCH 074/133] Fix prettier warnings --- front/.eslintrc.json | 1 - front/i18n/Translations.ts | 6 +++--- front/package.json | 4 ++-- front/views/VerifiedView.tsx | 1 - 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/front/.eslintrc.json b/front/.eslintrc.json index 501a0c8..766b2a8 100644 --- a/front/.eslintrc.json +++ b/front/.eslintrc.json @@ -17,7 +17,6 @@ "rules": { "react/react-in-jsx-scope": "off", "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-empty-function": "off", "no-restricted-imports": [ diff --git a/front/i18n/Translations.ts b/front/i18n/Translations.ts index 16e3a28..4e0b7c8 100644 --- a/front/i18n/Translations.ts +++ b/front/i18n/Translations.ts @@ -183,7 +183,7 @@ export const en = { noRecentSearches: 'No recent searches', avatar: 'Avatar', changeIt: 'Change It', - verified: "Verified", + verified: 'Verified', }; export const fr: typeof en = { @@ -369,7 +369,7 @@ export const fr: typeof en = { noRecentSearches: 'Aucune recherche récente', avatar: 'Avatar', changeIt: 'Modifier', - verified: "Verifié", + verified: 'Verifié', }; export const sp: typeof en = { @@ -560,5 +560,5 @@ export const sp: typeof en = { avatar: 'Avatar', changeIt: 'Cambialo', - verified: "Verified" + verified: 'Verified', }; diff --git a/front/package.json b/front/package.json index eccad8f..611a779 100644 --- a/front/package.json +++ b/front/package.json @@ -8,8 +8,8 @@ "ios": "expo start --ios", "web": "expo start --web", "eject": "expo eject", - "pretty:check": "prettier --check", - "pretty:write": "prettier --write", + "pretty:check": "prettier --check .", + "pretty:write": "prettier --write .", "lint": "eslint .", "test": "jest -i", "test:cov": "jest -i --coverage", diff --git a/front/views/VerifiedView.tsx b/front/views/VerifiedView.tsx index 37286c7..5e7603c 100644 --- a/front/views/VerifiedView.tsx +++ b/front/views/VerifiedView.tsx @@ -1,5 +1,4 @@ import { useEffect, useState } from 'react'; -import { useDispatch } from 'react-redux'; import API from '../API'; import { Text } from 'native-base'; import { useNavigation } from '../Navigation'; From 91c9e2b295746c8e46d50259327ec43a9728b6e3 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 15 Sep 2023 14:46:12 +0200 Subject: [PATCH 075/133] Update .env.example to use dummy values for the ci --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 578ca33..4000261 100644 --- a/.env.example +++ b/.env.example @@ -10,5 +10,5 @@ SCORO_URL=ws://localhost:6543 GOOGLE_CLIENT_ID=toto GOOGLE_SECRET=tata GOOGLE_CALLBACK_URL=http://localhost:19006/logged/google -SMTP_TRANSPORT= +SMTP_TRANSPORT=toto MAIL_AUTHOR='"Chromacase" ' From bc13c10f1a41dfd70a497588a31698d21dfdc899 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 15 Sep 2023 14:57:42 +0200 Subject: [PATCH 076/133] Fix ci --- .env.example | 3 ++- .github/workflows/CI.yml | 2 +- assets/populate.py | 2 +- back/src/auth/auth.service.ts | 1 + front/.eslintrc.json | 1 + front/views/VerifiedView.tsx | 1 + 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 4000261..38ffb5e 100644 --- a/.env.example +++ b/.env.example @@ -10,5 +10,6 @@ SCORO_URL=ws://localhost:6543 GOOGLE_CLIENT_ID=toto GOOGLE_SECRET=tata GOOGLE_CALLBACK_URL=http://localhost:19006/logged/google -SMTP_TRANSPORT=toto +SMTP_TRANSPORT=smtps://toto:tata@relay MAIL_AUTHOR='"Chromacase" ' +IGNORE_MAILS=true diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5f4ba5e..8d5433a 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -93,7 +93,7 @@ jobs: run: | docker-compose ps -a docker-compose logs - wget --retry-connrefused http://localhost:3000 # /healthcheck + wget --retry-connrefused http://localhost:3000 || (docker-compose logs && exit 1) - name: Run scorometer tests run: | diff --git a/assets/populate.py b/assets/populate.py index 507f525..387c914 100755 --- a/assets/populate.py +++ b/assets/populate.py @@ -1,4 +1,4 @@ -#!/bin/env python3 +#!/usr/bin/env python3 import sys import os diff --git a/back/src/auth/auth.service.ts b/back/src/auth/auth.service.ts index 56f4679..4c2d98f 100644 --- a/back/src/auth/auth.service.ts +++ b/back/src/auth/auth.service.ts @@ -36,6 +36,7 @@ export class AuthService { } async sendVerifyMail(user: User) { + if (process.env.IGNORE_MAILS === "true") return; const token = await this.jwtService.signAsync( { userId: user.id, diff --git a/front/.eslintrc.json b/front/.eslintrc.json index 766b2a8..501a0c8 100644 --- a/front/.eslintrc.json +++ b/front/.eslintrc.json @@ -17,6 +17,7 @@ "rules": { "react/react-in-jsx-scope": "off", "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-empty-function": "off", "no-restricted-imports": [ diff --git a/front/views/VerifiedView.tsx b/front/views/VerifiedView.tsx index 5e7603c..51d8c28 100644 --- a/front/views/VerifiedView.tsx +++ b/front/views/VerifiedView.tsx @@ -13,6 +13,7 @@ const VerifiedView = () => { async function run() { try { await API.fetch({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any route: `/auth/verify?token=${(route.params as any).token}`, method: 'PUT', }); From bbc53f04de40236133c53b6d6763ce9e5c338582 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Sun, 17 Sep 2023 14:59:23 +0200 Subject: [PATCH 077/133] Front: Get Rid of external image, load local assets --- front/.gitignore | 2 + front/app.config.ts | 8 +- front/app.json | 6 +- front/assets/adaptive-icon.png | Bin 17547 -> 0 bytes front/assets/auth/guest_banner.png | Bin 0 -> 672649 bytes front/assets/auth/login_banner.png | Bin 0 -> 401497 bytes front/assets/auth/register_banner.png | Bin 0 -> 623485 bytes front/assets/cover.png | Bin 139348 -> 0 bytes front/assets/favicon.png | Bin 1466 -> 18658 bytes front/assets/full_dark.png | Bin 0 -> 239151 bytes front/assets/full_light.png | Bin 0 -> 646041 bytes front/assets/icon.jpg | Bin 0 -> 77935 bytes front/assets/icon.png | Bin 22380 -> 66830 bytes front/assets/icon_dark.png | Bin 0 -> 98647 bytes front/assets/icon_light.png | Bin 0 -> 122086 bytes front/assets/splash.png | Bin 47346 -> 91121 bytes front/assets/splashLogo.png | Bin 32340 -> 0 bytes front/assets/title_dark.png | Bin 0 -> 413216 bytes front/assets/title_light.png | Bin 0 -> 510014 bytes front/components/BigActionButton.tsx | 2 +- front/package.json | 2 +- front/views/ProfileView.tsx | 51 ++++------ front/views/StartPageView.tsx | 78 +++++----------- front/yarn.lock | 130 ++++++++++++++++++++++++-- 24 files changed, 169 insertions(+), 110 deletions(-) delete mode 100644 front/assets/adaptive-icon.png create mode 100644 front/assets/auth/guest_banner.png create mode 100644 front/assets/auth/login_banner.png create mode 100644 front/assets/auth/register_banner.png delete mode 100644 front/assets/cover.png create mode 100644 front/assets/full_dark.png create mode 100644 front/assets/full_light.png create mode 100644 front/assets/icon.jpg create mode 100644 front/assets/icon_dark.png create mode 100644 front/assets/icon_light.png delete mode 100644 front/assets/splashLogo.png create mode 100644 front/assets/title_dark.png create mode 100644 front/assets/title_light.png diff --git a/front/.gitignore b/front/.gitignore index 80e998a..300084a 100644 --- a/front/.gitignore +++ b/front/.gitignore @@ -14,5 +14,7 @@ yarn.error* # macOS .DS_Store +yarn-error.log + .idea/ .expo \ No newline at end of file diff --git a/front/app.config.ts b/front/app.config.ts index e9cd5e5..a556143 100644 --- a/front/app.config.ts +++ b/front/app.config.ts @@ -6,7 +6,7 @@ module.exports = { icon: './assets/icon.png', userInterfaceStyle: 'light', splash: { - image: './assets/splashLogo.png', + image: './assets/splash.png', resizeMode: 'contain', backgroundColor: '#ffffff', }, @@ -18,12 +18,6 @@ module.exports = { supportsTablet: true, }, android: { - adaptiveIcon: { - foregroundImage: './assets/adaptive-icon.png', - backgroundColor: '#FFFFFF', - package: 'com.chromacase.chromacase', - versionCode: 1, - }, package: 'build.apk', }, web: { diff --git a/front/app.json b/front/app.json index 26b3474..2045f9a 100644 --- a/front/app.json +++ b/front/app.json @@ -7,7 +7,7 @@ "icon": "./assets/icon.png", "userInterfaceStyle": "light", "splash": { - "image": "./assets/splashLogo.png", + "image": "./assets/splash.png", "resizeMode": "cover", "backgroundColor": "#ffffff" }, @@ -19,10 +19,6 @@ "supportsTablet": true }, "android": { - "adaptiveIcon": { - "foregroundImage": "./assets/adaptive-icon.png", - "backgroundColor": "#FFFFFF" - }, "package": "build.apk" }, "web": { diff --git a/front/assets/adaptive-icon.png b/front/assets/adaptive-icon.png deleted file mode 100644 index 03d6f6b6c6727954aec1d8206222769afd178d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17547 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�WRl@|r z+hSj=Rp3ofh1ZOF8RWG^_~>uRc&WUzRHKkXn5AIhj=fZw_em{m#frL}>BMMIifRcT z;$l~FU^1y;8%29D`0p%qE*qoR?xD?W%G$?{@Uzhac0Uk3XW9U%pSDed7&U z9UjtOf9w17=*d%h?bQeL)*CO;oztWGu5uRW#pRaX``|-5JUODndc@6+^V3pQ#HzO~ zt!lnl$t^15ka73na08ObaUE}V<%PeO?zyh5xNi-yFkXSr{+YhGoysDqq8@4)xEBE( zqakR?*?>k&eV%DJry1@Qem1$N4EesvwW&tnHJM`887$7xZ8g|b>x-*PXK8KWW}y*b$&(@L@?(xdWr909|SnalSIRYdlk@81hH%c5d(sP4eX9P)J#04g04Vd#oy`@J>`>-TRe9LAs|Mf#Mxy}EBx!M`{k*><+zlLB8$?>-2o*VU5^kX#U+MES)3lRjfR{4~+pmyfKV6g(no*5e~*H&v0j@FaR9*d*Hqn1yG zVa5v=Zv1G;R`46|*WUq)C+Ks>MxnZ65c=I(1;B*~V6)*-nE7|1AjAxza zHk{05u8sIHtZ(n)hHE7AO9jtY@4VC3#kxZL0&i(4p@@T&2J zMi=DDh6f_dz=yHxmS-to#e154pSr(wyg7hz5F+wG?m>nLprCH1v4T0P*$9JJX6hU9{T?iVzfKUFtIPDY6 zIYDS|n0wbt+s(68JBKCieK&12zgWJ%#7{ zHWn$X8&QW9q6kd!H|v}KBfdUU++S#{aQ)arHY8+%$UDAwz^fZ?ne9tdgu(VIQB9n+ z0x#>S-xY-sqkPu4>3Or7vsUxX*tn^hK{NW7q8a6|=8r!5kbd;e2XwHS=*>6YplLnP zJMX<;vF7LA`V2j|cSa|NtD1^a_Q%ELh8{kBLgyD7Iz79^)f8t{urh>v$`MOGk8M`N zwee{Y8UybNF2vvCT3Rk#&OIbx_W+!6QCxz_Ln95&Ebrb<&R+valy+Qx8Ftu%2f?YW z;33LE9H5uUrFwNj@2c=6JXe^Yk+?@obwqqkA`>{?Vw&}kU&+TprlLg4vnwD8?~%98 z5?cxTe^$3LSk}OTsJ5+?*zzw-soh)NzvD9_YPA|caU3#fF2to(8>8Gj+~oZ_F14xS zmoNoN*EQz^YEq?5CXBafGOKgscPjAH0G-0`8Our&3ncK$Mco4dA1BjPWog#PoR$>W zLQ-YDrZBa_Y|EOh!3$<%)Nn_(ip`n$JAO@d5Qn|arirOHaVRs=10PP z;4$@L+4ku5D>a}y!Q_KBa-bP)1$jSI;>GuLq?tVl8s$O3uQ29ik?A=>uBE<3=3C;k z0(bCINd!^`n(CT%k;Y)C6jYwvt@a_~h}thDy`q$!fA``!{p6i@>FD?_-M@W{o?kqr zqqAfB%Br?Mb_3MWu_XL^7#Cs;+Ny2Q;rTo1Ch*`R*lgPP+b||iJyJOG%BogIUC?Lu}=qYz= zhKib6zae<)p|ieAeAC*^3;*JTT_Uw;%EYRLR28nIu6!eUj>R{|jB@}0AOJ~3K~zVL zLf)X~2e7D0FoAlzO{lUlQ9{Vmo@02`-Mr&>O!&0}C^)N)t|flo`X!4j>lpz_8Ynt3 z#{|bLza#T#OvP88v}TjH5W#pY)Wy7Sodpi9i~4lxewS%Uzz;Wb#gUUORUZ`0J z%hBl{KYm8v|M5@gEqa4qzI(3<2QvitDT!C)<$G}A-gbO|cbxmt6R~Gw369=7rx1j8 zeW3`3!YQgTq38|Fr7F-}m{pv68<=YeL8G(X4?IxdCiS!unKOV1?yLw78YmjJ(*un~ zp^onZfbW1-@{tn8q~hq3e-(V506+LR*j`xrkJfgwofyUy6&0CNTz~s2;^5)Yg_?_D z^Q~{ld|U^HUuBdDc2tVmK7e;{Bi2(*e+=`IP5x?6B#cKmSN7mT0K`r9Zk+T_7R}^W zdc;FyK7G?!*OYXBnIYGpgJ)bBCR640pwl-Uzsk?9_YpYujf?zN45U*6W5_^Dk*#&( z8oX=IXx!}>D(&6{lCIlx#!Hc3xag||T}OIgTO=H3G>8b2xskk*gx>MF$@AT88+7EY z$Fc{~H`4YR32hs`K_Q^(x@Pb*eO`@{SQ8*-SbEFY_Fr^TXcDTPM`aw z*Xj2CTXcGKNGI!qS`4mWqf#;P=kI?+mz!P9?X2bO`G9DgIrWn8f=L`$%>(0nwit0W zbz~7Zezyk(eDxP~h2k~3>{;eKYY&$SQuKY*rukVcE@sXL+QL%_C+RnSkfYR|y_WL~VXnVD#%gf6yl+dS{ zxBo5cJ#+caaz=(sU-`EjP?zDkHaC;$A>7VHhDD&qAy!<%UAQO+KVzXMSvPbN5XSGA zc+Mv>P=ugi2IHAk-_Jl)5u8gnQ4=)QFHbw2y;lL0qaFpl>Hz|px1;RZo^0A{^EN+v z@{GRs!ygg7N%YD~ciAJx36!Xo!+yd!_JDlpGJy>`G_P~&8-nLL?@$oz@-GBGLl_<5 zn|x@lggyvgb5v=e9)yY+(mzySN}R}uz$#AA9FKm`4h?cz0HA9#EVMNA1W-(;kPYT9 z1Ffk>AY({4cJ#^t>axe}dReMNIMsK0L1fV~w)wkd4_(f|c z{MA(ukb7k#(5KTQO5VcbQ=F^M)4V_ z8^?jNTUqM0AU+TJ&wtLI*XYiYIjCoC72db2`QudnofGGVwHv3JCk1ED3V4>1;JO#B zN+SU#l)`GQ=D^H~+1#pk^IlQBs52_>Z?f{?lc#k1_=wVUK(}rk(U;$Ri>9=tqoYGQ zIykIuywc8QH_;D&{9`&gJ)zaQRUL1Vw#$@c$7A>0H)S9K~T*DSfzzLnSvo2Uw439{cqNnB|enEq)rEtN;Bbs6Raupc3BnO(PAISCBBf@3@w&{^Ev%;)04sC&0T-12 zH&cd%g~f64)2KIt62z7jDZ6j3)!vdlYtf0s<$7%{#8TrGI}D8?T`MD2nAeo_U!QYk zVsS#nFSDYe1s)`?3xNlK1Mm#YEPP5i_1(PXv0FbY!K(|mHDXJa*y=T#rID=Qi77r@ zLr?|d$^kX0U?rQa85B%1RR&qxm~8%VJ|!@Ym>f4_Ha(*LOOEX3h&e0fj3`{-J)ATP8KGo6EN{gNehY&`Z~Qm=gt@ zPB6&t+pddFg^7wAc|sV5<&1`|BS8?~3kc(T#>?c;aG^UKhc!Utdrpqe34pf8`U*7( zmlP-XMq|8DOxMEP$RGX6M*55^?H+aXkyZQ$ywtaXp7HGYsO3~ASfjpQI2PY?|E|%q z+Rugg>&Gk*mYmYJ{Gjk>>zL!o1CxXBj0BS!=Q4&a+O`|;nrmpNhX^8|y^gxXw-m1p z&LtJv(2#KIwh9vA0xy>K!^532OkwxNcf?ubcY@C z%o%nQE0NQRuFfxMeY~c(KmP{3`rsuxTa^NHM>R}myWO_JSdX95M~@!U$*nt-cez$P ztay(ETdD+TbCRw55^dBxfxKfU#EwD}X0TSF0z5rqWR^3+{bCfd@j5#_g_pvg4JWw2P!@UF+JI4@vp6he?2H)ZPx-y^AR?;>0-~pJEdHg?dNrR~zwFlc-F5502Z)`P#M4@1Yfb@_6@ zxA4wTcLEyXXMhPbxi$#GL>kc7+4^gr78H|_Qj%cf52MmohBbBbgYWX|lXcB~^)>CIYjp4(w6D(&)<%0j8jkY}15fCg zdDoszyO&+suh?%iI>Wq)2S@(4qFmx(K<=B^JGHB(&>gjOg@bjfMKGEtVP)P1w~bNg z7;vWG6v!Ofx83dN^6H9>^iz|`35*Uoxqh#JmmEwh`qWEz>9@Y}Cf&VzN=L^lS~Eu5 z&O0hmhovCa^UEtbK02d%6d6gSZ#MF(Xq5RwOwbJNJ5fkV%Eh!|UTcgv<*<*G1`LU| z_r(3SMT+DrYU@zEl+^nea&3V6;?;Rm;NBw9gu|F296Q*yv~Eq_!>Dp=ScT z%@ZU{Z&pqWej~7K5G2QecIsqD>eg3766BC)W#n+*Y|qCwaS^hdv8HEH80f*dlNWfg zfK|D#7DpO z@*TRoxT4E#JMeH$?R*R=;-S!K5+z@(Y2xuo<`~ntCpg>14-SpWmG|ZriZJmPH3oe* z)3#WlcC&^;%py3H<}92G-fS>W-{C>xXb&d+A#kQ_A%{vLBqX2U7J!y@-mDg2&b*I# z&y;z5dT~kL|M5F?cz9s3?+`YCA&^OSY{&DH-yc%g#o-(ifKFLS92(kf8+7^a5f(^~ z!$=E{2=j=BBUppcI($#$wy1wi>idzs?z#A`Y>f_QQ`sGC4sFSjJ z@`3k?Ak>gde&59J_aSNi{XNu;z1w#!wSc*Rao!UCd2Q>XFM8#Ae?u5Dv(GDKeHYqT zSXfX5RQe7|v7`U71M0>s_8@lqGsiDR1PYxSf`5GPK7zc#+IO#xq~M%LK6IF1KCZ(( z&_drWCm#DbyV(_H7HB2jmuZlrsIqGybq90pm!)fL+_xb=e8U97S~?H5 zt&QiBJ}OiG5LY$}%0K|BN$(TpV+5(M=>a~TgJU^BGCPqGXQ$NJZ(UMjN4OT7jBR!O z$In4NjWKHjYZ8)r|IR7>?pMB04=?$B9{z*q@@@?D$qjCC!Sg)ItME!gE@eIOnu-%mX*6-OkylYJP^3nFl zf}B7jR|uDl#`48c!<08sYV*1%pPb>Rzab5Ou#4gD($w&H`e*be5Jw7ta%{!-Vu;5^ zcrJdx*3!Ke{!$#0k(~X^p5s8|hdThW^DaYGp6Z_Q*lUq@dOxO{9N| zj>TRnJv&Uo!3ut)Vq|TFYRXTmXTaK%(Y-sj zIg$f&zY+41r+YGN<>{+=tF|>fP-L3XNCM-C$jlU`ubdBdcI&8~ZCkMLHm8aUK6v>aD&mg4QJMzOh`r(6CbExH!zOxiFCN}>QnqFlmq zFL?P^ORoD3+Js!m?6(TEW?#h?M+UEvBDOCqAL$);XwiS>SsXrw?Xymo$=Y@X@x+GX z_EHTW#VE8a_YWp-0A$wH{aIpMQz@}2ZqP(mdE3tJ0*iT0)_O}in`>AZdY9@%l|!Am z>PRclAv2Kx$l94KE68ifDw}5p@OD-Vle!5ix2c>jU%3}D;w%cufN(M-*z02I^VxZ* z9MPzPgVtkEOEIP&Vw)2%j1Iahlj|)$j<6E3^sxZs&2$i+E5KBPOhPU&#HX6sxtHf(k~diMN^ zo<4hCm9k>ByV`8&a+9mauAGNf6t<$wRL|LNTc0b|ubIz7+lg1Lgb2=7?P;E^ilYdY zCeT`2Ggpbsv(c<6`w{|dM=fM!wi9Jd+HG_&OPCmhi^<{YoHq&pHYz2Z zmB_4{9SB0fImnIa$OjaTfGASfB_1~erSFpo(1FgP?7}L&@}d?2DupyvK7^MsS<2g0Y7Wvap*L15R@!JJy8gY>pv>EU7zknH$= zGz`e+B_&XwnbMeMhObO0=KSxx)`jQf;IimU3W^GS-d|2}?f@#q+&o9t!5Z$U%*K}7 zbFdH?N|w;T3F96PdUQny7J;5$Bb+<8=N1erOTY}DhiQSrGwlX3wrLYSZmAz5Iu_7A z$$MGnc;SG@4q#2xZ+dvAsy~ajMASxcMfFvVRvqTigebcgUx}V0S7^X00Bf*1=kKEo zDuQ^D3Vw{^id?^adPKJm)^v7q)W$f^ba+@iS_ie&Z~tsp^OK1^W5Nit2)fh;Rn8ba zJvpfbFGPuvy@~q_!`e{+LqzV1|Hz%}K$tiLP;i?na0>Qq#t+vMtxB3i@zl+Uwwo<| z@bC#;UU7sB?OLo1VAWY24l?CD4#CQa3(GKXXt<|^8O+wzVo-J~fUdFP5ob-@o zD-@NvFG(ZpvfeQsrI$x3A^&h;fy1ZQO^8m-ia{JlJ55y!M^6I0PkG-&tCq8+)t;mR zU8+&O8N$)D0$3s2ddL|wohjFi+;W3h;exrGCJQfY^ed-{6MN&TUqlDmauv{$Y9O2_ z0t*=y<|~8^Ehm+0b%NwX*96s-)LW$$d;(Z-C%6Z}jaRaJRG3R%Su#OU-#-niys1?u zZrrQ~Sl3^(07gh+Bnf3BBObNJB(?0IWh1_US$AFgN>1w*(saC9)8RDJ$+V$gf9qBH z*}FfbZ~o;s>16$z^yN1{MW+XnJJ=4@OnFN*t*WY@R;)ahviH-9*6X!j*Qr@3Y8*O5 zCdy`*QqnMpQaZm`K$@~t^3=*$H@CNRb#>axjmmh_y0K86t2t*UY-ijbBmhhVf!}Pz zNw_U92mlfs%%~NWsz^na)V5yG3 z`q4>9mb}`B8A|s}KH2xodaSCX$#$I|6WslTV~!Il83MG&mxoLku9w_9rGJBDO4!#+ zIU!Ns$>F{JSAcH%a1XA!Fy2V*`tvxyIo_vti|kV(2!=fEm#-v>MiDjmI@#Ul>;ao} zqe5s$0W*^-O%|%I2?|U1Y^gF@5)QY9Cv9RPvrM2Oq%gszr zo<6Ix8p27=~l_-TD5{`C6us6o}?z{)>`7&1W2|6Mw`8`l>unDvv}J|Od^Lu zmvBGj!%5}@7C`Zu?KihKl~`EbNpUgWJFQ9ETjieB)cU$wuc}us=QUkiZRmrKAJOHe z6d5}t${SB};#`omo`qVH{;oK!5&;(~EAQUUbbN5o^5=KEY9v13LRy)_`A1Pm{pH*^ z&Oxr=_%9bD1fYd zFlW_B$SYbPPtbjutPM*aS)3(pqlP2Of4y4|M(M11Z4;M#nVcp!_{h_8mgGcm$rd14 zyafkSt*YH7LlV}LmPS_Q&uvs|L!PYq5OcArie+;t3TFd{7|vZk5uPoglm#ZdRL+@9 zVIkoYXd~4vsgoYV=0-gtPHdI+h-F%noPVQ41Cu{UGL|a~bC6It0eNaf3*Lkv&9ov7 z2m=RZGJ8PN#0pBP?%snbRmM^)rEfQMx?a;i_|-4cAO6L+=#T#Gzo(1e`ZfBkU;856 zI+!45i%Xl}YVC^K9jaAk+z4S#b)P`Iv$T~x|L|ZIyaD#kM!(W0Vfv`h6~!yh z;H@iR8k=qVyq!VulfQ)_nR1r-x2$c?S_P;aM(HRx8CNoI9xAcsp)+OQ09p0I!*dvu zfM7Du*)iA|`Y8F24kXJnO3zcZuq3UjYJFdEaT5e8xH&XLbp$qncH|$;RfW6&Rd9Lz z)W`vQt9fzzM!!~pcuEuJ>omi1XSCJ1HrxXpbTq2q62P%3B(gT`NEm&bztmC1a{;r_Q-=LJ z&&F?cjfCZ@_SZrIYe->-~3PX;j@qF!QDHwS|>U` zzo>-;io#IO#40>$y>9L0sa7Q16xma%7H1yMY?WsT#(q$8!dB}hf99E;i@h;hl~knp zSZqwS1u1C7`w8g?ze6X^?yfYOZS+sUQH;z5fiu~ zd0CC;w$w{KguMjP*C}AI=iOQ)YlB#Z<7;N&t6*DKyOhd*TwCE?lMB^HZ|!y0Iwezj zFtKc^AY`H)6r>2W3#HjD(O&?lK;10aUTVE=_Xrrv3hE~{1zA{;#0A^t5pM=5Bf^6$ z1z4aKZI!)5c#f6RNKFd_kWhFyuC7*DZ7y30bRz3_iVOpp4S$})W-;#@Qfcb`v3=?X z8N(ub!KL!p%}E!$nR;Od^v)FpiG@`Iv6Z=(*w5t zyZT@~SUOD#veeiCUP0mz+7Zu3K__lt9~d>}Tmoz|lxx<^SQ@JDEX;M_GGl@7RpPK%L`ThRxB8F=Jz zX%UH_1P5xi{!dzjU-qBux1y}Hu#s*>Y!Ar07FY%{WI3Kf#^rm*p~`Tifdi{dj}y;L z(&zyXLhV65bB3*o=;4^49CHe7*qY4-7_*$z2tX5QTF*!V>U6*lfu_CJl&}nfZnVxx zl@v7sK?s_Fta@C7^fA(*D8K|DoV-#^6dntF+vce^Qn(fZAa|Z0;Q>LRSIkIc^ua(n zDiaz`oRfJ3wS9wHDnABQat+t}v(EIOSpH861XLw#MoYd7CaD}p?;I+L0&Y#~?Pj_I zHrfi$x3h|avPyw=b4DH@^lRZ*2CPIDnt=hAoC3{eJtia*d~NGBnKvo>L{dz(2&USwkkmtGRrLYU!qla|*%zS!*O%h-^P zx5u^!*izVk*!AT%_r1;;7<&9Yu*G5AmgK5|ypw@4U+N<9S1wRp(PYiJf{dsl|E@@%8$;v5H4vpN=F`21>1w~n^->!1HLJ$iah zfBTb%^o_s#+scTGB6fOIqt7|~uoae2tMqIICS;CntQe{!UH|~h@_n*RmC3Bll;9xe zX+^rQX)*vP1xF;FH~?B<+=&Zgkh4K$JxCCxh#lSt=S@g{m=+>%lg(kjN?I*uS^p`E90sP4_l!o_AJ%#Rj!g{=hFCM z3K`l)D|idlfi31Xz8IfYy2iF|MR{BCx~w4Qz-SMJUsKkM4p9&rtb}FFKydXVoSVmE zGXQ5H0EIw$zu0;3Zs8Z55(6Qhs5B$rL1P{fdQWhi29#{7Av%IzZMuIlx)B*9bR0!N zptpE=T>w0-Hch&AelPTmC8wa`T$`*QA}~DqFw`WCICAn{LBe^&7t1pFz%K2S!Wq8B3M6{wdZjBbuC7*q7NTGr$7DX-_Q@=`H+qdkLdN6U#@(t zgy+e@wsV&KhG$hGeP#f>!1raEll8xhyX0UcsR4lCKH(annI?5PoBBO?nkxxTVvGdv zt%godr&D!A%yd;k`FA@{*Mo?obzPbX2^Dt5u!T!)fJc z!_AZKnZQ!K3-=d(1tk3f4=S_NOLYV==pcV?G!)I8;nY2nHZDU z8x3rBF{;cpjs`W+Zx)T){#uLHo@-%&wpk|eN{MAw`!h3HO@R_JXlU(f9w1LWi7oa* zh!x24hAsc?ka!_(If+0|`VEsaECTeztbzAzzeF&(Iux&6=2uSoEZj?h6+rfO9t%Ky|OucZJ=<1}Y^}v`7xdqFC5OpWvsrS+@ zcy<+wDUE_>X9kOoRP3>p)&At%zk3Bo8Ms{q^lT4U_-n%F1du3j1EHt7NV4KS%mb>0 zvwQxmgg+%vUP$L;Mo_GdUequZwH70|v-EEXbD6laRdEz$ zhEeJyR$S)6!ty0#N4zzShqusT$-B&YPNV_i7Ouv7M2?eSV3{WK0Lrl;V&$)WEcfkZ z&i|b{Swb}o6T}N|GGw>(-tLA|QBY;!xwc@Vr17&#_Nrhhd$@-}0 z5e9`*K1-hjP-EDY@M>K@=~v7Ngua>LlE5?Bcvv$WOvYctNI#L%J&CeEx5MmL(kA9b zl_E(_88oHXtiA;A2<{-XJo9&${~>HLF+GTvN<)~rVaX#=j~DRDc{2HH3SNS~d2g0e ziX6D}^d>x{?O*e(h+|6(d4h068Oc(x0hsqnX^-4|wJkHLM@^oS^{IGbhAPwQRWSEk zl00#y-IlYT%>I;3?&rcsn8&O*47EfImYnMv#X>VZy4cXa`Ln;KZ@>FNz3;6Duh6~I zGy3q+!&-H)Mypg!Y;DTP+`|5=BDRZRfXoNT@5dTy&2!tr=XZ@~fl<|piIB%bBQz?W zHpxMnEo_@m=|)98D(UUzO1BYGJMSB()ku{@;j5Vq>N6$&kLcO+3%Wc%r`x9|bb4}B z3*wdV+A^PypFX3PZk@F~K7qmhMYW%iqV@~Au4{4_>4kqIpVfVa@^9%$&rX)U!H(*_ z8cbo+l?7xDc@j55Njx#ffee2AuzhQ`A)|?%3FH*Ox zy6KV%ZDg7`?TlC%Q14K`k^bO{yZ65SurSLB-p)iF^`bvEV{9+9# zpPr2Ys)x^%D4cQ;D5=XCGUBta5U=RD_cOprys+x6a-lB}8tN0Z9~3(TWn} zKZ&Q&703~VWL9Y|o+8PIo%I+34y|FupoHbL!YDfi_jcA=&XymjmU2;0ce5&Kri73J zG^vnD>baU7_$=YGnJo7#G0+#K&88wlf^#O;YqYx9WLhA5eC13=iDPKjq`vHEwQnFT zbDOiW2%rU3#0_wX5}`D&w!5U&3*}uU|D-91CO_o;D(FPP%Erg!1(Q_R4WL{I(C8p( zd#b?cBeKW%jKa+8H!$=F@Dh-Yd^4eq5~RnJyeC$@dbqzOd|gA6MPb0aENfbLyc&~C zI%?Fy1R)wK#~E~DRnrWfPV|=1BuWvS!6`g4$k)X5T0?nZZc5C$4}-JC4w+s${OY-hJg+Xs2nsbp)-kiV$Me2nUwc5 z9+lLnoM%(64a8d|Kxx!j<4N{^a{bZ0l)%HNeadEx(|PqC@~JUk&Oe%J4p$A?rxpeE z^x}g4=db-K{otLCX+0g%o3Fo0pT2jC@@Aujqb8=ivL>aC?Yv>-=}?P?X%vg%E1@lq zONjFz+u5N9jr1my(-d+deaKgEJS3m{i?1a$%-Ql8@!H;~GJ-3Fn_*M<{;WmWBvQ(F zUweF3+0}C6F1H(c^6XjN3oqTfN5=ho5i@@ zLwzGi!$bNRLGvD6lI}F-#bZP=lx(9D+WyuM>7T+5pT1ABEEb z?xHYhCT~N~%bvpeWeLRJoE61^a>gyV<)#5{C+&iKR^!l>=1-GHzTv>>2JK01{8I=s6YM z*2>myx0kfpUePA6==d`cnb22dU`k5wGDY?-)s96p zIY1;{!D*6D?Z^z`oDZ>r3Qx)c!UbF;8^0QioL4Wqek8RXW%hPj=whk3Im03p#ei6t z))kcVUwE=IbKcctV@Z5?c54y=0EE>!ua|%>{;Z0H0Y_0(gf9p^`)b6#Fo(2h9vSW* z@JES#R|-pNC8&8E6VG8)@Zh+}Ocst=mBL+yA|R70juq@7IP&^~g^o?aL*;!lF0zA+e$^l&V`WcXQcwqLIeQuWOsz5^0(4#%r3ZZ0quPYD zAy^3tuuzS+%64WM|ECTH+4niCv9ugbGaVebIWw8vWbu?xaTe^`O7dTAcJ$=QQ<~>3 z-99^^J7=fmBwbCv+0I+~=;0H3`0y$1w#PO9EN3&&Bru{Z>l^`>B_RG^p!S6=IU6+m zXpskKlZZ)@ZLOtflo|HG0GtH><8P)%xbemC#cs$!_y~{8phqO~>x=0fXq?Rcvqk4w zJF3HAmj+ldOJNSNKBX$KSK7ykf%v+X7*8CAVk1m0U%@L1Eg~gZS#tytIjI#>tR>UL z${6}+MA#&>fcwxqA$nu>ExgKXx(0f4lzkx_5C0Jo5~b0_c*{a*!o7vp;6#r}-GNniWMH|g+bO`m=JQ#9u- z)0$1t%$8QI>PN;rTX?Ok6R}lR4&pN}-B97rjxhYVLBTUBv9(MHI?28x5GG#H!g-2n znY~Xzp{~1M6Zu=Z1i?@)?ghI=_A?Vdrt1-WN!c((5IyPlP+Qd-Fs%)uJ z1s-&@JX+q9G~YaAzG|tOB!Kp1;n5SEIHV_m@*+oIpx18V`~-P+5-mZ2EwB4*7IImu z$uWRQJqM&~$JRaE-`b`QKo2ouLzseEP*^sA|6`5B=>Hm`IBZ)t28i?hHWWW<8V5y zUY8nXP34#gJ^-~Ea8{Y~ckE0@-cmHrlhTDAH^NG|@@=5R#47 zPQRyUCw$Goq){l+AAlF7dA=8Dx5^K-kaKt-(C(<%YN=rD9rl!oYe zD(kE{TSm*;&%}kKAkPF11GfK-`5WKpL*Zl(kT&7bgs|?~^sFnSbFOot?Si)tjjK7+ zrsN?VtmyFYm@cW(C9G7m zLz~-wdAD)rU%COn&{LMGt#D~*FGw>7WMw`@J`D`tlySzDH)c7o4Bi3OX*CQgz6)0E zN#{@s*_a1gLdVOoG0)1mqt7qs=wMCv@7$rY1HUK>WrX~)Ualnl?3{6U-2PL6Ylnt5x1UU}6x;Vv%u`Q-t zfRhRz`92U?B&d$O5(UygMXOIlbl@(6OQD#g$auKN&>Ep6iu#2Lu94Ot;u^f0dGsFO zu0X&#PrP1pPIR#;xnMJ`t38Utrt}2iiH@e3e(kfb(Bo&9^!5MehxD_LpV9yRZ@)=j zdi(7b1|`+}sQta;kO-;5t08Fk9{?0l()6BA86)+;pc0H0RQa5Bb7!Cz7bWh&#%O_1 zu@}Z7&jURr5UkdxUeF?q>C^7L$^DrI-y0o!Ma8{3f0)^Ut?Rt4-OlAygow zIY6F~(qt9S-E?VD3=j+$8V6G?Avmb4Ohk@$y zz>hWbtMSi+a#X}>)oK-Fpk?-sHE(k3^KOPcM1%uT4@u%93NiyJ@!*$srnFMQr1xO1 z6XZroxR&UgRYs&0cr8c^@~8)v7oI-RMatpOOHL536-tlZ7=Isj;hF{ zV>j7mR9VI&*6*45Q<>L!28ELo``g%cw=|xm^P0H`mdr&f=PjPZ7J_QymC#UH-MgT-^fPI;8GG=7mwLI+c6z=Tdvxt)k?mT^A@uiYaoh4LKcPZ zS-NeiXCNZ5*>PBE%UNq4w^k^j^-&Zw$qPi8q{d>N@0Nc`8bVyWxI4~staG=U&2tAi zrAczyv*^r{yV?3Co-5=D|&CkA0yL3Q*^MfDLAAjR7=$#K9(!E=^=(G3l(@Q6Zv`(|jP zGxKplYGluTkEr*U4Ob;v=lt@Do}53c_uf7`rCX;*bbPSV@sxDBt9s7oj-Fp`>iy;K z!lP>L<-BwAU}Mbv^o726KXgXr7rR_Y=S}rFbX^f~+D_D{jF!at}>gnc_T36g=8cc%e zwQglKm(3Q}HZWTK)T5M58Oj4{$QZZo0JeA{5k#UF%eSElL4qzVP@h?W66`}XNq8XR ziH0q~l$q$H4>^nv36c$?PNOyDY&$oLrhvQ>3cH@n`%w_**^20Q-u^T_JwK;E`|i)^ zr|& zm5^Mlp|vNtm@T@cWm*Tvup=b5(7f*v4(k>OS=XhP&<#NDs|Ok+!EL85en;;INwT? zH*a87ud4DeX_#PINhn{9J8$zk@9600u=cYa23lp~tn)a}Sql|V4ey=R>(KV8c{4@f zDgCN@nsb3m6B0nUT*aG`O=`Zq^!{6jr zF?x`Mk&1#%%_Fno@ZU-im38Il~htVM-1I! zj56#ao?m%hDqB}YSt5d3-6^_v>oyge&eiskro5xqAG}PjeCh!mo!p|o{MNVWkN(}C z(|aF2qWiaR(PtjKME4HMiDBXaYB}}>;18{IahsQ^>dA4iO3s6p>-1gT@|e6R;-MktBtK!#vn>EXmjbeB>k39 z+PGe`E;d15H~%*K&>_w{Yrw`T0}&@w<}B5?CL`+LTpjs##L_3qP$JvZHvg6%WipGs zcv_ZsJnh;Zk~9`Xi0)PJGGMrvxWh$=SS}0&VwX)U+IlinA#Z_m%9O!nQ>w?lHVVX- z0N(q-m$lqEP^>f2)~)I$HEYJ-<^RbP2gFZEz-VbWIt(zQ1r@5U!)2o0QG1c z7QS5zvaBXmK8-n$=J?E@j1vPe_6b_aig<_$hBRzArQ*@)$j7#?wG% zB+HjHuV~VWuoCK*xVTJxrWjDz+gQ(sn&JGUY@w#)-b|Xyo2vII7hRdH#5OBCHonxn z-Cdi5-E3!v=FOI6Tgxdr5aVv`ek%l1_Gj^UX#tNU^PJTqxSJ(9Rzktb0rZRsQq|)n zK~nP`S2XdxyXMuY&|}NvlvszPrPswnv)j#Flz~@C=rRigOq}bOG#q|H8W%(fW!%NX zG)?YY1!fkKW7_!GZpP}>OqNg(WMZ#rE(J2`0m{v5e)rC8`t)m`DjER2|H04c{=M7u zOK*Id?%%sbw{G91Klr16M}PFE-=Oo04L!Jbmp=W{eL7ngxxC@2YjaViXeZGpMK;be z9ClB}>}rVmQFpXj`+OqOAByI$+Aw0Gz3vBI_DS zxdP;WO;=AE#$82eTG7SD1-&{dKxbRF(doUa-;YMDBN9IcFpZDMMsRtl%lbD(0CU z!A!wE=E+Pd>rshzI(E{-iutNeYQ8KC^TMc)V6HDBGYiqgjPW z35&=q*rqJZZ`N=`&5KaQ#HwtG`#woxZ*E?yHOCCkJZmYLh1fu`9VjY&l*3BnW}K>3 zcSY-R;(7_wIapV(+Ge|>&1E^?Ve6;=T6NxLNC1N|2iTNBC{hY;>Zk;PMJ~bL3VemB zqW4X5nF7<$Ho_TZ3bKXaC%e~(-o_~Ry190gvaEhB&6_H1$>vDLHaP{76;`h1R&}e~ zDmJ}xXHEb7AO9v@{=uKqci(wP&rXT{;qUx5-Mw|IdKro}|KM=lJOkBR(DFT~deJ+hSy(xKzDAR))2U|C+9gEm9TfD zBt93bc;Yh2&(1HJ@>bWODOAPkooX#j4nyMnBMHZ9%5&Dat{$PC%^8kStnw}FY17`# zp-D5Jos+m+^7|itOh5bi2h}rM$~WJ+eY=SOnTI*6w`VhFJp}aZ8!>!+G1$jt}Xm@YPBuD-P3bXGYbwrb%KcYrAD% z7eM*5ciy4D`_a2}c6vIr%Lau3c@conVwx-5^ac1jwd=iT(QSq!f3h5D;u_w zC?!*q9TNUq@kyCmYEeHWN3q$R+hw;$VDPn5;9A3H9Q@x*Q^L< z^~fI`9MIi6cj@%jDShud-=!b_=!f*1zx*b>{@N>ae0WsT1OC^4{m1mL{`J@CH}J@_(%~avx+r$^5E_waRCy3{qG9&BQQ=(4 za~L|U{e{{K-cUZ8YosGFe2rgU4@H*`;+bg5{RD~27P29h)WjiSyBXU{T;!O;5~Z|g zA><^bO!-WhoHTqOOT{v^tbj)gm5mw-VAdt!3UzaDw{%g!a%y0@bDoS=HETK2W; zg7er-T*$*pc&a^ht1dza0l1c@bzyz*GEh*6tdzGdsW2y)pA6^rV5gmOtO|fxCfF|J zEgQ}vVIdAeiF@~V_T)#vz?GIJJCjJ5wpbM_?44R=q*YGz>a7#{r~k!o(7*iJ*Xg}S zAJN6;IsFg+;=iXi-}nrzi}ihK!p}k(EEG`sEn_2yna54#7+SbTf!v4`g2BldqKLfP znmqH&+9&LX5a)P;%_B=Hl+aV8jp5o$C`dBlClazLZy65w3?4d?a3C^)K$3(`?4g*o zJH(1f0YUG-_W}LkAN?^se)x#~^WXk0dhpWSdebDJR;6T{$Prv^se@gFt_%Xfp_Lu0t{crv`ourw|z-KxvN-HzjHuRG0 zy`%r*-+Y5UeEf|5(Qp4}baph+X0z20s^ZNk3S0SHat#W2`}X&LOh5R^yY%GgGrGFk z(&6Dz1%O0ymd}=1npLS%p07gGq?8I*rR7Q2)O*bM-`RgBw2J<9$*s!D(=hCjRMD1N z7EMz_DCKxBHHWn4-XvLwGnvcu@On~0y7^s z@X?14>Dlvhdi?ll1&+V>yT47p@`X365v%l53`=79EuATV^8ESps)(!;)x&!)wj27B zum5}c!B2ihU;XMY(?9;*->Tl_%tnc-RHjumwv<)+_78qczyG!Wlg=-mSDF3x7d}J( z?4SNu%xP!3*v$0%fAW9P&p!B=?wlRdKl+`o(A%GXla7xL*~>Gl44l%M{$JMKBgoS1 zIurZu|4e$HRaxG5wW&7M-9R@C2@VIO6q*r3p^+lA(OMft%t{L_wbVu{X)z3G1~a5M z6di^H1=;}tkZ^6$ro8F$l~t8l>D_bxRorvWIrrTEy=pWudL7x7`QHD2bIq~e`A!!F z-u>tze)yAjiK%b6S;yDjejQVzqZHKex~OZYH-~WR!4rIZZr@ zoQ3v;0IIWKcB=pRcVYRJ%sa{4T6DfR01cLHb*?* zARnpjwW(C^k$|B#lw;JWxBK2GG(k6LTMw(>k~A4q6Xcb!iG!@7D|~5eFOA?BJuCX0 z?Zu24T;w7+xE9)}bg;X`AJ9~Q^*r~<(x!`#AJloN+ zM_6E~Y&M!qvShN`#%!qwQS)-yKW3oPgZ+}uS#l@)ZQQDvT!nawEQgWLNr%W<$j*?Z z39|BvEQyeQ*Xt<_JM#Ih-YYLwT2H0VbP@(xe6l{XL9uYx{?F1F3~<1F{%_r~<|Zsb zGS>To`35ql#;(DMTSM0PwfXgR{CvKd)XDL&PC@N7QIeL@G{NO;G_maVuwAw|`c%&Z ziP0v{vUSZs%Kh4ut5YFu*$}JI-~2quKp5;bS1;=O-YLCV{5)Q{AY-?x+GD{!h?xNU zSu!%xd)4J@|Mqe(zc9>@HiX=pbK*25gGj3kjH5t+6J||3wJ?TnzI6`Y```xN`PuvU zHxs{ufB8TD4>)>gfs~pUjMC6nqg^^LmFT(Yua*x_WoPKCif2b!KW2@jPb%Z?)dfv( zG3XXcm(h+~BlyI_((Hs`I`#qEY0$!YHNpn~`W$Ga`5Re1e>s-7LM= zL{`z9veRzKQEJ?$F2N_+;PWv%3xTvU)F~j1c6WC1NdCuieG^ z>M~k;J0!$LhUz$RWP!d@5VWws)3ptJcI!4d87EI2#;Y%##=faB%IXBTbI9}x0wIj+ z(#8&+E5}44$e>UqK^BtkPI?IFn8BhvHZA($?0hhXm=T2 z#!@dhR-vZ3mncTX825}V6jV^CFD!j(u-@%Pc}$>9nx-xjvy`dN9tCm=3OYS{_yo7^ zJV4j?aN^8S?3g|~YIo6YbAWV(XDnyju?Xt~N zBYTJ1AJhb1&f_XN*Xf9)EYUyq^`DR(^VR7e;OptJriW^uC2IoDB3rWZiN329LJ>Og6%F| zI&lE2TV4F@!cBbt?|+7g@p1gm|I@!jqfw(d1|*A7=)*W&zXh*leS2$+GN}<|HOyVVM_wc6>IJ>ADP45|~tEv`S8?Qzyvj zc=6!rK6c0h3HDl^v)j7*sCKLuvsuBRYStmx?_e}`*%@=Xb~)l+lT3&N7{qC;DI}%f ztN=pfo7x5T+eAXBQ+O}Yav7{>#o4_ zXU^cz!bPlY?%?60N4R+9D!%d7>(OYS#?mn=f9&7^?4O;*;?gR1_jYmV$~7GN`kS$K zQEL2zHOzaWEq?vni@0#*Gi>eb;p(+pID2#-hU!J8XKA8!!V>Hw zcW$gAkj#7pKP36+6yj~_U_~}SvTHewep2YcvFu`FeI3na6C-0IeK2cLe73&LXIVC> z`Ao2A)mIR9NFi16+5I?eKpmZcV7S+$<$*LF=W7ZPm5iG>O=(XDs8KDLUmy@R<#B`xp*1NPuDOpI)c+j4q!IG znQIYdSLgNzu_m2d5G+1^gzMLD5mKh+didIxUdDLMbMGqdgBoCA-r>^Ko49%B9ywd5 zPaMMB^jNH!l*M05>wA4`4?lVD67DXpQ{duPzxEOqW=7coijyv8HDxxW9wubGnhlks zJ?@?6nD8u&OOI?>zPopFF|sJ9o(` zKf3P#rlzMUbGf{>ia-17AL5;luF!X9$Hp)}F%lUNOV18a!T3XQO4Mjc0rI2?#3I$c zfRcD27E8l6-DflKcx0_&edVxc=t-}(lGsfQB{fk+3G(H(NXqs@BwQs3s&$KqC=6<1 zT>y=c(e9Sm+*-%*a08>w;po7l8wrZSKIta5Lre?G@t%;wG^w{bkY!l7BJ=@)H@&gVXiwTDa% z{V#?dCcDd;)YgypY^T^}>Q&flek;QNU`EKLg&d#19~W8O2KBVLU``YZSA7xdxpXlo zK3*8@L=Y6}oqKkuDn4WOFojL`8bj8bU($pNxM}&DAEw+ZU{v2nVB1B z9JyaGdGbg z3du!@RUyu<@;xy+WsuV%(mTsv{Q^t2u!)&P=fWJPnM^fUks22Bz9d2%Rv=1xpitJd z&ngK3e-yl1MuZs$Y@yAuM%{BT7N%b-GZ{xF3%mFQY7K_~gPxeErQ=Fg-EOaLhs>$<)*q z4yTVF#^L!HT)n-7+jk#g>FGL-AKVw6J7zD05EJoy%}kA9W_%P6A1>ng6NfQ6IYb7h zjI%sX`0~bX3%lJiayZuN7#gZ$Xt;qR$B$tD+>{1#gt$TWj3^4-PniKAG7u(6BQnhC ze)ig2Iqf|N1X5)fw0;=L)Kh&XH1?kB!a`4@TG7G8*aXHWC!#Y_DWukjwsEwo^#^J9 zh{edeUz&om6PiPpj5DbIm}Isg9HBYmXx_M&c(*& z4whFosUdI(3LQDLAN%H}qQm5B*xKF22S2|^0os#C58}mB$1oBY`V9QqW+S^DkB>gS zg6-W14L-Pk4rfmuCF=DQ?1>rO_01i;`{70Gwo26N4sX8tBF0CCSjXAYiwLp1eeV%I zx^N47tpalsL-?)#>>C(rF#L{#SDEzHx^;12OM-TWpj6mDoGO+`f;I;SntCo26RnTBDBLuE%%3 z_cQ$X{fl(ZL5|Fgk6@@~pjoo$l$Z;un^RySv57iHC@BojE`J-oadvN_GJf`bS+7o8 zm5BYRj+aFs$vF+WMM_0PFG@3UF$JqZ#oSg-Weo~@tvQ0jhV{FRnD?Qw_;Vh`nq)=~R6jQb z8hV@rpz>ayxwcUK#_trBtXZGkmQ+W@lNIj~sKckiVwq`S6^iz`r^vF`MyWk^Z)<8K z%Uz`o@Ur-A-!M^7J{E{`Q_#ZKI9tKg!kjheQPkWila6D|el#p?R)dT4ArbeQGIu#; ztje=a*3;{s$ZEfVsw-gyfdT<75HL<~`g$TRxe#~?_vI_g4mm-}lGZCp5$*2mpw|w(=rP+=a!UfRV_-+SnlTQ<6J)@+ zE>p5QB?KYnz@mmuuZvrEmhiI=uM-Spa%u<@6B8I4A4ks(V{?5A_a5GXzi=JD_G`a_ zBMbA1q0FT{L)p1-y)xDskbROH0lm-ymk)n{`@06TI%5b{YA=hef7=rkzo)~ zc1}%9;LMp*xP0vnHum=L_|X&GxbYd@eEl^wH-sfN!l{7aqK2=1`8=-P`a3*cTE+ES zcW`juESg23J$}dlEt3N#L+k{ z&3OYPHPqQShL76sSrQN{DNELIsV`ZAkm#D1`byQQNs~(rnB8Yi`O=e&vyPV5`^fWa z0K*L=FwX6$kz1G668wx*$JmRcJ2!6L#rno3Uj6DDn4KJ>?9ayLHa@#` zA5&9Pc<$6;j5e9E*bA|j)Y|n(Ew8L?U~OY3R7e5kF3!Jpjv!odaBBGQ=NGZOx`pwH zNj!h*2=>p8%c9}+T@ncw*zvgk=qWzFbPJ_xqF#3K_Uq>{85}E=OdJvIj4tZ<`NiwF z|6~;oLpU%qi5E^CrRVyzal(#YX4M?vpmmC`2)3QIMZp{ldJ;~Qn`>d(OYlsR`Hp*&Su%r779c%VjvTt2tv=)Si zQ2Uol>9H)-#C;8Bx80ElA(plNdRsQ`&uV)SA7yN4fn?C;+ zVmA)5sQd3hf_o|S;BUe#?nJzZ6u~RIl7_t%Wv$AgU_;Fgshx2d;#e$iX}ty7 z=vWY@nyN<;QoOG^VEN}V3APF@O`$1D z&nC?%Z{yJ9^I{{etZ~%p?3l2us~7cfIHteR>N<+{X7oOj$`HNHooN;+S1HO28_TfrDR!gQ7Ib^RVWV?AaNOx0r)@ulXc zA&Ofk@|0lOhgzv_w}no-MfE)Gb_?zH9$Kwkv|4*;wfE5J#P_1X*Fm?_rh2B`y&d|z z-EE`Q*~MOKmz=QGjV+YUVPkt2`{wrH{Ohmc{Ohmb)mLA^tFOL{7tWp~DAoHPeu}lt zZH6~T`e@k`)PJexb&{m6r(pR)RuD6?oji7sYFENB8#`@Wy>XY$OI5X;#SPDT?)m4i ze}0-$oXz-1A8z38N~wWl32&hMaR#VqTyZEGfXe)b858cj@$3}I??7|nt=U1|1A zY3kmsP2-ajQ83FjJd@8DElIzzZYN}el)i~XGu1B&8CE0Q=u|;YSWCMio04L#co|t> z(rS8WEwr#(YGZ5j5-4cN-w%-ApsPYQF))7?F7^Wq^AWPa>zmu;BnLR5T-(_kGYu%F3qCL^?df z68e^bF)*?(nHLFXj{NI+l-R?bOY`a+jmsmUc{CxvPCBoBX6Sfia!sFpkefH)HE8Yg zK#56TD~v;@P9GQQ^Ev}ebi9lTzv#7bWOf|?^sSdMS}${!Py}lox9pkyM*!$FzM#oPb8tc9xTNByJR0rSb^Cm~yCm55SGAWUPgKIZE zU$kWBqU3c}DmFhk8RC3PZIV8-l`YO?Sx~Quvs9CybkE8#S8%OBNfEwK{2eHeYtAXt zA=Qh8$Zs#!jl~{4WmGoOlS$ebNMI(_u2TfL9q{&Js$%3YkS7`u>O43WRW_3onr#AKe&alv%{rau zv%B~3@bMDWW>9}K&W6m)OyKm%BWQ*q?rw>D51&xIj6jIeT%=&j$WQ}szWO{V`umTU zaDOqL*GZOAguUmr>ARSj8pZy7^LV_xj@u6&$NC~u!%No+PS{WrqoYGgrCk)UPDmXa z4Ui<|C$)qE)f2@g<00)IVl083mO|b$=PArHTRBs?mUGCQpF|P@g$F|9nkd?=PO)Mv zx}+bfy4VYQrVU1D@FN9s63IdKWi=FY`!6YB$Ihuj?(OFq(8}~(ll1m zm(b|EK4b!4BYBsZGbwWzWkSd*N80)5G{pW-J!K&kCSy^_BYo03ZNKL_t(>A;736MwtdbT}NJFJ$1V!Ha7QYFLuff78d3(Iuh&3 z0#*8jYq#)lX`O0g&OLt&GgBkVLRd5KGU{(w)N$|8GCsca8G61(b9Uy`Va!dBm}iVK zBmi$dy?Bir#<1t7$A@t0=st`N4N;a*qUMfc%scHazW0N7vAoeD+u>_pc@-y59Mb)2 z<*+&ty4K>n^-2Rl4K-jc(!B@xVA$I|__Qpf(J$50_L5^p?Lx}froyoF(ce9>FQQZ0 z?)Ioh)#B3?jEs-sz``6RM#oUAH?X|Ei*NtM5AlPae1v+viLs#}%7Or+KwQ5yYYCzU zDPxdvU>zk{>EzkR@2FFmDLk*=lYK~aQ5B;=Lorpm#56y5mYL9gHwy%-5YaUU6I>Nt zRv3rN&R^2U<{~crAr4cN7a-=s04t>@as~GG+SuIOp?v`tnK9$Yl|&#VYQALsM}bQI zy;ds;dVK2WA)GsN67v&7@MSv&85oLg`px%0^Rs-6{~!FdL8tpdw%5*DxK%|ez_#^%dCy|^{`#p5s7@CuQ3>0Kj&EUrpv^x5O@OEEof zL?0<*OM*2)S%Yj7$!s)C#4io5r9eo7HE{A&N+bu!e#JUR5<#t=!WnJqj9|}PpUh~e zuFgSoE0J-1Of>?a3)gP3T+qsn(mQaX)cdcMEcnVP2HqEVd~+g_f{V_aMiseU0;XS4 zzzX-ec<#^~zW&-t1fa${@BSQr^6fvz+QwEN(S`QAOCB;CiCzuN^i%flW_Vrqnefkq zV&7o!e@@5IRR_&_)Rk1XH^Z19kR}(Q5u6wt=^ta0r&VVWsW4o!5(O9FBf=(}IP_Gf z73&(PcbaCxIRanQ^d~uFHGPI)AOz@=*ZLJ5us-=B_PRVzI>v^`>_|tWFw}M|uWb@V z{JFrKwr`p!z60c^(X4R|MuCNW^YFb69z3{@y}ee-_DcUZ&8RztRHnUXG89Z&@!|_1 z%QZ_u1fqSuat*CcFLT|)H{W>e6%36u$Q%nbUbpW)AcIxlV6|Fu#!$o{(F2M_EgBkTH|dkD!e>7nG<@eQOL=*3n9vi^%Ak$z;d zO0z*}Puf^OCLYpK&jU8D@}B+7FqI{vDN|?Zo@DqlD7N0HK8qN+Std?OQ&k0jE<0uSj)K^n85)PWZUEc~>up5{dAH(rO`>AJFyyY4emsc=6I*i%LQObOm zKJ_6>$dx!Yt#(PY=v^PP=4Z|vRZAfRRX)0K13T>=W~avS)|=;0D-tUp1yBlxVg`bi z(&4?2E@ES^L)VxX9mbhcM=&}(l*yFfpscKK;=_+GQRXbXf8@x196Pq4^!pkBq#kiK zT>R`FetzXM_?pB1`6+z$t=BO%HNlw)uj^bEn{E;QJ@)nLMuL(cLu++<_WMuP@y@4L zaqIC4_R50EHQ3naAYtj#+(voFa7BYQk_<1+c^TKt+QtSREiYqyW&#Tb7N}-2d}n!W z4d4Bb|A6;Cxze9UGx0!p&Eq z5TBxQXW38wxihw+WY<%`)!O;?RVdb4z0WH6gzvFp@5P=iUE{3eB*37q$U20!v$Kv2A10F}J znTW%2p{+y$WlY7__B-5?JcZt?$WtleBq3)+1QULo;yGqCnm-) zF*b%ri;u7w;ETZ^UP?Yr38*;NKeF)Rw%b47u<*)f7?^8uai1B1i84E|VFAd6>6X<+; zS%=9H$oEu&9~WlLNU+GOfJ(B*4NzWk&ncUjvP`;;Y_?6aK}i-R2pZVfEsfEW#zZqq zRWTtBnNLI>UK@vdb6uCgy0YMx+&4SV1!sFoLzfSqpk1!0&}|C~oH$=a+Jhb`i0Vu8 z08aFUY?TOKCHnIoH)?l<^st~)e|q^kvAu=12BG3;@XY7xclG{?a?>hcoEZ~CdL{$Hp2A|!cQId7nkv8fB8N9@n8Iaem=Q;hq7gmrrw!e zC>RaE@F-^?xiYy-TH!nqAw78X7?V?z6nL7L7>5rHgm+u`%fI;%e)`_Wv@Rz{o0uAD zqFD%Yq|`trr$qx8Y(yq|Fv)_X#gKw48Z4@%H4m>%$dk2^Y`?yj!W7eb&2+7m1ETY? zV+WjYz^}$W&H^u~c}af#pc6w0MWfk3r&nTqeG_Zzo6Km~j7}))%Y-nA`!Mb&M^MG0 zC~^4EejGo1fXJSPhL})?vfwqUlib;BV|Q;4+o7>@r!=HRU(mm*5M4d%nC#!dBbM9y z)pwlh|GLkHu5#kfcin74Ah)lqm6jZ1E6a0x-mIHv_+Y*|M#i=-I9TnCt!ooWfNkdk zCZMwYT7}{JS{%tV<3GAGi`sLZ6dqQ%yB z^?UGfarn#t@yH!D!SKt?R6kb;gz+9lNSdSaYnpkfzNE;!?7LUv5LCvi-@wZM>@(l^ z4JmvqP-MotI8T8DrWCqjnctFyJR&blQF@HkdieVJlQ?~31{>>J_&F zoC#?A14QX>7~|wR2?-#wkt6>S$=ChhbbMq<6^SLIvTu3sc-dd+S#qP%8gYrhgPg8X zGT+h&+6Ji700e@lh~CIynO3Gs7DL30I8mbU9Xkb8#h+}JsPAgR2&&FHvcN^UHdJ1g z463#IP?L$8;Yk^0SxtqhWfKP?66mCQwURSbS8v@xz1bu(j_HYsm<8vagTY`7@;tzF zwb3~f7O3OTfw#~&Ib??dN@aAoiTSx1f?lm}cX09QEy{3Dj5P4p`In*X2yJ~JFRTFR z`{1DF*h+5aWYKG5FDW8)op?-ZtZobpke>yC|-Tx3>w@JIVu-+ zI9!4EKKuliZ{7onCJxL`;Mcx>9`m!4*NY;P@)^}G zudZ#N)hco4;S*fAehcecyGo1gvY+pVs~XWU>5LrrUXHl)0(56ZtEL+ zxN+wJKDm4yPgggwz0*dk-IL{3y}R@@Rt0;pIg?r)_%c->)mL(b%)FR?(}9CeF7|A{ z&*hDr@|91Z_PMpg2e@B)FDU?$;?bEkQ&}tN{-D9Iz__34Jr%zyXJ(wP$HeyaO58^xOt{& zW%yJ6zy&uqEl8j^W#YiBqhRQ`Ponfu>p)tB~#Dvze`AYgM%A;8V?tj@W1@8 z{~PWJu<)QTkX{?fwobJU;Oj5HlUc4bYof1!1wy?F`#_{7vs5qRW@`%i+K@PRs9g1EC z!*FJ1nw+vbx9<~%U!h0gS?e|GD^^Hz+rGV6XrZnc)BES9@#guLdF%@ObSV} zOqx>%qxM*Uhc%nTTK8mWg#!msGfB^=6je8l13|^2l8>1c6Chx8t`kUEnd*LZ&Rxs| z(fV^elH=j|c6N5Kx3|a6nM>Koz0}5h6$Y09V zB}Qkd*>xEU&)K@f949h8&0ESCBmxiTinNFL-U%Us1W7Kq$6qJVo_Bi8YS+WPyAP?} zs4NN`IxrVllC+aw*gN4YH6mN8rNAH?)6%2UNzfx48|(!a$Oxv0KD}r(aP{^>d~)>` z?StR^r*C6^a#-v1Yz{?;Egn5t!PT30vE7Q9;klU!yz=~MH0!nK0P~s)O>!^ayn{Q7 zPl$*lFo?eX@+lnNKc@?s;ATaHqTPSAj32-A2|*?UW8;@zdmeAU@hXJ7LgkdotCXpP zH42?ar@ezmYn%ALe*Zi8?cezm43CfDzx}WOInJIwMYTnbme=rfeT##PrvA80?s{PY zH4>N=*mQWzy;ckN7Z))#GlhkH`!F&zOxNDp-NPS!=dbb3hnFZ*Gd(hlnLxr3^GIImINzley7oQvk@f>A|ygQ2AUJ2+Q-<*cDvQW*7i344ek*r{S~>Em}~hQ)ddDL z#wcEY<5e6wI8S}WLSQU>-l#Xx?gk>2RouLDA9wFR#M8Acbjz@3ngk8*_EPE2pqI>% z3`Gi(Wd*{6zxyl)O=er?%a)E{lD@;OO}1UKZ`J~GS~6+@gAa`=#!$%c5Ocv@IJtbN)OTO+&RhMWSl<;Z?SI!yLp@;iJ$A#3Je(7WqY0ch77F8!9YB62Qftw3?xhI0|vPVgRY+pWI&Tb zD6+2>YLtbBiD1J&dUZ1&$*(8F~ z8EWl(^ph9kdHu*@6(h;6G;vm)Kwsp2#}eKTSV!iaG_bEKW}{IXzaWnUFB| zo6+)DooMqNU-`_|49FYic~fKS1OxMG*yp<>BUzBM^+h8c`bNZiLk<*cOF})Ec$7Vk zx<^QvM<+CFCgZw`smU=650BvX-Fw*D-XZ1YxE?0L#6XT65&zi03Ck-HtYX}Uo<%P` ze+F~2Q?!ORH@EQq`ya6~7D!qbqeBh6asE}hw|1wb`mxYnAqj3%lgCc*+{`3SA3uoU zp&`l&T)loXX4%9skiY^DPcV|FrzS|IhM^4*nS#g`qH!doM3PaHOqb(!0_UDQSyNI|biDqugFM(r*j7fH*(SW#z&QuPlw>m(K4Yth|NE0(&jePhW5* z=+wW15`2}5;n~?LnJLj52v}N_rly&%+v#?-$B);w=u`H~>=|*$24xfVKY{j^rS3bg zK@<+E6_R;Pa@Yp=Y@p5~-G|jL>aZ~>kr-&=V2Z32<2U>h9QJx6(%A>6Dmd}O!$Tx@ z1N=3>4z($`1KQmV_bB6gQD>bUN{?&~193sn%i*}0=}BrYvA(^BcR#v-?VUXwKDZC( zUwIBS*X2rylq!zFhe!r;>)t~=4lrO>pjoTq#E}Cya&TTE2lOnV?reE|9apY@hK-#L z?f2>NVZ8O`%LHGvk?1fdd)+QRx_BLT3D#S~%-9gV`72+=#MmeYjd|Z13qUi8Jb)6g z3;RE?dI3ym;y$e&ZWo!Nl+|G5WSztqA{iNcIlb%@-Oxu=+c- zU}(46SXz2YtqkV(&&L)NuE5rA8-M;+e}^CZ_#KRnjbLK9iOJBUU0atFxgpJKso=IF zu;gGKnT_DHOc~c|v+3J(!t5 z^H;TS)CiRHR&so*4w_87bF9wf`6_wTX~^XtM4b#{_Go$9l@aQV1b z7NNXnhe%G4jf44?WH|*sBkNLr#Bia8mD0N^D67sM&Yd`bFTHdEb>G8Z{p}C%?LYrZ zY;NsxosKiioJl;VTjmHn3w~OJ-0+l)a6?pO2{}~USP1+C|5dRFcYHFsJvH$E1rN8=lb0C zs`f#vQ7`9U#>!-zl@^?h@3M=P<)>5=BFD7bZHmr^s|9B(MD@qVM=?1uf%T0o+_-&5 zTUj!w0BNBq9+Cy#LWB)W|kM6ZlEW4&FHb3WkT9 zbj>^W?%~$$JJGq%{L8e7nvEJx96f~T$q72|rx&lH)$OTKO^?}24nQ#ACdNmpIc^{& z2^l|fxY!9UdC#c)%?gdBw+|FP6P$Tb4P~XiN$yn@p3&6QCx~IjYV4P}Ua$`>&Vp5> zSwINJVX!?6&6-I;Bl&(&y$n05rMX^OYtF&Q0-xQ3>_#D^Dvbkb*Q{fGljN~ChDBwL zJwsf5g6CQpnw(qdGnJfVy@pFQLTn)$Bi8DIRHK~WL{K>**DH13%ASqi9~x>XJ0#T< z#;%~`q*=&rAmEYbsMTsZFLqD&m~x$1IqQXH3Z^C}F*GuQ%hzt>>SuQ;YyG9yUckc4 z6e533g!VZks9QL1aN4eZcAx$Y8*rpi!z(X6M|Ol`RzIq5D?M&MSi;SFkI@VJy)1F= z`BMZ3D^yks<0Odb^u3QSV|}NMh6BEQ{yDsI?krP0=MC%aD`shYD$%IdA`EzR6jyHC zBg6ca7f<8l(ZfV4H8$M9%+zGe>USA#R@yQS5w)c*W|8~i;0AWd<&~#&FLSeV7;cOb zLC?zeHvar?eu(e?=sgNwP7F0MG2B4iMUtxc*dApt@~u9vKzQ?gmauCHU1ZBeWC4o~ z=bFzVwNbG9ULO#-esX55o1-(BR~n$|%c-4U&o|(x}Fx3_n(wEPqgA1#x<=(c+?c;zEBvDfpN zoYFN>O29$ zQPipw>@;%PK4LCo|Bw(JsPn(gMnO$?gE3K);$iNU;);Y*_ZEjMiwIBWbp*&u4`Op|9e?=8{{cVx>AM7@(eA6RdXE*ORB?I|Mdl{M(k_4u|AhBOWp1;`tuc0B z_rDsh3|$ci(Fi-M2xT56g)U>3BIGc@iS$f*DU)ThKgOp@E~7`~9{Rr3Cz^Hbi!7iF z2lut<9PXn=O_ym4tw%+9iLvh zOtLZ-X-7hh0}JyweexLnzPs1Pdmns^UfFM$BwO0!=%EAHH#<%5Ek0Ss{l&+e#S$1& zsrTZz{}2qMNg+#x)RlTQ=oM0|PEs1{9Lk*JYBe}yA&Y%Dce5WHKToML4oS(uVB(Qv zn7y8iyO6RtSOup7G|39h!lqg?%}^P6YuCQ>{jl+(at$9-gnA8iZiKm2Brab|>#9VS zNqYvLAdTwW8iA>GLB7mnpo|a9E|m9E9XAxh@3;&=;H8Ci%mk8}>BA&*Wc|?5>=0Tx zQ!C`0@t!D~s)9{|S*i5}eCj_K&fR4qpz!I$e>WlDZ^KmSYBBrB*5(K48}*tQL7h3@&C8q{~7+~ z`#;5AtBdjB5ljv@(R8s7k;-jrf2jOTawW;6Bv(+fiK?>L1QG0hbV){1jbp8r>8fXV zQ2cyl-#V8h$$(stI)&NzRcw}Ys72R!UFT^YAvd3CJ8vbp? zJU=&$<3|tU_>n`HpP53V7VYVPT3K7$z~iMQJXu=C#^x>|BcM!-N&m_kaFU3yv3i@A z_`IRaBYe*s?_d1#I?u?LWV)XL-x@gn7V^+%yC$32f6gr@KcX}j9^_fcUXeQAT>i^{ z1N=gIr4k%h`8;<>`+fL4pq&DBgP+Gb8%2#GyzwU(Hnk#n?u;FFu@`BLoG?#V?(lb= zdct^yC_1k5f%z=5;L+bMI#rEue(t%`DSK!KgDFH1yrXD#uNx(Hp;77@^$3HnQH_M> zQgVps001BWNklmyGK@>!k8l;2Jz2p*Bs!4RqaxY=%kg=!*DB#t?GHNrq$KSmoEq zBjF<4UH`(g#tBkWs9!%}c_vO^AQsoUXG(-^zyQkJKrf1Umtz^&CsnUP# zz~t*q1~3U~rw&-88jg@*=NV!P$9?_`R6~bb1VqKOFd4KY>&0+P#<(RS5QDd1taF#^ zN}^L_pTX-T`c{kHoY(!B6n!${qVX%w3OsqTg5{^{%y<~er zgIY=h_AoZu!1-6sVyF?aQ*~Uv{uv%EuNXt!>~&@o8yRlm(P@_=+M48d>Ag zl+?tZ(%$6#)-8MN0~IDx&G0}|lk6>Fk2dLcI=<8clp3+OXb(?L&)|a(FXHz7#~5yo z;I(tlSkFZkSdDtxlJiLs!?gscCX>F24HKIdZV%wgs~I@W~Qx+`dnc#jtOm zf9@!b9oetXB|*xtv7c`4;QddoVyn}mOMdP3SMchKFQ8_N!AxtASz$I*tL?i%EYi?LC<}Dh7rqGP>kBtktoyx{j5#Rm{xKVPbrWg3UoF zefO`wkH7qne~)gb#LU=m?O}Ry6wjSJh7*SmVrFWL`hP`P?Wu>@gGW#Bcxe?I8@uRs z9HVlicbG5{#}y?^#MN<^`^;X?H16Ht-~SOWU-{_^K~#dO_MWN<1gpc-+0y;VbSMRd z`OJI6oV{LU)%eP1e6G?yo8D8hmn^y<_us1l0nsONfKz>6IWXww2qOv6 z6#BOoA$&nj)EUcK=fc}MH$M)rnPwvteb-26hTn&p4gObtFQ`zq*{l(~fqohdGEhQ_ zzS9l@xks3LGK2zru-U-K$S}soMle1)gyCj9e{}YEbJ6-QnZ%(-jZ2*tF-M1Sn4pfe zzNG}A#5QA4btXP9c94x<3SAgM($92=$_CO@rE&X3*hZHeH(cxFS@dfS;$7e>jH1S(wSQMyvXX6$r8x<1a;F?jVIK@)(6gx67UyHwDA-YD|ah z8Fqzs3)4-H-+b#F7RHD1^N%j!fB#qC!lR{ilmgqeLK@PLH>{<&j)F5+QYXzIU~Aep z#b-M*{?EIVaZu~Z4uQ4cVWKO>a#WMkXc@Dw^?d!~1YOJNd$}~qf(|Y^nC6NsObS(W z)!B5;n`;TFLoPw0KUAuakz#E%IEuoaFf%$K25;u@!8oaAecF1MU;s2C8)2yB`t-sT z%6JCFSYu|RbIV}^Sbsf=>z+ID?8 z2t9f)K{hjZ83!#mJDj#>k~!9?O33{@%_mt&MvR7V#H<{e8NJQ^ybB%Ws^cI`PnEqF~Z5aX`o! z554(z_VB^Smna()>bef@pTxPdCqq$aGH?Qes;}XLk1k`Avg9Q~TeENc>f00q2E(L< z;3Ays<4f0Z>G~bI?*7>^{8#_{H>nSwF!+i^Uq}mpiavLSk~{=q);2cr>8ICdJVP(P zx!IXWCto_PlY&n&+qUD-b8?AWYukJX(85pp<>~X~pUJTm$wCzFg%;-m`imv+rDbvuYz&^}9t@WHyUW*U0Vc zN^-C75p6~^hh^(M8XITe!y2bd5H;2_Oc~3}RMmSfY@o~~8Id`OKFwr)ZI7bYi~WKE z9<|4;NnOHi$9j+OJ7Hp}@28JYqhO~7dgt(+(#6lh@4XN?aFpGm_aifQJhtoUT%BIY z5y;5+6{5rwVws*ZTW{?anQT!HiWXEWb6PthN`wX*e1T#268t;^m zD0m-O`cg5J6T~W*m{bYV?c%`n5WaT)3}!}~_`wf@{NAWHC@MTOJcMgEZ(?n2o9Zj5-;S%Lr=~F}Fgh}V$%#=k8cht3j$wU!6Au?3 z5?nDrs+=%zS-+WStEH|X%WktF^Tw+$;^eUfGVZoFck#)^t61OKro}=APwBBRH;?De zoFro;Fkij@!ADqK-_WrM?-F)#E1=Wt_zA8pL|vJO38c_35JEVS4*z_k#M``+Ov2oMcOl# zjZmQ3NLjEXU(;?#azvnOc6lcS?_sjG6+xBurLB8GGW3%FmFWPhXw!B|a!Go!QJ*}8 zgZk8uuk0yI(Qe{M6p|wFvZ2+Olt3N#-4Z%@Y0j+*Uz{<`N|g-lkMD_trz5C!J_QH3 zm`K4IeAW?_K96DDgtbStEFB7F^m>L|#7U##xPQXh3=rk*t!?b=weXXly^kkr8yFcL z#`zb{U}1JT1^r}>y;r8y&>;8HmCuO5Fs!|L*~M30e;Gryf;0cov<=OoAFpiT()GJ2 z5uw2W>Uiw%0^O_a1QiBiV|y2W_x+zxPo`$Az&C&GZJa%Gg4f0z(kn5)5Lk+b5Y%qtu=ws)}jXc4p1lh{XfU_(LO z;qU(8UHsl3|G%i!hcGrYgsG7svVFh~rZgP4>z&rB=v9Vzi$kWmRvS;IY^u{>gr~7A zI3wf>u{C0!us}*QK3vD}Xp^3(rman6)Cz4Iq+ucFx1aMPh-pGB|zDR|l_e zpWDEi$U<$8Q8{1cAWBe&0*YOX2m6yqPU<*%U_V}d{&`G=mIyAcqd+IWz1zmp${In) z1MDzlYdyC!i2ZCmLp!tKO^uv;RfsaLF>j82=CeM-$@oXSKJN^ow%wp(%`jHWTU=#+ z#LD=&dE3mmy)EF>*!}RMu3DQ!GMpn?? znPT-KGJ4j_9?l-!hx2C+V!U3%pZv*p@MquoTkN%rVUhLpGS4W`R)riTLowa6*SZY| zK3N%gWIL9oZY;wA#__H=-2=g}zWS?KeOX^T+r7ovOZ5e+v~EG)tU^`oT1D2^Oj=He z5g3(IPu-|wr+7~5OO1g~b6(jqwkpZXdgs)>JSX(&c=h-QnX7SXd^;E?kC$Skk&V_! zWi0|77#jXHP>dZSsLeV~9Y2nl$w^u#E1|d8#Vgu2gYFSf7@udz*CJC zWo&J?XuNACgG{Xo>W#?kSSHv^nv7m1_Y_Lu1jy>u3CIE@Sz8gIhqlw_lXJ@JTn&a4 z-ic#ow3Ub;HAqYZT+eKXI7H#<`3!Bh+=nVy0|{{zhftdtXLP}d2uNU?RxbL=Jy}AH zc&)6n{;y zY9SnQob{r{%ZU9pMTV7LcQfy`SZ@^IZ9UF>YyUAO`XJaMkx6)Jxv;slO|ZhvtsTlz zAJ{jKuYLJET-i~=9B(poQM`I$6MW~r4=KPK-VC*1XO16`Uc>Z1A~$djAAEcf+k0IS z%R@DXb1$64cwl*?wg_H93ZXRTXYYTEyAPM?84t`(;u~N6GA72xb!+IDXUf?)|K`9j z55a)Db?ZL1cXlZg9t`z5)rrPIkBqiaZaS|!Kw+V>Q-rlT$cfF}T|8WRf@Wg~2lp*d zONwBBz5nqAeEYlKqk#AH$OvY}MkshKw^b;~l~dzZWMnb|SueU&H|CM|K`SiuU3Ow2 zYpzDUJ12*0)UR!1$YEi66bEL;Ffu$u8Pc>hl6+0hh2-Fr8iAV^gBlkvJzb^NB1!&N z%;N#7GdJ3keUaH`CPCt*?rfl6<|6@(b2xqSFkXA*3^8#!9|KV#kQdhV)0K5RSbRkF zU!evujEguEy;6czDjbxVH_613Y;MisSxaA4g^@9t#ouo`{xUB=@ar=2&#?5Ym-LKG z*r1oJL0wd`^0OM;M!ykjWxb0`%ig>E#`XSK3K+X2{ol9-8Ih+Q z57#$7y#9-H5fS7Rxv^b_T=Fu(O+~bbG4CCqi;7QaKQDRH1sEfBASY4|V=%Gv*DF)g z(Nd{)V=YLJoWc$ygBOHa_zASs!TD=-+SI@>Wa(Uy6y>w?Uti=U27?)BJD~Q1FLElm zxKDy8&56r|q-@so<$lLTg^TW!s)K{1QN;KkP(+wr#TcLoEseAg&4qvQIHvlK7if{eY*RE_Njn&x6*g}$>U+ugsv4zf?I0V&L2EOA%Q*99HD-phk=HQGz$syf z)AwY(>VK|GH92gwiXe*58>3F1aqLRCQJR`FAuTbrW4g}Fx)EqgMzmuDN6H5K?CI0E z6buFR=ylrUeBHWzPc!x5$k0PgY6ye82u4dV4(I3R=)J(AxVpMVu#ui-d)Ou9Y-Y~> zW$I~64P`KqzWnBEn4B6Xc^S@m_1bkJ;jr0^QzwoR{dRB;+wBq`e|m+CP+}^BS6HaR zGs}`7jQi$h2t9Cr@d@=Bqn>v{ip0l-AXIS1Jh)E}L%2#_+rsdbeBk8BO3=gmGIQUx zA*{47Q73@2z)IL)%r?{fSPdQ*4UibIER)LeP($16@5b5EnkYL5$rCjGk`Y%n7UJiRvCxY>|M*;3TON0u%n}fgHI7&pZ0Cx`uBQrEX4?{Fm;wCGm$1E zS?ma#1(UTa&+d((5bvl|QVtmCr)2M=o`sTI2!t`RLW-f7lKqZr!es6O(#2`8#$^Gb zcCW;PrKkAm`yUZYY0%dmv4-<2Z@rGW$uZ7S@f^W1GJ#i2y-w{K?mu_}xH@H?&pm$< zb5mo{QDlV`WYNm{8ZKPAN<=)tURao)!kJ?SsjQ(arS>C2mY=My;RiqdfSB(Zb>Q`v z&*Hh0Cu1#>afn@-EM2pi6nDl!DSLRjwn>iBNF%a8OTaF`-9s-uVvE$eb)%XKXg1pO zy#|N%(eg3{u;=&h$I$RF$+`7{WsSAyP-A;7ENPT&3Jx9#nC zJ9To>H7a)5Kwq(%sj$DR9bw6!$`pZ#&@3+Qm&I7XKv;66CW<8$af?@Ju=4g_@422U zn!Xef+i78Aw~h7iv(u*EH}^W&YIU%&)22@Mp(*3`ZU^hzEv)bCQo;IeyTo3{V<)76 zLnrfg8#}Ew89v%sWmVWPVB__Xf5*{}l~ z9-nU!OP&Cu5c^K=(>(QGJl&&p(&RY@Zq$KqR@i;yd5c6}E6xFZU0BepP+?`~4MZ`E zCdh^>r6ir_qu0gsa06d{=_KaI3fv>2jz7ee>$l)TfT1Q44Y^a7=7nyU89yXC=<~UC zmL1MI#rplKn`-9Dguk43x<0MLH)u){BWONP>_b+Xu~qLa{ccR%bUp?AC#YwiBW2b@ z5|G9!(K)H4+s(&bjl&X&Z#6ftC9~VNn$(M@hJhqULIylIAWxQ8@N{KO@%v$I)i_g7 z5_NE$GDwZ0MwIoTj%savgILBQG^W=loW+0<16{K&&S@<~c!g}(n{T{=K(rVX>4i(z z@Z{+R%}K$FY-VyCFFkh}qeDaFl-zsp7`N`;=efw)F=br_1Ld_>UWnPVr)#+P;8ARv zYwCs~i36ziBRF_HCGN1BA!+I~e`TiRB5girIG8lV*^H#DU!_Sm_bYnAWOwZzg}shs zuM38Gva#0_XeI~#yzZewjb`bWCQgBZdgVT|^~!s<5IwJ6e%uWORPNYJv@_%7m_$mK zrwJZOjTe1~_i#xUtMNLG|CSZ@*EFtWgma0ZWn&DQA&kw}Dd^FSeeWW?6Pmpe!KBCt z7P!&}O`LiOl;lVZseMe=2lf2o?3c{75yKSF@aFratW|aLV+N&GBqEUDKwZ1}0KfmI ze~k|=T%&$m)abTR$JA&OU;FZFD10|Io~KB3SIHkD3_3V*z>k0SbF|AE1!-p{$MD?A z!$eO{Ylho0_@a(WS8riuy+v8By7PGP^f4ScuutV|S*D=wkAC_g?mt?gdp|HYg|B?+ zRm{#zreIvg#AfEmTEFUWLPOwzdVgeWl#n`86C=?{?M3+=t{j5QQnx3vuGFUAGDnW~ z`;*nD*xcU4!u&iY#wHPRXty6e#_#{hcX8*zBMjFYm>C_RX9dqY%(jbJ4Bz8-`2%|;T+>iDMF$b`0;BWsIh^JjzJNcN6024uEwgms1hzsU2Dac#9*SXy2o zqLfanr(Mbg9_I~FPr9BJM?G3TsqcVG;b5hgoC%tGKK zKo{cg@$YWw=-(E>8cX^-6y^825ntTp`n1w>4I03Totr$T(u6G9@rz!06e7LpV2sjd zr8e#5jG(iVAOoMTog8>80?Muj%^sv-&pr6cxB8-4+5PHm=;y|*NQ%3t)=nT>*}nQ- zHZD>N;&e^KV*FC)A}vf`FK#JycD+uJFoN&sX7Je>QU3uZ0ytp0 zIa0yDx=i?H83F4=dvD)XNhtD7u>Yt;{0oL*!8mx*&{s5LY$;JQbtnbX^hPJA#-F*u zk~kC`X=ciLZ^#NVwnSOq6(MYdZT69gz=9+BhYszhd)RAr2nrY>9oxeljD$MW3$(_afsT^j^DdbIQu zm#%$AN*nBO1c~&<>*p{vJx2Gmwzi2+E?maWUMCvsnd8dNcIol*i>EOfsI9wQT)S}_ zYug=?bJ~v!vEaVZtdTJt5dl5U48$>vO^!>J(Q!Zv&q7hxW09P3YhY&k5lT?g6N+_n zyk~hU*G$Ss$bksxa zy^pRCJ${fOue^K)UwZvzVm`GxQL{dxZVZImj-~3_P_I^x&C5fR-cY}uv{elFgf%B5 zXA+1A_dqp4e4oL7S=-*hy_bFMDaaKa_>#&>cK3FP);;X=kTJ6B z#r~U_nM{@v4i4*V`RNL_wze@kI))-t^2f=p_i0kkcLuX%}w<1$;K zUuVeSsqAETw-v2Q!ycSDI@aU!{p-gIF_?K*12?jcjjvzGH)VmB#Ff+0nvR}84#ey9 zX`mc;vGGJSC5)G{KYsk+f`Slw*WI#m@3VhwlSqtccN;8uvAm zL3YZ5mD1F9a#UgWFRkj*sX$ut2~2ZXnNWMRN_0I-uy-8Umgh9ZFqRp} zON;UZ(^Th}RBfRf4zNN-@XMx=tu`Q6{`q7;s&p~Xrivd^iN|E?0h-k=)p1MDmxQ7G zCx9oL-4?i~Dmu=Z^?d3B7WZsV;YmVo+>>Z4uc4$jU8K{N$k@QGGbk(Q7)BE_KQEj+ zi}CR>?6uo?@NkjpO?)ZLe$;;>!fy(Xx!Gy#wRSK$IfmxY5O!NFJb3Vs$%GQbAr``y zN)X~5D^b3#{5UoS+PxNzF6_gv|H{`;Z`6rE;GOq>j_sWtp2|qmK0iB+mtT4wjb?1B zeC6s*+`hXQ8`82Il>k?Km6)Cw!E>jM!SzZkK3c+^2g{nl1RH$qy;fxNEPP~~4TdbU zAzH`POEJEsj8=F{YG~YJRzlAt1CAXcf{Ay#YBbR20Upi~uILn{UlG~y001BWNklw=?rOG5af45{^QRA$aN{6)9d!;&YI`smLwWJ+=`!K;=6q@3qVHE7!lJrhNzlV7b z5a!@2>F*^pD@<_r5~{bPb#gKSij>6+1QNlpqgEH3xeAawuBR#t#~EZNXy)0nmO^D& z6b+7zMI`xabdCmAwA9lETH+W-0-Y>hZ(xI|QD{1Cf;mT~!a{4Bqy>bOEW|*KlrE^` zN)v`yTeh*ejaIinuNQSdC_xD9qQCO?tEl-F^#&E0lT4C0tGn$Ee)j&S*xZdWXL788 z7tS2Q4;P)VE7x!1!QxX2;D#!PBM0Yj`s8t?|Bj5ez;>&JAHVwv9tP&zS{-v! zllbPZd=&>5=E;c&@}iQwfSm#vCslG{6LBr*&`=Y#MkF3{40RXCLSV`RF_tiL*1|>+n3~p0@GS%gLZ7nmXrVnx2rh-6 zy-pjt`o-&zyOW@&3AzO`lOV$%JbZ|yr%S~8x_@CGJp=I!bjrvzKyohjqb!X9pJz-| zi)gT1f{Y@IY^GlWO_i*7NhL5{suhZLz78wvTg0^M%H)IxXHy+XlgRMW_}<8=dyapW(UfSf&L1p&eLO?}X_`&3jN5JxQAqgWUm@GUL`%$*nm0C zo6l2PAjg-caY*Uf6ooM}lzqoDvs`tX`}Ew|kGYS^ulD-sK^;5LIRl$@bhE{43mAy9Oy_1C=LCQT7s*<)_gjRfZLqsSb=7eX?I%k-^z?hK%80eK=Wv zav$0>R*5iJVQ7O{`8+yr37sPqAEF$fwKim^6@@xqrG1#bb>g!1DbMNj-feC-DI^Mn z`X2T#?8lKq2e7xdM}!y4%PY)E7b&vI2;z;~Z zO@f>{l#5XOB;7XGPSJ`B}PxNDplgYBf%+bIn}bc3#_35R4U(WtB)!LeyU~TI{CDc9o`vnNCH%?%@oCGG(1G^detaT2XJ%V6 zK?zz$J&|G&DP>MxeCaeMCWdKFN-|(MJK@mFY z=BvC03)SoScvk~oJgREVMp+f~PH@5kI)eVL*E4M&2g0?jPA^ylj8I_})NinVz5BR*?>-(ZKEcM;ZiHVO;8yT@rQp5vrK;VR>17o(mu z{XWQ<8uVV(s{8y`)$TKA6?;_ddFy;-0xriXTG)7w-m+y+cHErm6Zt;OT+2Md=nR>? zbPH@vio61}1rd0SJFYL?*w`dVEl$33VjJf+uV%MQ23Gb_3gD+7#a5Y!PS}feoe(br zP_VLaDvag9OE$*Dxc25)D22487q)YjA^{G?@Io7Ec36|rKBc)stTILkau zJE*26RX`-a$Ucvr+d0^{X8z2BA{7-aWrov^tV5#5j{S2|y;>H)@B;ghD1}Ys#xs^? zJw+oaHDpCvZV|fVfQfpEH(xxCwXF_rEIz@ve)kV>;?!}RfB7ua)C++NN2K`1y*6ZbOUU|ljr0rbHWARk!0Y> zFE)O8SWFVUAme~qPvkgr@;E-aGDjQo(()>156p%ru=~3=jEm5(iHxHx$K=EWx}7dX zyB;~p>t{2Hb~@wGD2Nl16%(8U>$M(7``mS%A%E=f0X%c*93DP;i4g2)U9A10%1q>gU^fbntNet04Hw2RtO{y!|*lpv%!$pe1 zjtuQ10vf8X>W9sv@DW?;&!nW27nneJSaETkn=C*h4osmkD%>PlsOT*}d(bJWakm&V ziNz3VU$iDLygvCpGBHB)T**{e6IpP6-7zlGo`puRu2q4{K0;{IP0S)8I!xR{i#JZ* zLo%d|n)TXne{c|_){cvcTIylthz8tE)3WLt6ul0*-L{9G7AgZ}b7}4k-2_&GCs6t< zE@xvnn^MAGgmIEYtY5uxO*)&B}Rd?Oqg@T9Fa59V*r{u=GsTe$!>$P1I8gSGk_xqs z*}efH$i)GBU5#TV?UA}jEPbmpSyA7Lvm&2eV%y|Z$zx{ZF;R(dvv9+-dGO?`f_eF1 zKWcfvj$83mm16*gSwwZf=NBA-Pon;@z?&Dl?+IwdC}$kL&rmo+JhE+ZDqTWJR^4~W zxE=Jlo@@-3#xTrts@x>WZn0GBo1+GZlKFE)=8E9C_-8 zMaex+e3MOYAiIs$Z3naCO}upR2-dfEF*kP;|KWH35dY)9`yX(4b|N^oTnMWmn5Iy5 zl5xb@0a9B?j6Rln!jYV4$I2*KWMN`P9>dEJty}M{==v|dKVbX*=8p$aZF-BnHa^BHIP8{DsotnJ6K3#sJWO>PbK?uf1M=49@8iC%ue-E9G zYrT=79@VFEc&&mEM5mBPE(>h0t{DI63+M38yO+sPx_;v}McmJxI4VZ6lf&0vdlesF zTObGd?!AYYo14dhnU{$1%`icR@%1t8_sNM796dUVkFG4BUT@&m!aW>5FfE%DW&J9d zFeHjY6y`27sUDHcZ|28CG(D5$1jv#$z_h?g&`4V!#s(Ob!S41hWj7kG-=pi2%X4W% zW76P#`E|;A!AIO#R*g7InS8d-9OT&DX<>WA5-H2*$dHGC%3k2({S1J}jEc^x%@>Mv zg`ZXHX@1t+RKwc$S(*yffabxVHe`&MjzO{O8)qA#1&`8eLUu{4&Zt`bHB|LC8v>F( zR2zm-D}w_xyc@8iEDo4jM|=+J(8Qro^ZL0+-I7B*%&fpUAkfMC*R<(JDT?d>yUO&f)ms{rL6QUZPqt*)MIB ziR2}^GwR|L(iEDg+kzSuX9z61IszX`JREg?mWTa5)L^;sTwGbj>h?BH9yyNT#t_k; z|J6VI1V8%u`?Md9HtLwDSCKn=$Z{Vs!~j|;&?-x}6cN-xPG7IvBj!mCf(ty9_g=$r z|A0oYCbmfkL>-M&w5jH>Y_-l5zRyn*u=qe>w9!`6qA#aXfzt$`6-GZ|ACR) z`apmq%UIjoz{qL?jp{UN)s%!xb{V6C9T75TOGkdKp{(f1QXAi}M*s!Un zsB!|MXGM8mtY=kbr`PSOY^8FlV?^~=_O^`rUbYnN9+w)lg!i(I^?0eP>JQK)K+3*+ z(v{_25??bi`WmItl5tdiLkx6BJ!+Go){bxt@`8hMRJRN4n;6AmN94n-*Crlg^%U}R zBqp!Yx>|oEgCALN*)FVP@`f_Oov*B%EO4`c39N zjIw2>IaX9r-pZLRZ;jf-*lm#W&LNy+t1G0vaO;nAO^#lhFMpLcUJw zas9?ktgfwNeRB)bQ)9tF;Wg?D;i;|^pt`V;(NQcucI;LwSXz3F$?=210F7h`RvR|T z2{CbTqFSw>R;j?|8P1#SXo*_YqyI=)2|=vGI-T0o$Gop zI=yL74Z0?5RVo-{f=(J~HZeLnBIBC{2q}YX8TOfMm$G+hDdB7nkh`Mw)-EMNTrWp5 zq_U_>_-X}gB5Pb1kVK%>XKSrUBo5)rK?;4jQpie%b;QwnV|B>Nh^$$qA9!yvYAst8 z9kcp|GQVbQ7z4-3S8FuLIqS6B=y!W!=rKGJlBJ6Qh_IM~*TJ=6VO6Q7xhS|+uONa7 zqjp**1F*)#3^(gM*=v+RW0c&A9i{p%g{Iv()1!yA;~e!OIAmQSv8WK_vTyqo_%MM` z!;y$E)TyOK8U#GVnNPLkT>!_`M7hSd4pwV=J)Amr z7zbvi$ROqx2F^%#Bnh8gn|fGd$jQT+q6n5Y;cD8?tK=?t?S)Z3#Ou47=*E>jEbu-a`Nk(dJ}4^ z0Bo$SvzHw@R{nK~e!}tI0Cj?s_A8KH|kYO6%(VQs8(tT6plYtT4N*`nz%3Mxl!L@ z%~+`4>RF4f+f#F|9|~RKBA3p>9F$~4?ETmSQBDjQuS)Lg!#cqU^U!I(=Dov*U-?x& zwCsQZTHmGmRk^EAINPZ6Q`C~YE4>Hz3d(C8&&TQVl+v0}VOTwE+DSvm@Uo3Ph}MeN zlRZmp=>WkF_j>xwF-(k)`E}jz`?@?RbdWf6daSf&W;-iO##p7FA<_{Mb#Xy5973nn zqK{svhl!4vrJ9(2h&c1xg>)FxMz|F--3Y9XQ<7FnxS}#f7*vWS1xKrIyRs?qvlT+Q z94E&&bB$iBG8sg9mId!gFSEx_1Lp-r5(U7@WP|Gy%;1%h$cv)%=lUs#!LH7lhE(uyNm6D211ZNSW041aqx>kv!5BzvZD$gj1DUWVk7{+k#8&!ZF-s5Phwedhq|&jD0=T1+)>h1qaiff z5bg(uGN-IiMv>Ak&YU_yhRw$24)qM9_7o!ldy8=+tl=?~ZR8G2C9!$Y&vc>2;g3=a=czV@S!KgGhGJ1~y6IRs-| zPoFP-;T6;>Igu32UB5we^#z#R!Z&$tyS5vx9omdXhMTC?ea7ePxf57geCX%OMg3jY z(R!`w?!ge1cu&b<*usLY<>zqqPcC}wn%+A{))NVUU_N>1Jw|IHH}Pls-PcW-5Xq#x6->0$6SU0#isG(7BVyHQSx}ytsnTmSuE!7}2g>LAsdIYg5 z%aDoQM{v9}qorp$jO`KP{?Q8r3O)~*tE{JFUz~;%QYNF;g*MI&$+9z`O$ee`a&~-X z*1-%p(_I9l%G%0C$Y2_@+XZEs`r#bbn2xQ}IjC+Z>Uo9((^CW^cKxHM(KtU}fIKp} zl50bA`O}+NUT>l36{u%@eC1285IbU)SA)ys3}fJmvrI<6?X~gL`J*^~Xod(Q zObEidNcZB(I)3<*cZq4ak`;LN(n-Af(o+E*pNFw1glZq`n5kNmsDu63#=X+N=U~pO zD{Hi;uye^mQ-o_eIHH3-*Ioa@yh6vVZfxNCtp!YsPhw_bAL&j^bKt9_At^I z!bGEv8Z&N+X<<|Vo$v^BA3fVsq!s?|ok_&Ck=!7JGt5*kNXPfYe#>J_U2GHYocIIsbce=qlFa8G^G`+J=?xHIqZj){MfKvpT+ zl{#R9GoX)5?GELygzM`Xb!J243uvcHEFB5>nRx$+Z60kgL0ixxSR6fi2=!`Rhyf)S z5RH(u8&C)|XtCCrKP_Xa9TaU}=DmqGFX`yWE+~b%s_8}a!H^G|n^G5@c zHzEbW)O`;CiK=l1&+5wyOI6vkFFC^M&TR~eMu$&B3Qg&Eq=KUj5QgNLCoCi#sfH5z zXiV$-H2g>*(yYeMM%FWbZ+X(3G!qB}gf_Qd1QxdfAqp6JpKz}S{cz494+X_eqK7NM z8!ukMiT$HkSzN@|zWH7J?41v&MMBX0vhjNP%S6da%Y&reQT01xmM~!uGl^1`sG!0+ zOV%(D&m^oGyaB4V>2VyPjDsj!1;ZxvD6k{W5s3jokA~a8dp!6h#VU@tRg$6c|Ej+j zpHm=}V;wzWqt{r@OvDWf+`9wOcywb>sTd;IaImAXW|Iu?I|MK6CGMLW4{{89J-WZ4 zp&@GA>>|<5P`G>VJ{FhOC}OXv^;uA}P(;tj0Cp~@Hy1&z{QI?91us1R6b|g4BtvI? za|gfp;A6D99?FHxJJu(U9>S4>`$>;=3WIk)xJ+4wIR1UAt$4J!O7~PFm`_HLxkCr0 zu)em8?cENo6?dP`Ve5xUVK|&XdQFVXiu`0IQ8t#z(hbDv(IFMfo`=?`Hr5Nuf1=() zeN3r$UEG9}F=izJp`=c2s7mJ97b3C^zF}xOM~W9$xA5uJ1tRBg&f&!iCvf<{evfPjt#RBr ztD9}S_u(}Zrb72R+^FI|`HeS_1vX_GgUn@3GW_JNPq4P#q0b#1uH!4e`30Y)1`~WK zDU?kr=o@CgP^$u5EuzNG1~MF%qRlAq(-+xtemk|&DGJgRE`#l|sXMI}uHTra`mdvh z4-re^<+!N0iP=UOyo9{&8ZNQshU@#4(UfCDouL9>x{wb!5Agy6zoVD zUtbqxB=mYyiPsNC#w6~|p&ZhYjC8&I>7ca; z*-xkYBe@l?!Ke$lK{~UF@}}v=vu|17M~G@`r%m4-#lLf28;x2BXlUa-34e&X;qj@c#7VtSC=cLrs+Mz2zjn2Hh#e2@)P zBL*Z>uvw-x*2SIbSiT8y>NtuJCXg4G4HU%@t`ZhY(1kAh#@;M5IlHx{-(0 zV!O9@zV}NYNh+&l%l#=zw3NU66&E3oyC@BrymE#@&4H?^6U8ym+^+n2h;wInlQB{7 zwVp0VDE3_Nsez}?9{hAw6s&uML0!|Z!5a$dDcWqIni~81Kr2RBpV+myM$se%#0Uym zR6Vkyz|?RBUwrXAW=ATRo4bKO`sz1v{pKB#DU%p}iNk`osCa+t})b8U!JXTiCp3Z`C>M~Si;>}Big;~oY~#kw+rD%tcCz zo8Z{}eus+QT{yovT*dhK2o{$%$QX8F=pZbG<>s#ue&gY+sa`h$Dh_@&mMbYM@WsP7ak$S;7<;{I3hl?8k)$ajkP97za93z#1K5KVxaRu*vbPc9b zC+Fn3r!L^s@nhKD-ll9F+ae~>S8-j3ffX4X)L~v;30meLgVmZeM`mP7zlaWSeW*^3 zn6q)_7ku5@i4!MKtygjV)*bxrpL`2T>suHdYETAjC>K5*%Ia}HD)(Lm(MUu<$T*`i zLv(CKO2Q_|wu83Obd5GUGRksNU%}ZoJ~QfSa;X7;%am3s$Sa0|UWT`My?cdASiPUo zdMMB!12{`pz6$dBHbts0UVz!QI$f-7Zu?AVc+aYY0#sWT4KLV(^q=n>UIy>OIIvqbI{aQQ+#kw+Q`(;*DCy->bQlhX`_G({9bb(raLoRdo$= zJ37J|W+Cy~_qb-f(I1iUI!FQ2I=sCmCC3awZ6plg;p+P~W8BJjpPLk`2(peji8n zjp7T>pT&4R$6If|i$DI_x3Idttrn>2@8U94&I!wd!>VsapIw`(+c|f@rX-v2)*D-G}>}YOO-_^scwhp@TE@z>Y%r=Bh-9XQgJGgs6hI%!}`75nF=pJ^1 zN=szd=s8KVHt}~Ibdkwca;f2Y$(9~}HdZYZt7IY)^oT^U9+0j~+Wd-M*ZO^&K7Ig44^6?k zrs~0-b>V`I-5%a~?-SpK!4{}h4PJcVA{y07Kp}W0$WG7VXK%fatyY_k+c!CeH@@%^ zMjCZ=+FkStW%MT-N1`PK2_QeSePBxKATan5JUe43x`&v%_ef7PT@&I49zMK}2lpT1 z+}R5l86C&mt$X<6Z+;hd9xP#`UdMQ&j)ubtGhvEab%77ZL&8m5Dx7s?y#>PobQN$= zP(umgF(aSKm{}zw5fS3waSb>cnMK`Y342}IS6$}IaLuKweWPrG(xs}7%&I`1`^g~` z5?i3(M>;VI|D%EzPS35Ztc5+NkYJe=1O*UN4c>+{8MEW53tGJn)%prHqzN^WabJuF zM`Tb85DCkvDMS|%VM$iO#&!pH7ngD8(Gr%|HwfZbF@2KF$?$q&^ z{d@O)UA0MV9Fbamtza-|T`s}Lk)43q?)jqE3kN}_(0 zm&Tv1uPXIjK`4n0s_=!Fjap42pybDd0dbK}w<-3mH?xq%qI<8zGO3r#GvD7QCnhE< z&Nwe1c4Wa>43?6@5VrpOv01!u?hx``7vKM@zr&w>`@1Mm2@jW%K@jCRW^7|Yxs96} zn>$(TyBAsYf>i2*`NG_5L^o|!n|h@1wI#v;8wgoqkbo5rL$Jg^FmZhRg?_ zjjf%QXD6iN49P^h-9f9}r{5jDzO%`jBO_Gbv9h*;-Q8VuJ8c@_xS0ugp+r3S{9g+R_tvo&EJi#}L95j! z{pWgXt!?dMY;*$ktS&vG*qjL-QemDA@>}L?1}zA$Na53 zxUuknoG|BDz4Y7#G#%SuVApg@ugI$SbZ!B6?k%GzTwt$<6Gvx#b93XJAiAE(aD)1S z-JlGc>%I5m8gudjZok(|GXcF~0uozrknox2X@&*EYji$>$bP(T4l+dn!jGbU?y= z%a{Sx#`T6^*GaQzK-PUGbHW*Q#Gr-_n9@x5QLh`AMg<$aF4o&^Z1)PZUCS5OBhdw& z#A#7`r;R$o1QIN#YlnwNf-UEtb9;A3^%4y0ELp!shGJ`H7rVPH238AnQKrwtc`|$@ z4I@-jsx2$pi>W(D5#|BNs=j8HNNU(Vwj5Aa#1e+mY+S*17s08hT{3`t@iHyV{gajk#XQ?|ww4HU3PxeZ6ZzlPc z3`VAG@Z^~lLpEQjLT@lNFvkoyl3*a|^k_{-5`tvI3u*8y;P6x7v0?-=%*P~~5x?he zk{Fqa$lPWbj+PZN(V1e?62T7x&-CXuK%{uaOn4?e_y|3cprKj+P&p#LX zhanW`_JwUKW(2K_apI7gT;_u@&g{5og`;Pwyo`B$iR5W9(qtJ{EpipubYn>zJN+v{x!*NzcXZ`T|Ez-A`a0)FeMN$jt=Y(M3ij?X#q5=<=9pdo2 zr-ZMd?To?g9r}#rl~o)$a)f%uT${g%jg1}Lx%&{OP8=o%y>7^=*J=$iCf)h&`{^?$ zaQ)^jY;AP0y}5-ux9{Q1sZ(&sKcOL)sB+j40_rp)C{BT*mr=hcTg$!tXF0LJedWuq zWA55@^!pjn(9bX2#`M%UIbAL*=CWaz&YZ@lpDkc*YYUIpx3F;U5ysCRqAUT`1k`iS zwASv?7*sN^!y1ht?32@aYgw>o5qxSH-)B?&Imfe1je{e5`0|U5x%r{DPu`BV#dSeWBe{UD&Db+ zRN104rG}EvVN#Mf7E${%jNd(a$PT%@gpHKSHqEp__?ssl-3>Q z;INKu@Uyu&>c8ipVz0mcGOpdai%!45?Cb#wW;r&z-fkDI_72r17Da<}wtGgmS3F#N zh@(f3;Ik_?(HN?u+wb{oQ09pns-ce21}0ont>TA2dJBDcC(UKJj~$sMLJkw03I{ve zZng35dzaBG{2v-Q@WM0auzzwiFq-+m+zv62euUMnZMxq6$qBsiYp)Wc-lGSPBkWiS zoEO=sm!xF}>vgH+j%@-==y&EmvqJWVCqt25b$vsm7ad2pZwst#tm7{}dLKs)OykJm zV^~~T#vgwDJ9ziC{Ivz7;flxV}`VXU&ia>#)>4)A71Wx|;tji)}4s2F*s zC~GnVmRS*_F=~|Gl!Z-*WV2esTDy;LzjF({_72UFqt%}rspI6~1K2eUgNuD*9?XPcUPJBP~EMoGy<7V0Gf2!c6QUyw}a_Xz$^=T#@jdEQLBbtjntpgt&cwNczF|R>l+kQ zqdhV!Fgen|!Pyxc+CPnYr3zy_3dliI3)OEI0|BC_<@SDm@HOBJ?D?}|H4Il9ycRpY zgUOpjx$A2V7}$I3-T^~gYyu@d;&^SOmEVQR55$YeVfP#&az-Fh8+Ali-;aQ zKthzJA46_PYwFN5Ss717*4G)j#b{ytQfJ(lxV;iF=dq*j>vJ3CACFou}(xg zJmnW-(roxtK7iv3HQchBA%E{ z4Gj~IN`_zI_Kh)0cv7L|zv+~Cxi1eJ&w7zaRzu&TjzH*WYqXBzwS*L+qCbxh$fJ2n!_>BTp?droNSpBMZz_nKV`P8rovtP!*rMbPDSmyO?{lg@6CQ z|DTwe`ggc+<^;jqd=WVBT1NHkNfl0fS|x}!Du!Q%Ip16G;@=E3ZFW>FCNy5vf6<$= z+EIc7%jV2B_;pwm7SU453zvBI+uLk$8-W5gZGngHj1^GkI+x zPOLND9IKdH)1Q2L9orkLs5T7FojZr)M-JlloqOo@I=DW63#U(=08GbI{f5kh%e1J)_#=h`!*$;Jz^k!!0dW`_Hb#MRr z7e0?~eB(QKw7ia;b_X9_zJg~ioI|DI8L(V0qtho3WB>F7ksPdVwsGg)13Y!+0E(VB ztX=(Ax80$QyG~U2o`KLY5>8EyV&Qfl_wGKVadGQ&$Whc6J@2xHVq@P1B2y7K69Qd% zs3D8GBu0x_n&Q0ibeTODeEdZyt=T!}OsN`4Ex+owC};ehHV#=#c)wC48qskxaV2V} zUOq3?joR2qp(jzlxv-*RC$O=xhAgWRsZ7fm%%L&04ZXS6H+L!WfAshX zblO)vb;l`Q4`O}B7Z(=;iU}*JV46ae+CTs(8!*Qi;ag>#v-x%mZLo4-Su@u9{Lo_*>RUVrUnY;A6!-Rn|Y2czqg z*|t%^Cs_|lFH0c8Mx)OiKz-G!HPRQZv2W&kG>A%V_j|5l5kGtL7dSFGi5H%G2^%}R z_@l4?Io^8jV+>X6m>eF$uxoZ)cq6|s(GJt~eWKoj6JR8Mr81<5Fk!B#Wj0j>YzhHA z4wiG^z=mep(GK#NDZjV60H_NOEp4^1y|x)@_}7tVeLUQ3VgG?cR3jz$JIE@%zyXh_cT8}c ze7#>0)(`b)w}rB)d;)=ySuX3jw787rwGFB}bf_IyD?BwhhC{Rauz%kaF;FryXuDV7 z`puhY)JHHmIpu4@*y%29(@26cd%qI9;0Zsc$BIQQQl4HZo@io(YtQd7n}j&`^j)>Z zDA`e>d&?e~E!~q|b7im0urAD!RsnJ9)B3-pQGAwRY;;Tl9KOe0OxoDQPALtD{w;By z`4M9HTaS$OFksa~B)~dM!Lc?KH)rFP>4z!nl?jPL9%$}~0@bLWU6V`W*>mzNE(RWO z*T0AUWG!9it zn!)#`rc8UpMopX+5P^w2;eMhmq$54HbWZw&WdalZo`&4Sw5|;XMEpDx|C~6T1CEA< zuI5#|ckMQQ|9d~i@BHP@@yGx0F24PfkFc<~fu79>F6Mhm1sd?ssL^HM3T|L)5U85j zKo@YEhl1G{*%&a=f)huqMl8#La(;GV7%yHpim7G|SFg_FcmLq4c(}N%;0pRW37EFr zVNfv_#*OQra`@8;+WSpSiJ#214iG3sBgL#Nzw8V@_gC9oz=b%NLGbBnYvSm7BquCrH2qcRDu1a?=-V-y?(gf!Fa z7d`{#dlve;9~m0LZ~n#`o|FX{u3Wv2M~|0$@whWq`hAQJ4dKY48EP)=47U3Z9%6fE z*VmV288OLmL~f{Fr9ytrM7qqx)YJsge-jl&zmM?=-(!c@v+vW^4@{3rxJu3scr&tk zzLa)McK$F|TNaM%z z+-PXDKR6Izv92g$CfsEm*0;9t&buGu(c^WTIdK>-KYNKBt+ll^OpcFXs9wSH@?%U* zO_I~Gv)iV+Fi*(fdqmy3`vAMG9)^dSbX^BeF2XHV^FVH3tx(##5cJz`e}s+QHW~QS z<3l)mY?f-GNO!nL$Sc@x_3`niH?h9eA=w_T<+yPAC=TwQ@lIOk7wMdv_dmLZ2ah)i z<~Y)<;a~ms8yFd?QgdypIZ{;QacoQ}Vx37aI6B|4){te9qwy}#V{PbT*7wf0a|l~K zi)-_@ap&GcbXpy}^2*B?8gAn2-})|o`t$cFxHL9Y!$>u!KBzkIVU;b!5I(x^0MF+v zEtn}Zi*lkDPSor+(553XVAQrAP(55*=byM&#P%=FdG58l)M%bKgq_Z(=grZz8D;Rv zb_feQ?#J4$3}b1y%pennsnkL$>x0Om>t(!88MN)~-B255)R~%4NCmxN#E#I z&j6SQM?Z_3rjhhA!scrwsw}kJ63JsF>}$P@E#$nM>cb9Ty;b0E-@1%{{Kuc+^zmc( zFaEQCjj^#&nIn$kaaJse^+b!kG=EPluq%z!UR%xJjL5MDgHajj6DKBvhQ05x6Q@R< zC`Toi$#clLQ71%)4?;eW%8g<(8r&My*l6Me4d;yPedN~JjK~6-qfM+VJx0e7Rm|=q z=c6{6VgLSVJXl^stKFfj*yQ+0c@Bay^?PI}*Xwnxtu5lx#dG-Jz4x)z>Crj27VhBE znWJdbhJ24X9%ePKqWvrz*R1x7Fb5S>Dm}dN%JcaC-~Iy;zBty#U%dMvP9FUifP)HJ zUng|_^l^Of@h9l)T5N4^V{>~Kjhc6)>h&60F5K$ov*H>94 zhcJv$9~hri3>6imi-$yry*4hA4b>#!!0@g=!euObosJakd$?DT+*i~Q;VjN3n`nxr z#&T)Lu~738Z#~li4PMK#&BS%(&ktlPCT7E9G#bLH>G!9cf?l6|b{$u)-6FDtFTMUU z>ZXtN?H0CocX4WR9Q|Gg4<6jZrSs>}>b9};c+oo?gc+<5+0E7Yn;3HrTcb|oMUJ?G zYl>VpI(nd9Ue-6Z@xez|(X&2Fd-TXb%5F2!gp+NT8@h9M5x4I=MAs2NWWc_OVLboz zIn=8eQNlZRKDTY$xcv}UZ`?=EWwdR9&%N>-o_*>ZY|-J{;fw#+44!RsTEeDNMZ(RLxkiJ9s0KJHHQb+XhonKG2*Z*^S#ASfH^ z+qZCF!DrZA^YZ8rX^65>>m$l+47lqBKd_03y;7)E?`s(gtZ(dKa(sf|e%e+OC)>t# zBXy{%^+R;VSrdlmQhf{k{6kY5w0M{PnDHuOENehi-R`AlkJJrk{h&f(^n!7>PK5rKlJHaMZ z8Dx17ty`?v@|kNI>UuNKSDsVP2N$LC?`5b}JPgKtRVz6;PVN|YUfms&#dCD?Pk&BM zwGaNgr!uX({up^CnKI{j4%KV)<^Jw6W6q~?pX(^3Cz?YT8LFe%s8R%LY`B5(<`7Z0 zjt&p|uc2X#HT};M&0#d1(zm{tGVy-*umIAbdBV%48(Ta$o~_r$KtxrnhNu+EawEhT ziSWdYG7;W#!5>2u^k?kxFfrQ8Ms`$cF{iZ0eJ55=5&tF;ji~>1DBP$uQXtj>nE)Ye zcm2lhY7BY=MYLix5*t)V!#lPbw}JQjHuPUG^1Q4F3+`>BikG=5tP#e$sS;E1||y50o+hg} z?|<|uIb_uIGh_iy9zTNSP@Nbb9m$Bx;8FdT)0vIBw|gk?eqvW2((U*@M!YxJm??=mHGN_UW|bg0d>h;_ zJRO|$Dtw-HrXX%-98B2{H0(@it0Jt;zB001&C%lW2Htw-L$r3=c>byLICfw^)fq0X zZW8=&dSVVfJ0Dmkvs-N5}vD=2IQLyaa*pD$BXf&c&@07*naR6dTe(PltDc*^ruw}Wf*p1$5W zZ_b7|aeNl1PaJYyv7d?p*xBvi!_VfixVA-5-`=pn=9`=r-V`W|2*uoEg_7+xF*DyOhgXf=p8t=UK3w-ad|DNig zojo(&sG-W_4~!y_eU$Zhv=zK;GNDE$O}M?IA2T&JSp$mfi%}HDCiyA(pY){-z0DBx zxd~)H#4$)!XMLEk7x1++f$iF&h%3{UkRoD48(9ffW!3pMcBK~4tnaEm*-g7+@;L#t=sn~BYf)UA-wY3 zB|LlK3{D*0kFjQrnprzCn9c1SJYHVH^6DBkw_C*M>yQ{uPIC%EbI^Ctp@4d)jIc3E z0}LMh%ik@VCQm%GY~qw|QCWWxg}|g{Vgqt;$n2rDpRf_|v216s*dzhC((@}L+ak5g zqfGI>Xo5qQ#r_{0JmXs^t7KhXr2a|x@`?6cydU>HbBoDSv<7eA25N3zOk`O3_c<+J zP>&8nDRw8Aefr9YS+1bGf-{2haGXD$2n&qIxN?6b6ADeaKSdU3ja^Z3MFib70Q3%` zbI{!H8FhZoC=KqSGS$!^)8WCZMt6p>(pMzNN^e1g60v!27(kxVnOoyufSEoW_~M`*8QpJ^Ua4@egq8&I8(nj2_LPKvZXhI3GL~ zdl^w>0kh>dpYXD!@9Gudd)iR+?`9^2Y^KhlT;NHPUpgk$v|9F|I1!##AWKsC2ya5+{$X9VvXA0>KZSC@12;64mhd_C0q`W6LEL5>=fu1;=2z2-fdC+KoO$g)kjnS`}o;>+W zqLl>Rr2+%`Dk>&0Ab#cG!(K*nEPYnzrEI-PeWp$C&?-sP_rUjU)EL;ng4cDe10>K_ z#B778JR6O7vzLLSVVpL(mqdG(95#Lyjb^Z=>xu_yAVeVYECOfpx|LY_oZL8?@X;oI z{IhrQXlV@xrl;`gbC)n&ub|!OVeaMv>eU)%Mw{5&*halRjPYij931B&^a4=ts z`RlhZ+8o8jvu9Dw#N`XL?HL7MD+=D#>J|9#lj~UB+I1Z3m>O&1;+d1Am+8sfeVPg$ zE^XrS)jQbf61@x>6@wR_zl2(DeCuE9>tq-1FA@~7N5PanzV!MFICFef2wE(RtSR;b zcs!$Si$N>DUW(`}glh;%2N>cGVrq1s>2yJ*-o)DGF8=O^KgE?RH!wXmK`kui=WpWM zfAIr6UR%ddwT9{8VGKE>5%=~}q8&AS+`|nMO$BUh#*Bd6rp5XiIt$eZ98g3ZVOQW{ zwM^L#VNd4_SkLh>^~7g2CXl z_Q9gFn^o8 zIe+#9zWCZpc;TrtI5aznv8IC-R?+ShSX^Giy+@C+vbKqC*UI=arM}?+HfK1s;xi~2 z{prs6WXI_V_C-l=Xmcg0nbIFvGDJ9=mLg`1AYb@e{h}8Le$NTQ^qFLp@e!a#&65U&9va5Cd?$l5~GP(sONC-nM#(0-V}OK_(En+ zw`zrr&KXe7&?>kqy`p|J;Xa5iG#Kjc`hBWK_KqGm*^SbYF3dQHgRf|CBan}9ue7*; zI7+Gu)}_<7Ko8S;FI`aTG4WX`qR9$Z!40F=I0SoLG>o>x$<#FUip4aj6!*@5$`gFuwHCdF;N~#pO?~;eY;L{yqM; z|Mh>uf$4G2`o&opX>!AkDjR$%oi2m0mo8L`chA573a`YmH&SOpFkKbd3_LbUGWfRA zSeioWBRv|jDOis7+xQ+EDvp`22%%_}dA>KRh9h})SQ%42Ha1paM9bF{fs)xXyKV2b zQEN1CcxIZ|>0DI2UdizExf6Kny=&;Ty14&n36oP3ex2ocs7v**>d}!AEG|CA$ulQ$ z>cla8c4dx^xpH+Lue|Ua>NOW6s`|~M?+ulL9NQukWP9D>95N3tw83=q&W{TsUAlA@ zFTea8{_Y>%ra-_u@4t)BzkC4`%?7d%EkAbjFh0HY80~HsOKY2CNHlByK3mFEgG9RaI6TSZ>f_n))%Oo2^C}>rqpenKR)60%t?32V`x>tg znOzh%)`77D=jsW$k7fepHYPTAR^&>ouVv6O-$%*FJ{z-d@mdglNk(#^!2OoVhpZe+ z&al;enPPuLE-kPH|4xg53~WCh1*-Kr?mb$>+i$-|$Q5Tu9-Ez{o^?xWE;wGx4Ln#~$IpNI6UyG5KYapUc=dC*d3OO{|JL`gwbP}H-|ScuHS{Qp zX8C@c-C~V&JC1S@94r&zb_7p!y^TT;Gb0D7k5DR>AYFWOd4K=XXg=ph;sucTOnb-z zWyaU!1rlvv{|k>QFog%|W#XJgXUD32r<{>uGm0IMG}x?HvaW5kiSEjTEGgO&PKR!8 zZ)1FHh>%;x#JW({3417|w5~|qMG5w&_fw0Fr+D9~37c-i1+atB6jqifq;Nw8%` z+!7leH%ZSzSMIn8WRW>0L`6rGi?$ zLD7}%Ru>yP9c=ElsVH%$?fR|s>HW=}7It>K)NIiy>TW+nrw6n;7Q0>dRbac_$JR~< z8#^s(#<;${gO$x~>~{KoQz+uXjZRT2oKJF75`R*RUH!XS;L-9<;7UpGQjE@20r2ld zQEE=B93FLa6h<+MR8In95=Ej-p24S!N~s)mu_1zLL(O)Kb){-bgO-e($j2)7J-PkR zOi?uvMQC(t{f!G{r;a2ZLEY^I14t=09=E(;#`$=+#bI?Npt>^S6aV- zQlwjqVaYI;`&N`UAxKu!@N=>xGBiS9FO9Cj>a_8~GZ*M!N3p%UzKPx4u53CEhDaY-Sj_I9!P3$S zs?{3KoIHx=(2z^8;lZOtf>Zg7URcAS27uwRIVy2&`Na~5VIZ{=?tZ4m$MM|LPhsEW zI5|ek%PV;Q!%uwk?=T<7j~xN5?`!sWbsgI~J3iZQa@xfD#3tvBGHd!Cxln+b=ngfi zM62rzH#h!kYpYUk)Mzv)m{x=yC_Dyn&Z8q77HuNEWj%?3zZu!gtkMbmoh68&aH*z! z(&v;vX%BYYBzQM?out-8>2dQ<#5=TFHd;P4Ofg)w*Xai4)cASgaItZlxQ$kw9UK7; zXae;Vn$-~={?oA~jM-X_iLN&p-^ zymNrMMIU$WJ;L_p4i3&vqgDZ0?H2aU%%I!zY)ZD$_bbY}-yGd`>D+a&*YcJv8?0(4t(;O6j1hcHnV4;OUMl&@cWhw(}UGP5q zc2prKvtudU*xJQ6|KhJPe}4(D{o1eN-~8AA6+Q3Y{NRV!Y3&k=-^@r8jm*Os2?8Ag zqeT(tun==E^dD0{XC^r3Y9F&9u&eK#8!{W&BNX~Y>bNXrMP03(4Z1GNg3;>W)&xA1 z-PFsQ2@QzBts@i?CXjgW??^y147XGTIXv#sxbbCcJQs2vO6!Y1!^0#UB(c{k21-M; zonqB`H?mF?dIMICr_XLUBA2C=HOyVVgSq)Tgj_gr^e}$o*IvX+Po2fYNR6Ch2S?o4 z+{VMl4sy6oHoXhxwXpEp``oO`}%*4R~URp zA)GWbWssqQn$@?kvAKnZj^ygW5*|HX#m@FNAy>$;36M^zIB^6vzMW+#LGg|i`4SF7 z@6av%93i3c!&t`ldGt)CWCXm*lpL{*=R zfds0_8j$?xpjpi-*H?WBERq>bObX?gv9T-$fO0a8x~C^D(o`0dVq<~hPt^|SUPL6| zZ2^psfGC(E+IU>Ru9Sy3rd;PD8ABhX5E7WahduBUIVDT5ENfMS66*W_V+8lE;;k!e zNXVmu!p}<$A_~+@ALkBF1X7EPUbrN0MgvD>7IqKMaFnUp~1p5Evlx2Zl|1ks2_ z@og$BH94M`n#7UA2dL>X_jDU+R&eCd6v@--+74FNwy?RggNcc8OpK384cGpe8EkB9 zqSx)?$l)1k-t3Hq-A)&mKfCIg3~4Mm`mF19ve;-lC@#(dTH6l}zSmvPK79e_P8}u4 zv}?fm@n=`DzOhB8xs79HdY>@BxlL<*bIWhW#{%LAOWGR~ZAJZZ%fDzt`NCotAhFUO4(UJ8=G< zznQWWmkctK9=GQ@(6u9F=!@u^B8f8dHTB*Yp`Z{WOm^Nt(=C8X747$R3jQqG$HJp) zm(9qURK9|$BQjb|vD29O8Y?0@3N=N}^S^Q94jC>JqfHz-a){t)F5~N3EDTk1?B6#* z#!+6ap*B2>M@y@C@bEFlMn4~N{qPPcGP$a%qszRA4ljm4l z-NfAWTLdF>a(-}n0%uMhBl3?d(0%8X8m`RU#+|#5gX7r6q1g#sJa>v5Jp|~QtFQUT zAH9us;e#T_4o>6M7oNs&qak$PyuU=4lioLV22;t3QsO!*CG+UAV10u}%bQr)*uc)t z4z@P7v9qy-*FX0;eEId)DUW|92;cTO7r}7yJj#h$hiLlHf zhC0I2tYZ;mkoBJlUmkAigA>6Qv5;0qmV3P^ z{s#U#l`#zQzhD@ zKr{-n((+KAlWN?lZ#BY?iU@^pSq+NJ6oFAqcL5KJFhB%^F48c}iF<+tPd6d8;9>Hx zNh?MND^DE(Q6^zYs>Mkty&n@>DQ^EsFRP-&dtJ{2CxdIo#0XIH<$ti{0ZsEQrA;M$ zlJq5lVxvJRwt@&pYKo;#8q%wX&lZITaBx!{OBD?A%N%NUNjfg-TY3h?~dBRGF_7TujTzWS%% z#G60=1(Abz$I3%rv>5~?|7u8r6O+~umcm)TY|7L;l;cz;!WObjzL1r(UJB}D5Z6@M z^py;Ep(I?*b7G_0#K?1U?6B|Do64w&nTDa1?R^%fJ)YGnIb{eWLuDPiwQt&LG29&X zHBa#K?CM5c6#DsRP9rytaj=62kCxHy^f56$hAA>4z0>ddfekf=X=5E58^*C?hddnC z7+k+`gGe;`Ha1@5elBs;VpO#sS~*Zd>WpW{Gkxxx8po?IJ&VziCK)S^ws`*LfT?h5~HXlh%l*60{V zAOQ(rAcn`3u83LWMBI{}*^!XUSJ`l}N*5*iDb90wBNMG}t@>F7%K@NM*)GM@U&XM9R&(_lYQL-{d3(njLE* z>J?nMv4FYxTNoJ~L4Bx+gk7-pauhT1PUmd+q8f;4FU+8ldoXJieU3V0m>L-}~Di;qu%qbbAKP zdIP`ppS2C%rjCHUc8%hAp@>)DQv?88_S(0;P!7$-)Q88q?dOWPq%) zLE;Qp?!%_$rI1P@{-pRfw(ne)cDL0^^_!YeYc<-#l=Prdg0gQFL^L-sGK80(yNKWV z;^*+v)90{nd>A=F6#G;o>FRmc9P+|7EvFz|$`Z>rLI}CUj$;U&ht4^eF6rwmb+qF{ z>}A*S|H>XooUhU@tL!Zu94+S!64?(nBJX*fP8Ta{8@T`QF&;cz#`4M<)yTPoLIph> zoF2t%FFuX0yzzOw`pUCm&+(2?y^>?Zp*S32U&YW~ol#1xkBkD4fsHfR{LFODrmzX~ zB5>V=7%tAUZwJHj#$W20ZMwo-O}MKyXJVbG_hSI9JOw3-EV*9U=1!XlmaK$%2dSyQ1hL`}gCPY@i7PFrk^y`f$6AIOf zz>>yMa#sTjy!P75_`wg~#73*-Yg<0KLVaUKn+=lPg9rCxabtlD+((a>(dwQeW1nb? zofB5=P|(2yC($(@&ni`H@3b&8HBN*a)kYJG%j?+MX<@k5K%UnqTPPW0vB#AZ*)l0d z>Gg!SjWU2td{Z_p4me2AL+@0|Y4JAJVC|~DhKdo00m{EikdNg|6Cv5S9!#R(5^TYM z97g{s8i$ryKL_L!5t<7ltp{Kkc~QRN)-$9x3IOdOU}#56UTh3gnohh4yGvu)Vg1 zTC+)HT<^aBsWgJmvpTL^na73mr*Y}r8LAO=PR{E3I);avq>){}JK78KjA-N?dg$8C zJ9x0PiY#wnqzXLq)G72jZE{u$_^jEjoA+>Y;Q>rmCFq``rGNV3Y03cGkTGy23U9vs z33gohStTcG@K;`X7UQE$s^@XFHc`|HRg0tS2?e^>6QTD-hPbnn(J2b-?DX*WKYkNG z_{m#XS>FxpsQdBUGnX*j9K!eh@~`k0fAhCMR$!!F$CzV`EIb*C+ix&MaNr;t*EB+94MWD??RkZb5Zvgm z*hIcqUd6UhN+PO&LjJ(P5rTP#%%@(nL~cWSbtXak%%m$(j@`;*xaSI4Xzn;w;vgr;~s0JH=bUJ zy1tqS!WiX10kpuHmu1R`*H3Gc=NLpf>0Q(&XNYW<5jlyJr`MFm_o0l#IbW`y<>tmF zIz0~?WcFcq?ntwWSDwF!r!Squ{(aL#hV{u@gB&YY6X&+>>B&({PmH45>d_du#_8R_ zYFUJmB}a(X4{X3bJ64F@EE=s8wCIO`d_gFaLSVSodfBpUmnyrDf}LUb9sdN`2Z-e^ zM%#1Z_C)5#WCXsw6{C#Mji@*os-!kwaei4wQul|QYx#-o4@pZ}5z#EL zVL8Krj$r4M&Q;~N5|mIw!v>JNSJp9ck#gq9(E``2RZ^x~Tid8MD_FU|j-IVzdeS$# zY&L2*ed-9V-dV=V${M;|rdRfxh;!aubNFLNkK(U>@EI;%Jc-$vN$Tseyyp9ieR};C zo_^*c#)mvH1~@B5GE)Q@FCsjmAG3pbfUOop-T}%g{IlPD1GoO@PwDd=)7*_a_wn4N zGpN-H96Nj%?|m|l>QEgI7gw;|DlkehgFaAg_})kT9nZWJ96V=OwK`oKIyi;gMHlOJ z8jsD*7U~m2RHrvQHcIm%{Su9z6T>}y0`p&z#kFxcC-S1^D9JX3MNL=EVjB!L>a@^` zPQ()&Fp;zJ&ZjPtWX{tSp?@#Gqb7Ll4V*!Z&p&U#DKY>6AOJ~3K~(BO{}p{m|x^*f)b8{rnw#c==OY zx^MyY;W1((U0qwnzxtQIg`q}+Xz86n{CH`Zde}Mn9B$M@n?=v6?D~nl_4d1z1#`@| z&%XFH#$4}EYCr`d>9Bc@AHV62@e1A)9lZGbvzVE5joJGYXmISH*Kgj&^@Rs;OT9VN zz*Cn_;i-#f5bXL0jtjN#WygQeERDL)1cI_u9cKi!>{^Q-zWENm{;j{nmP1Cm42Xk8 z*Q(^uzWd($_{N`qkAfr3yn^ZGFdBw#-LJ(g5*%dK$XsP1+fDOa#QlOYB}ASPGjY)n ziaq3%rI0j!=B33oTUL*Ws!10_Ll7*wViskITa|g#k(E8e7_L=JRerM43?zFi*(a3{ z;4$Z2NxBb8Oh+4+yq?*0G}zi{6GFmeVj;|f%2gD~^q6?CVryx5qz|(78HnTThKj+) z_8L}JSJCS9d|gviS~A|8!OxUzDW8_+Ni9XuOwI{&V_H!}M<&sQaWs{6ml(7OGeD4C z(MtnYi7(o_vly6X8^PJ?uGVgAdy8s39kX!3Fj8B<4fD`&6_+lY#TUQuDiKdr2!7uu zhUvH7`G91?K^I-nWM^j=oo1a_CY|l(_G|0B+$^wsW;t;>Z~&2OI3uErOG`paBW{lq zbf>S~_6^x>=#y!JoyTM1YQJ`Ncf}zmn~g~WWt5Z+l_0eOV}~b}dHg zkY<52oi1w=AzX15($nD%4)KDH7P}^G6~Ts z)0x)i!L& zTuzK-Rc z0_yk_Brg11A)4&xj_Wx3`1RLc#9#mI4{-bL3bwX;WZa%Qag<;g)8pf)SE^Lgva-I3 z)y*x8PBy%oU-%}Tolc83v1-kr=vpBja*#~dLlG3E>|ndqMs<4&>#iqRt$~g+6nIV~ z>l1rHZgIb%_ap&G0%-vX^ELbh8;>8!94t?=vgRf(KvyC%nPhq4vg3mtrlptwW=5F8*|Kv|`|KSp4#1D*5qCwPZeaU=rs>D#w zt-i=T%PFCS=+GkA4@}l!e129lG54BcPdr20DBFu`bosH!(p-jk*1uUu0-YapJdttdZv@bYD!g^rp^@=XE zFknTH0P*7Tvf=Mm-(FB`ZmOIXpVluF zsfkgXIdv2-JaY*%lM|F(?{>OGVsdSM0dM}|6WqDC>T=qsR{gn-c<J)Fi!EG)U?HKE5YZc+bSkXZ%!oZG90NtPm0cFvq44~%p*2<*Mqf@*p;k4dcf=<` zGUhBBD9vX&8ER0IKkB)R*R90ujW;eM8;Q{oN9)BaQ#Zg9uQ9-U&q+iuC<%^W6wHR= zP2@lwsU5jcUnZMj`aA}T)>^!vxOr0lkKoPABuHUiJSFN>wcRI5BMQ1?m-s5IP?W){ zENH>!$1E0mJ1Na5ltZN_M#n0|DN=%w1o3pnEj4Ec82og-K;l+gB+d~JMcMWma4l3{ z4?coNQyT#SH#J5<5jbKIqxAe-IcHU59z0Df8R8VJ$)aqS7zuL!}47U$m+pW8;F`i{=ZaDl{#Qyd^u}qqcfu>ymW(V9fkEb5P&NQhrR+E z_Z*=zT3PYtshqbYl`oNI<;aTjPn!w}L4Xmwg z;QGy5ICsJul}_#)G>Qz`JQyj)!>S~c2}Qub>&bYCwA*lg`zv3<|Mf?IhEA`7tJiPi z?)^oaJ8=kOBd+;;154W-Vs?G7xP(I!M`th~*z+v-veCfC!+MHn|WH&LnAXF5Z9dBeYySjboHj&{=K>%sO#U_ppfAlCi@-u%tzy=CBPxF$0KP zci52Fl}YD3{nSBtN7U1i${A8yJgApq##!leJs%n|pba3FVZF{wF#k9}reMANcUhlw zU*)wLWr1Z|-?J(FxOs96#5M=q6g=ZG)pdyFSNe`o`=L>5-NYa1wuph&MTWb+_o8F+ zYqvYZHa0pofrUE{aCQDJK@uH9aldOZG&G9F@EA6Cmhg{1ehZte4w{W2YL@Pdcn2ps zu>SxVGmf5mXQxH=Vq1=Iqguhp&=B&hAXd+N4;FFr{zLrz58p&#s&qfcj~u}M=_$G| z6O38sAiV$nr^JZt;6<+C?WvQ82&bq5QFrmw6|A*iEDmj7YFP_8;&pd_owKaTtxxngH3*Y?C z_i^Rw9O;k4(^D9Bii?^`$4G_I49>E={HN=lONkA@@2Fr3&%IH0pe7~L?xkcI6EvBbswJ6cmRh5-GBQqmIWyp+(r|)&b&E3q+U*rrJjjqgm z@!oy+x-d68cI=p;tc`E)F>p4-;@jbHX4+M$ z7n^q31&ensvv*R8;gpZ)Ddw^4*HF8q8vWmxVFtEqUvo6LV!$@sZ=$4T=0ezSF4+X} zal=0Ib(~(Mw|&qKYJo8b_Uw^~Rugk`GdOW#0hiC8!R3o*sUI47VO5FEjc0iHWF5Ee zJiyA+Z5(umC_J^f(+PE`-aoI`DU0aOG+9qB0alzi;d*`+C}N)?W681a$f7pPBv5OP zeuiQH+K8YHsVu4>U^e(2mfF3f*o2)slg3FoM9Q-{#O^c^h?V!K5+e2s*cGmgB6;fD z(k&1tUG9o_7sC1Q@lFMWQ7y`3|!nNmU|>p;GS? zFG*(-WEYN1Y(9s28Oi&MdXFl=cPy#OsG-wuR|kbyR2|Xicj)y4QP$(}@&_cE!jfoi->(*~)jN<(Uj>b^^OJ4=x7fvi?UDiR3INb+vG)`dW;3 zr;nMbampBMZ0+IXu{qRh4lSQynw!AKzHoZ4jVCLsIDh6C+MO;sodyYWxT=q{r%&U@ zzx*Zk_78A$b_&<8U&Xz}C+PJDc<|sM)?Rr5<7bYC{)R~4PH+yKP??>g@`ybXF&OXk zmU#Wu7jf>)2`nyclEm?^KDdEP=g$!OHh**mt2@g;vyK}#Z^HHVso2@ndN|ncp}l{A zM=PtCot?t&_5mI(t&lpTmq9*u;uxN+?Giol>ESLfCHupdIZ%JE{#o0g$bpZZ3i>TkrZKB13WxxA|^TY_~djH0bC*_;93#I zH{*Dc;6kLKQ8&|+!Feu#Gs^4`z#}+|M4>J`>N`gJV(*}hooD+L*n4puAB1ghZ{e+< zzfZ`puY2isz4ZKD%pRG={l!PPd1sN@#WbU1;{!MkfQ>a;L3X|bcK18@`1S+r?sYLY zH;bu>Nm$pTy5A2zyoE>i?qO|p6)2j7X4pZafqC)DkZ<|}saPR&T484G$r}(vM zxOV9bX1vHvH6X{;J98i1en8D|Yqc>n>ji%QOTU5fv8Gx8PU!1K&d#*%d2Odfs}^V! zVq(YE-=A-qvb4H`fAXjQ3QxE9aAa;8Z+zl9X2u%mwdr+4|HrWQ4t;Tpa$rCes<^-;6ABb+epJwxWvdJp~^`%uS6a{$J+F zrss4@Sx+*A%I|e7O5$tPONUOU8)$Da@T)49*-m*n<|E42I=!UgBP2^uZ`4UKoR~W< zX2RmaG*SG8{j22bju-%CFJwZnsP4hOagDfu@P)v8Q#OI&}gU z&Y!`V6UQ(=H;09VBWTrY!T$!daRxLZ({i5c8sSw|_roKZKdv?$&I$Ls%QbY>bHfgX7H|V8zRN01hQ7nN!8z@GV5R9FxWWyz- zg&((yNR(rY9|iRt;9e&-_TRA?tsqFrj;0pVlaC%`S@86{@Y9%>^^hTx=`&BWSW=np+_U0SC_3Fq*xrpX_x1e6{XgQ z4yrOQ>X66EuPDQm8Tb);s{W#p@5o-&U#afTjT(G?$j0%vCVi(FQN2X=hk72v;g?Ce zw9xiNFZ|pw2qjq#TRXd$KQcqTik6?O6EZhx9X0fxogPP{s8M$5*4;a}a``;^gDsM# zpP8N{)O>v0J8n&EKHb34*$G@ce+COjj^N4D9jvWyQ0>;KV@F_{1?sjL8h1K2?$M#D zs)(fORqPaT$Jd5cn3c`aCZ^LZt;?epB$zyM|J4AW<_~Uz6d9se(gC1<7j`l$h z4X;4uvv@XUmx~&@q^OuEA99MBBtC%WtjNsr^8#>y?Ev%0v~*Q7mG`4=#>t;ogoEbp3~^tE!?{Q z5WCyk7<3N^_4d7dJQeTb`zvS<3>w`5sg#cS^=Ip(BDc5INBf`))LNKm`b^kyG^mDW zAk?{g_m{A-wU5#n)D3Xv#1UM-dI4}lp+9f#?Be|o?oigOUMunDYuE7d^~Ut2SxxeB3}PQJ zo0)NFMPRV~%7YGYNs8KwAvm;=p~QZB8Y~T*B^wQ?kIsIavfo({DPgI?j$Pc-d@uUE zOdyKCj0X=W8{6-P@pGVlRn@V16o-61^%KWS%3cIRQoc*H2Y&B+=0v{=8A5Q4Ki`{C zL6<%Q^!+0CbyH1^Nl4DClkV+Pji#^3^u_N5i;W4(f>&go*wFs9WVpl^Q_bVm_&S$p z&z`n<&_2MyK^vWJCkSo0pjhbpP+qxm4xf7cRUDh2$Mp0BnvELK`b?yKK6<=_dy5b8 zbYq(`>K+L6=UpXp?a!HETGNp(h=_knn=D?t{8TpGvl0KusWSm0vZ3cJJGEpCTowZ` zm`iOJTp0ndFn-jNjO@Jf$2gv_s%}!dLz?lXd>-dU19A0Q1P5vd43QZ5!2i$j<>{p|eZ{i?F` zYkaS^xH)amW&ehnbpE?RKB(F#<H{008AfA}AxUat#Ec}NLTucPdrYD{$i#;?1P&yHqfM|U>|x7plV3PN>q z)QH+7pAU+PDcNB~rO4*e$iA|1jE&V(oeW_{zfg5MSq9cIZPk&Z!RsWa%5q&?CGYo! zlBB9@7AwnZc;V6oYA(C@U>WOAchNdCOE)%mWCl}{lh|M1#q#nR9iBem+TPyA!oobp z#)5dy{M=D&Y;E9N{}ibe`rckk-}?#GZr!^30Iy!Xgz;lDlu@!S-U}*q)K<~Ci8jKe zu?`Or4*6zljO4pd9(xa~PkqmsKK}a0KPO7!la;j)wE1YJu!JNw>ort^E-5s6`t0`R zK1{7GN>ROT56||x==mD4s=|1yfwi?=Y_9EMa(W8KPMpB{@;bf0-DzW3^|8O-!Pma_ z4YZoIuwHGnvjJ~N2&8T@DKia(WIbmyxE|B zSG{%{_wV1Q-c047i*J7Wdo=jIXIQ5TI=6eB4nF+g2F;JBig|^@Y8ahaYcMlAjia*x zgb36li~UX?_ZFAwPk;YotpZmsp2qQ`b5vL6e+EN~4{j}D`ROhJuybQI{D*(^yJ$8G z1@suHEsCoqDCZTScckUoFzpqjB^G!#-XZfsBbCEJdw_3#`v>^RTR+42+$=hSl6nn# z@Wk(nAO7U0xOw|NY~@G=?%3=UisGHY5rwtKy}@QKq5dzI8#3GFt=cx!6zjdno`KHX|Q$ zww<$MNhO&na+UZb{EQ?V*J#jvu02^sQ7`bqrHg@C6X(VI70z|Uf90zm8lw@`75iFA z3O}96j_u%JNXo)K`{k*`p62d9TQ`ncw!Hevb$t4bPZGd6HBl!c=Eu|1`aSUZ!LL8Y z!{rt1?zO2$+F;0jqu(@Pkh#|@2Yx0FD!uM)SL!@ zE5W@JFphoa#s#!vrua|A(6mm#_ zWU>hwjcs(ymz#u9E|3#CgLZIvff@OT$qXo>?5#LBVp!P@>k&&|sDlP^uboXzwaG|^ zx|>w^n~%H8Ml0?XsR;`l{lbJI%!+G)B6@4%;bWt+m0wprVIRe!h<0jK5JBHvdZfn% zbV&gXPJ*B`td)Ge0B=na_VpAJdW0eBsPO8gc|6 z{gZl-Iaz~Qc5{RekgsmFmPfX#KF}!$r@AoToYmstqZJG*hq<|NEF3$ETlXH|{P|C# zKj`4(iQ_na{3!Jz+S%E|-hLYsljB%lT_qZ0v)Ll&=IHz^R#%s>xw(s@M~>k9*%LT& zWQuyf+`V%ji!Z-G1;}G9D`E|tSrNdYichQR4U)rSz=EI`&z&OCfIt5?-$SD|hSk+= zEU!GJY{OWij)gIUh8e)sN^x?^L7y^uwMIpI!S^%swJ@Es59hiVdfEPZ9rgN<)~j#7 zFgsbp7zQZjT9hTA{WK`4?q{#Ng>GSGt_&*zR!l2I%4{k?OF+EXs5aT(B)|eNFF#uK zDp>+vV@xmCEdUwVOO94v!;9FW#K?NAZHu?yqiO|6mVi zXUEX6q5dj4EKw2BvO`;-p$>Ikf6NTY;Se_xNX8qtk?s^Da|$A@D(*Fm)msv9Np;Mr zv8X;ZOnjk?#wOMAo3s*7;1o`sszSP+2i&VjCMvdkNO$XP*XfT~y`u4t{CT?pOH1&)&gb zeebXEpZtSAhMhWsfBcXBDbckCroy-X?RW6r2R8{&nxAgs)a(@Me#GcpOm$!`3LIDw z*)T-4C)NcLU>(#@6E#crfD1%P|W=l++9guPz0%ny@Lahj@K%49g zdf3{1N^9MpQ!^7|sC(7$D%ew^CP$#LszyLs?aP2Of+}mK{Al`T1ho3YKB*gSZ$Bf! z4F&_e`tIb^1O;5a7uu&@e+5TprenV@Lm9H&X9sw^yoO(Ye24xV^jYjBst#Hw)JG1E zgEApPYn76-*N6&`Hp$;BUzDW82>dAGSz4umRY@W#1+WQN;N!@#Rt0+@vRO2+oc25i zhkk5|T8#qap#l_bHqWv`r5`b$abo{nK2Ne{(8sSh$Fh}GN~1>zl6vYC!C+|oK>2cM zP|OBD7i9ndAOJ~3K~(4_PliF>EZ&HCA?Zg2Z)xGXGyy3(3uv6CD02pH6k&?j3IDJ1 zFOv&u?>)R$>0-c<5}@=clPrZe;p!gPB~Y1_v<6tM2(oZ&RM_&H$^(?S&_><>Q2)s& zHW}+Ojt}*0aMGh850=yO(;BpVf0k0{Dd>rY(uVQx4?^0%9+eZNFxWUzPUGk2HOqgi zyt_elC}AF~snB#?eERws9JC#7JY2?CzxJs1L7ftb zv!1QPJW|UT_pvsp9@IIozV!@SJ3G`&^X%zUc)Yxf$4gHze`Ff1u`w*n&(d1x4oadI zzH;R}Q4pUzS;4}>Q9=Tb&drjn_WJq;re~%}TKdYxbJ+dWM>se*zy~*O<_e}fudf+LFa&Ey$8c8 z72|tnRn~1KYaltMl7tufAk)hsG!QHH+o?6AY0X*YpKWt|jX@AiPGrYT=)pGCRrztT z*+$vL z5hs)FOyv|B8yr4cgaC&h-^R^SF?C)Qt0zZ`9cb0=#Am-sR?Tx1U{ie=(mYt3YG_TQ zpi%8@t(H;WNO-1ZW02z#34(wzwWg`|2Ekc!=`0AnR)gko;c1719w{e+=;i|wIGP-v zgsHc%-K+57%@0wlh0M*7nQ=55Ma(c8%1SIfS;GLlKtsRw&Rzg)t069(JB?%WvnU5c zvMoicgMyksMe%}?RCf9q2iA8SRBj`xFA%EM7Q#@aaAh1i@b9m)c%gpU=d z2+T9Mb7v9X`qp3K3t#vge*a5f!h@9!xLyZ)`+NBAU;PL_c?{Gj2l(eH+IJ@zTJzrf%zuYP$F#NNvZAd-DJ($h}= z7zU04ph3Hp`&udAK(lK`fyWeVWsu6DA0u9ga#q;UX2m`MW|U)Vf*_6`H z4F{N>oWShN6xHy0(HZ|Id9-DiBU`Y&iNU%_!9|*CCH2owpnS@~U`XHTW#RYRZK6LT zGIl(W=@o*#Ak_<3FXGKlegd;olL6Fno~GEx#^w&GrQW>r08clzFsxz=9tH@I(;br% zEQA)z0V@YP;>(XL2>}$MHDpsPYexYQPJJeeR}N)0xZY1ss9Je+f2H)P_226IljVLc zm)EF7gkd(B$(EzsCx4I8zcK25!y9T6fazdIrJnPe85QaCO~9&p5k}JUTS^BSVpgM) z0!rR^DTS)gWjTcSTIxIayVLAto5w_{>?+bpQe?t|$`g>To9H)?YdIMeE}+FB#lf^b z(rS{Fr)2BG_gItS^As_sbob~_7IZ2@p&mQC3Byz_xLe(FhVLTAi7bsfD22LQB@1l&tVMSw6F#{-64Q;N=8E|_o<-OqsJx|tEV*- z)AuH1PlI#d`-T)U{<3Y25qcNGQ7HpMc7hNdHaHeFH^fY%z$afgjlE7AH*Va)SO3}9 z@!$S8{{^Y>S!2}IpA$^U_v;@8M(AwU^FA)?DW%L^_TNNbby1?t%K(>H=))-Hd<*v`oP#bj6>(J-yY)8<5kSPcoB1R zlNcXwVe!FZEX==#!Jv!Di56O84eWQjR5<+li=}2oYq%^9irrGnqRurMRhC&mv;cj%K0AIl+k!lL9U_o=(+)IPTeGkjbX@f!6c^J}vxhxqKLUxlR%SViH}umpbg z^A7>*Wv)xS`Nm7QeCZsWDUR<=F+=1qW(uoPo)mi)fdx7H1ei2f-`K?0{>7hC8;jrj z-7jOjIgWEDPhe`iiH8p#WBr|N68)KMSe%)k!x%LS9I7)qT+35Di%1I;T44qPM%zv0 zrYYE`rpip|QjUtTsgqm^Qc~$bpu8p!Ko(f;A10QHtbs&P%xPS5hrH<3MHE2e{-)C< zy3alvYH>D?CUZiST4gHB5J1|c;E?~XKPQ(RVfUq{sZ|wx!<%B4o^7Ly^sFNjeJxGHYz01qZ)Qo zrM`uQb`q+i)AS;T{G4+rzuS>|9d$s<_^8rB7abUl3d;RvJ(`>f#*!Ox2$fY2ZjlgU zpF!yLeM876c+h9|>H~zQiA(?C+@oQQ8039wYOoJqPzsr%T4sWihQ|A*GxTjhk{xAco`C0B%pB&0=MDY#|M3RhlayVG_ znk80J?rD02b<`iz*MV_qtg>Ob$mW%4N6+O+q-Q% ze7qLsd)UXx<8yf7%6S-1zokGg2!*U~ZWH6>_|X}B=FQhg+y=-+DKsEOulcMev1Nvo zv6CKc9C}6|tcv@t%loYbM^|0)16DSsW4Wu7iyVrO?7-Ch^X zdV^Gay(;fm%hw(SC#2x)XS_G+|A?Ua$@?ua0@!EOneFgHs+Uzo4Tyc6nOAY_bo(H; zjA)G^>pV9-g;!s?j5l7nh6|^TVQOkBx-}Ik?S6E75f2_NVRd5*`xLxE(NqN|N;9d> z0;pPd!}h@>!KBRB5O$p&>*uk6M*p2fG?|ahW0Nt?)Tf+USs7z3G6sSMK`pfKurz-v((7Yi5sTOemWQ>VC+m9h+FN*i7Npb4$05(+Pp*a^WvbaL4Z;)i1~2c}Sg56j$N&Av}InvAi@jANpi zKmt7;ZiCbZMy{taV@drhQXW+CxA36(q%iqw9Ej-+p07uv7GX*O>p)YCj54bE`i_fZ zM1MNfAdGrNMjAAaTuls#4s5i^<-9OIg^h>3iL@6zzezGUW^&Z7%7XGp^^l-gJB3Qt z*TvL4@o?)(aY#EnS#%iIQ24w?+zXnEmL1~4u_^34JBnZ2Jiu4~`PcF0YcJxnpMR6U zhSUyCN3kQ{qjiy=6A0;#@QG})7t=GCL(4<|Lw0k#9X{aI7?|gLOq@P_p9+mqpX0tT zzTP4oki14sy0&g`C`hYOuV*VNtEJ?R__{&=JyhRORe1Vz13SCVFg`Is4%^L-fyGD5 zI5Kw;)6*?ddGhz*=_#H%bY$)b33J@Ndlx59o}zu}DT8pH-nSs zui?n_I0bvYUVthg`S6X0GgHsNa~2O87wZoE`Y(z=$zvY9i^_-OfFKAP5e3bk%JF)k z?;ZpglOt+`V#M}|_om_5FpMaUAhlTustT}_edGWLqM+zxeevPUbI*b0kb}0Q;w`i} z$EsUuX?dGcvoUD*yiUql~EY zRq-qf0w}8YrVe0LQ&DG<;+@_%niZnQ5F^4&Nr95>KL_KGz}m&AQupCuJ0<6=I9cHu zC4Hod3Vnf5K(#VesOxpHj*ta=oC(=hR%8QB}kIHX)VTEH5{3prX}d- zr8g+?_{l2Opj4(t0xG^n#S7+;qv?Q7e~6#I{Q-d%zP-cs>*w*x%h#f4f)OCia-TuN z+IyjX*`S5eAz1h@GB&~Ke?*~eG^-#^8B@4b&d{`-Fyr%#-OFR0t^ z?4jEmVDZ62?C$Q8pn-43Jlm{?j2)uVp-W@zN3s@av+T1_HXS+`(`*&h6DjT^>yo{< zHroL5*(&-$47Q{!>!_dyWIrd{l_yg&7s36>dmLIFMOT<3;ShiKZ%5WhkD zG;#*z=K!B&ymmu>Sk8VrTJs)U^Ax;VQBSu}CI2fuz^Er9FG?n!brM1yP!;!C@*m5J z2fCm>l+X6}DERX9*i*+BFy5%4(JWAlHS~o|j=8tX9?;v`-@*Pto6t62$4q^+*aoTq zQ0f*V>%?bo_74uwZnvqm%D@Z7lvT`9mqZ0VesUh4dgBv#^~GzLpPj+vSdCZ`UP9jY z*ZlQIw{Yvh15zXHb^El>Bye}hUTNy808QB>*^%tx2q5F)`a*$aqz>PAaK8 zOrVBy3UEP`sCQA=q7tOhkgO+5eG;nV(-Wp9(yCS@QQ4q`8}R=qd81e(6Xv3vEMfGf zkS5I%7({t+AZ9F}Ghp$Mwp^HPQ|#&3G^ikgVJ%lg*vRV4@gX`MfYB`}?~{G6kQ{r+ zsWg(I(M6GxnjQV3ECx!8hb42XSZHm7l?|Q4^&Lu}%oIHR1X_wyZbP9!DL9kwcj4?)Zm1O3#*31aucx5EqETyMce{VrFKBvR(IX-@)qY3TEeLNW|sb z*$epbPkw~ewKWo4nLj#DJ+9*IYB86-P6hTzhGqHB65(nH!E3BL|hjFOYdHdYy?C<$S5c)`WqL>yQfwU4#U)J~~YHY$V2Y_e}+EaI~;3xoqWey&t* zpq%#@oajD8e15UwFpX6e>w--jSMFJbV6!Wp!%RLp0Y8Io4-Fq&`F0EyFf%(xs$|{) zs>k}<4{ts|X@eBD7vy;LgS_3yfx`)N3byU>=3rDB$J70JmN9U$J%QNha zG6cPB2RSoum`-9U)Efge^mBx(K6zV^>?hMv$p(h<(o(Bq#+`Ai)Z*-_?v;0hKPi$g0WzI665V=Yty>rTQ;PliqPI?92RzVq8+C$MF z9lCH<6gHG^Z0_!1``IoA)ez&YDLh_U!_vwohQmq%3l}q8931++;e)-sb{o%pQ{_P) zwhUmBr_49U>S&GCapn98{MP3_g=<$Xqg5|L8V!u7WpelvQ zA{i`2O;7%O4i-2SXeGwki0d-)ll&I7fU>nR3Jt_yQ2hHm0ReqK3V4vKBzH(PvQM@- z^a>kLGkM?gz?URgk=c!Lint)bXRX-^HB$m*k0_ozMn!zDwa7|c(+=WDdYFI5@8#d~ z;Rg}CP_p5OhOi$Ia@L)$=(?*jRgr^RLw0)6AIEyrS4!FpjrC7t@7@MeC{<>bCwMF6v z%0c3qMY&^M_e}ANo4yKjNMJ)*VQ##ES1z8w%Jx1UJYL72eC;pr-~E^W5YyAsAtR=a z(b3WWTLUnI+%{z>pjsp9qKvXgpmiun&pGgV?(u(Gy| zbFCK6pIyK^zkWa*c~3Vyb+U`;sd1b;e*t&z-NWaOeHNWwmx`q4k1pWGM>lZp%xN@R zO`JP>3ilr@VZYnKori0f`PB`aIX;6kXV2sK`~s%^xmpcT4cTT|vXvpzQl@%FDj;vb znmz$db8|=F8k6Wdi;0O=s53$Ubes;ff~rJB)fgB`ik8724l9?Wv{g_;^r1L#WE07e z2rTsA1LQYfNiy##4zut@D~1vqKGAzM!N!7&qd@jt)YtM&a)Bvy`Yp+12!D()|?grlVF z;?+-Fqo%vQ*O0%rXL~(-`0*kRx_wefeBsJDeD=-PV}FInTo5siIL_*z^n0Wl3`tVH zTlMhGzx+Ple*1kqSz5)l%U5vu@_C#*J&#(eiMM|KF23=t?-8~6fB3KeE6h$EMZ0r= zvS;wkZ+;hF`}$v?@{V(}K|Rb`zM=1+5<3tO07PUw^}=MeU;k61fD}US%zOhaG{XU8 ztceZpi6Uqw2)(cxY4S(Xb1P3Q1?K7;amqV2k@ZoakmYKvuFcd!6prqP?-zjTjhE`H zN4;SV^mTB_=Seajx>O?fD-84nKv@Z|k|>WHX@OqxZe~U~?1q8<1dKYcl)2ig?9h67 zu3^Y-dwWvzZ9`lYMR7vQj9zbmgHDG)f!XO9EX>VOtryWn3t5KrLretUA8;Z=EvTnxRbAe!ENAULVZ)Y)mO|W#_1CaxtOrN?)S|=q zgi~dymnKONi8xMbXA-VjM`h~RZ};%*S%(Cd{O_z64U2Y=K?b&OP-EhEEa5%@xgF_G z0h`guxbT)Q!YHLR&F~&UTan(w{bW=CVJUdCG3!xatl5e^EK*|?7Xv*tg#rCFd^n`{ zrQ}EI1?9VrgQ*2E^_)3$Dv)7AWmIU)8`Vg(iY!pmloB!WqsR()ktVNk^#1wRdA3Lg z6xE^Ys*^pvq_P|CIrpQ{i@(X~&oX0BStgS@!>9M9pqGAAvFcNz7meKT$akeb+3^xz zJRT&x#<+(I8_Y^+(1F*SP%V`(0>g0ZkVNhWBl_Ne`V@YxUJ$zF6m3K@N2ZMJ7Lr3; zMg&nZTiy|LB~Blmz{O)z*n0d7@4f#4-g*01`0d~M%|Ja#k&yC8GZhN#kf~C1r+|*b_aJ61tqVDz)!MH@K3%c^meEx*D{8*~rhwCB#nu}6 z&(}=eyN@%@-X=9#H41fB*SAROed^Llss)=rGKZz*ZOqNh;LPcHH0u_ z*2@wXFP+D?zV$I3hOJhEZuZ*stN6?Bd(KwMao{B@d}Hz z65$V?W1?9{$F>rMT5jNK6%~)iFV!>ZV9BrIRM(q=Ee0&a{wdzP(M}56OgPDKI<}$e z6y!{t%q<6Xc2w{wyjEB%J->LlaKPiyW)~4}u63g&z-)^cATTN&sNBPtIb_LsJq9ce zt2*?yZuhcVzx z1k=-$QXya3B&FHZHipMXXR#9ql4vv|4!m>eJmrJeLNb@UeyoT?!^cnX)-T^9@g47!pE_|8?cM?2e)nBG{mv#<);F-<3++i< zHK6Rl`sNO{pY7nsKm95G^k00PoMdm~kI&7ZMQN>}7`=2(@i3O+AX?oNIR>$n0;G)C z!dSH7l;SXu6lD>zVqq;CSqr@XwXdNa=kPTtqscEC`CkmgeDLUO%qpfe%peV1>Vd`1 zGtqmgpP$QwCBzPx6s>WM8wC7JAYJx;0WlI#C$=u0!`^;08x8t%=v)-fDTtbv_G%0S zD#a~wCjQ%``{IX;-x(NOmh6wuPBrQ+bUSV8jYlmMOhIgmBhwQ>os@upBr@k>rqTB? z^EF#uI=?^g{zVO~=7hB3>GwLp26~_=(iXh}E@C?m|9w9Dwe#$Nf+y->S^#zHu&{81 z>Ly>kc9HsKPWr~~K1)*#&>NQ6*x14SM=Q8}cM*$A%h+%Css4!}6AqqSENO8lVornr z03ZNKL_t(eox8#&((C!KUl?AqVrRsb;s4){&|tHlTz!xk6~-t|!00_4%A%#uXWu37 zNb1qPB~6Qf)grdc3C)|!Xh*rvqqiYG`?$TmOY8mC?G?HgqA5~;w~7En4-RXw*`GArBNbXXsOqZaQxW99|2BkVbwVjC0B)h*1>Lh_u1|U+P5>DPN9H z-PEH@4wGC)UT2@ufySRn{S_*9LV1#0f50BlU6(mM!80cG-xk6e;+?OK{KGT?1I@oe9s!o|$PZ$onN(RZv`ex^U=;e+PYI~A87zb;5 z%qj`)_;+HLyyM}9xOV;|e!aX$4G?eMzJt$x_A{tWG{SofqbJI9er`~r%z})YRc0uS zgOPFPyHs=F*r+=7?(mE}dlvb83d*3yTJMvT$uOB^Wg|H1*fWf)sR3;G#0Sq5pGMbE zPOUW}E`SWFGlYVY2o-MMx`WH-PQv3bmoJ{hkAC)Rtgmn5mDjG|$lMg3tQ}x=Z5;;( zZL}H%8nrqmCnm7;=n<}8e~|)|WAh6*b>aj*`uHY}&d+0ftbuD+FXQ3T3U>GRvA?^6 z*WP>)Kl;V{`0AhjYjpnL3wYtwEKIMD<3vkn#sG!Y0>fAkP05QBxB&qGMbV7CRfhEJ zL^Ux?Q7H*A4K+438IKBajq}V!J7<}_5C_YO;#jHy;d)#r^QvsDs{hg8Pzb)+Q45TR z5Uhmp7vN22iXsh;Czchtm@379UT{{Ne8!{cv|qhI$#6h>v!uV5)J#+YQsqF|n5}kE zCOPy9v_fyE>w1}VMs&fAd2O;Wu{$cEm?ogzMhdl6jajry6)Uaj*9$EZZKO?yw1AO) zkw82)?U|kCvEBg$?%9)1wxSOp~J$i3PZKf01e;D>uaDi>Gk< z#Bph%(CrU!`~G8W?;X(CoIG(9pa1-)gY&2Y0j@8GVPSxvtVeZgwE}nVE#e11_z9lw zJi}OX3}6287xB`yt2lmQf!6r5ogI95>mI)M!(U+a=~En?p2S~%`+NB1d+%andmA@C z{1BV#YxEVzW@mB42Z4i5%v#&%s5#jqU|U@=aI9*;<6f+!`TK~VScZ6V7D_cm7yltH z2BYc$*{>2GK~Yl$Jjem&iYZ^Q?;&fka6=#~YgF~tllrFcb$+G9 zzrr9=kau?Xu)DR5dSR&VU2D3Dsfme@D2U7#X$ukUXQ$W4{(hV67&oeK)?3lmR;d=1 zGyFCRrwtRmMR3rLiX$5;5Pf1PK2i-mh^XE!gRw|qe z^OW_>i~F#kGp7h`vLb-y&%j1Ktj$0}=MrKQn>DMzkVHISTQ#4N-u!?DE|Dj<( z8f_Fn2q+CpJEj3L;-JZHPliTKk^}^dsHuWxr~?ej$O&r5C`LXnutrag4w5xpMk@dz zGiLfnP(_#Cs}cIRJkq)v4Iq_ctLcIn(mz6@;{;8LBV+IxuTx3gQ~q-}qo5TOM^=7Z z1ZHIX%xL58LqS)#*E~!}ApzLeQ@I+RaL2SZuAwkd`Z+p7l=ot(Pze@wfRyI&P+Siwu3NyK!8v zsMk>z8tG9}&jlr>`3rMu#h1TV;EV1~pCoeXNY8$14VJqxYZCe7%C~B?BUP2*lJXeAm>%L{YSH;PXbu88HJxoK6MJylT+B**~8|>Ce>B_!S8(qU;B%1<1hZrck#J5uH(fkr*Xk6 zreP=^D2oz+(9+;!HH#*O^&;CtT+D3LsU-jeJKNO9WFU+MxP(@cno~qeD^2%?LdQ*V znyO@GW$*EThbE?>23IJ8QISHh}^nPzSb%W8J)kg;vG%HEHn$z1nmVl7(8?hR2z z5fw^EMEkxCE#nASh(5o7nUgRSoS<8_#yuvHWxc@4WvZN@LI{ z8u-KC|6TkC|K9Jx=LDL~8UeV2`AJO8OwfJ3`_2b=@%5MS{lEG-Zr*J?^atPD$n#@e${S$7V8l+akTmrz@gv&e?QJHvo@3bMn#NoVmW3r1(6oj9$D z(#*2n)})|EOaYQGR-zq3F^0kh^6S9&9_;rWDPVFPrl-BRxaZ|&+0==xIZR12GCmNE zU-9qL63W;;F47;pt?_}0&pPzWzW7l-d*u6MAvSxjl&-t}FK297+=HLd`zY<+08cl! zv9rB_&8>YLJ9-q2!l2#=tx^hUxE|}ZB2d`r_2|s-_YhR~im>k@L#0wSAhfRYii%-_1>}T-Wi4n%Pme@|X<+4%s>XTZE#am=2J9~_0_{Fy{xV*HvwIkd4i zrUmPAc*^Kt7_yv@2G+rAuK5UEvOmhvH)bdlBO{Wj$uZ}L2`Yy+@`Xb%U|3N^Hcc>u z%&TNUiAvW@86M|w2NKX}M^7O)+yR_XB+7in>v-chGc_GHLp-EJoFNNLlGB;VXavBp{6T3iQS}*OWUm&(56R90hugPDZa&_gW72$oGzO$c$e;#$5sM=9mJ_k zq%#yw#$89PDM+*|s-nK!35u7{2~CnaoH-1?vEnS))USq|D_$2iDAte~O~Lz2oJhUS zn93-MUom@Cvo#g8a(19n2q_3Ko{CtKsWd` z4rqD5CAUi>@%huUbH;l_YVouoR&y&Krh2fT!dS*+L!;HA!(%XAAE2F`})U^g@4xj9I{h|Y zdg&#!#-?J!+}N<1kgp={5l??jLK55r)MtiFq$E-8mgU+D#QN4sT5s^S6;(u2h+sw) zW!K4pHVmq9fNX>+MxcYWDl=>nlffZoh>BRJ!ZP?VAgPS1JE@`&6X>v_8Z0*q^g&PK zD18sMJ_#>)I!3LC{TqjfGT|jrI(*$mMZrRPJ_7fohaXb5$&ZB~+ErAO^pgH%L@UFB z_0B$`GGMJ91U(3wuc8dJ|Gv5n^rb4$PN>e=1ky7-a}_grOw)|@FR9o%F44*fFzKDG zVKqoW3OkLQl~E0N`P|gCI5xiD*FgF22tj0+J74p{0wccFhOb+wBIS-8Ul%el!*bvY zzQcS*TD~|vmb0jkdWmH9i`2-SX_PMED{NB=8^*k(X2fL@eehZ7I6ka;%jX5aA|5tS zt&CS?>*CM8`4j53H96KozXG<~p5kS2>c}*%UO0oXW)rU2!tVYaIh9LKo|2%))ibB? zo1gy_&3gbbs*u%-N{4=a_jY%%ytaxDZrsF;8y{nOypD@kUc}bUKKAzdlm-9Fm%f0i zcL3ul!9MHiKX>4JIvoIIA9HgPboUdJ^H{!j7pB%n-B`>`O=70ifF1V9p)P$J2(r-; zNV1AnVF1oSc}jemYbOiY(IYsf zRT*#w$^ua8VlOf));wgLeQk9u(jFN!3O28bnU-{j8Xa_rlN9fdV>G5nrn??>%FRsG17k0F0tg*r_cuwjLsuhp_% z(f5Fq54{qnzaKAc|Cu*m##es(bCmV+we9}9J6>?iSgbzX!Y_XH5$@c7gx$R^hNV;L zvt{rDM*6ZMf?L|R9A$aQI@4aBN=77q-6XeBuP;99P44$fHd22e<5n2~43q;Ve`fv_ z`#$VliMSO;7X3)Thd?o;KC<3ttkp1dv4*-<#2}mFj`Vp~OP{wGNv0T=Wx)ej7W+9y zP|yFP7AU(Mh}dkOlC6mH;Ov0PVDX-gj%XDWy-C~v$y z+T3*mG#kxCWr}NBD39@aE+SN5<)qkcz29|&z}IUH3c@UN-5HTh5)CrP3G_%Z?dgG1 zpmvy!=w#hiDkGf5!OED4wW1Gcki?22s`UnfQVUMjt}%&HVfYA+y=g*lY_ol(1N$;& zIYxs`S%#xyppCCWJJXtlWE+Tb>K5)VKgKVAbrY8^oWtio^GVE1%n&L| zsC+?P!eTv_i4IFGJHU927uJp(Y@sH=#emDp=JM!;Aj%`Fb;($`*mnl8l?Z_f4q`9; zwE{)2Mtt?K%_^y%Em<9l?Cc=YG198Dk@8oSWdhXV8Ymg;ik_u+hP^}4>kZNGA7C)( zk^T4g*`Xr#7}WWDE5rIMtVxR_eyi+TPak%%)+7cd+%h6KF=0>mAj#O2y{n|@DLb-0 zSPOFKfzGK=2NMy>C@f%Oma%diWT|pa#76ZR5bE%RUTj2} zR}!)uD9HJxYsF*F#9EQq4RP&Qo9M!RO_g4OkIYD@+4Jg!gI*u4u_o=`PS;Hy7`a8deYgaCzd*DSw zy4cuyhV|Wje0cLVY7^u5%WwTPw$=|&uUD9#n}q4r&@v@zRcM-Cl4DEg3T1SS)K{f* z+8TWdhu>CG@Nd&ujO1TQXvV&RwX&C;fKzc%j)1?J?bJ4uYt2;M4$m8Jbf@l{@6~X< zjtTC%_unWm=nr9I{R>NL@!^zZoZaDbz+_fG-UriTUCPi&_7G`|nDS0CNW+k+@HJs$ ztroU-_GB;nebDQLb_5JQc=ikXFo-}GmDVVK2S{hDw_}qNEi{Uw*xWuKC*8!ps4fcV z`QY96l-u6fB9V@w-oRLMDvH>Ya;8?wldoa}XhW1rN5WBMVX=46rrI&T?>n6y%4&d_ z=@wD!zxZ39!-=DFXf_Pl2T$96cF@84_7;Br^Y?M@@e<(6OCmmK}i=d>OUMriDToO>Y*3w*NlqxoC3s6TF2Q} zE1!bcdu8;(RS{)LsG_Y4{^qkbuaMby-lt zMnAxlqo~D5WDgUIw^JdxUIStpMr4_R6p%2gB*n<1i8Q&{gq)17$}HGRUy!9{rE|Bw zc9g2;b*QiF^0x{4d1%Q!-}gQIIvdQxj};e|P4muyXXMx;DrGTxr2{bjfK!KtQTSZA zSQY6vQCNc;7eb*IT6`lSw5eZK3czF;u%%`zJ~D1b-(fVs-XZhr#b?BPouW8o-Vv&} zzDyTSOD-@_lhl2M051j0>1=c9KA~Pyo?VtbCA70lPTXipQx3>v@3`nb86X|%jP8M? zl$MS|6PxSuEa&T)=fy!OsKTZ7Dw%V24{l^_3&f#n67=tsGm)04x`1I&AOz|jHK!V* zT7mKL3HsENwGI5}XTQLwUVjPaPM^lx@7~1Ee)dZk4+2#Ni;tE_2KdO#G#SE$qbIQV z@DWzmHZVCkO~udStrlixrm;WRrCuH$ZM}B&DiwO)UtGlpAN(5UPaVY@ufK|iOUqbY z-NE<1_XF%aUBN3ayn<6F7BDe34bv!KTJ<1*9kYi#J~r0;_;qJx?JFS2aRc;10`wsj z|3?}G*^i;vVF5-&lqG!D#9Av7R;Dp42?$Hhd2pB#^(-F1vDb_sm&PU4Cq5Vn-E)Fp z^G`);b_xCOb%*Ggq12`zW&r4%sl_7ps*KdX(qD^%OQ2@mu*>Td4Fydzdb&~Jhs)BMWHa$2fvU*Xd$?bq&`qUci-0 zC$Y467jD=mF`W=(626^OoudauYN$FJCP8{WE9H@?#=6g6O zVC%JDdty}WRaJeh;z75I?X4ZELG_|bbh|N|T^%Z8Q7xWa=wG_u>0o=mjVEiHSYF$} zpkKjO1I*8iT2(aQVVnG;0lN)8OlxH#Rr%czFf4?kwWblVx;!B{=CNB@e3A zh>?59oXsq&n6gI7*GKL~%lRGxtGNA^N!9nU z)j>F$!+m(RMosQGKCT(bBG6ZfqDP{a=}Fd&<7DJH4HzGes31m;E{W1PBg6-pQ`sSn z;7AsxN~nn3c*RqaCXZ8)=^oVHJ{0lf9-=H>qZVGaZcYBNOz|+$d4QC{eNOZ?5=c6QjRFIN5~U=YbwrbcF3BO4AQzGQ0f=<7RkTlXUdkY0-KaBt zjM4s5IbtagVRuX@Mv;P+4zQ5`A{w|XYlQ?BIFm0nIfpdVVbVS{N{m68y15kWrJ&Eq z9+TVPrrA9G&SrZk{|m3JB)QN1`h0(_VN|VS=OHt;qw7NMfdkOdUn=nqzK$SRA^7(* zGTtcAsu`4n9x5*jU545rUmMmNH1Od5Bh(9E{@6TDoH~ZB_73&^@!1bwX#MMtZ{x*l z7f|;y_Y>o&)f;&5@F8aBj$&(T2P;n&=}sDrI*v?EU^wVuXSa>dedZ0+jlr#Zckq*6 zzK<_|;kWSWwewh8Uqdk*U~sU9oy~RF@*p$`EeveEfjSk97o0l`wNYLbur-dS8(VQb zs>2D%7IGiHl(jKYAR*H8tm>5&o$N~XX&DcbK&=>yN^(QuyhrTXAqFQ^ss-YcBEzd~ zIF1yBgivG?iYZ-`05{;;m~aoGZVT>hrfX&6nGnA_g8k9vC8a@fNRVb(H7}_v%3c?Rw;23XL!#UzdzVwY`EWKdppgy1W67#s(Ux(& z0cT5C(26OJ)EC?`u$dg{OhwEG9cnl^Q;)a~WcQemvE;LtgT+cW>y||r))PApKBMex z2n59TMv$_K6OouJT%M3dJuH!mXk65%t8n;xU->k8-8Q;jEzZ{h`s`_Aj2t7+S@k{m zyn?N*g}z}nW=F+ zT-n6!rB#?_1Lf{MUjOWC_~a)pqt&WmXL}2#?4jG<#{ezdxN#f(VMSTnGbfMX)z_|L zbA1WzXSN6WD_(xV}3zz!tIraZ6 zE0Iit_H@;HsT6n;Ur!fO=baz~%Bu*#T#d5LhEyR<>~U6>Ts{JN-2+aI*l(7tIR_qc z?m(YqP|A*xs>u$uQcDNYaUq@s`vy@c&S%033c?2QeDgtA2ZO15^ECzZvx)l8 z>o@rvVGnqgOHqV1Sd{~`+dZlq^y<3aTzU{NxNWJ81@8yM0GRP|zfOJq*RyAP*xcU6 z%GxHjcK6V)Ds;MiOizyC#S7=~^7SjYbm1%-o>}1~_j`RT-g}JO4<2Ii(K4QH?O@O! zifh9`mG=2$?Bs0GBPj!_)>`s&^0)AYRtXYayPbKCD!GvPziCZMAgVq-;#J1)aL_9; zT`5O;b35$hj#I#>V+5x3$1B=`TH5UIdFpCC+UF`O)#0zxSwXhlPW#+0#Z?^jaNwsC zOGK5|X=A=Yao#8(D`R%Tl5UNPHx-ReNB5ELP=?eer`q|-(rlDz4LnRL(<10g{I4La z(IeHth8P{;v8PFs%|+i;$?KU@oCPpixFI=@X^FUzr2+NaSx6;@E>XbZ^Ncv?*^g3K z$@4rpr&W)aVa2%2pH;!s2*q*qTQz<0@GS+W%OgO8enBD?l~8G*P`_+8Mm8C50!I1S z`QbXEMDvk(tK#8pb;dBMzfpF;r1@cFT@h6E>_+OMl9f-lubNXDqRb$si#@LF>qrDJ zkP+m=FIhDf)(ygIQMO%e_tB+oc1+6TF10c63xWXN@OUbUKcI%DC-^4UN)n#A4hVA zePK_zD{*3O91HUc81}p5Y*BxePM3;mclIpRt1Lczf=d@0R2#N=V;`_3HCe3{O*~q9 zf|ZpOT)lb)jaD6}PM*du-+c$&euYPmmf(eB{o&@Nr$7J3OL+Ed2S57hZR~Ds;nS~O z!qVD0?mT{qGq-Ny6R%!|DbHhguz|AOMsNQB&117coy$`jx*c@(l47gxQRL^)Q=f*F z#gpYV1&kz{V>s}ws+egASz8;?RjUGW8|ROPD+a~9?7UObYPHBo^?^oz*e55#qxFsn zg(j^_0YOHX4<^!qEjyOJ6@f`j=8LGBSGh!4Hj>rnFgiNyMiu|ZwP384b+5!ONzfJP zzkF|!Jv2zYbkw@#K++e_v!IW!`EssE*2;y9W2!L=`%)CnVpHXCM8>($=asc-?;&L% z{Xa_=l?YXaQajnsjfyhZkd=3pq6WIyY&zPo%EV`I(4}dkySWGe03ZNKL_t)k?jY6# zX4FSTVdF208`94iXGseY5it_b3eW`Z0cK=g9aBOr+rrc{D%3Q@`1cMeS&3YYk z(^IH5TKLt6AD}ZRsa?g9sU|-8%4Li-eCbyQ2cAY)4sdX=he55v%Gy(ugD%XVi_^zW z;qlT#JbCmG$0nx2chWlGy5f@K^kkdOs6(g}=|;?+QRktot7zYovm3?8jFGd}#0W~c z+ex6zBGt|#Wy&mzA-LrCAl9-$vYl1tlhG~5tacFt7OxCA-mGJ6-wi+2h)k644a#K*xlWt3|pX4*C`uFm#flVL1fR^n2jc}BMK0Q zc=~jc+N$gxwDD|zAKi8jrEhsqw|M>Kt9a?kMO;3643iUMutft0oj&d@F5$-AdstfD zz|ONh%EE;~%*RSCqmhwTd*zTQib?Cj7!j3lfMUJm^K|IY7CNm8^p)WepIW)MxjU{| zS!w+_70?M=NI#ioEsBSi{2u{9;=fb6+ zA47Q?DPAHEtTHH$JLpu*G~*)GBy7Qpz?G#KGnu$N1(7|sAU`G_uEPsCPO~iZl$y;P zU5)hWZsW>7ZTel1y>(}FR2t`S8gGU#zpfuw0r-0M{s?};z zW~kTg;o#tadTiWz;hp4#c=V&}HwEl_!}%6K1$_O8#1QcSIc7!BBj8Nu262 zmtew0s;x~X&_^XUp! z*H>_4ewqRw6LW?YwNMC-d_4*qP^qq~=ztwkb5vzxVl!MD=Z`2{+!Qs^BtY4pLU`*U zrHUY2;xk|MdOcFQLOlm5ZGE1>BcM#7>4qy?pN+i2qF~!YE zkeBKU*eOi9ZkB6)V#%0}8SaPXz~L{LwS=UrjtEcM^xMK$DiQH8OHb6i!N*$QJy z=OikrOXcjDud4|)Z%`saOx20?cP8yPM2CR)7X`Yqjbkm64hl>>vp6f~Y_>jh22+9z zgt{S56ZCexs5x?mtt+$h%h%d4wU08kK4|kjl>FEXhh&ps8|2Kg(q#ye6)-mFlS-W5 zEys?`VQg{&+j|}ALFPpgT)U0WeD-Bbw+d>|>OoqsKIKDT@f)^~0#XPVm(E8cJ;16+=?pCtlCVjf3*|*~%QhE9 zr<_aF|C9w&J;l_SW>iK*g1OktJb-;R*^X#uEafXrv-uT4JIDLE` zlau3guiX;3dFwvj|L|k1tZ$Ntkr(dJV4dT!5SKYm45&On+^@N>Ve(}vfPzt(N;Z`2 z$K(VrUayG>LqJtk$#t}6i6}m1M|y(kG99+13|fr13fb54PpIFmsCJkiLQ8np+-_p~-j)Mq2v!N_0{A{al-C@pc~*=X>6R{Hy+#IIzul0%`X zW7>5PZmUs;WTgvA*$}Ecq`FVYRTI5r#JkKUO4ExN6-;Pj5+q2|rloB8Iu4`XQi)>| z-%&YmOB^GgP{HP*;ENZDVV^%_M{GdReSJ*5R;RRnS*b>!ys{7N;xsP2gTmWF7R%ZS zKZI~IfSC{;~@UOLdFR4lbQ02@qh zCL2*@UuY|+Ka_!SIXV<*SY=$}R%Eq620ke8ll&iFlLtM&(%ZSQ$de_B*+MRyQ>fW?iPr+|HOb_TQ4lX&`g32(e~6%AB4b?g|fUpR#uw{POkgU9&9 zOINV5x`rn!8+iAF+qih{Bo>ZLV)nuX?CrI&vbu(IXHUh3%V)QV_lV&LQ@;D^CMZZ=y{wwXbs zZ0pi?D2gJkw_xu*7*SS=!W;=o92ipe$V5RWo90@ujw;z1qZ|R-6sz&Bn4)nh`)!=#4bKbqe71A;AG(5!EYs zU&uXbA){EUTqsH-3p8*;Uu~ZuN|~3sD%RVTa_{hhGM}?qcm9jYk|)53W=u zs6YBOY~gFi>Ve&WO4*W>HKn!QZewA72Gg?>Kz#~7`0jUtTz}cdS{XyIt z6=fj?Ltwwx!TUEKU@+{XX)C;P?L3ap&rpv*3K%OEvjO=zey(dMl0$2>GpPX#BXz~0 zyrKpZYqNNrYQ(;Bsb(?Ey%o?v4x#9eRc@FC5Q!y`3^~7+0D^R$F>Thbgp!+^DI8xFAYWEqc^R;j&0IA(*2Y_nd&<@2ZT$_rQj zKgQmx$&w^H6Z<^k%GA2Dsz?Tz34p+20qmL)#w8zUYsM#%5Bz21%Nl96Mh)!3 zumlzZF$)ebqPwS6>B_9itkgQMh;W*_ALWtR17=%SRc78BH^Tk+k>B|aZmuk#-wX3A zOPrjX;PLa<_}gE6hMm2WP$nki4v1}>6|C_+ogG(UBOaA2O==oX(wXlVW!3cOEGohV z5?Vu3{}W#AyFinjyiatYky3ApIU0Z=yFX3>S?E2(XE|Wx9@zZmA-*&xvG{(4{0%At zwutSZ1R#2*xvFjNU-!ZK*7hW-ZG+4gK0pEaf{XP@kwzT6^+Krv#XUQojB2p)P<8#Bstz+}!HT2Vnrs_nbG&`8^+^?~Sexotel2xuY=C7w*7(m_om(r7 z4Sy@2F~)S&h3Ofy0%Yk&<^G*MpIKi|*$~#ZA?TWJPeezk*J|VbjYZtLwiIC}5f3ly zdzNH`XDy70sf<6MR;DOApeff%=Ywt{K@_-ujB7&@8d6q+7{ZDag!n=YdLT>)1ASvg zo@dK@-ET3P4jO2|NkxJg(lU&&iPgQ?Z|Y!E46+P6R%lnglSOu2c3|t8j4GGfT`lv2 zBy3|CrDy1w%A=(W$V%>3dicJi0`7@nsuZ{}O#c|T62i*STOqa(1T_?yq*C^sT z3I6B*>u<2Wxs9)$KE=x1+tCSFy}pW9Td#0_ei5NL=}BudHlRulrOS<1$TCNAg0e-1 z-ARSXqY}rqELj(lqu`1}4nTvDgE2{D7Nx++BjhX60+u)%T*OL2lu*7F&xwNecSH!J zAMs&{y&yufP8Ak`?YSBiXWv=p5`3_xIaQooW7*+~a3K&{Xm+0}#p)c9NOHA~kq<>7 zfdq&85EETls7OOY+2Jl_+`wh1d2(bm6AYTi#l#s9;ujy`*Bqcm3FDqK zNwz?ky%K%7>DT5d)KPEK`=okjYU~tK&IUW)XCarSu8AJ8Hw6c*7UkWI~-nN`n z`og2f6=+sE#Lm$DdOg!zL6quU$`tU)%ZiFk+u-6@hDyo<^K)~Up4!IfV5CVvU*qEZ zBI@Tr|DKqPiA<;VIS~&h#_8N7Cf*98VTE3=PqXd}<$fuhzNvT8)d?Pdc7fO1dw8|= zCKAi=IVtKfCMUbNvATwb_wHbRb~;SUKmd~jh~xUvK0f{ODW1G|9pUlb7n*P)-!Wsq z=7a|{F)9vhCIMiU30z$PX|{VJeS$o_(f-tFq)iA;FWR0#Kd`6 z${d?;gd0txL&y*`krF+)_7Uuz8W-J&DhW#AWPVNl3LAm2ba3;Jq;8DCIY2qIIvFZiG3+EOC}qjb#W8O=sZ& zIq8KsuRM;OAJ=nLjbxq0(gZ%4*qOwF*#skmY8+uIZZ$J^adn}FIDDd~RMqGjG|~jk z;NN_(`P@X`U3(pfT$6(v_IgwmvD$-S%Ifx~rZ7D{jfeN|;?epWY`)%zG{%!t3plzs z#OjS3xIWv#t(6|0@10=t)5rMym!D$#llL$jO`+4Dj6Esy(_P%XeG{KQd4rcPp5w=# ze1H$%xsRWJ`6a&m`YGPNbqy1%3+VRynCMU7^!O0HPJ&>O&q{~^P<5+7H5$j@i=i>e z>E!B{i`B1!dKN=stFTnPH3bZX){|myRFNE;01b7-dK-rydse*#F)p%9X|}mE8J_4= zdBccDd+(gO;pt2i+BcLD;n3V?PF=}tJ0!@dZaNJr_E}}l1~qbSbMpv>9s@REVEQeo zY7s{(L{`SY+Bi-r8}3zdKa;1(>rDI4hRVoE`oIaoR ze<3K8g88)Qs3bTP%r#gqq+E-3ud;Yyas3Tb&b9BkRr+y zSL!|YCD*mlCte&k2cGSQSV;;1%HS~9#H%|Zx%O#*5(U*X`i3(9AxQFEt*7~CHtQ_T z8vQF&Y!>EbaB?xm`LM!IfA){Dy`mnTLE~dQu=BcyW@0!blsiGv;5bznns*O_t%$#78%;?X$G5d zBBj}&nN&CSFtaD-ELp#R^+7@8Dq%KNi@x{7#Y$6;Fbw*ZN8XT}CKQWl-r^u2!}B=v z@5J`n?RCXx8(v&wy-rqF&;zOC>=W6Br{9M@_SI`EI66LxK|lA#h1Ud|9^ib#;SlXs zPZP9ufVwf!1tDq5!lTz~V{)>O(a;lm%1ba1D{?-OYV7VG;?2$;ws-a;kp{!%Lm%T} zfVZzM;`XgIOixdsi~)NU`wLG_&ZA9x{Cp!;!Nw$?af@Z9Akm%BAbY8j1A^$vf)l&Z zm-fTxQ7CdCOWhm&oB4jG9mwiBksr}2cK6h`%t5JoCl2{-=ik|eK>lDONm9i(s4%ba z@7%w(PVyC>)pS9!N?~JdZCb$TId2BE`O~Hsw;WeIIJ3e=S(pr+SxQ??&{DS0>!uK? zkv*i3Dw4CykTMpMW_CkVhto`mtucYA(M^^;(GfHLmMavhc(nR-d1W2)fP@#BAtPi# zMQA1S=&eV2d12L&FrR0XM|OYmYrQr@EAw@_fjL&{Y_R)j={V%{X784jDRxT4oe+Fe^kZV41XJH+HWX8VFM*lRH;A z=B&NJe_wSn*yn2^S1-k6<_t8ey!?Hnm8EFeOTd|&__42Xe0UZ|3rzJok*#n4-~{8r z0K>ru)BQfS%Qm*QkFew>vA?~G`F0yCckkog%@s_|FXGku7Pek(V{>N@w{BiTCopD) znOnUU-hJyXo@^ZA<*O~cd;b@Y%jCnu&T zd7uoIMe@iaoH9@jN2p(@x`uf+Ri$f;G$T)f`od8r6cVs|?%N^gL?nc$b0ZLpeB~3F zK&%dxpq@Y{29b#rJam4ew|yhV_Hb{C97%6xoOyD$M8P{50?vlRv4Ql3F#pxYpyz^P zWY`FkwQ&juf#e=J7^>;4jAGDUpdJ&XJq{-)h&k!`=wJ#%9A)~=XVn(|rYm69+9DWe z54k#K7!EBd2?s2C7L@fgotIMdTWy_a$7)5vx?bi^DEn~jEUPdjhHNDo9D`~=VBy1j zW&Ti2Kv`egY4XjhPKH+pJWcF!s0Tw7ff1t)<-xB4G&kw)p~Yc6M=idI3Kk zV|J>Gd$(_(-|NPzN$4Hxl|6;l5&LJzzNacmDI_#9xYyCh0ovzM=4?ToG}D{JYry)i zR)whN3@&qE<-9m{LisITZNJs9*6+;hhp8g_1QTvW3V#mZA{DO#P^=Ss;*i#D8 z<_*0{l2Hl<<)Ahe)c+U~XQAyOtkcnGoT~6v1`XuPDhLj8tPCtI%wcP03cLFUNtS9N zc^QXc;O#ietKaWxP;B6kT%mUaPY#v9Rz!JJv0@&CzHr=cn$G-L7-g`%gUy{?>>q_W zU&Evg;!H!2Ys(9`eSH-xi*s0*orpTV9uLxImo1zPhIsvY2lKPDu?<36E;D_j=z`=U zmKt>Nxp8&2w?-4mId&#s((z7B+WE_0SJ`TnoCbO&^CkJaI=j$ibWi5YWcQNYm#Or5 z$0K~8!IyC|yyy9sX7q_^lYl)#SFD!(`Bne2tE%5#ir~KWtCej4UEC216+2lu1j!gm z=i{_=38o6uG))^?TIbl)Ak8G%v8O}kS$GpHWSwoK(AiM%-P+ADRTs|$AjB?ZU0i48 z;AA3cN~aRkT(K36yV6&P@^kt1n)`5-z-7O-%0<~7v%v3Cc*}40m#%mz5SFZM<6#W9-AXtPFCc?-M6q;@YTU7PN?2pU7$+8pxWW9UhYFDbn2`X? zMi%?Z#PQ?ua80w!8M;WrF$*4?NRDx>6)V9m(;7yYPzc0Eqc|_5RjLCZ4j(}{A_R&c zJdpq(%)V)t#As+&uDO2poEep1`zk$fNjW&K2irl^%pm6pK9xKyXO)<@_up|nh9~&LfBpkp>~G=C>({sw8lpR0ymx;MdprAh z`g#wy?q6VbdVpTYbhb;Z-B`hcTQ~9K#dG}n*(QGc-S_axM{na#{_1D=#b=N4-h=77as$Z-l1 z>O?G2OFXB^EQYg&9+%|UC4J58aNC3mqxBWlpoK=1}_wVXin3??*`@AZ6&mnH-p47K4vDSw9(+3?~l75cjd zP(`0ndqo*)Y%6u#r^$9$SM!oJ%kyr|+$&f6nMIEJv6O~BtraIwc~nOTP!hRDjh5@6 zYWFeGX`>Sy&-0O{Ua5M*HPrinB{gNA7`xu5~!eE4(YfG5vcOnB_fRcr|cP#fMCHk06 zvM>yZwvB?xG8p0uN~qZ$KDL!2L846aN>S?eF^P{tgEKz8YAXzsoi8gR6X-q!p00z; z`9`8vas}G)42aj2JIz#;E6D%Sz3>tUffM^S*z-2IM;D?q8_ru8gdAi;`wC5pP@rr4 zHYawlu9N{gydc0;Z{J+Q(a~ufJRg@N=mDCM7)Ztz=V#>{#kq?HwIP+ZP(g3CW1v*m z!=x))K2`;5YJCZC^k?hq*xNsd@)8Hp`wD~6S%e!tymvQJ&bQkM(m5IqDR2mVK4JVq zjg#{c9P$&I4~lxK~QsWf6Et|~%MIQbO)0EM1fpQ9OU zU5=8PulDBWR#v}#t@)KLPfg#B7fwz+A52vQP1EKmD`;;z$-ly>*gytn)VE4v+$u;> zdba;!oNO77oe1m9aWt!&ZCIHY6Ki^@jO%wfHkA^-;>xp{Kto`i)7eszwIoZGnSm=S zSeZ+i-vb&FC(l~va%y@Ftg)1Xl6_)cjnaCi%(h;?C2>C+7sV3aHqd|U7p|h+clHH2hTC$ zM1&PO>*9G_K7T3zK0AXok&e_&t7fd;^G8v-C4!_>{KM| z==J*;oz*d`yRrQS|KX><#KGwW4z_pk>~RbCZ!hENqfN9Qy}=JYxD^RFcJ~hO(@!7c zZ-4$dW?S#!#==Ale)_EzZeLr#@(up+({J#Hzw@04 zU21iEI3Ets>({ZLq%56Od?S>^)o69vv8jDH8soDk8~EnM3-r5X9QfG}?1qIWNUv5w zJXJSifaMcyxubbKDW?!eC>!HYq)JcdM+nf!x`NPRI8zC>6;&avu+G21w@Xrp7(3-` zae(D@o{acrYWU)3dme;Ny%%Oaml)cDGwezV;u<>F!)srdhtU;?eQK$Cm7L^*izJ7C z^{aKJ;!RACp^um-<$Yv=Q%Os`c13QdoU%WrciX!#001BWNkljx>6U$FD_|US zt-vTOxuSgzjM`^|D$dM1z8K@*{Mk=Xc0)i`M19QnUJ$ya-7aGf&+POx7N)v*aCa?M zC0Na~-qD$u+J`n8dwla`1Fv_Fqu%cLF@F08A4XKhD9p%ai7P)2W@PrEo>i`%3|` z%i!GXEUWfZd*R3d^>%-e`h_LdvUbM6%EEg?02BJ93a3dEI7LmRAS&tfl4mw{R4g7->dgoLSiN zSiQD@?|Am{ie*iGaeEyNHh4=_hSi^!&ua#Jtl!y(=AJAQYCEfo#PQ94XZ_FY z9-%%|?Dec_NGk*gytXIMcw6*)a(A+m%?Gp@h}o)*GnE&Hq1FUpDCqZ0*;^#2 z6voNbd8O4f$m9Ob0VV^_P0pc zzygem1Y1~vX3Cz+c`351E2Zczx6bc3n1vMMpK5q2C|?|5j|)426!Yz36~AwRfHNsy|81YuGi_EI5D z(B=Ye_XNjhXSlXB7so0v5mTIrX&C5uwvXp(8_#F*YLLAIIVQn#1=FcFLay0%>qyvy zU*0XFP845GD~~l456#-Lkfa<{PZ;hd+u*ZxQZ$S@=d5cpznSO1(f2h!Pp#Dsh9$!} z>BFcEaRO6=2Zl-4>f&TvN5YFxec}-by-pXC{TBNDHWn8qF*iAhnTbB;CcEf&TdDd| zG#lwn<30tO2dC%w>gfg!FGj#%fKT4PgVp(IoSht|en_9t3Zpm{z~S|qeH@++;{e{- z={8mtmvDYQ#IPRV= zCJ#G_v)Sm3m%bn}AevX_Ign9%Y7^cx@hk>lt(G&AX%tpr6h+MhBATGKh#>HsJ}b6j z0-gBQvKE}kG)$s=52A(!?dL^tE0vwsh|DE>I#lejxrwG0Z1D8i593KY;>LMn4nf0#{Tf~EH>+CsRygUYU4iW`&Pf(mQ0^LB;p{-_iCuE z+nrUZ#Cc7PgWMAu+qQjR{30kKsE>nFGPSu$qg=ezMj{AGeao2boE%TD%EqXstg^`1+S+UNwlEBE{H_8zPYaRac7$%HLs?i4KdvKVm-l)@oJ~rt z7G+eZBA;ZawSwutMOJvN4dssvQm1Dti1fiRd!wmnv!yd~<+yi)K`t_)COZk2?nBQP zRN>nwi+-MqnedpK=&^e$y2jCc zg~ZI%WEXdDE#ujnBe<%@#mN~q);DqU`U);ij`4hb6Rq28XtzAxeXxeD!*hK7>@`-d zE#bra*AYUc$*DGOtS;g8;SpZFIl}$(G49`5#?z-uc>Zb!pMSlMfAL!n(GDzJfvJ!x z!DXSN3RJOIxU;r`Uq5*j4f^uZG`|1whv>ImoNY7mykmfCrI8^ek$R*N42iugRM|>$ zhDu66#Y}dQpgjdSAnM>K#U5KeM>Lb9v^*`2`sq6mX{AS z!DZ~B=wU`HT#DEmY>NaviTbCi<$Zy{E@YfPd$Nuv8yon;-}*lKfwDRz1c{Dcm>yY{ zZEvvGWL&{>-s+lWpph(ReGW}$moua~M4P|oZ`4mPB;KoeuiFHv0WmtjGk0+jbyE3KiT)t|IAKH8$)M_&UxMd-iGv8{0=w z#3s7H55E5a24@$kT0%P7M>v_s(fI{l@9yJlFo@N!2M_PYXF48?Fc?)h9gJi3!ZAq; zRZMwJMD~r30b-w2;-_W>m#V6$b$w;Co$Mdm0M;9s)isF;FK`9J6iuf%5=9cLVs^ir zbBzR7Rn(XmC3S51LLgXr;B6G&YCZUE^?V5WqNlD{36vXff2dTP=-($U5r!pU( zl5My*K3M6{?X+?8`fBXW4HWayr>PQq;m+z2nr=tBEH)fgor+UA#0M6>P-{8v% z1kw7>f^5j&sI!T4zqu(NjHprf-W$1c>Jy855^U`_CRehU=nAqg&*%hU+I6`T(g;+W zfotX|nYGFSP#dI)Yik0%*mubf#KD9FHB|R1^0F@*8(lDl*2qex#Us)J&a}i?3v}3P zW-{PXbq2@M1JF_UN=y)cQvd_405kfYY z3j6y_LYv>$)vqXET$1>?b;H1BAKnZCjhmwCjd>z0iACd5u6fHoBP6-{F}#r}cG=;VRdB|b1!>1 zIKII4&LQsKUcv3PWo+ym<7dD40zdrdCMMbeZrDk^Eli;-vhArtRpFEOZegm|!Z*)e z;Opm`7*-X2=c9)}J&eI6S1c7m(U1ip3V_L0lNKR1Sr9xgI9Zj@iQAxw&qghJk%J#` z2K5ugkAi`fsKH^mu*t7N$Ydlz;|mR7JfGn!jGOJ5X=E#Gvd}u1o}5AHS@Q`x`_|0` zlo;Up!enxSNMGov6@CO$fwFqBnUQxK?n4p-@*alXWHF<4qwV$igkMs^jgZrx9jyrI zLCmXJx{QiCzb|IFCCOv*fWSbQI6m_Q3%*w)Zg{g}yU~)oa(V{(2K9r)M}kyTD0k zDkHdBL~9g=gaRf&H^N#-I|l0|CR?d9M^k4W89gtD%lyptQkw6r`S%=P#*sqGA}zbf zkhsjICn#Q+`&AY$JLB1xyZk!|HjUpSpJ{S-UVIN^l@j0Z=j>>uOL z{^CDjvfstQ{yqldL_3#~ft6`E!jsqe|7SA0WVKf?`)oMpO zgp&P@IxuVzOfEemn7u1}~T^~H64a|oe@%;kHTRk}<9E8lP3o6E%q zb8F_Bd_BE(-Bc6C3$h*^^7}S_>PPddENB!Ge}vZsGBlnUC-R9#Y-Qdp=mncpro|LJ zZaxFqyrG2hs!! zq7DkD!D0v$<8WL(eDQUKrvbG^r2h^Iz1L~ceJ4lQJL-Yp9uwKi+N@R6oi)3{4ZFs$ z=6Ga!rRTo61bI=%+bP{WQlRAI4A+FGCj%`X7p%r8LAKa88Kw-WoH`wagvFUj++3W&-p&C=&SC%P z9NRlbcyMO{^|%}9fhW3)vF~hcWgbT-7x?V!NBFy6eu>}v{s)-uwy`ufgSqJ`tcStO zTRXV3I)z);=J9xL8oPTt`0CLnK6&>h+HIg1*O3xCod+jt?h`>G7H7Ly`S=bV+?>Sb z?g9S%uYQL4zQZT)KR|0dl;D$}uEb(n+=o+s|XBJ=xd$>}T2W)%z%N zU0_A{QYKI~p5Y_uZfldGEeKMj@1ip&BUCI&lz~8r@#jI#wa8?q49!i>PfcLFx*U^& zt)ifLM^5gI?TE;d%g-wZS2a6+{Ieh}#`$wz6EoI;TNFm~%VvFf4LIo`QZ2vZ3a{>+ z#!#v&9n>*S0h*B=(v_SSb%ir9A#+_mchWjDjtSzt}cm06PP-C4P-70`2#Gk1f>Vte_KDd=qzU}4@BO)IPFfZ zllrp@Tw7U=42G}Yyg@alD(HBO?cKeYsOt77BVr*y$0O5aKo%5bwDFIgo?~`m0=;$_ z+aBI|>jB=mcO5gcGnks5iqnhcgE<+?Vd%ScTUH%$LoNEB)jA*OBZJkng zNiSp$yLn}9_r2-}ORsOy1lj(pgvHdckcK4RE;3}Ab7I_kO&)t^Y$l`<9sUnNav^?3 zap`We==0K--s`1e%~iUde%OkAE8{e2K-B4Qku7PAl86y%V%4)Ho!FddjRG4{WB5hTtmBbo2X)hI z5a&b)^Znr0Nmb1(oVSW7(_fk$ZDt^@Di=%3kkil5=d^2Pj8n5J*Z7P)vjrnuCV(>8 zfJ>D#p9f$zJ75*ElwgfQ4nbI?q7BBCdb>)aaMRw_5|l}aov*`9!aUbTph9`GGs7u@ z+y)W^u7G*NtQFU)PQzMZVjPcL0~+}dW9}Q(6Z<-;hUz<=$?`gJnrUx*g|=(O*H%ar?S+96vx6R!H+6t8 z0v|rSg)g4G!eCfqIIi*f%>mYK%wp~45)KZ|@nY);H?A$97c%xAJiz(I34Z>o$LMzY z`2Fv{hpCA!?yarj`HO9A?H*w7=oqszJ=|KE!Pm#f`1!A2;O+Z2(J9N+ug1fNDapip z8{i1hpcFN(EzjcjfBR$nn?Lza_|w1q8+1A)-oJk*Qf7nup6Xf*lFfvB&jUv_Fp+Z% z4(5$s^pH7uArTU3kJ-VIK$j~eNw22fUn>z>DT_mTxq2k`;4_`bzpssR;AG5+HraDP zkRZj}SgpcT$P7uZ4jjxq@PBboGNdU#9OizngX^8SIINe4;ucP41+qiL&lq}{)7-zb z&|C!*E(nHhvTq*xM;)^Udt!j4K2<8&h@OD1OJTBE zMA_-#=8XkBxVM%daA62?Ot`wJgR3x)%e5jTjn|~0`H|o=Pl>7s#VojgIwgnqk1z0x zFCIsNjTUOWbN433<01AAM;KiUF&qtIFX;Kj1&)qSa2nuddl!*4)cX;pdK0lqF~6{g znduo!PfTKT_LSK7NZ!O8dDYEy5Th*70BlbQ5DtcGuY;D*HilQpfD@e5mN0X`7H&y43o^t^|sn5Bb&yd%hbFHLd84w=2wmWMoF?6SQtOM zK#8FCoi{sZ^^Pze4N#4W zc;-XZwJOpDLl5I*uZ_3v-o*Rwe}MU!Nlf<~HBnSCurFOHm2{8Phj(~*g4b`haXz?+ z^!tko%b4i*BKuTT>NUPVshe(-=E8hCVfTr&G|?buoM9EGdJ59 zq+lRt$D6-FHp!zNj!2(*=}y+*4@Um3__9B4_I27Ko4HQV2d$!PV?3zh9Hfxtm-FN8 zOZ5|+1Oe1fz{a;=XBEOk=f+hQg$8&*nJb&S{i(JkWq@Y_r*JffJk*{=mZGvTt6OjdH zUFss6fsvY;IUQ=S=9aj`It<7IFfV;Dh|mJg8b{~>Iab25=o4Hq7MLoA^wdg&M#;gyf7~s@Q?}W8x>csh9#+|*EyNLqiTjKi_E$2 z$s|b@N5eGc%S(ZAotn67uZp{_vm}VhfCMEs%+NOfZytNRC(r-W0D_N z>9vMoXNTUL-9)?tTG{Y@JGE$sfEZ37c%DxLi)=!OG2Ri@0@T8J|CS4U`_Q z-|S-N;5sIIXL#q~E&TkmC#bQ9*~t!O`(ym>58lW8{35>k;t_5v&Edm$@8iRF*6^z@ zo?tV)_wWYp-Dd-B-@d};yQuSkbijY3j+a+ifW?!sjP@CLG zdqGCI0H~|1kzMD>D=L?w#wHEPW*5 zhz@LEk*O0yUaM$Rzpqa-+(3HRtApn`0ZUpmRkvys?H>N)PyZ2T!xRk8^jbLH-NsM1 z-bBKuP|+G!qj-j9rl-)Kn#J+x7B__HB>fv!rlB6Em zIy=X8txhs0>|!9s5OID2Ux_X(BvHV23gX9PzQt9pgc@wMAwjnNCNFz- z;bq|@2;$zHdEhxZ@gvoC**(O@7fvmy8jauM{fm%uk%tA&Yf8^80t z5An}`^nFbB3XW#utU+#dU`FJ+Dr3O4y?=nMH@g^*D$LBxU~ORu)4fjYc?`i*^tZ$M zhs0qxw{d>i5a(wXkqo9yy}x|!v|6KJrGmmwE-Vz*Ulj?;{YpOPoT%a?xohl+%A|-; zZoRYWs@E6k3ygdk##_28t7G^YHN(8GBIqzah&NIh*(mE&M9PW9%=@AGDy!ZRbh@G$ zkxmjSEL5uR)#15ng>CUodsH=1ZI(zPF)uRN@|=ojWZ11U>x{#|IS6MXXUYs!ayO}| zksSgyKvjJ1B*f#u1LifV7G)*}Obvzv7g5o0A6TUs(3(F>@xmoF>r-fG{b!TCH_oQX z9E)H$kpS(9G5umj1?mcWp9|3y0nk;IE_**&M!+~u>{Z(Ah5RlPggkI=-l7Pkd0$q+ z6M-q@&2spCvp$kNnR!N4)@Etqo`mvzE5c1msbXostyym;o(~^Xt&VtTHk}c4js{`! zt$50yFsr90We=}CV-X8R0jLlXh%=O46F#Tp3?~KZY=9yJscgkY^fAw)s0oVT(hQpL ztQv8fphUFB6_!?vhdf;4=W5^_EdnbmZS*$R6*R8NB6$mOFu_jae%#gND%o+)Ji0=& z`-v<-XX7*_Q(({A`_>(-|MfODUhm@ejTPLywt$u8C4BX49gkjY;r{JaOoh>0NREG`si$WX0}+2v zL~*P}=lIWm_Y*wZ*v8{$8~AsB@waHVJ9u#WdP)))#V&WslV zEv+--%6iZjN}?m#Ne&=X>*pp0T6k&L3aP~W;=>Bvbc>M^aK_oEVapls90|5)6m(rgi zIe5*3T8!mPhl3FJ@^8l|AXw3fL}E}v=0mDHxQBzl~C`zSc$qt3RcQ2VBd%#=h) z{i}2zH3qaBkm57w6P!Gl}q^(SLc z7CXv_F>UB;eEP+s=qLwG6~5@jNU^n_0Z;001BWNklyG=3~2OfVe1x^qHQ(JUH_IZ zDR^i&D1{bvtqqETeNOdFtQ#$oLP@n0fHe?M;xG98TIR03z&dkTRsE^SV9ySh@t+}t zDdyuc@ivy&$)<_V#{1hU3Xb@7VKo|r)$Zm&(udcm$wejwEieu`@F0Ujvm;{3kcbg9 zi>F52?rLGqX@DT|^@S(|DX6=o1DG+b-Hw^9=I@{~CLXMo*d@v&@`4!7r3vKDWF4EC zdL!4DVy?yz<;xYgE57W(knA(ek;vg<60A9U*j)a3MmmaY(bS37vb5c0?a#6g)_l%O z>yZhkCsK~&2-GI)#`A^Lp=eN{5<6ouatiU0lBY|&w*%2P@3OBLoEd@3ADLnt{l~&ZQkJJ`*lPt!O0g1 zLSPiQ6%#a5(Utmr=Iz7S3*(e4={Z1Q`{YhM3TEv^Z-FUy7n>*M)Uc=hr6mBff zV0W*F&F$luJziUGVScK{_rCi!zIw772ST4MP2<+}h1eUmwS9z>(;=2tXYuZX8+i15 z1M6Ey*xEh9)Y=@}7^+8|*GdKTzB*dtzyvopQQ*J&!yn;)`IDdE)z&ut-CzC<{?)(y zecZjinEH-5zEYpgB%%sALp8ishp1AL;+w+6_UbUEYHe*;OEoc9(mxn?Z#7xW{xhY! zSC}0KC1Ot*Rw(DqNRBik)ur+;2;Y^O5`&8&U%*Vooz5(a24Kbb)J(_1sT?=R&t=t z?OpuzSHFyd(Wkpzynp`|Ru^aC;$bLcK(2=u_$#S0^+ZhMO3^{5 z=OcXa=ovz&6#}Q(ZX36j=P?;g__?t7g-f(r9Xx-wf&JYbxQTgOoDa}zxA5@Jbxf3@ zU7{7Aqi{6_wT}rJNzREAR*PR!QuWK!w>ZQhC)4WRrk%=l?Nt>cbHYt!!CWi&DHc6Z z8yn0JQu2FJrP(BP)w`y9EcH3Owk>4IWr=q9|Hi{ur}Q^{Nnf3l;DJ}qQ6LF9F9EKq zNyG%rCY@P?N?2cI#_NNzzrzXEAP0e{=&( zX?S8zj8$Y;$3)-R#W@a+Pq4RlfP<4$OmzELUR=WTR6jC&rul?pO56mfqk&3BrsWDJ zr>8g@T*QIUEte;AK+nr92VA+7)T614Ug=jhe8@{;W&A|g-dlD3wfx4fHQ(zs8{`$v zkUAUrx^xRy7=1=&8Jt=6NzB4p^FV6@W7lAlmWS`v^BFSFF8)Ufh~xcN<779Sp5>%> z3k|%joI-;(>r2apc`=;v%guAPDq?Mm|M7uyniVuprlmF(3C|-Y8`*M>D9!RY3bq2H zTr$4e6X9z$=bEu~V)&#Ob*Z%H1OuOJs2U3uI@TX zaQ)gMo^8Ito81H4xju)xHPs!k^ms}R(`b!!p- z#UK3`|Hq&I9bUfP!T}vZXT2ntC(&!C*`1I%VqAcXy(p|Ri?k;}AI3GR$CN~^W5r5(-GcKPnGF*vU~6X& zfB%cmV$W5_RrvVb`?z;~5$&R;*^uhYCFiyhnRHg=)Zz(>W3CCO1oI1P8rTfC4^J@| z*C>63+bavWu{V zIKLQU6dX_W6(0OeVFj;rus?54Mk5^~DyndGa)@AQwOTvSDa~DM&K1UVN zWM$P%9>X0cpqvGDLrz(f)$v2xJ8lZQ;4%6sH?mh%t>!{pi`h+nx|mjjb2~m zwy)FaB$R+bH06m+CzS`*OG}GOxVRW%dv}{2(o2OM6y!yuMXMy3VoJ26xqD-rpI^jT zlW%qpV-+mGA#bj(U}kDEl64hKIOO&7*$?t0_u(9cs@eI)FeVg2m2O0{ML9^YdYyyS zERZn!#rrPf3L56r`gfcpXnxtmy~`E1ebLozHw{rW>7%g7p!a;V@i&&2(Cd`c=8$B&V1xluk_nXDN=(>Q=j@m4Bn4tjy{vkp5GCQsfH7Vf z#<7kM1=BkQ4WKlm!F>YkbXNk~@btT)Y{`3jop#KOL?B3Ase&?9D2-KAxuX&2v2&eD z<#rB6R<)IV_Sqq5NP=aj`KP|9*RHnCx>M{f2dY*XnhNyQmxKm?tPs3eXBI@c!;JWV z-(!s9w|$6-YYRSF&b}Zm+WBCB*$Jh^W(TTFQH%)`Df>fL;JG#h2UMa>ykv+#iq8Q8 zks?h`?^n2u1Rg%gtS5(rv)}0_N;DCjE>}zQwWE$L&ako5kjmUOF3!&|H9MC|<|W-% zc26uZYJkKWa<$x-zz1b7$%!^PO@bRCQ(*&MX!Jwm9SkPpJ{LBLjksNYXM;z(osyxW z09(rT5MQ_vXyzFNg*NDGvTAWA)RMt4vx{`@m^eD|=T)Sa{`KPxtnZ%&mkQr|?ZSHaBtl;3np$`;qwLFaG{>Jm1*D2M=#xd3G|f zPll={XaDJ}C!M2|!~tW_Z2=!VxQ_k95AbLI@n?9sxsU(-PyPe`+yCaj#KLqh?JOlV z9Bg)!p+|X;nw({3=p@J=!+*t;J5x2`-Xb>WTFs0kHpIYLKp`Eju+`K$^;H#?jD|9k zf@tu{5?LCyO{z%2nQ^Sq2`VurXWi=9G=t5>zd`S39a1F>dra^!^gRV>snSuVu|hN6298Yl8$yQ6B{TIT{IsFgTHe;Sgn2!~ydRqa2M#apl?+L{$U} z41U0HG!&T$_PUBQ`RWv~7HPg#?TBosWR}*7l3yw5w7#*0pZveSz;R$gY&rb)_dmeh zYYQk{f)BNdmgtn|tc0L1^oFq==U^;IAwv$5#f_Y$ z#P+nL-)j_{Y~aL$=up+`HW3ITcj8cH1UjOh^kx6vxcSq(Xn@ zsE4n~i3uSWVHxLOlKZ|vHmat348ivD(h^S3&*D5rPYykk`!Lr*I0G@c;2p-}8pGib zCnsmv+}^{^;c={9t*xzLve(5#uZ%LTmGDA`$Rk0##EyC=m9 zI~~I8YpJ~Z#xoUi){KlalFD3ZuZ>R=e&6X7_#giJe~ot^+(xTxM?LHUS&C!v*0B%a zUXG8>vHtos78d4k@6N55xIwITroPOoGQE5>xSr#YIGeKNB19UkP<}3S9uqsJiEM+M zVi~H*IDT(}_sgkwD`aDd?kO;TdC2 zDjuN+r;xx)V{N2nW=E+c{xn>``#iUqyN7bSH(EAiX(Qb+*`-p|awn|?X5x3aHh2ePVms`Aln zK5~v@*1qu4xUboIvzJ1aqwJ7gIub<#w{m~E6JH5c-{49ncyI-ek z91aWo_18$w~OtW$bOf zPQl&OG&bMt z_$}1q3;g+Ce~K5|NBAHA?VsYm`>+2PD|1unEk#LtSws>DhJse4I%8skhK2@08IS>S z8o8z_GxtClIB6Yef0_Iv>C{lMC~2+}>w(Jj5^<0a&Q-hJmhUC(s#W*YM2<5Yk7G8w z3b;|KE=Om$EMvwwRC74NQPCWjP-XT==hsmKe+-IzO^#Ojyby%N0uDV#xTheisUL}} zsE7`b$Q3zbiBVGrIJ3hM;O;PMBO7z#>Rs_^c4TMM4>*{*i)N?MiO8P1*gTT_z%sAUoY|T#Mmg6xT86A%6Y{ znRe-OM{%%h74`qr)CA7X&f{w+c^mhn2-UR+AEaI*s@%CaDBQ;xT$581@gBZ<^a7uL z^$5cnnC_JL&p!D8cUBkBE@&@e4^18a9qc&w`6Z&2GR^v_$0>Ms8X!0^=jq;Kg|{xE z-hc6W8|!cOF$$|T^0>Qp4c8W?(i#T4<_V%%7TDWA!137t6SIqW@oXKVy29#A8}FQRMT|)FzST!TrNdDvTgaStGZ*>i)4lHFi5o zc-ep{H@J!%f*1lvNy#8G%$N#t`UO@-eqFSe1eNoq7hm&!%7`dth;@WXINDs9_|REa zPm^n``#hmDSQT>RAbj6xcO+nx;ENM9CjT0qHB_G<^JcSfIN3>4WebjS?B8}Fcv*-5>_4=X_o!<`a9db zg-kvrVD}mv7T;18%TN`PV{n-q*w2)+z}IBi6IgXcK~1gb9eI_3kxSxNpUFOpo-FMp z<0M~r`|L~~?>tzGJ)mWqgD{q>LaOp%Yxnm~F}gU${QMN|-&#pb$K)&JD5Z3^IOwYh z@e=tFP^GEj-oTxh=2Rg`yu0co+W^~>6J)Iv<0KtvP8pu;sie!{!|Y!K!4U>0ufznd<_virn6S)ouVOUll8w=zB=s6Hn;9zr znkPn8;lM^09kMXj%<+6@r)A}^>=kAFeJl17xU!O!DBGPRQ8k2~x*5W=aZ^2H4zDO1 z3%OFLOUi{v_^Me(Q$_X0VNg7G+LVwbj#Rmvc!5IIR7YA$T4(muYqib<@^LsNk+AR{ z*b7PkCJKW0QQ@h)7xpXl>(ui8g2Q5`uPwOGFtVDpap&3szIn2Rp{wxAFQ4J#kKV=7 zWC!&q&E6_#w7`dVSMl=s2A*u~!?n72{OlFpzrTvw(!>N>zHX3YFMOb zq&*j$nBd-(us6NJ7coq6@NzS zATV1R#Lh52$4L{(2q)O1=r++$TEXRmD}8s7LGXf}Cplz^eUTC$=S)Odh%E|sFtD%6 zOfF`}b%|{g4gv)Q?ORoAGBNf|x61fgwf8i46L_=3w^z`-KQ9c4)rf*aX-H3rmJk$% zzLqc$Z&+72KO3T5dfc3!!jC?D2dfJ+u^-cOPhCwA*20i|#2z(H)Rx9SfF#1$NwPsr zoa;2K@%;53PKOER*eyo*`2G8_cXI3?{Wl>XZwWv9OG%7h~+~A4EBh`_fTV0oQk#ao0Mo@vL~#NKR@pnph_3aE{+A)cfolK1~8Q zGamKTy~)}4Mjx^>9R8n}=%Z}4Q(zP;t;T*Czboi~$;k=&I2y5F>?(5-*wk^&{z4G~ zxM|Ey&0z2NNTKb#{#J@ng#xrcUko(kn!nZJL!W5>= zSrd{SGY>iJ_jrJI%f;U87G0JJcjP#DPy%5bVT@rGr>{oI_lbl>jRXYwN&NgwP8Do% zB<83EyO}RAq@>P5UDEJbey#B+JpO0@gM61|FmT7I;B6r%TTS%ZbPaU(cnz3C>+GD1*TWr)L-Fb=#7?2Ayr| zXmEpj!I*oKsU^QMv6qd~Fvj!IIA*fD5xP_nEU3ze1(K{*SY4RKwS{0{-(dfAh@XG{ z2!HgW_ftPkoGs#G!}a`h7Z2`T!?T^^#B_Cjvm`)xQkiV&(eugPgoU{R)- zd<6~mE(-2*Pn5h7aZnVp|I&a}FdVMPbP#9M6C|k2p(|d`G9xBZ<%^vTcC0nC8)dE} zV_k^3G?h@GZk3X4m7vJ5da|AH6u?V`QH&+$I>?EsYeNTK2)cpw6Em`=fXs}=mgE4l zTH1tU+BHwXQZ1~U5ZMOJ4q~_z-wWTXoG@SN6^RPpN2n6@hB{jJc1h7T&=G=zDaF-lQQ(kUTuw~O6>Q=_bT5p~HBNM)2}PE*BKD}UT4p`#CE1tk zm4!>1`xDNP0W~_v@A;3cmr9AMz5;Plh{8~l|XxaN+LT6)$z0QGkR%F zZ7x20=5D7QtG-PLog}Rdk_L>PF#0Ln`~2)Ic8^aI3!(R%HIDZc`n5j)>JgS^`dFBm z##?vpVxr$C_~SU)r&NrNtpEl4r8NG7*Mvn_c?;svjTP#s@2fG5)kr!xu=kFFEO7#y zS~J+ct4&pt{Q&kyuJRi*vH=^6G`@G{Jsd_k`MF88nIsaVl_mEloBocqaVltf_7x$d zUT7Wdv>lCcl^>;RV81fkWPCT{M9G~xs?u>4na_-KOl3gTVzL88k$ep2HR0v+NJ{QO z^sJqkNyUg3XKG-abni6tZJ~Bd&kB>JF6qN-I^5i=laxg%aRv8u=_m2xm8q|c6qkc8 zkeCO;-n+=kRY!-z1_laoqv2=Hp%)KHK^YneoAan#{9x0Iz`wM#t!&uMXW778GO!I1 zw!!$f7Q(E+{D$Br(~35DG(jG1-lag#HQ$r{A`d-P4m3zDE-AMEAJ5Y0f0InIC?YFc z>U3wf#+jaAK+VP_hQdN{_?|-laTtzxdLEtrUTCQCRaEA&V&*P}6;!(nSi1nE@STqU+ivIATTYNWuu`v(h|YPmD$;3A#VlcqtoJ zzMl@Z8e7T6i6IwxapJTYU77`RGWe5W!S=&=8F&wTf!ABR`0~*+Y@ZBJ`wRT}-+dZc zs}gL=3DE#&fRmG+jBBUek_trlJLndf`4{xVsEW|3lfeLchsXHn-u0L{jMVR*WscGm zMRHiDCwjQCGLOgWyEq#}Q_;OWLT z?yjw3qO7noKY^v0E?(}P;@PVmtjtYdd9D+6QmgD>VSW~Kle@7o_xN;(=da#ib!8C? zvt6t#&EcyTukrQc7r1xxW7O3-!6?l{){6$FCkxElZBhwo!N9OB>q%@^1^ z9bjQ_j`!~01cpbFjA24Q4|dc@`7?0|XU};Ds3Mr61%{=v3>w2`NH8Se^^WGd6jE99 zX4V%dxZz;QTVof8`0^lgXzzv@9?AwR>w$ITj}fz8t~CfEW*i+9ME@?CV}((so)bj4 zqZfUnpHIbWasmuA9-OdG>sw3m%0)Q*m|&s&40eVipXQn>(F}cr>8s=Qccx+~RWf?u zl1MhVlElB)ere-`&>9!UA>nF>xBFRY&$jkmCa7^J4aLe_ndU7<@``pJ7h~XH_W*~- zCm5Zd<~zx| zvb}QB=PcfgwJ7z$R{#JY07*naR1F4>m+5#kbh-pLD(Bf9v6nAN2t9mQ`@goxK-1rc8Z(T>b)gjon4n6mr9I*Y>w7!MoA<~IySpsyYiI4D_ zF+uHu?x?9XfGhun^p$boulkUE0*Pm?*x81VgsQ&vmeawUj|@}h?3q!yx89~Qpex~5NV-KG=y>3(dG>g=bj*k& zTN2rEBau%lB^sI7%}fB&g;3v$pScyOS4*YVt+bkgcT2a+c(%MTa8vjfFgvFD}j(A#Pla1y|p z!a?U6GN-oSHwGuR8C;u@6~3SlgGSJj39F}jX?_sD&jy;l$&9Z~Hz_^IiW)KtfpO{^ z#1Xr6PyghX%g!_OOh}NTnOghI>AS)ZxIhvE>_9n%ND9G7YHAG`v9rM-W}GM6t<>)% zfg~~3@Zi%>?hoZ-`d$gB7bg22_^WTfKSwP+-zOY@zAvpWn~!d^Ez zS!uAn&imkfVeEB)h^kT2XEh6K&xHg{RcPj=HMG_@1Nr7#xABN0#jl;E&v7XvD;JZW&yE(-~yd}$n#nrW?VqrD{`Nk^kFho+#u6VYd!tnq~3p!bGq zanVXfpP^vfRBp5SaTqiOhapr*y;D?+ah1L=JU7iZ;`3ZfHKx#^%#=_f-VcFhF*6*` zK(5)^@LH9rjQ~Ws9|okK4o7(Watm(`PEb`Nymf08zxVxjF*DJMKE#;U5wy>gp!Htu zDw91#is(kAJ?gevb*38qBu}TqF&;gCg;DS!#v?quwTk7%8C2B;1_2^Drr^2L!Lw(t zV%6IfExg%3!o~3^9^Sczn@iKN_ofbw_|yX!`q@s-hd4Pq$9F%vgR`THG!qBf1FwBh zbbcvgRonh3<78%N6k8cF{)soD=fozMfFdJZVl+aseO%#|AS&~rtly*wKe4w0Gc-wN z_J>R`sFgfNa5^&&(&ZloEg7i?N4M12oW*Ml2%o(x`h87J!M?VE6~u6W2e`(C&@7)- zbeB#B2RUp+DJvP>eb1G?I?r11rHsSyZ9$67)_P$_(OxcvftrUF*-__6m84lSXR>k9 zujY_PVeCL?m8S6_8W=nCy-zGy$thG4h;RF{K{ssBEP~`Y1{47l$PyV{9&TFF+s3in z?;=$^(~n1D0B0u3Q?qJO*0B#LV62Z$PT?zu$zBJA8%rgJ!LlVea2CVQ4_GuLR5CDL z>F*Q7B{`%8SB?og7kh5Pd1xiVgb2MXifr-3p_B}o$?KJsuJWxf)FYsic?`yy)jhTnhZ&BVIj<*Y7jdz-Zws%m0WHl=zdSNgc#-7Qbr_aa0^YxdwyLJmN z-t1!U_yT1;#zzlsqaK{2=yVhDNT`O4$M8i5FE(FbYO;rWH&^l6Z^o*$bGF)~G6N1s zL{FzgP{H%vR56RL_lBfF94co$Bu>C_Z?L}J2`Yna7QRV+R-mKTV2J&!nuah}+5%FmmtuS-Jy;gm z!Fr9K{qhs)+Ht^a7cPw}5${qw!h(Cx9cLG6X@iJ^-3t}8IBY(W-Z%;HGT1d3k{*g% zt}xir2A3J!8B8JfxDwWcbWcV@L#22FyfNqF~^K0nwSw^QMW}n+cVL)4|Yu zh#>6<>GcU3Q$+ecQXu47z1`q;1%QoKeE|QF0CDG@$ynFMb9OoiOU{zU#&LFy)FR zU88h`9Nb7T4a(Nmsh2Qi;~^#g($(k(+RxdkI5_d(tj0{QgHEW370Dq%k#M~U>Qsr+ z)cy$0ycPw@|*e}kokKH8y5>yuuss$q2At7v?XX3SMS&2|bIFo_a$#H}9!2J+(Hv=&(3L;vnQYNTfO}X9QYIEMeYM@x7@E%WW$3Jbfv^FHzSs zg|OPGn(jT#YSExg+*vw|vFhk7dt+kttV!^#{*NO>YNNku)pzMU6dI_}?7?)Dr2Zqi zBbCq<`tFU|3_l;o*_vfMFP_%cbGd=b*!)mO*4Hrp;mfBladUY`yz7+esGn~w~T zAV%ESWm6>xPa=J(Np~i4p!j{2AgopFr=`~t>?bf{h6GJGGojM9xqXU3B$gRsWnnHd z(C+RZ;PB`GqpCu;)5GNKEI#|{2^JO?a5}ue*3lUT_5a7(d-YhBWb0vH#6B*4R+jfw zU8bwe^h}SxoJ(F>0ap|V0)hZO>4)i&fF1;pdXV%$k$^~v5_#_(j%_pDU0vR$sq~r0 z?j1s`SZl?Ko!NIrfKH=2-8p;54zujHzUA?EKE8*u^Tbt7!JtT+Pd;(aQ?~o<`VM~f zgZFWEX$}VqeX7axObAA^#{KMs2~Ep?n9w0R$ZQ@eVFWY_TR2?2yMoo3&KREo+RIKI zXP9i2?!T;0)uwXU5l}VLh;5Q}F@k{&E4(gA3`^7;bj&%Ut(UO+;e?G4%C82|k^D$U zOsNDBj}B1m*W`hV7tiC&%2I0g;H52+l`DCmo^pXi+dYIm!;iOYdb_Wm!MHlOS~iW3@C zdbhV~=>VxK7VP}xPiTW)5s${PZjZ5mJy_!(+2PGjaSMlOmg{fx!_){V7Sx<{heApV zbCb>bc>}-jT#(*GhsCf#S$cMgF!_L90M0H)M{I=s(FB9qVJ=3poS11QYp59jDY6d5 z9zna9mf=6OMx~N*LBc}}phy%mnWmXcihBTS-t1`~^#<4kg-*d6pddR2v9bgH-x528$5#n+9V zb4SP2p|%)JHguF(jK@>YFdawA@(I-e#3qSEC(RQh*^>O^Nm*Yyw}xw%*6`Jn*BCbe zpMCulx2|8s%3_ylKZe5w-Hyln`~V-^y@vIzcbGK}?{*LI@WndSx2z5-tju@u-qmyX z{P7lEufM~atu@@ae2xM>QK?)$e+G;59USj=@Md!#-#mVS5ANN<^=oT*^kNHdwnq40 z{@t(9og1Ln>!aW8QQM9RCKyNA;I!{!bJ<9fOH_lQCIgfV~kjQDG^haqftgBHr7h~NJbSv19`I7MeeF|%0xOMYY67lBz;^n)Wg~m z@hN7rMoE?e*RF{ktl431n2nI0t;x+oy+KhZ6cd5tR6f_ARZNvVnGE|ve)R^&!wJ^rdwBoW1k zUWGv}rknHZNHrK8k1!n!=>8pQK3*po>7CX)J6i+9K?85t?gC8DG<)V1!e1IfTDHK! z8fvi-YtEJzv9`LB`t+%BTRx81NtCq`=S0gPg|IH@*rPLdG@4>>{}2a&8M*F1aSh4XtOZT$h^S2jFV&TFS|~e zXAHwzQsgx^=JaM9uDwjHwX%Z4W#`U%$gQ#FOvoSIwplQp{KJXg2SX~-m?`VvJ@q~ywBFkJS0bGU6Fl#-<56 z#D^J=CIqEJtlQw`o)hL?@pT{yMyfCG&8Do23dJ44`^IUq_LHq z#>up>L9IJJpA60W`S%~-;p69+x;~!2-NkPoKF2@$>HC-sN7&mRk+F8++!7wVcNKs5 z@*BK-H^a<1yxiKygQF4Vd~BlG$E_=Cc)q@agW&|ni&E#kB=&Y!8Vc z@!O}baOuJ-u3uS0zhB|#XoiEs36^~q^LBP389uEng5rcpYYKLrf@VVbo=sj?sf`FsVJwD_h(0-I zN@^j{G3n#dn6sgEjp7LAF$RW^`N~{F12j33o8)NLGY+mG$bhL6$@9c{vBuQpTKZ>I zc_wINM7TAYECOBRcu_J4LNtk-4dDn8&u z9Z1i_&UBk@s%?q18#*g2&zq3obd@o{E22F2ROC*Xg4mLVXuwnLTnKl}JL5%>(c714$hGqXd^T$*)<%l1P0ea?nBKEK}iVs8XvkLZ4r z#Vt@f`TSXxTtdp_o#ji&2eL%8HWXjmW!u8(`?*hGa=9qrNWHb1fL@g#_-NQrpEDTgt_4elbYKwSlPtaGvD$pOFK`=MT**Vr$(_J7x|xNv$6n* zGO)|*?<6~{fl|-s*Fd&q4t$#+Ei<9Uc{?~d#>>}R*w{Rbp*CE+u!4ovMI!!=WyTBh zOL()nttb=e(`#>0>SF$XYr4PFggfO`hNb`5o6Bd*zb;cp&II($K#TDSERdKnYt#G8 zW9T~bjHO3`k*MYDWp#Fm$q z3c1@j?VFA~RK{@TEet1^=2m8a2Uu~xt`6ZJB_dfadmBgE*dk8IZJZhd@|n||8_i0< zH2#!msh*((W1t9aW!Kxl$?^)Y_gn4{^XJ^VM%k*&UNDL-E9UY#!E7QiFx&2+{LQ|y zpLDt?D?nwE=`uA=>YNFAL))X$$Y<$%>)+JMDi6C^j1v=P$JjoiuDFGDWOB4TJJ)#= z2gcP)6IpVC1dCy!4#l2{5v}03?jT@=pd=LzW3*}3U}?S!vTcR(R-&0g7~%w;SR0|& zs%A9J!G(o0Wp`Krn?|DqVG*u%vHRK%Y2j#xV)8;bd5+58+2UgZM7P)1O;xUr7?LQS z?c{R9mHQ+c5{V%%Ed&dgCgpJ|E_%+C-BP#URbfu+X)^v8LM-Q08t~epSjx&ciN?Cr zTszc6C0#eBkU!++ys2Snm!9k9<+J$s{w@6S56=nS^~E<&@uLr}<*j+$=AenPJ{c5q?oJjUZO&Mx(E{lWsicsjzH?MP++7WZymMpIAG z@ilH;JCDyEu46O_c>VSrwl=o#;oZyh`*)u|r-riibb>Pr1Io^V8Yp+P2sk==-gi>g z);oe=4M$^)Co?h#qVXCt{gHTJX|9X&D|2}9s*9(ayLhpFfZ4dAjKGYbv=ze#qcd93 zIq)37AR~j3458QyTo^u+X2gcwHe{C2#A;WO;aqcuiq^IkXN#Tby4*;T#foH2l3A1f zfax=yiE>=(cji)4?f8aHRjK1racxvwdxHMj_>W=Z>vT+pDGOjC;EjY?O+_X${4uu{EMj<*cAv zr1zns3Dl{Cu3@}?G9u!hoF#_RkPdTnguwOJy?&qm#eh~k5AkAiy)Ld@y@2JVMRJfL zr8bQr_(Vm|OmFd?U7sSwsV8Gl0+L=Q^y2$Zdj1yYR~B&n;u;S34>6kt3?ofF6Ozc8pr8piiBAq}TEE8bsciP= z;HE|ivU8s0wlyrX)1)M=ydt2G1%a$)7!oy;a<#MP95d+bSzo#)mk~JTS85d_#8*S$XhMwVtz6x0CN8@4+`^Q7< z9Zs>lz%VfC|5dR8C?1BexOonM%9;|LTAL&-mS!Pq4LjjF0bM$KgR7dkUjD$GyJ{d`Npxg`f?cr7c7yC-22BemB84L%trkj#L^Pdu9d{=%Of3p&i%8$Lt7Z8zAHw8Y54oepM88j?$Z> zBLoeGj$Tk2tpG_Fn;&1gsz_S?rJeEIkd#?uDxe|U|E#v+t`=7oR; zEC2u?07*naRJz#NJD|E%C(OMHxlnJ3WmOun)Z%*Nei51(%R)LkXv#JhP}mY`MrAS@ zHRPP=Os_o}9kX`^)6Z4ym4d{9?HaX?Mdqg3$Vdb> zl!Yo4m{nY-81G_>$dx3f7uT?s8mtfsZ7H=-nmumYl-3Y8j)5~fOB|+H`>D2svpbIo zvy@Cq<|wo8>Tg{_dC>WFY8a!TKBErrws*1hZkzt??(I_$`0xGV$GG?2HS`CbSRgw- zGIuVK)4Ma-N3YYNe~ufnQ)Bgr@@n#2+cF8reXWCb+Jv9*p7bG3+HT>Ge=Pq!XIEQ` zTWkk0T_hnwdZErG2oAQ7t;x)q9YtS#+o{S{sCB%pT~j)Z`5ZvXs6w4l3HrBSY#*)< z=CfLHu-?v_1e+}gGh2M+GsK@eV)Q$sR1_|x4wi)Ia6Vdbb0bZ%XN!%Fh5{}3;{C1)x0Jw z+#0I+%LdK~hbrXg)oF*bZTn0Anpm(O>u(SmZQAM-J8c$$Bkv6t?StVvl{o5lEuHNJ z#6|dQ;8is-&|q=ULAP4O_Q4Uhj>ZH>>Cr(-FdSmkY%-KmjL-O8?P`UakYZ(&m>6y` z05O|6h8w2&iVAGj%+RZPEre!o&CFol$i?@3nb!1l(f^Y zxmmOkS}BE`qy6SODqLi4yciw~KV;*Kwr*px;7sxmSuYc7SEJ*V076i59BAaT!!+x$ z;ql>Qh=(taP|s>I924(BhHeNHFGg`^O=3Wt8_eO#xpR2>dYu&H@4kA0AAJ8EE-f!$ z(CeX|O}W`=z>hz^h4p{`8%#rm-NP~d@aQ#u_VG1zy~p*7=kVa5#@<)Yv2!rR%Z+VZ zUAu~|?_#dEg#Z3u{4@Ly|MFiE$w;gRoL^YN!u%ZdPx|-2{1T(_7_VNx!B0QAi{<%+ zWDv6v?sN~=%nAqISK@>v=A{JTOtN=%Wgh?HzxjJ4_hQ}KyS)Sa^MCqJu)nj7$#9sQ z1)tCh8s#(M%Cpm5bvlWOuSwMMR<_uUM9@Ql7e;4l%5@7GXi4ww^?U4~*KF`}Q%OBz zP6JP|C!F*;ioLcvomA5jSw?A`O{#y23~7mcDYKeIM{qFcao@^p$a^m0?~>z`WNym* z$e9T$n^H}QXDB<5PM8jxnrY-=V1_{{i$!;7<4z5Dx!h04>Mx@=$T6%;Pa2iOX&xz) zUML`*y9gPL@YLDNocF|<=qwycWFyao{+*nxv^D^~KtaEe3?|OG9M5!gI>dq)9h86j zAO8zJ`}Pf%mR9iT{TulCrypQ>u}{~aIUvYq$OdbgXoOCW2}J~QBnEfG20c4r#^7m0 zr)j`YWLk3EUcTADPjt*a7ePfRTaH1Dw zozi}W%6tuQh#ob%UiX8_aM5{X`Zl1XV%K*uV#pu{GYqO#$19Nd^lCUm%jTf4yje%Z zCFd(1SwOmN_Yab~vL34^2M9hXwyteQJp(-LxQEPR+iNdfOm~eEq zL%dfwaGLW(jFDw#_G4rZsPoi*nu3rnKgNvO6d2SSe~t1gk1A*{yLg@~fmlLVAv*zz zhJ)%%9T%}9YV*xJ60ZuvsS&S*+iJ@<1P7-HY${C^m+KnTAQMPgj(8QcAw~L9`k2T8 zaEccexKgHhr`|Wd;%IKB5TC{(;>v3cO0h*uR70*OYn<)ZENaRum#GPG`9oSu<;r{6 zjD#~gSB+7#C-i-Gp^U)F#lWrXh^dLolW$V@Mi>RN0SjT}^7CmV*qdFb^?#*NpWk5& z|Kj=0d$?dWu1P1ZS(CG2T3@0~UB%JkeqjVbs1hAKLqT%S6fjE_R6wVL%&rB)+~Q{k zU5E3l3)nmy;@#dcRu<>5*iH1K#5zT9WdR$4($C91?7>PwfvQjl~>+SPo8^MW_#^Y=l`qH?326en4K@&qgL*F}cV2CM=|3-BS z@%&F`1d)pDY8`TtW7AEC>3D)`m(E~gdk3Rwjl*$+zxwSL_-B9dW2y;>w8V1WuAEyW z5{|E4z9Z!wSrxZ$oWsI}6*5fjUSGvGFJ5B*C`QVMI2ui`y3_-j5w5Py;m04{#&5rT zhG#D~uyOAu?#wUX&wh9hfBpMEq$vHvC)oVyCs@3ECS^D189WtjCjs3}fdO`Ih!50P z49%>R+$5fj{=nhR^|Scz{^{Svzy3G>3C~|V!JCbBeE156OXPpnY*Tp5Z_K@;CVUFp+G$HiOmbbaEOPGo>1>Hj3?OJ8xidAryt#fuV*-(rXWIW*dCD$FWd%V4|eBUm{cO{^2pUcMdR{9?_buEG*#Ct&4c?<_%oFdWU<90uRf=pg?Lp-vMI5rvRlEXD7!0LQC{%f&-cMN@ zXB-y$o;KL2xWBo4Ui&Pk184UXYHb{+a#OL5>s*%KoZJw*OX{hM&+1;4WJOb4S2N2d zI1-3pjnRAty^v!S1|F%11YwQNy(Ga+xbyQiI)5g|mWXGHS!9PovCA-#7WE8`vxK~X zQ?w;T1-y;m>ob&v!df7$Q9k71y994I_0X8Hoj4SX?dO7PG8Q_<3)2XSfD?nlXVR-F)}d%z?aHwWZX6*u z*$WKmj0W`C`2qG_Y{of37<8x)RL9k1go-jvJW#dnH))Tc& znsojd+U5jGMNTOjsBE}eX1ZeEaiZ55oVfEDT9bvPr_A>>)Reipd+jncW^K5RtmdY- z5z--1>%?}K>Z76{j#0@-J^$^?O>(%OJb8&%_pjmFg;mNbMB^~7;X*&)-t9|xyuL?l zgOQWq@vCi|IkSej2GslO)}=Lk@ni>EyGMBa?f`Rh^XPXPgwZj6`0-sleZG#(cYApB z`W>#GTc*#vf9E~?{>w+$-PyyV$1iZ@>?-DZLe$Q*?oRqDCTBz$2zbXt7!h{& z;OlkOWeJF8B3A2J~H+R`3VKkYWlhBQy-qFOd=a(B`y~`GsOPX zWCcPI;^5HlN?o6TIMMXff7<(E;A*+`#V% z3~BN@)}Zr1vaIK@dpyM7eD)9zU&O}bi}?7?b^P#q_pm(Y32K-lx}lUAV5cC6b5bk% zC7#d8Y(nqq3az;if$+Zf{2;mhkTYpBVE<^0M=v+X;EiW@X>J~8R+rd8qTb9HPXqRb zV?2GcNeCg$cl841I}W3!!8kf4 zO-a1>q|r`c9oz3bIC(?a z>jo3;J^2W^u12E+7SiBEL1ZQtapF`#8-Xray&|$IcMHovL zi#?y16AiS3oEd4}>cmiH>^({cA*_k6KuCH+O%6Z(lw1F3Iw#dNSJ{;rq=02AC9VH*Kl@ufCqQ3;;V0-()hmo!z29cN1vcC z^#mp|Cz&YnJp^KFo9l92m27kB<#&x=NJu4ip3Q(hQD)7e22E)vJkfAnmP!jxtHw`zY0k z!9XzuieJ}GWrUs=c4oAm%;$X!fzj|8r#@G8&bmvHxzx5v=C9&fE61c0a!v)pNH9-6 zx#9>0W)BsDjfQL8VxSKGn4$zP(Lotbb5h{GbD91 z8sVE~ukrQEEmYkBKKf-QFY)eRg6`q~oBKyt>3RI(2lwFW z5%u$Hd>3Id#&}lai|3nodoacF;v%kISfzDtrfKfudUZQJ&3u+B+y=ASuk4g&qp@Y! zs^fCPMlJ0Cz);4QPIY#A%J^1OIy(}pl2Scd zHeu~fFtb!x#1@9%o-v~<7=|6?&EmoWk+F#VBDykNyks-h>9y#pzvWd9DbJ(ob|+_q z`;gVCEa6}{!p`nKc6RnKJU+r)-{a!Nb68zn!}7{9&YxSs@;# z=1H)7Lwo~Q);fj|GyrDhZ9XRUIdemAYws6HK9dQvxe+^{(4GJr1ZdrtnzgI%amvKW zJsN9Ur662H;1Fx9ZBXyBGa9UI#a}yxaibn|HrA=@hh++BKai!>H3JWJz$ObOoz_K2 z*n?OYv*J`SlNud_CiiKvi!TqDO3<5pPh=Lh!qK-2Wfok{cd$Q*x!)@4l+&&?SKr}e zm6<=72&GIIHransH7VDY^#fs;-Y`;$NugcyOtvNgG zQ?}MEkAs_@ax`ib>>iKKXNQ^n z(pw%rAC{L1d^EgI$e?v4HFQ=YjnFk zeEi-ueEs-2UcB8U#TcXOAH3Vgjq|J2gKRpfQFXhRAN29wwyD;zYlkeTdaCnU0 ze)btY|K{DA7_6gqw11l8JND9-d%MljN!QM0vdK;dSh>#7wvuKv}tsf z(V;jGLS!J?Er*ME|2F9id(OT^2PZmxC6S0+Hp}LQ>z@cdB{f-GTLu{A%;Ty#+U>Y5 zE)5~oQbj@#p_h+;@AU`dbWCQ`bYFHj13PLuXAd7cuD1Q4pi@GFKH5N9}Cy zVrOp;$HzyQ##-@dpa$esr%U@h66vH#OVH`MF+oi+Xihj1tvYh~pOvfnkyAXT6K0-k zf9T|^ZGb!bnQ-D3OtpO-MyljpYtB=VR6yzzW{WAsvTn>6iiblUl*&wbAk$(x z8~^FOg6VG?c;aN(EVtv@5mCOHrmwP7CyOEx#KypzB!d*$l*Eb4Bo=u&TM3>MkT7Rh zx^zN|{aGIJ6GEY-h%6kS*q3H5f;Bu<@Z~wqgDw_C*CC&c9CZLJE%+%1#n>b5<7W$w z+n*^tX>(EDm>RLu10x?}dTZWtgX<-tfbv=d zf66H|Bn!V__E1*N8h9{{5x3gQx85 zo$D9z#p87%0y#W5z|rD7Uc7Obo14R#PK~=a&f?qW8#p{3O3*u&XoBsl8wl|i&-wJS#X}}>4>DGNf{Vf*P08R;jIIo6C zxAuuG%+1EMpH#`2hRms%u2Xr}2)&*dS;B6G^ek1k!%fO(Y7jadZ_4~o?ylpN7C*2v zW#w(MMgz0x<)B-`wXmM)^&P=MXC}&>GE>PhO3ksOvm2eRz}Y^zm(;?K&wlU`KD~Dp^Zg{l>fji% zja=te^gqjWs#)JR<{UaEI^Y$seb-zjKS&VgOa&in&NlZC@b#nTaI+bH`lAo={SV&5 zzj^tZ8r`l9<}f8fiGW{!{s)WzEL9$R+k3cn;T-N|cruvPIe~o{tKa^`lAUQUImrr0-@Ht7v{9=J`d2G}_!-gU!WVjH77G9?>59Y^sAS zsabw7sRyMJimu0aIK}Sn9Al<0E}V@}xDyUX!qo4YObc zO%Xd|*CnCi6ekIZ5;2=m0bdMxa`SUH`tZ(d1RE@{IDR>(juo^`JAT)e6K_?7CK%Qj zU^;l4Y>wW`7_D-hlY99@LR3Fv4b}E`k%ov02{fcf>Qx&$1{K0h(8#NfAY`Lf2BVoA zZ9wVGb2O?1Y-FzWSSQ5nsjn8J69huWdtD%E(TG@_>*09f@oxVZlZ646=XylxO0>Tm zJ@uwmB(G~;;7r-hSuCGOX5?6UBxOPh$ki0(?NkfcIUHlZsj)Ed=yl>}W?V$xOD|i&LC?!ayS} zITN7*G33a*T`MO7MhO8LGJXVV3C#}3y1T-dvW7-GEe}0QcAt1Ef)C0VYJvyILMeY< zGLEIrmzo$ZUnvLSk+E4@?8HVS)5D^m9uTN2?nN>iIGsKah2p%oTr2RL)tgz zR#QJ9$62++TT`HBo#21^*Z&6FJA3%^pL`D=y>|t@ zswQ1MV?#nRj5!l2GCZ^0O0cVNQn^t#1;2=HzG7yvY)`7FFj4q%*6uOx zT)v1u|MWvF_bXJr9uAJj2y6402H@G74gAe-zQ)BHck%k|Yjnc|KYH*!`cbx`!Zga^ z_zYDSUq5||t>Xs1)5De31zbF{NKR-(+@Maip;X@(Y3$*&pJ*a`DOt!gyA_N)UwV>qIHkS4S?rY>`U zQXoNUr^M((h80MikB1ry;J*ifW~kuE51=q5F{?DInzJzCQOkA_W~EGOnzLgPO?O;; zS*!7C9Ft;?=2W)Yjlo186q0BbU5qeUODD9D`H_}262jdzC0zPjS*_)+R74V zmPe}$3&^aA;;KVsJt{dXA<@Pbf>!%~H0%(iF?e#2q!isM0(t(tmKNhL?{k{Qmm?9h zep7|FY<<_N6GLljhv;0*;gh>JvHr{7163FA_Kxt?qgOb)b_Ts@s4`41&en(T-@;dq z-{5$X7}{3q23tG3IJa^RD}7L;{i`Q0v2!rSi>(7(T$xLZm=3rR9j=uDp1dC7i-&LU z-i*04Jo;?eV$w9#YT*n@l5sjpc=FjOS>D=j|HBExIuhwE;dw10>|!sRtQI-cM^ z{pt%G9UbGry*s#m`2u>qDyP>S2k|sB&qgWh3#uFAX3`clP*DaoIc@RTUvKTlLTU<4<64@#I2#O6oz=N6^Vy5H#G-fS_6$q)GzuBs+1tlo{q=9Kw77tueEK25tDN5FaO8?8Hbzu1ec3&sI#j}7<8PTH>XX~6N)5d>$$c}bQ+qhmmKhNeH&X_8@PYx zCO*7-1#__@dgD@dQsBzGL8(1V$n~3wPf+_X*wf8tPoBkVrrpXH2_i|LiL%4aVf%21 z&%S+*ez$|~Ke$RkjAQB(=7`*&c4u)goZzp2^En0!D>ynHV|V`ucQ2g9wY4R5JAo*D z9J2tf?;PT@Z(k$y2k_GgZeBTyD%MI(L2$7y5&v{kkF-HQJ%l&G&>VTOzDSLRX0G_w5RqkoF=;7-VY(D*9Tdct#ihz#kJ>k0w~*^)LHVwixO z$QON3aiB|DFC9^~Idd&NIQS9gVrh9ERli3nE<)CKb`P+%vxmLiLmVC-k$&#=Vk?|J zvHRA{v?rP46lgZKV1V`m6oMZ)ujBHNb)m^<8k8Q>~(@M?oYT* z`M~RK{{+vhh-93AjB<8VakWx3ABf#-(2e_G9!JL`?97H(UYy6EA0ZTto}4mrXAh@5 zR(6o|Z9(cd0>dl7l;Y~Ew6(S%TM!I|K7G1eUqjUFzzP>h|*HVMn4ijx-w#l`sr4yzV$mDbp5-?fPAZg+WE| z#H#WNr_I?|sB;-OI})>wQd1_|Qeen2dz_;7kxqSz`M$@}d>4!Tj%K_yP)>VTniD5O zD#C!g7|L|NiXSb?7*FSIG9IB@adrqf_?9w|GS-Yfhyk0%r=WsGF{FOw?DR{fKmLlI zr9r>nA?CTcUPXPbsQGd}_$K&Z%+xBkX^GE5gBvGmb;m)X$*dt*XqTzoB+1^$xtOsI zZ4x~`v9$5oNpdTGeu^)@euVjjd0f4?MspLPRY96yi(@72Vw~tGj@;8;tCRL%ig{V` zB7n~sx`u-&X(de3j!1AdDz#qQ-7Q07d+&sUEPwwA9Mb0#+f7SlM5soJge|Y!` zZ?^U^w{i{}8=K^Cynp8!Ru{VPtkYu1VmLm=*NbXgR=BdZij_eRVLHWPzaqxP z`EG;xxp{PA_M+RPOh#jC#_dZCV5!ek9n7_T94HZF4(xS|#hA_?TQM$Vd1i&8AxU#) zVp;MNlr*wBPV1zbB3h#x9Wb9rt`KGl=gPivDT8zKadR)DyBupCr|)ePp`>zLf@yZX zBp_afl>{Ji!}-c*SzuIL&TyJU zg*pUw-PCsd6G=7NTlh~i=Zg29yvu3f_WYURCMxH1z$JuW7e_yPYKc!apR+w=Z0dZ2 zY&+z#x?KO{igpEQfOXSk8>Qt4X|N;|7A4pmOQ;Zov=INo91VMj=;gEE&rvKGzQ#3gYQIC(CF2J&i1P2{5CU{=nECO$x3?--1+ zTKPn8>RqLu&8rF>kNxFoY2ECYW+O8{`w36xJHBtfPTQ>F2wPV@4_o00RvtqP^wwwW z-Z6OeVE%)dN4ZWrt8!|Z`#T>?#(SFUmR^l5XR{ec6G3c{8M~rw(64}{`2k_tw-1hq zw4-52A6olTp2N;(do+%Fc{LoBB9<^dh)fubZWS|c9&`N;4n`9kPh(9&N7q}LjLI32 zSxb-65V=8&rc~5$woAg*?(vf|Bo0EZ;nTkc^NmSKO1*$OaXQh?WJt4fl}DOGKLR}t z=5t8_1$LykKFQn0g+UdT9Px54${Ioynt(DG!5FQD11-;G>Upe@L7BCX9dK~rejSqO zS99~nxTe%RyQ#TRb3@F4(MX-tH8G;a@8kQ{7UuE85APA=FS5Yy9vtDbFCU`n%@K4d z)|ng)XP6F0_}LHMr&^vENspP0c;9zB2V?|RKH%c{6`I41t$n4ruN{i~|OilWvYh_>GqvEp$r z8}BTu;WD%1|y zdGTz_IffbM=)S2nj8S5r=5sKZ(`}qHUa&hn2Pq^V0G3VMcr{V4B__ZKdx|iUcxK7y z_a>X9#$|RuQDj|n1YL|bFq@j=^CMLBRmUqiMl{5{Sb8qKN9RW7z_}A=SL?Z=J5i-@ ztMj?8&%$~dF76M?lvpPxshOpkG(sR&iT&7hFdWy|+}^|D;sP$6JwpOpoJul8DZ`Rr ziM8q#uYK6kX7Suy+8UFRk*pI7V@S%No~61Tsfo$KAkCprea6vnir;?r5Zwm2b?Gdz zB2Hp|rRZ>sj&XQA#QOFDe)sibG~IdZjmJ0~9^%fGbGUQuJiM!k{j>3N7=;R(hZC$H zj;R)`Ga2KPyO%LP@K~7dlf!m)v5Tcxj}#rKxSX->F=Eb2jhUsl>7gna56@ZLish+; z^tZ&xmw{cSt>zgLER3_Dch# zR!OVzk&O_q#&F1X2J29#=iVB|g$g_I5cYZ7wZRJ;x;D0eGxOZC zmQ-&-#Pnqe{1*wl_Hd!UZNsZ$5Z<74rGM>QfsF9GT zM^Ma;34VFixrNTR4#%JDMwL(A{>{miF26th(|^M2yXsE|=b&;rDy{Ye zr{2z){}1!u@sDU9~Tzpw{b#|H` zfx!s}!LjPF_@MFM6m}F6e8b86*yyH6n9GeU+0`^r?d(Dd^h#qhQWxZeO-j})tA1cS9T!(8{rd)_cvIm<`RQmFbwp1SmQ;xlmUe z`Uq2)8w_wfnPB@Mru^ry5bHM_lU}GJe!{cn=W5KDa)d8O$atSO398^3lT4KLegV5g z*a0l`dx;^@%w>wwF)Li142x(u6Vq7mL3vIT5dbgD`<>nLIa_pOK;1@AuL39eniu zJ^b{>i?R36g)g_rf z7W=qxb`eW+18g6T@b#0IxPR*!LaYs_Yh1Z>k+L_(dlS6bI>5uHuW{wV1H5A-e?LCn>iIvfr zh`H8+G?F1s&Qi@#STc}|9q7!t4NTZUV{18esV9#?YlQ5OSYyCK(6wgzL`g8OoQ&Ob zUdC4~gDUk#%X&(Vn1RZRZ1&uqAZF93?_xI*;?Q156#1Ib;86(0eX38%aO`yd3h#Cf ziCpH)(mYld=Q$(D@c4ots?ouD?thqUamU>oO%{*P0#i)kiSS~4e2lH#eGG?VtSl|z z+_^P!5}=gTf!5hEOJ>}svDe!cQ9Bz zhl9goa(;gCgAcH>&_g|%lA}4CCjIf-hp#aVJ-B9!PwrpG#kIL;9aEhVnsF2!@Ku-g zP--($#Y2RM%&gRA$V*Ga%^H%2wvg}zQ2?hVS%`Xp&&lSo*b{+ds?5$A9)pXwD`bQ`~5pF0_Kn%^;jv|*jI9LNTXN}|>(N88A7L3!QnFkFVX7Y|QT5Jq$ z$?}<_ZogMoGcfei*exn|jLigv8d}|v14}lTh2r;OAZrRm16AstQgEwgO@pM@LkikV zsm+DMa5N!DX*`Ke`h;6hR2g#UJ9G|-Es@z=scv%GDBM_N7zJvH-8G}9hz+$xf~WSk zRs=XR$5JC6TJv9iFYD}D@3gPBHK$8|ilg(#9I|Yu8Yf2ECYr2Nu~vq#M^2FJ$zrkd ze$u^FWS&fr-XMtVb#?mqI%H2++ssaY&Or*+%{aJa?cxY$wzn?xwU&V}{n(Mln0hxp z0FA!a>4mhx9)xN>(8f#>#~9f{6CUy)8aCQp@Ve>se$oSnqoR7hkfSMrZ`X|wJSV}c zJ4;Rf#p_L%J# zjuuH>6u-aWj0`ncjx2^9j3xn_F#@%`h{d@sWy^#qDQK@H>uicEoulz-pH;MH8gtx& zKwn)tk-ihqa~`Y9E7;!O$8bEw%ECN)+??1^VL3Z3f^B9aD;m2LIb&nTSEgNn-DhUn zl+s-T8Z9S_4P^an1KriC98IlQK)F12zJt_q6pXgHiK5f-1!gF%te1CUfr~6_2*o`` z*z0&;zbVCY4!F9^j>!8qIULM(85#_ahj{k7&d(sd2>E_uNNeU!1bfVY3XCmyoIksY z?>~4CfA!lxpm81S9Zm7qzxe|H{2%`e!^1;_NqX*jJi;%2cpsbp?r$)y9X57$aqZd# zbZdvrjcr`Kc9|MJZy&tD<2Rew*gwXl#V(C6l2u&2au(~muW&S;;_b#Zj`t7o;oa-_ z_2&<VMM}8w#E0S|ipBrAxhM|$k8A=Vz zMfNvRx227gbCy$#lfXD6K{zB*4@2E+x00Tl?6j9qR`6cVa=HmZE+J9r{E`|heIGY5 zmY38zs(cBV9axMx=W>>xkYLKv=(1_f4xf$mCUKmQAim1aA_pY7C|p;-(oTyVK|*7=Vo$*KmYN^_~A$Qu(G&7vOCtYKF zp1#4>;fQ)MU0PbegPRwr-Z%CFOWEayh*~70OGXmQv5K3}i}S7eMA$1`I;TSDAi5~a z^W1~dYU*TLrM*v_uSJ!GT3p(OB4wUIj_9~_iwJh|EGte4% zHfqmULV3=G-rlMqTUNv$CMaPfAeu}F6%lV4TN{L`gY}JcR%(XxMq_+T4a9-L+<+VY z3Y0PhOJW8(UPtsn)p5+?8s&0DwVzZ2TThApKHgVlvm&IU44kQbrUYb4##PEOXRI6J zc9?8TDMnBGs_#36Z|=m;r`X5s@nm#C_AySFks+`3$;5&6+)XH3Xz67yw9=h&Zi~SS zK}g89@vP+&xu8~+L5mr3C)ShFUsT$+)J-ro)g1ii?1?&U=}f0=luvy%6O1o{9e88M z0^(Tw8Y3%2gB!ob9vbmqm5M!M<{)Cx2i*<^RU|WT=yyC7wWhD>=dOOAeva>pKlkXX zr?2sv#NOj$v(!`@ME`v1ZeLMk3S^Y0V$*iEh8n_0fQK&8gX=X z+VxG=u_@Bkr@ZtoK^zw&Wm*P-z*_QV2>Pu$U{XA*J*9F)DzKrewFs?vxo653g_gQ( z=sTgwHCZ=>0htY&VIoB)_S7eDf3N>He=3{+j~g`_axP%L*TK^K zBK8l5*gu+(G28^F28X7AZPeIhqsor4&F%zb1?f^-pxBlOm75VmUNkTdj*pmW%4gO> z76WzC)XC_H^uL{y6`-83I+x~dA#cL0JjC#2-;Q2MXE9(nWK5ud4GAvNDus zJh_b}*zsLEoQ1ejtg?|RSukWLC^uC1D&*{iO`QD1T~wLdJ8SeZ8#AdPcB(@0Y&2^m zGeje8s!jx%3eni*f1pfEMT&72Ja!L{aB+DKXO1Bv{;w z6nIJFtGQ)^=N?&lHju9&UlYvHs{&7?C0XfPg`R3K7%t{3ny(H+1id)3n$?4m-$~Yh zGfSPSlL9VsFIyib&{~E#rZII4*+5=bk?D4=1-fXnfu66I*yBSIKiuNM~tr8=%68Ar`Q`#@a}koVUwCbYtTCT%lWJrnVXhDGEo{=%5h6(Ce$!d^P5zcrZe%=t3=JTHOQpXEJ;-DjRJ*V-l$xk~GX z#TIAhj?ac?@}gKbxw*B4l3986sNDKo{jIMzkI{LgzC<9q5?J;NqKzT#9zk@!b)w&&6;a>`(klfR z^ZkSjST>U=vRAjDmg%nnax+YOe+0)^A(B~G2g3|T=6Iweh=Rcs#L9DYl7&bV&RN;fWSMlxZ zZ8C^9-tFV+`LkH;_OQLZjq_`3SX~$p0mh@Jukg|BD+$_F*EqYfLQQb1p0HiUo(2>>XzV@)D(JCug2S|s&YM+oJuj|D4yrJzRWph1I=_# zc5hm^x-$??F?5A`8HI7ms}Y;PHOCI_rE%VmX@ky2UbI$ z;o$Kc%*Im+Zp6%*d`6wakd0dTTf=?XDs4s|wB3l~b?s1Atw}7Cvl#}x9zMDM9{%Ak zeiX@QDRUE8er6^-M*)%-Z+CD!oM67!#gBgYVS-k%mx%xXAOJ~3K~w`)9ZbhVY;J91 zYv+haC_r@b(Fr@iU;e|NW3dw`I~%iR(*`(dJU)B8fuK zRDU@o$n%uy(PHMK31gBUXhON(MrLa-Qx~*3x3yv&N7NgJa%!J2SqYVyyf*6Bh_jn| z$xW%oHSNRL)R+i2T&*l~dOn?3II?YNl1@sK>hi1+s`GAa7#+Daj?7+?P@vIMc?@~) z*v}b}T-?p6eP(ow8JjhdbB4o=tpI7LR>_~WPs5K&=o{q3irA&`tWiq~9#KEm4n{lI zd#t}*$JY;^VrgY9k;#M{6zle?REs>Dkuw#8Jd^2^11d>oP_20U8}|r<_X=e-Q%q2K zY8^5jBg8!$6B6E2AVBJnWSv}|g1jw@Rs7=)SYEl4FOfNUADr}S?FEWNmF_widn7Md zC_ZY=fsvc)=$j0({hK5t0H^0C558S8WbUS@k8CTa#El*6X|s~%pDMNMCXY|_WFz{o zY|{~n3Cx%7%=NoE&}=U;qnK_?Q5KCc2J!;WG=gUuC$l1?M{EMaO>*{zQm`&5kZx6R z=0=>GT=c2NvS9NIBR;3Xg#sVKZZb{1Z>aHFD+;esN1M{-`N@j0$qL>yjkVi7pvCNB zHiy1nQ}WPfm-kqQOC2v2I<~>xi9L`Pz1YbnHH&gw8T${7Vyi3522dVHFv_>J@xz~b zoY4}qtyHiWRUyxhDy~znlU^by`@IUCIu;|(s5U6}`H8G-m9u0H>AzYc(jm`_6->Ez zo%~Hm@KZzS_&I9()p0};5;GwCN5@#6o1;u_3KXrq}{N$0<1VPH%{eO{}Kf{sB3>GD|;Gdcu4cQD&JpME|M!sf-sZW}_N zfreVdTf4A26wjsm(@BO--X}69MFjiZM6e(Mogk5KMQaAiZi!htZ3x43_I2iIc{qUjiiMHeY;|s~Pnp%|sK#+e#=HD{F`|=s8%OlyzP$d^S8U!PF>x|cc6nxD_M~do3Lm;;B?I2@+qBA2|o9Ns$ z%*rL_y-}t?uTZ*FgXm4f+yr|}fKq9F;gt$K{(+dlICCR4gEPqx@IUG=X=u9zu8|z0 zq@M`B7$e6Ov+0IL`)dU~w*tWfN3pA~QAzAk7_81eO|UbKfy=#?Uk4 zWP?0*IUi64-v)d8M;MN#WPIMdep%;IWVnt_$_m6TXe4-+vRAc6{{&9&$Vo~R-=2)m z`?oIPXFt4;#kmSTGJ7I1S_UTlNd!C|>+kmP?9~P)qY=J$?-~W);yY*4K!JvLdj}Xz zQ>HC8u8ws%AKklw`!_FRa0&aT(S1Mv>M4%KNd_!+d(=B`@9+rISwJHHl-_lY z_JG(x4YwJQRuCG%AsePqDJXhLX8@f*V!z8cHLB}5DCZL+N_J*lqYzxxyS&~+rP3tm zVXFB`WL1P%V*Gl+YHwt_GIOe4ux~VhGPA<%myLZnSLzz)U2cccGW^@gweL2D^QgtV z5{FjwmSrQB@S(A7^SLRqALfh|FvawHF9v*F7tr9qS&fS8vBU_YTD!pj3k#`!FhbUP zUi5Wf{o=@Zn)(?gqluEj5sN9q$P@fKXeN%%J_p$(u|wIB2pi`N*|eF&rljcidbEzS zW^8)vwd@1C2H)XS{eOM^N!R$>-em0tCC_u_&!zn6wZB29t;4F|9s*N?G1qkT$c@8z-Dr!BoLpi?tORR^mNR%g?#jm?xOyon-6 zj8-CAcH*+*8&W?T?iwzTiWq6|!Yn1K+;h(fX45#QmqYpfld1btHkBb15y!M491w8{_a5n`eV2Nn><`CSbOS7O zQUqP2F*E^HhU1y%3}(Hv)0&P+qm4-|{ceirNBZqfXNi<}tP$&b#{>Y(nM`npPEp%p zquyd9+UJ6WPqz1^>_=)+Y35b>iXlg;-HF+AC>Fd>MOJ39^FpKyg5w9*{sc5W)Ar`5 zUC66-8g`o>PJ#+vW#lPE;im5k5mG2-KWAP%_al=Uowe0P+`V!kWqVBf1CcqJ+c7;~ z$T_QPZg>l-|DXoAb%TrJA$AV;@#y(J6;yUY z!8JU7`W!p^Lwx!56I?yNhF+&(hp6HJ7(bm)3{Em1DNy9J{#E+TIELxYh%81Nn+js@ zIW9s@SM>%~CK1V8aGX#GS>7ng0|(cla~B=IZnu}3l2T^EQPz!|C)Z64gDJzzjtkwJ z`+8AC*ut+9sR|jcP0%b=bR>n)LYg`286{GRrf^&+N6I}L8Wb>Ne^9rmz=ilvk8|p_{m$nzuChu>^qF zSF1ukW!P>aG?F?5FOgfhC(T`QP$P2W@aTyCMP$q6ix;a4?)6_=6S2(vaho64`eOx-b%zEBJMV)3(W1ZXM7wdTXavfnh#!o-}fch=Ye1oIW zjQW7Rc(X+;bwnQ@rdS^I@PiNUMhXyWiXF3Doo*j*-tABm=f)2ZW>cJ9IfJ=gkIsD@ zTSd_EPU>tW5ZRDA?S@&6xqd&9*?6P(ovD3yP`N6r9E|NE!N2G_Iz}8Q62}BX6`8@X z=?D#-He6fcDlQEP)S`vlp9WCyV%yo!fOj4n&92K0r3+`qWSI)og~__+?@Sax*jXuX zSZUxQhv%}Ll`FGDaYflx_VSP{u9Qx+-)%iTXASt)J6l;}c}6NPjxvP_e8~B#yvo$* zc=s4aEF?csUahPwVQz7b;p~m>Vd+CkGJVje-ya;)EJ)PgYv)&$3%Z=g$i;LJuL#36$;tfG>bEfMa9%wTm;+6Nt6-T zg#m0P33?d85!^w)PYzzk^qy(^3KAhI>`-w+)x*r6b^N?Joo>7s(VLn!Wfml#4e=9W z_>PyYL({o1(V@IOtOI9gn@kND{f{9o?R0OWMV;oP$iWt7rxPKq)6U^352SUDLCN2t zFff6>>MWMo9X+t8)s$s&mKXyj8vCxN{y9g78;UTJpK01*u+Gm0oZwx-EpMqtb(%3@DkO&bjPMjj+ zY>6^=Le>Co2-~P|Q@D|2kaXX1l)0EwS8T}OoYL$jIFaWf{u(K6D;XL2cowwINfvF! zPO>Lw3PBh}nF7UUN6C&Q!!jFnkX7gjR8AalYW&<#A^Or>msr4p{wHcF)Az%|S-4M> zOt%<+v97S5^|1fm6>PlQrFsxI10FwH$Nk%vaq-MDy8S6OcK0!Dc5wOZ8LX|m!;9@h z9F7B?ym*V%2e*kV;L_OzTs*gco!3*m-Z{dn&0U;dxr}b@$#6a%Hz|{ai2Wa9(CK1r zX%3%!_#Xbl@1Ee-Up>b6zV`ucoSTEI;>>i&$#TLd%eyvhAdarnW~c~RKu!oVSR}hH z%`NfR)l+gPDpvYV_Do0)nbZdW)hq?Z0=*~zspp6T>cFRPF;d&E*% z8MH)(F**nxec59!W?HI>9U`t9llYsnh0hUL;VXv2rQbD8Zp=&${7mSasw{J)E<>Kl zG!WIAFdvw#BnKHQBip61Y%pgq%j$CO8b~xX8zEkr=yLs15uiXW5lE5xSUbhFTuj`O z>Ja2{d}?ycGf49n+Z7l?JN4mA#vVbm9k8^xgy2V*8$>A72;OChBx6&l5fXflGH<;2 z4QIrh_r|GeFdW6OLnI>T;?DKUxPA4Kw)r4~v(AQgs-X=y8cp!z`3A&P=bJc+wZkrEy9c;< zc9nXO3wZ1OyZwKJ=D^Xd)0YC@^&#CSA>1#~hqdP?UH z+#}WL&oJ39?ek23qs&*6V3F}6y{=EFAz|JOu8?#M+iP0tpuHWPz6Y#F1du4UL=yyc zB=w{10G^yK3D8QvSTQz2CXP_FNh|Ya;|Z{HV*DtP{cLlJZb%SO&#+mOC4@luLLrm% zY1`!?22CN^4syC`&keP?AENaBY*K?}37SytBO1*2`^HhLb8V-SpjSg|uf2X3u3E(Y z!2x2)Pp{V}SrnP`;+VUguAb{kT2uIh>X58?n&^~0jsafB&|{yNVALkIuhSfjKl$a% z#GV{3d)4osdHf*rC5o7EGV*7H}}GX`1|u=1iOjI!Mqdn1}_zJh*wXMCJk;XTg~$krqG- zzSeUDCl!ekYaF~POp4~lXk#Zq4;SYKIJ2}w|9XTM&zR?$VMOs?L=x7Lk{4VwQ%_TG z6LuCF6>Ut?5F8h`X9{5J{5Y%Qa)O(GG&MXH`(;+r`coSCX>Sjcf^sg`d=)a>6bQ-& z&;iPOZD#G1mqfa3)Znx?iJ-EZK(NYE6n&bjbt236r<`t{>vn|3+Wu|lE*QtBQCx1@ z4Tn0}B=j3`q#`kl!=MxUdc|Vu8HRN<9>r*#!TX$QmT0mlpB%9$G5^6Vzh+>_mP|D9 zb6t-!D~lM8hZs-Bn(?7wddW&9r6mSuFh-uvZ^-TgtYA|8W$WXdW-XMx4*6VqLv{dL zUSphZjpQ0G?X-=O(Mpu7)NgB=ey$l_DAuj)UCFzJpz~QV+)bT%QPSDGqEquxofVqWbIp5bys&+FF*qgKmbUQ zLrNT(X3Y4cUGp-0kbaF`^rm?llkrWW%*JRU#aYN934kQlM(@?tUHiV~b~EpGB4pv= z?%{E6768h0VTH`TdG9%KB0M~N`TTQ?r&DSa90Lijo#Nw=o#C(l{+Do_E*S`24Q2PF=78k2s!~l08@ZA3D{$YYz+Mz(vm7@$7C0_D2sOR$ z=<~7FLg392tV$p`Zc+;enQNNYnvJQ1wW&CAEQX9UWKJ~~HDAXo5~AVSBr(2-hF_X( za}OSRKW5+PUxFMaq7SaEQuvrqxO0ZPGKR1k)Y1n}2xeHv$bOREW_6_*Sur?0Gu{Sf z6wT3WbJ+77ED)4%Ku~(j_ggI@pt`iKQf+6Y8HK>?$BBWH zGHOH!;L&jv)of*(Luj9^;s>xZ{4G8-uM5L_pnrV$dHX_uBiXNx_$?{dt>V37fHe1xOf8ZzIh(~xUZ%Y zjK^b4_V@6`S2u9;{v*mP4XS|ezHmp_Qq56@Xy#s=z2@z3giwUQ&wH(OGUkSzcvd%Ts^Xe>dR@f42 zNKm}u#jG=0MA+Y4em-3Z9b;}BEZ5c~V#^Ve zMX*10tPH8ivec$1lIJh;mYQUBP*R0L4qHB`DA)oHX418VE1(#8{F>K6(UF5bV-M@r zU)tx0?1I*-h$_hDNo^>UYg2EccAVU z-KQ+?=D^8@s~JD?5cOVgCRzyH|B!l6*$Xz_feOP8@O$5W8@KO0!0z50^I3%(cOK#0 z%V%)r=n$`-J&qSE1Gq55@5@WEsZ~4e;ps6gO@@ zz}?p`;>@XI#8ODq@!gu3ws!V_VQfAe0!|!W#^tkzF&gjVldIQp=ib{mcj5?*v?hHS z;oQu5Sf?5jg2%;RlLscvlo`8fZT_2TzfylNGTdVHHaa{^i|iNTroG^Fg{ZeRhy0*~9 zLnEtdXj*MyYVRZiAcPpA&k0s4gjyjRlMsE+#2%@J1qAC{TU#Xt*ZFizFjB{~+!3x@ z+ulnqqZqRK4f%&a#zHo-EAv^;L@a}04<|MbX>;y!k8*G%QZ3Da&#v8~jMT=Fb!@D! zP_1v&>-*C=Zry)`4?n(!?VWwP#^IGAu3S1vElWC8YFSfZfUxh0ydyd_ahJSu<_Nxi z`3!oIZvR*9XsZ9m%^#Z(*+xrAYa%iAVgXak{3X>TEpCxI|GeXI!W0cS540E?fur0rE z8eovXnwF2)y_8R#JO+^^<0x6(Z+%00woqkCc~b+VGGpwR{JXpnihIc3lLNu}Arcfa zx7VNYethP6lWJc{k2>f))RmwsLVo55GpuSHK6D6^$(Y!1W6ju{^y!>FC0X^r8MsL7 z0d?42&d^)GsUSeIwuQBj?OIr&L-D)X#`X$D@F&Z2IWzWe)+Svv+SHy@dxK@#IzUFq zHDLi2m%J_oRJQdn2Yuc?@PQ_3DgXFYPOCPN&wrP`aKZQ^MZ~?ZpIs@FtUD?hxJ2J& zF{IEvzi(iFhKWbv6$XBxk^WGwWxN*kt)VETiI(ypGF;9^J6!%}GjRIMt|cVqe)`o= ztU++4sJPZx7Z$6)p|)Qwn(&M~D?hcsU}x1^sVK^Um5Ok2j6r|sGpiSG5!u;ksnl(D z##rIYnqd^>gl1zN>~0+(xW%I^I;6$lO&00pcPK$;ju$dC?3jc(I@O$DYVj#|_U0Ik zfqAHzoP$%$qBKbJ2~<;HPT3gJdr5@Q7#^u{cSD7}vFAs(n|hYj>c7iD(RR4ok7pea z(?7y&99xfO*IR!$mlr<>Y*lI&%1p2B7d?oKQ>@hAdDU1O6!Q(qZs!4(aw7`JMj}JG zcIm5vtv1gohO1$VvW97%HQVgA<ij$zwQq@)RzeJAt<@o<=iI^wwLu``FqUA@XIc^g4L=wR7m# zk;G+;4?e$zag2ucItea47@!*?`!NC@>5P3qB)GeB=@gDE4@igp;Ag+Y6g8_olldVy zT7_=6PLWw*WaEHPV|tV{)c0tXvM2=g>u^S?F5pUm5eO1-jX{KHpsQ2OaFIk&o(k2a zfIa^1wLT@AUe0NRF2jSQ-m6M=IOMcxqh4W?lB`lX-IU%osXuzT4$mFqIP%WXM{`si7+Oat0wHb5k*4NHRo|LzFW+fqO!>jSH7yW9;z3 zI)z2XxfQ(?=w-KK_E$EFbV^KwS&XanGoU{hq7#{s<63tT&AzJmknb1NND}9Rzt^i5PUD@+XNf6rI2_>A#u1!6zJa|NaQn$N=2Z{&2f7EGBTJ==abu9%kLOzFs*hP|EBcV#TA@960|LSeRStB?*8D0a1dG0cjqbkmwe7IUeUCwZ0zskd# zn#6Q@2@D|HxFKaYyq7(nYB6O$NnNV6j3nj2RmS9Qp=YU`C$9*fYY~J3Vttt#%8}vU`dxS zuRY9A+V*j_Y09< zqcm0-7vr{NM<@+1FRrbDLdm3NBQhQ26*oQf%nYZIN1Z*{V6B{w_E)iy8y!GiFqh#T zN;};0U)1rkzFzAHwo;I@T*1ngS@F`TIcPI1yk{a;a*xs{HxVM!7NCe4Si!ZTWH*yJ zs2!)d%WOi>gHRQ)DmuF<7Ps8uleIE&G9w`?K0Ak*S2M#o>Oz3VVVz6G1NuF5nN^A05%4LLtX=;%bZ~y6_NsS$OxL} zna$PXYj0e_;q_HA++)+s&%eBbt-bVY)UUA9MVQa=?%S7A9ZLZ9j(PfGC)L2rr+DMy zDO@;pgy!|?jeEF#|1r9QAw^LmD=j%8NZ(Bd@Ej*ktmD+NHS{|@T)X`UHy=Dx9U=Om zj(rgaJ#>3LttF}1kQT&&W5{34Mnz)2@cfb9z8-zVD-7vIffx&stDvWIKQND3UX%5}G%GtT4~)_J`=GeySRBnOV!TcsYw8TgDd8zVq&7oH@FRVJ|^1>rM}K-KCynQitg1 z{nQLMz9!Qt{fk+P=p0q5t8;)!VWovUWaz3Mq-sC8L^aSTo0>6xI~P8zMd+?plG-}zk2ZeMo1(9+oz-@mS$wkeWfwQVhH z5*!qSRohShyJQok`eK<9JwrS@sZhO>@j}@Yk@0Ar(m8b=#rY4`*2!up&s|{ndklWW z7D!CwWBUlwjl{M>&bY@t73C_TAfld)kZyvnNuZK5!|{Jn&SN0ASJ%|*)*%Oxg3s&m za&PO`ymAt>@eWG_-bPRKlNcJCe zZEaG)I-#YnV{PX0<4#31JMJl%yXfHn1W%y=03ZNKL_t()(AZ?LWe+dtK9~s-A=X1d zqgi6$IN?C#I)zXkcm9{m=^@M!t3t8&4nC=o4~;-AmM~<;dq~YTjHKYL|L> zRb2F3#VCIeXR{%Kj^(8xM&kxgHuo`YszjAc#lAD{<(0F7>Ij%8gBl3nsDE-q8a6D& zF^{m7hUubt0NT`aVNw?Ekk?MkB!dm*@()dBx0E z@`Roj;tvpUr;B%%jUdxieW5iB3t zKyQ$kz$ADEraG5q&k|wwYW#~6W%@u8xkjTj`e5h{Tn-A@v(GVOVw9Z-{|Uw*B1eZw zI!LyR>JiyX%%pWX9DRaA#&!Tb>i3g-j-^6;)BKw2SFH1H4Q+4aPvAq8m6Kot?!H9=49 z+0Z^S^7(HRRB;Atkk$l8Y9U-OaI26%l1}})#xFj+2JgB!zHt<@q{TlXnjd}?KgZ@&2o`gN1*1_Lvy z#*`Ol#9bw|krnClR9iMB8=@8lykOcO@N-pJU9v9o8tjljm#4m64$~&WhGP~ik@Q4T zkS;MEQh~k(iA)^Z*cBx-JL&8+-<4LXK^ZZ1ZMim{Tp2gxtU1eFsz_njBeM!~{btT~ zI<6Z{gds8OFAkDshZ$Cybb2U6qb>3WY=NxbAr4mCu@|xgr-m@qj>^4M9@$Z`P)x01 zv+hIAWV;YDlckYzm>MO|`+XMsb_o=QUuqX9vP2C2w5KV<%FfiF+rx5ipurGgk7XW( zZnsaF;v+}bsEnc#I5g3q+d3m;8_DPp>-?HO9Pl#PKiDno4ln{2gs^b4jN8iBtrlcESvYRt5;M(cPpVVMn%iZdgE*UedBKBPFhX*MSLN7(LhD+xBCqs7O3$byk1alQT{uYE+pTj`Mr1(6r1*DFzF%S|> zdqc(p)$Z__>pcSy*+8Yw#d<=Y$ROT4eFSHZt`S^te^%qCAAO1aS)>P^YvFq{9piVt za|JF;u|J#O!SgM0)@D@GFu~blD|qA5ISl$sxOL|R?%aJufq`C^2=cKviQfa!y3gjG zAg-^RJ&NP212U$*x_t-N?>;6YlxkffQpCi8YNC7n9c=?nl3y^p{uCPKnv8PDi13k>1@g1dmL-nI{q#StoCGAFWNz z!M8>og1S>@*bQgIlJnve?wCko8ePxCO6c>tBW3Dn9fgXW#G|6DSFCsH)Cu|+xHU@f z+0xaBxa$-LyZ70!vyerbEeqyv6=%aV)2xT9r}|OJmg)A@fE2VZrx202;!FV7rKRzD zCT7v#8E4`g7mLgO3Di@lNyXzqGF~+gsZl+w4ZA54?>R%9oio@oSTfOhGpc@cf@;y@ zC>hFwewQHI(YfjM2Wmq&Ch|$+Npt;Va|_pQ+$DmI*DjnQ5|6kiH}@v^^S}K$?mpha z`T+RWd#_<-xrejI*U+my_5K6(f}Rr-;{Wr5pAgYSFU;`U@4tzoD?QpzRDab>;b&uV zIAf2%8B&O_ofUFqcy`BPuz3>c@Z)tNJ7{#i zA{h!ze@G6Y&vANjUhR1)PKch@Le^Bk2A#qUD?U2{JGa_Y8a5aV4XQ&McXJ;zMI%)V zn`|(dHwikaCP&b-uHrswHWMgDYU=>X8SjO^WxFN$bX6vwk$IQ>XL_lDODx0zwa!Hm zP*I!Q3-&slfK}R?-qd7@esr9@lp`nVD{;gFv(gG;s1oEA?5ccJHn4`Bc zBzSrZ0?g)9%$h0cYKqq`oW${?M~RVhZFNZGEUAr%C5+29XMVNdh%J-MnxKUvAOu?) z6mKn-{>(;7X_4ByN|3YV$h2&b0u9i*zr2?XFC1X^me+xCuk-WTjNYQGNia}F&L9b@ zszjs}rAX43&)8UY{KSwLyxJ(0vB8~NoKHG8g4reMP|J>3em_M_o8WcQC0bo>NOp(B zaMXv$5kQ-|54Lt$C#~YmCr%ww6oxA_#0XClRuL_;W5NQ-ewAyL1tc$)ePw36_BuQJ z#sQhB?3`P;SQh4kymj@^L-x=evT-dNy4Va0!3mqW%IjpKWHLa7540}ij37b5sN8F_TV6s!FX zhTT4P_h)#%JHyo1m2AT1REY>HxrH*~bp%&5m427u zWzmUA%u@L2)=HFnN-~g+J;=VO8Uu*UsU@p#ed$ws-a@0~Vc`CemTg9Y*^T3P?@obI$J0 z@$Qw2bO6T&(Vu>G2Rr+zACd%1=ox2ChO6=VNVZD)cg1ChV~?;ZLY~%@QixL~$Y?}a z-&h~h>!yrR9Ov@-ItI%t1lJ0NhCS75F%zL>Se14T$VN6G>|V7N+Eawr5NYH?Rn8dB zx+!^uSNh*MueahL42ef1Rfx|p91gjjgPm`~+DNQpa<=(Eb3dnmK|2^A^rAu86ifY_ z&qxY17zf$@tqATFdYZ?~NZ-@|H)tQA%2kD45O`#qN6##Wa=r%64pvoeW-a@Q97>-L zTnV^}!(OqzpUtKkm;ir5_gbNE_}L`8CUT@`2@Zs@<4#Ss8M&h8yE#AO`|}3)=?7P_ zJ4rqF-hJ~G1V6#f{sce%e}50>PoBVl6%i39c;JV>_zX`+ zRAq%rXHVj_^CyT{Bl@CKpY{#y^?8FyGbaZlLLK+UW9&}G7)__tpNqP2Rf*ME*ftyQ z^~~1b6+7~>O2J8R2c&0a%!C(fzGB1a*ypQ)SJpzW4x7=r+PpmPO=Q1EZ(K>QGPPMU zUMaT#$<4Wg+6lZ9nC&n#XY$%{xkzMboUsm73(7_nIdf={D&@bB&kNSy8bdRTbZQSs z$w$SkrcwuMYVP8gowOvY#9n0iXU5&25mNKK#zRT{(j*5VETZ*-4Hek=rK~$MVK$BQ zB}|*P;=oI)la;U~XR+u!3dCBwGm16Cd)VIH$MYB4R3Emz_X7LVEi4TxeD6DN;k~zC zr2s_KnuA`S_f4505@&1yAf+~gT_5?iRc?gxIonU2U!|TakSQ&axJ6e;-fkHz1__pv z8u^-v#A(ag!GqP|iS4X^Z`-|L;VbHsh?gFaOPR8Y&WRoUB7Y~MVS*QS=e!4UJB0&m zYWWmz#twvZLpLT4#B7`0YkzG$Q42!VN;OJzQu%K=s6B6(^xf?2Ga+8H6G%yDhd=)MusOp8-jbLZDv>{+2JcYy+GrW-PP~TTunq;;; zT@$^QoOS_rYU#ce!%BigHzWaa71VzlKX zE0}znoRJDld;l1#dZla)+H)vfD%a!K`U-N=M83^B2bKlN(gmVv4|uV&hX+r$pgK&y zKy6VIyosGdg0(eX^^h3Le%>(SRY=(qGVmKZq@$0rw6u)1^>w`1+{Sb^#m_#zhU3S- zg<%EkPv+R%+JWl;Z@qCIpWb>*j??oOn|Szi8!P=o7T>uKKKz&YHCX zWvU{|AT~~pEPc`NoX^?m#=!@iWH&gIK~ZOy9ImLFyMsQ~I!CcT8eu-2U_P7Dyiyj+ zaladvSq&|0&wC-9$iz34)rkg+7+vvyv|W;u8R24*`66e7BiF&`JMS~1BKKlU8KM4g ziAYZ-<9#&ERGEE)L@@|S;Bn^EN$l*7 zvH5hwpn{6V5%)*K`^Zae9UIp1XWZ-5WO_Eo8<)<|zN))*sq^Khv52L{lN>Lf;>8Ir z%;x~hU=B41e9h||i+fy}#RlSez&TKy>srR)xpj~(wm}I9f+%orD(Op=ZXk?}%4_6Y z!6ce*E>2)jq0}pf)*#I*IQyLG6*Git4QXJB+dhOGfD-48=CXF!-QC0P_7(-#Vx~3L z`Nby5{Z6M`DESYQ0jWZjVbgL=*nR4>Xa}6tlwb(a^^4sr0c#F$QXnq|{l;TDC!#)! zb%p(2jio^s>&q)xUthtI!^;#bN_)OR2Q#WSZswlgsx~K+0#=!f%K8b#V;aLrL{nk- zMxtK&I?%v3e=@SW@b~c2ua@Jq4igFmQrK3Zc$RkWw*v-e@3UaHnro>74H?PGXQ9^l z89&B&GRAo2;Fe^QTF`B$V>Sz+LlLHHqNrzshfOK_JQ*sM)1Z0q@;MX9PyvNmDpoXX zh;=&x3o-qkP^SMJH+v0Ypz#fpktZ1o{#zAL*2S>_S!JfF;?H4m@k0Ju;mtydndLdu z>&a0gCk~dOIJFrtn=&=hQHXC&t(P@$`uCO&%l?)XGOxT%q;l_N%RwEfZdDLaWbiBNXOaL7aD!v898Lo7YNYC4IKyNL`Zc%Fi*R zUUgk+n7g+hqZl=YJ(n9{^1XwdkD}N-Q{&27C1?VO{VNqaJDrQ1uFpzyL3zDo+J1$a zEVbc*)8D>m9!Vij@*jppFqorJ484317{|^;v?S;eBp6ajy(O&yHLut+`ZKF zEN7mK*ouwS7>0TBd<*-dJ%Z$AgGdZh&T{ghAQ``k4N{7BanCJ@K_^3%A(V(&fq-cU zI5Zq!^TihF+M9Qu;P!*3xN?4jjNRK0USKrZ#;Nlcur!E$jAj_^?cv7VM>v1#DEhI% zX9xJ&mGk)U+5_CY_Z-v7gk)wg9MG7eBR8LKB(_b4WiJo=*f_LAdhpJJhxqE|U0gVM z1od!Eh5W=w*p$)oM39l-Y$*ekU_#LriOz|@B(k2(Mde9`*{HU9P8^-cY`1=h?in31 zKTpkkiKWnsKB-ME8I6RTmx&a=X}+1RYIGa0Wv zSXx3I>DFt9POr;jWr(EGwma>SSDAiYl_3hLtQk!8W$FA87_Y0u5On&i3Q?9UhM*dB z?>j!Lvh^f$mfVpUp6+feU9(kW)fNus4Qb_B&EG&!-F`^)lt2b`_IW zNFOXK^AIOQ4UjyK&eopTOP=ZouYWhyCVY+DTs(yAfPv3df>(#sKe6$_7}T5( zmJFbfg*Y=V11FP%PIZYDW_=vvf@xA9!^7zgUK}ygG@Tt*#|HD(_7)yJdP0Gr7}y$* zCv;YvJb8l1EhM;CI-)jc?RB5#@#cwj+$S;Zvx-m%+l-V< zn;}MVt{kY1wgn0JNESqm**qEM$uo@74mzLe4g3h$EW3 zH@x7(IVIhgLNSI>WaV;D?C3Xpxwiba-!RI{QeSI-KZ7IJzGuehus-oY-d`4-mdv?) zEg>q=y=7_|XwO^X9wV316k7u;F3Ul_oG8|cn+jJ{!!eDK!){QvxMY}fX*@fY1nHm% zf0Ht8owN?A>2Y$*Dyj3}M(|=d$5`sd$};YEdl*gk;Knmt{pv1WIdufxejio0i)*)^ zpk7|biDQRx@7@D4z&`)-F245m>lnmrk#BH(wU6(8<8^%b*XiQH z^QWmPeXL3013xl*u67-czjh8cZr{bHUwnmcyz?fOmU^j<$Hy#5a=5%YH&B=<1TGW% zgn3_(#ALh4z~=aj@B$ro0aZ&FlCd0XtRl^RpYAgwhPSz{sf7{KWooX0Qr|AkD>-l4 zA5q5An5dMD;zqfPD$84O6xo(F>^T9af<1*%z##qJY7UNAc3Ka>y7`%;M` z!!8pj?Lq)i7okVei;7~YP;Y@&>)Q5z9XdskY2RsBu-3V9x~5zFhvnOWmSas6m& z_PxEcjmHlk(}W*BdW6n}>HaveT23ZdTUn-{RO*440;IN|c_x=j&sVjwFuKkf=%th~ z$x6RU^@WkRWovsIJG;Ad&-JxcoH%wA8%GaeZKX$9xmW|-?{yP%_IS zIp(86HqD(yAvx?_Yl&x2-; z<=agBr;O9Q2Wn-RHqW7%zkDtETgOS7SB-Zu!t>2Fis15oD4~WZ7Fi-NPBU5Q@4_O( zb=3*G?mZU=8#~e*Xo5qLOq(c@^l6_RB=K+=#jE$M%*G2PAx6;8IeW6?hxA^RZ9th4 zcVgfgXo+G;8HSS&;tZE@fJWWK_z=hrzmWw*GHJ+}9~+63`%-@#sYO^6b6%97kQH#o z$#LzDM8!mf!bS=NM^^S?GIuv(UU)j6vJ(>xrz9uw(5CkyEMzvvq2(UdSC%n)Hm1Mbx%(9N z9*^+Knd3Nn`UrM+_Awrf@#@)Qc>LfY)un8YM)>T@+c@;@MJ!DnR+jqs?t8D{2Y>eg z?mXPWlV@Ah`{>Z26?}R9CPw24hMiiJ7V2(?vRH@Kmhj5yW4L$!F+RR_6B~!FkmE+Q z_!U!-BV~yim*&80{X}2`%TqlZv_3Cw49`q@L>u0Cby^cc-kewxgW1KJtERo#p|$Mv zD}=_S?`R`t5D`w?1u^Tan!p)HqLM6If($vPy4U`c%$OS3fh5O}Ndbb$Nk~K#lmQzK zk^?4slRdxgFf~$#G&5#huHskMTED1{9xITv6%x4wH7{WOnutXz)dQMY5TmWidN>)8 z$tX=mUq)7lhRF3qNnfOlY|zYQRY`rE%h%*_bxc3EAp2R?wu%RQm0D*svKJFsfD8FN z4Iu|1Wr8l3{x>5j>*-pjiiEh3iG)nSkkJP6!3h{Tbu3L__oD zqo=rf=MnsD5C7Tk`~mj&_VMYh2l&a=+ZfLSs@Vj;_x%z#`RRTzhQh{+w0L)N;_U^J7h?w+Eq^5Kv;d9_71~XVPvqlR!(jQ zwt)g)*fZ>~u@GBZU&DH&K+PCQ5E)ALWg>o&I?LF*OwUUVlrLr#@_3!r7lYALq@U^p z%d5GaK+PGh@pPJ+8>6Ax+z7v}T_PfyO=sBN-9@+G!)Rw0v#H1G>N=K&os^j*(v@tm z3lv#&j|S0|*u+!z%M(FKz|Gq?F`JBNAFQklarxC(aQgH~%5e31H91{WCXQ6s7Hch| z3`O~WHrmFEtzC>`{iSyd+pn;@2Rz@Iqu1TV#?dim(>XmqLAR}gD>jA3cE$b*c~W5# z7)2FKcI#0rgIlmqex;>i0x_<=pyqn*uc%w^%xKznV`%LG+LIL)K3EE4;n);oEV5}l zg2Hw+4cCb{r*5IJDn%1W=2(2R$W9EkqZy8B_HNtOa;`*##W8n={hmpILnGE5z>MtIHny(Qs>W$M~RuPG|0wggI~oLwnWm zlUmV|tyyelr}0&(8d`C?F(sN%Mq1nfo87L_0l|<3|15vD zs-$Lt>s645EeIzYDdeU97ax8hm@$ML-4SeU;P@s{)k~yNi9kFTNMEE9!zuFxpQ^?p zRea-Zv&D+wdnsYvP>olo>Qle3-MtaPMV@c%;uoLaz_DY8uyJG+SKfRb>#H4#zc$JKTr<>cv^p=dg zWFYkVeL4`{xpI*{|Fd6yhHt%d2~lUquta2ylZbV!YZHAHjTF!NBhF!jfLGj{S%XGR zlXZ3sMpTLQYfhBzl{sv(a4Ds??Yqd3@+4=%xR~Ir791$3 zxE3r28hxTDr)+y{GSHE)arT2L-$N=~v<;UXXGoOHLF>|7hF^z<^=-qBuE~Z8Jj><2 zc97a414Yy>ILQmwT@)S0iuI>B=Ly;y@72{Y5?qy>FlfLk-yde~&5SW}!38nM*~N@m zy&&-XK)Sv^=wNf#qltaHW^*#ABl*Q_Ho=R{DgO4SS8?a@Hr_mO6mOi}z~d*6@xkY} z@gx%2jHmd{*WbYT6Nm6<^97!c#%O$nSI(Xy+1;H4{N&@W@N8#7&wuv#IyMe3V}G>E za-R~7p<>vjMBAN>EIJJibj0ar5?_K9MrXg@C32d^pmG|{pjB0-h==;5E~_oPmk8VPrul{?%~yY`1l&jYOPdIzQ&~B$tt3tCNUP;`^iBJ-pc5 z#P-$}2c&AsaPIDo(CegC81L=j*^5o8>x<3mW8rS?9^?G!lhnxD`wWv7yESK;p!Ow= zk%G7hoe=f<&Fi-?91L*r{Bc}7e-0Z**HAf8X}7*$-Q<)uN|cd@2yIx|jnKEE}Iphi0mj>@*z3J1N~u9^M(Z)UBy1)H#C zpcq?Kf~hvjA#>guP98Pe2So;d;dA+xHaXO`uVHOs2Td0F0-no^ya-0;1!Mn7a9-R2 zA-D=^=Qy(_2WJ$`gG8sV*X`&g7H3Khzgz>ABS#kQCc;`dL%S=5psfdw(TVsE>?wMN z0jw+yF&Oq!13MD|KWNB;m)FPzpj5-cs0J>A?GUx6I5GhXR&kJLC?R+4=|eF8IC3fq z7Y2JB%yg^LF_3}m7-eQEy?}vKE=CZnTW=u&PR9ThkhV;g*1CnqD30c3FGIm!C{u}+ z{i>+Mf!7nI%LaCAP#GJiqQ+!4Avj9xof4Hi3mKH)jS(Hk>#=wze+Q z*|HX+;ZU>0$Wle2Do^qf>JGtIJZBdwrr%Cb*&H>KenRE`avU|Sb^h9l?ZDS>>Y241 zlwt`Aak1``BZaT6&?xziwH|AO8i$v=*q`iEZNSaDk8$t8BV4%@DTPZ?-Qev`mKj#3w-ArZ=qAoaqHo8d~x$W;JP?>;t<~d+Ut1n z`~`ORX4oE0u)H$F>e7JNOh3PVA6IWZK;tSbcO2fha1voYPEBl$-w2a9m+In z*%TGMquI{%TvWbEOre3+UI<*0J!OU~My9ccG8#yjH1o3w2}eL~6b@5bfR-bXQ*s&B z8TZbd$$sJ-Pp1?5+vesL#^bI&W6Xg1*^Fukj~rg5)*I1|h|B!s@pEOnjrWNGG&GSZ zbx07#F!#9s@F8Z+94C(-MF%wpynX36$iw-3w$;41qv|@cI>0yI`#O#v86uJX2JWNS zp}jZW8)H13VQ)0XXgtPbJWjJ(Mdz!p&Irdtk|Q8}7`X=}fj#P4kxuYI0|yHn0|)tF z*8VR3=*$W33K=^n8}`yyX}*?sDa^ygYq^(QzE!*W(qSBAm+H6!n4QfqsJxvfF9ytq?ZYTo) zO!h~k-jX~@QH&TFkjOhRan;-)v~oF$YO_g_5;oMZ0$ZW?7<*W8IuJ+&u`)u-({C5i zp*^>GVhfdNm8H7lV*ERf6t$xPI{p0o;?N1s*=J|WF#ibtUyWXK&30Dn*Kd=962fhR z9XZ;PPf;U$=A%j*f3TyxaBWj75lj?8E-wdnT+6=eQj}>HQoomZld2tSrfQ{HiBPcv zr6uPY1j?}2T5BJCFm;64f~3!9iU{eol;*x>p-81o21Y23oz0v};3DKR-f>&Z&~m_B zq1IZ;>NkBIpggj(bin*;&$2ApIr_+Ov@+kFAtOZ)AWk~y!Uyn`dwzqq&yw<*Q&Xp zu{;Ni4Au;T^xUUOdc}o`<)!IiwSN)+@YxMK+1kfwG{dK#-@=*WN3hiErRJJl;P}xs zT)+L0GGDP)<@%i`c>Ur@9F9h#tFhLv@cs8Ma6`?(#VdmwMQIF~|1y2pj7| zg7!sK7_$cBFvH0c$8i4aG2DN)i=Tb?DZcrQuVKCK7*&w>5*2ud1lNs@iD#0O6isdl z!iYqIEuSk&|5$xr)e5 zD8?YVMxm2YQme$+7!95Hel+A)R+iC=G|t*&m(M8;dZlbrl&hFA3$sS)gynvE$hKJv z?V;;gk8`aVOheMZO>rrE6f8m0A|%DazV#1=aaAGIY^YZ)Xs$I9D_(qR;@z#uL6x(K z3|j6DMtAg$xSiV1Nm}-aqNYr-OHSA%ro-Z%YEs5BGEIgsgNp%@$T=7r4f|;fXVCA? zJc|reYj?dsm1}BNJej9@O;5p=8bAHy2LAmIJ|t3uSI?d#<2X{%fBeNQ8q4}h2j6=4 zGKMwqbY~Zx;VSmWV;nxTPVlqmyLdPuM}KT>Ks4aJZlAIeNe3lEoqE+l zY5-BxA*IYPJK0RcvOeq*nNuWgicG4~C(kP3P&E2=Sy$Q6y~$jZjutd9qO86ejLpk# zv}mp^p=)|WG9giVejdqsF@x%y;g~9CE^Ff)CgE|opto>&5L&-$WzspJg|}HZBMVl3 z^Pyb?qbVadPvr-GKErIhPXVFfuuBy0vGyv?TdWaX9S(5m)eHF6``^H&3+D);8iO&v z{Q1YYd+z}rKY4-YFJ53en-DR}@{tYn`$L3giU$v$V0W~Iz5M}}hKcxy=8v|SG}{%5 z|1`R|wK|+djc;DMcn+seZ6M4>e1_DNSsab`vAwl}z3~K-@hn5%sYjy`8L?TUZ=($| z>iJxO!2=vT5~nS@JjK~>UN#d`I$EI!7sy{l_U+GK`EsrQXs4*G`EZa&RLFt}K>P~3 z_GOM|+rka4&)ejO9s9z4QuK?iSJ#;Y=4Bstd>)X!;940<17*#Y>H!nMd#4lo=#UVE z+rx5p~g)%jj3Vtfb_rtoY^vJ zOkj>ea}CQfm?)(^_jQrc5PMoxVL0ewDb@!Bsm+4%yjt_F!jd-3cti98P@qn&-A)5X#CWef*B?9OKJ%^c6S zN4WK16Bo}M#bi3h^6)Uuo;rfx``!2P`4_kF^u;FDkFI0$*?nwpZK64Q6wW*J>0qCs z=QMHf7nOf%;otzeJ=P;Eb5(dc?R61V5}JOJ0Ke=6WF!C5A~k$sV!( zbu~GxDVtlXgOU$u@wO!+lb}?UIAh$*9A+=oTx+CjtAsf~*PI2~xixh8-J}mZ&OSqtd=# z8NDLVW0zZdFnP<9&0Wl9JDBWG5^Rl_-$vA!d~0^JA=% zlpJmqv(-6)ELH)7y29a=CHg5$dIg+Hm=;cp-3WYsHL#oUMcm{|l;; zt!xN#MI4E==Fu0QOD!ex0ikPe4-i%DLQ*4;ygaUo?Ia=a5q+9ZmF(1O#!=6#eAd|g znledI#`Z`DMn==Mc|&z#@? z&BwCE?^Gxf2Nw-Otk$Q^gY{mMDZm**qu5AvVnkjdyh_Z01U!$?Z&ge-b5n|$nICJ6XDFjYnGOy?lun8j z-Ifcn3Ov7kK-(QtYaE#N2D1I8Prr`#5D&Rc#tP?j$zBD-pd8j54EXr0OPV_F?+=2O9O79 z?}~7wjUy{5O0AGlpCGJNg5srHG>b+ILk$bUMplXx-0_SB4~{b(Y5gyrJd9V*oxsnp zKgRAT;N#D(`iKnM-!?s+}W!!Z9MkI`?!7Y3AV4C$4YOGm8!zgwRODr z)&RSkTe$!5G1dLn2J9+$BCRGpouWfhMi~bhAIbz29^RtA1PXHvcy%Q z_RS4>b0kn4YsuOXv5HFuZ8Cxa`uzdzMXD)`7jD3C;p80D9X5tKj+)-CuOFi9W_$Zs zBbVgSC)pxs8rPwz?sBRTRBcwW7et?{D$aT@7re9l#B2+nho0FA#emCd$T56SB~2GY z0*=bzp*7;BcE+L;40I-JF|gTPOK`)OAgXVHb$6#lWoxJbyFrIX633Hx9&c` zpZwVmvFjZUuMctd#97>b^awxu;DhuzSL4W9A6Fu@aJEN82dis`@Njb$^p2Xr4Y^l<50l~yYd$#fv{Euf)zu%*C zKejM=`g{}HJ0m7@N^)f)C=hN^7^hAq%>~1nNwsM;I}ugtQyBsi57i9kPr=4Hw|OW7 zqk62jGGSQ@0amb;KkT-2$7C^af z!@IMIh47O(`o2qq8^hQv)6Ga|1i})(R+9lRONG1Kf2NXpA8)YyIucP_wMGVm5jn07cA2O>Kw@q*EjoHDMPjNH1T^Sm%iI_EEo z0OfE%QDeY?2X&lWDI5~X%zM`9I*VbXa%&V#r7=0DEh8#qg8(oP5@kM-d&XLiwD+m8 zDKl7wyc|06#71XeF@?lt3SP-YIcE$cVY5Q&HyE9B%6@UJY2vf=gs~?@%P?jMdFVc8 z7B93|z_PxPhVV(=qVXTUv)b?CyI;GE8;@R4M&Q=nr}*V(w{iaLQLOa?PM?=Wml9%y zMAA^#T@uxXdzFEa4?ZuPlI27T&=R^zt%wiOlsWB-x~gFf%3RZw-jf;#n(Hbx*A2|^ zO{7X-h7^kGN7!9jkD8iXSBfwY!$}4nIAWijz+~9OtXG7~24Ono>|r{0axfx4l`!V< z?x~m=(#v-BI#;evaQjLfD$xk}yZ{r|BpoDj9u%G~hJix2wGG)9K^S5TZRW`crGYlY2)eeqhT)(lC&YECv=#xl_k4s|2n4y} zO^H0~GTYJ;A;AjfksQQ3O!mgu-rvLBN6+xLKllZ9cN<)O>k>|{E#ZsnH}UgNzoNRX zn3#<4#rIylh$E|A%qCMT50^-{%%+>D{1_)s9L6s``V4m;JxARe;?k+(c>Cg6EO!$m zJZ8W{x1)VNY5il(PSdVEPsR9^59)*@7T88Jys1udPPIq`(UsOTs`stRt_&1WW&^5s zbPcV;Wiw=YBxJORN+tK#gVD>X)=)9iVMx8+xF?;$!JSu~Y9GCwoeRaeVfPi+%!RBA z6jILnL7NHr_ zc`pvLpL4)5cr86h2f9Nq)`(F6VHwkDgY&07{^=k56a1?`{y*_-a~r+A9zDzY>Ke1T zdR{Z1Nn2z&)pUu(ThU%k#dV{}E}lJni1Db!8aUJ3+MM2njg(2{g!m+Vw!=uW z2*2Emdu3-ElgX6JbU?&UGm=4G8?Ea%PKMLpOh7fCu*Kppy!R_!_A)QKq@6Gm+?6xb zn1O7!FnpX*1MZ;f>2>X|F53^quuQ<$?k@=>%HUhkYb_q(bE+1)d6S??672PC1Mion zX)^P2@JedrDwnUEY2&l@mfsx_0l9oA@xeyLX0FPEH}FFm3}+%L(>yb<(-P@`6C|cb z(eQXM#ep_ps!f8H83>6tN+2JZ^#9&C3=QLAopF3%cuFJ+CB@aTIb$LUkV18P{kDL$ z6{#*Yv&=~V$QeOrr>xanQ#PMfWS%o>Z4X~-#T>FxD_0KrGa@_f@fj)7;#)OJWGrmp z=WIl2c$*6-Yf-6$vyqCNC!vqU zwRPyD>pB=uCnN`AOxCrGCJDWl9${vp9I^qF4>Yd-aRGIxltIb{A_^!%q`aL`rJsTQ(xBI5 zR6|w@sx(>(x3X`T0|YM1Xfy(1FeWuM^?4|!w+YyQ5x+AT^V(F0=c|2K7-h|51Vl*S zb3dG*@WCAAl73gtP-Yid9f%W>?$`)y#5snNRfeF!(VE9Pv{z0Z!8?~u;-{bAC1>yF zpWVQz^JlQW5_QcSm(HER)jQ8gz9R&CZ!*CbH}2!L3n#F$+{5yGiN?IVw2WS-j|UGQ z;oj~x?mT>m?|<(-ymj#mdi^fCgH8$<@VvbB#zk!W%`fp}XCEJbaTBjyIED442>+aN zP)pV!kv7y4(PMb0z_)F1rsAf~8cbk_1!XZ=*NU^0q2CpwOBt=e+5L*)d%`@HDDZ{R zHXn|a>LY>S@VOvRDCZ4YB9S4u4lo=pq1)X~V=)=6oGl1O)dV#F0ylDw*|7Os`uxd> zkn6z|=4JMmWS}Cwg){x*g2HK?&YP{Pu9(44BHY^0o%>`8{k9ZmrNErakTK-vAji|_ zWN1JzorzHo))E+HXmz8ro9mM@@{Xy**-)Qz6I!Cnj_cTQ_{P_+;QZO+k%E(I!n(aK z#?yd5{r7*5(e^I)1T>KOmj03cZ(zu3?D@61y@j8Acoo0=WgiVouPu!qrj51)T_9aGoAdKb8S?l4Xs zT}ACA0F|=ck-k0Z`Drsn9XiQ@5vEC9Z?C$~>6=NXL@4QuT3O6BKnDmcoU<9$;AH)o z!g|ufQko%KJHZ&q-ki}zy}GrAnUBcJU6 z`8}WS(xjQvg8I2wzEU&17qCp6LBHcdVMNgT{caa0Hjd)I`LF&N{^(!)k62z=!E8Fl zy?b}C)EnU3tFKW8797|_$mBY9|7%Y_ms*$X?@cfsZ&PjTU}cE27tZ08^XD<1+#nX@ z2Tz}4cYlhFBZtuI^qBrXHR*QTQ!H?1F_G!iiD|W)+JZcJ_>{;uC@IAUnb4FkWItRc zM=8!&V-tF25rxm$@BwGOMgIr*>F zj*!5Go&^F?7hC2ZF(!RVTS#U+h?cGGT6$G7#~E60#;xTt8WzqUP!Ec0#tpxNJ?C=x z!PuQ4vplLl61Z8j2uZC5Q#P1|rZLxmh;u1Q->ajSqA?)$oz(J1AQ{;Ijl8qD;_i7z>PP&>mrQvM7duM9T)L_n7Eqw^< zh*?CgjSL05sqB!2BLAR_$pLQ_+srs}2c>$`hwRK4Dh)A(YbOIrD{0W!ZOKwg#r_?Z&Iw!na)lB7b9~E z4wyOl+6y9M1C;cj{ql-6cbZ+$UB&fTIr@!77>PN+pmXSr59TWqM9Osh*J5%<{r?$it{Iq;>h|69lG%v z5hfUep}pGSd+)!A|Krd99$(yih_7xv!255Vr|gBW<%yFM^&hcpc>_l^@f_=)DwgiB)2s zj~V`G-Zc$nRAW7(wm+HaTxT;`+ zLXtTYque(3RwL8w6_fEb=rcCz%ABFtU&$EF#8OV}FX-pg9^hIeIRobkKg~v;)5w6? z8$}cDpaUx$e-0klL#aqAI25pUSEaQPgo>>Plszv&t<*max-X*+Utd|mKmRX&5C7eN z`(I-z_WJ7pAAIl;{_lVDr}*x7zJ*sVU&eHQf=;XvwM7ML%kUWu-tW=&>v(+dlTYx; zC)cny-NVwLgBM#PoH=uvVB@pdGa{XdOp8%(Mn`Nw5JSgh327fI%#73tCn&l}uSO>? zLxj!w?#el{PJ!cR4_qTIa8J5E!@?y~->Ie7SZw9s57fjWW2J?AkTKy}|NZ~Z%Ld`o zGutd;D1T~j!G5L%3H%LxFpI=8Z>p{@KP-oRJ0m4JUVM*i092Kvc1n^F@n?jG0h}nR zE2(uB-^S%H*?lCo6S7_=Crl0_RZa%lr4Qsw(gUIC_1gT^8hMOM7D%8uu*I3PiYNrD zEabc{8T;Be(d@LzH7nhqq{C{7xC&W-*m-3nTy&8YOHn{-K$}Q@1~plxIaAbUCtHbj zvePC`qRgo-RPlVq43$l0ivs2UtW8=dRTzU=J{&}A%JZiQ~$BSUq2w1;88gXP#yu28mexChj|nv{1Wejz5Wc|(p5*&gh0 zY12*aU6KgWGXzCon*=#==1>%a+-zW->Y9yqpOnr1c!IhUFeCyPUNMehMTe58?)8=y zmTA|@ndu7ZG?ug1QfkGz!$8c8aM-M;9-P^>1kV-8Rh6B*6ezJx5rZ1*M!51k*@%&I z)EKij?-O1>1wv}Z$|rjIUVljYaXOx>rI`c7)=@4G4uT<8ETcY|cO5ohQzF6h^o0z2 z2{{O$DoP?q2CiBQy?4mYirO;bV28X`o@-uSJ9843PT$3gYqzO!@%8KXaA9MJL(y5N zDqKE$8h7tKMiV2m^9G~6F+RC^3-7%3DrS*ElE^5cA??wr8XVtPC0I+$rp_jFbm}hl z_T~f!i|B$bXPn--d=`K8!y%qM-^WK^+`?tk;@IhQ{Ts$;Rkj{19G(m4FXFFwbYH}6rCTOn22d9j5H zub#!*Z=Ax(jU)K{_7m*y?V?*d^jwXlUWG#|O9<0ZBJXmk)L=56VrzGTt??A2S;|hn zdFc{PY#c|J@252mD6)VRv(`$+T#Ywwuj4t$o6!P+VZjVhBj-KQxa--f#)_@q%Enzg zDIBYSJdHbdZsN${Bj^tXm^YIY#M9uNQ^p-CkX=S8IrS7&fk~SQ0Xd|HE+H5|K;V1-?AIz+J9MqW1_GN zoj5isht`8dHvC@pYMYq)(~tuNm}@w@8xPzU;Ez{&eu<3}7;>MG9b%Y99T-`VJIt6m znV z8?mA1jJuS_uec5%J3*C3Yt`da+aSM382JL9TncF+unW#pz8+eNBg2=1i6X-o*!dcw znAGr4mZYGEV&R+_$H?9{%ddOs<|(s@WyD2(q@^v2Z?Zw&>f&vDFs}bISq}p%J0KSE zD_`R1>A2K+O+WjcE){`CMLe0!sb>sjziM{+NeQu071uaMiG1n_6=8~ToP%y6h4GdR z(FcZ88HPAwdgmzHkzpALCmfqCdg&*ohFj_5!Q5Ak zIkcAAp6(LOaX|wSqA27msb5e~3hMN+6wMU_L||1Kf!8I@{la|k3o?}TnJa&4VR1!8 z%ds}B)9WNSoZ|xb*o0H$PO|4O5uP%L0CfV?XQg$G#_beUgpx$VTv3Bwrz<3M2bwB> z$HE4pFiZu;KfdY=!FihUcZZbk2kT>TgU2B%B-F{b&P6c&YnJo@qVm5iM2%)Ceu_;v$wmC zIvU*MTsa(C9^hN=y@5ab>yPMq*X}&WyO)ljU(euNViK(^EH19WOlpoK`^Pl$oIQ(9 zVu#5*GSpA0i8K(DGpnKta(f4b&gdR1>wJZIFEF7}T}kgO&shekU#nIA8_bgf*6XQ3 zBQRKjqQd&s?My?k5TTlyKE=6=#$51Tb#fa9s|G}H#vrRSa4JpQY2T5dKBs^T8OQ{w z?&7O2Z{SD&@C)3&cR$rn`5HTWGyLSETj=*0-WmI5%|QCDJBX~Xd&IIyOp!!p!SK0A z$=^x+FJmvds&Pc(a{KNRZ0}FVIotWmAL6SUU*i0!6Ifqa#-Y_^tgbHM(BXB0_OaKH zV41ObwNDv3(Q||05ZzdFHJdZFxlc{9on)B>6(A&AtW%_xObr?~_qY$$_5089mp}dl zo4b3|Coe(F9pAEQZ< zx0NoaR_EXT;KwPm*y&KfBGF7U2?+-oAOW2wXWWIA+1BSsHdzgEINZ4V6jhZP1Lry^ z>(DK*BrVtm5`fk)TL?@5RdL44>loF?psZI4rX&Z92_RHA8#CBtyQqj@sxHmvo7LY= z;F+#GgLDiEITa$K?5Nbd4=U*+Ys+rA?o{SRFHh?f`+TkA+u!^q&YU`l_4NUsZ;kQi zfBsi^>uXo=&9A>h0jeMV=ttOmF~aYD|NA&`@+g*8B3dT(fR#G5=oH0TsgFPZ6o2x6 z{RMVMdpLXHEJ6%A#lS^9Ktr_m6Z9jS;?4-`>#Nu}b_};}-opL653#$uN90>tpD&qw z)g{^6rG#=73uvdT=1juE@CfAjGWJ>J^n4TKhCt%uSvDLDacFG`!(ktrTU#_9HQtT= zWJIiZStLne*I1LX<&TtJ$ji@Vw9L{BVYL>t8J2SzYz;;RbzcM&qjcq$%f~eS1_Tlt zY$gr5SF?OWg9ruE!8)$a27m1Uvc0UCWSQ5H`2c3qNg{oUvNM@-knjKp(#)&Q1Yf5k z2cak(s$XjOam;2;QNG;AD?@m)b0rEO)gF`vC>`**qIuy}8MtELG@o@W!2M^ky_$_; zg@sfMIpXGa+Ay$nNVq~IOCwfYYK;WRHf+1zHXoD)#hHkRebORYVx2peYwXhDmuoW$ zvW#Lqvyyhs#F=gMP39@&8kuqfW#RqRLpi5 zqqPw#l32@%!c?taKv6`h`q@Sqx~s0W~C;L zAypox>{X)Vz3|u60q_z;AiMdOq>I zhvH9ZuJtg@vS%6nlDy?CUy8vb`4>k-9m-H?6{Q}G%zBwFBwS8D?RA$2<*Y+5^;t#^ z!Oec9R);A5=M6XKP0bIZW2%`YtBhTKL<{@UHLwrM#@J{UaP{szJd1MDU*bBnL@bc% zk-%gXWxa-|T*-b(YlocmHSkn#m2`ThXf(~amr_%Aas1dZY~OlJbt9i&e}GfRj^Ook z$KYnbJ8xXZgTMPZJukIfn9lKcKf8*PN8d-lKHW1K%&%X*gx%c{`ojSx`!h^KgT2`7 zbAKP*&K#3iGg+s0A1l2szWw#r@#7D_z|+lL{MFxmgx45X4$_m%D<$WviJdgDJp1bJ=t7|RsP?jMvR%0+=HqJUU#izuHgdWmjbV|^| z3*1olj!(hLs`lhG_+|$99zMQt2mkvY{~LUM^(wIdjwf@n)neu;Hl>fW)1)n2r2(}MYIu5PaNFG7!C(FThq(S|8_jr(-+up1{O7;>J~bX+T^(ZBuP`8pIj}dH zAjFm=oZXK7xnf4ZbLCqUt<9YgZrpi7z@yediu!*&}4UQ%%ufhtney zU|DoYv~Nt}GuH&OQzLSp`vn1e42um2dN#W(t_w#;PGKwnygGqDss*3S zmxv;mtK%g%$|#(65Ke+i(EEzzVs+}GgvU6}F|T$a zY;c$feBS-qTln5@eVgR;#pVwF^}qgO3J`qvw|^HyG?>js_~}O<;!SdP~u77nC|L))Z2Rz@}!M*!iMB;Vh!86RK9;+)$l*z0( za~>gxF-yI^W(zG_!sN1ZBm{Sip~f1x7_sPzhnI9cxh>RjY<9&y?5s6Ep)_WN6%u zMfOpZc601oN6gR+Q%-GS#EElxE?{hR-Vfj(9Wgj`>v03(P@%PzokrB1iPT7%U2Y-+ zNQ58O^)n8Itv%Ca%pVOJG0HH&hT#uDZfGov#RFGwH8)+&S-e7TwH5)A#*}EWMtn0| zGAr5KWZ8nHtr9M>U+P$<$+!Ky~Nh< zZicF;-I$po3hDu7vo1!H33kUbitNXTS!H{uF{(fSvPCvVy$mp!ikVlKRFDsv4W=GI z)DwgaHiGyigC!c>J{5$hT&lZTp!yc)8b)!V7-Du@l%+D1Ap%v3oZU`}OXyXdW(no+ z^yWrV$CwTcr$R-ysLULg`b;BDWH`qRWw+lY=upkADVk=+r4{pQ87v7``DT)|lrpj-xX$%f@RaXW{%|r7NnzvqKk|>Ka#L zKAYnB;X~No9^>)mHb#3hT>J74mTHevr%vF#cV5NaC(rTump2HKwz9m6FRtIfjoW8& z`Qi!kAzbL-{JGQkn;-ogMT4Io!&1vw>EKx8M_51(J+MC5{mR;vz-#+Ib?@;s5 zHFkBg+3aqPB56*d)Usq*5-muk<;W8pJAi=zhJgf0fIP%cc?j~5rvT1F4A_nw#~Mrv z7O8=vC`u$Hks_OHlFgo{>KeO-TX+7)b9S)SUTf{O&%I6OAwP$zy7&Ljf6m@(ukl;o z5}2UE0HgGj1i`K1aN@`qEfYf2DITZ3I7Raag?|v)S7Mon*6cgU zQSJ0>t~w-^-o(*RF-tEG$5z>JHoEFKnARg`$x+p#!cgjxPL&U!q-x6$;x_etwQ5^5 zeb#1nTZo_0Iy8e`tRRFcUS-d}=|}au^djE(F#W0T&n@b;&17^?MCUV@pXdA-BDSF9 zz>|+ZhO;M6@(j6WzVj@;^rbK3zx^NnJ2cA{llc@69^7RDjFTtNU}tBB*WSF1-}>#( zqnhvI+Vxuqy#bD$IF1|FZ(?(EhlhdF!23q3W4%~oHl51jv^>9ZF&7yDK*7nI6ixjPX2kVr=Uo`Z^5xUC0$VHcH^v0W!v>jwH+PJ-9JIjnJ) z4lZfndKN?Z{T?aiQ4j~Mw6AJ)AHpw5%>JG$1bH-sd3y%A={VNrho}3WPE%jtpx>7s z>_+;WCAru^^c4H!s&zeG6u-C#N;NEtm3dQhVAI*X95CsAy9!Cjiwc9dbT>OYfVLhE zhAZ)m4Ul zHLV)qIx$=MM1!#pbaHt`Vj)=O*<@TX+m%{1@EfXOUVP{TmhBQdvn8(HxsUbZ>lm!8aBtX?k6y;cgH7DHeV6+Phr>Re zeePA9J$nj)hb;#jUq8at4I-$a>h5ed<8>Rqf;^Mi}_|OxN;LMrR zc=Fws@ckEF#|y9C#Pct{j!%5#NmR|0_p?73a5aN^^k{wRMs%YjP#99%Q@E%EVFK@= z0Ei)1ejQA2=?RVwz9m77?6uhqO|;2agbLl{Q?9Z{`4T!uy?%}H$_g{&!3Hsi+>nDL zqR7A3gq0;vP&y_ak)RFLfuMIQm@uPcmcIZvCn6Lw!9AsXc3Ss68Tz#|Yw`Pk`b~W9 z^IyaxmmkGX|HMae=FAB^^Xv=w>YsiMckkY0$VycWWadw0HmP5$ZIQG@beY&nhbc?X zT?{g-u$7S+0*?(TJCB|}Pf}57^EJpxP}C)z$LU^+jjcIey?T#lYS9hVqjfxX`4Yy% zQ9=$VoRpkx>U9-r`nNZB@ba|{tgH;V;!N_(urTWF-Py&>dpr2St8d}n=7i`M8J_&+ zjl0;{+{Df#L3mPZ+j6Cc*axXEtv?=MvOC3SIA-QK(kGO}nJyaq#WT<0&gLGfejmq= ztm5366By8-c5|$V|*Z7xD{JBJ6Y4@FtkNF2a zahb6e+0hTdo$VkAGt(oLB}*PUdkP=F$c(xa1@B7wMUCApMft+lWo zLTBu?4K^Qav+i118S|bKvZg0V5rtY)5@~fbl3i>QT$uWR+NJppJ_)3=yc&V+Hf=f^ zG_1U7((ed9NpdtC_OLP>@=P@9SF1xhr%f-XDC;Wq58GDA|2a@qVYLpvO2P>972d&V z3x4lQkvJ${g;+(~fB)Ut;qmhHBX0S?zXP(vqHj1PxG4qJ`8D}rOXBD9y!a%8$-mDm zXk|-+#59rw7z~H$daaui=6p!)S&yQV3jZ!jPna#LH8lqp2pn7=4TyBeWco$vsz-lN zW16F4#*K_YIQX#$jn*~86W!wHs+dvZ8qr2&tTwQImP7|^uoP9&?)%EE3In&Je3)Y@{xTZyVyh>FjFkg z!RPJfCk}gAbik^htpZ z0^_@B5czDmWatuRL#Ewd(gR_p8-XVJKobU1R55rVq#B@35?A4oGBG)rf>kW6oG#^$+Gn!M2prVAMTE5St_1lWzJ;D5K7d;vNucoY+LZ6iZ zI_4yZ_OK{(AOy;sEnLWdwP*Jkx%A>7CPo}t8ROCOXL0TBJ>1{f$II95GHv|04mft~ zG%lSxi@WzW874y&t~YMHjW@2{!9&MaFzi=YAsAKN$L{_N;~KcPwT;Vlh3(C4G|Pak zy*ZlY6xZIqhnHTxii;O7<$xAe$<5~>{XIcG zsmI2xMdgxy4vrh$IpOMJ&%KXeri&%dsylz~G)^2HBQEEB&N#bEBO5}Cb0=4D^5ikB ztr2m|4tcsv=s|XZE2|M$?e{RC%rFtmG$~QEvAvIf^B;Z}qwx@{qk(gJB9kXjqOCvZ zA@rC>lC#To=%wlq`grNJxA5&Byo4BfSRW5@_T&*}(j!=CU1^XFW}RfYkJ*`0Q&R;U zyxy2>s?(&uSNW>Mz8LbSO8Pc4rIXkyEyE7NsV#z-w>3h39_oJWd>2#n#pX{K=nu1s{3xJvephB=?Jb_XjWGy+8Kj zJe>LEmtVo|?rs{R)SL5uF6WJGX3PEAfU@3#gB_|Ex2@U}rA1Hj*RZrTffrTN2rAu3La>qFF~c$;dj1E*D;_z zcp~1B@e)>Hta@he(yY;{3<%60I5ZSFG%zcWH9vy$BIMjvA=?LE2cs&B9lQ$>OPM_U zj@^|!`#BExt&56csRAK${e<-y>{XAvJin$||GLVf5q_ za?nG$Sd~)-x*+PdS``Di$=YXkig41$7|0coA1N9}{-iV0%HQQ6GCHH*$t-nxU4qLz z>Tt*m{TxD5UU0TnXNkr zKz4rG06%Cz>4__^z3l$8qHi6up7pLchOVUeTel(|nqb|p!d&JTN%=4!TQV6}D{GGM3ZUr3@+}i!MZLVgge?$5%3e9W|YNhnDZC-EKfY$rLSCcaCX$d#|t~PtI9RBntAV|rB%?t=U9e*M!ZAk%$c(VO7sjw? z>lUpd#{)8%*)3c_TXiu~w+AKKdP-K;C+i*0- zbZ?pZmlZaz`dPkE9kpORkQK9XE~UB@>WJ5`-ohVz>1!OMefDqs434f3@xT3xU&FVb z`9ABa#GF;>w5aUhn#UDv{*(^SHa!t?FlcH?6F7c0jUIi^N2Pn^D)7n*t4SnYLnMgR zqDcdaN23AGojr-8>m!l>N&0dY~rs@z$MN`0_WOWeD)NU*p{I zb*xh$r|1R;UDE1>22qy8^ynU9*sHR?5;U(9LJrKhr_nr|)Z-{Jm&@!v@XG0#vi~Z} zmejOT;MGP$O0+TiRn~8%H>EOTk&~qfa~p==I%*V(Z#^bx#$SM-u2 zesE4{Y1g$p=m}1w3P1t&aDYc2K94h}j$=5e@%HVTOeG)h>|uTNC@x)m2uF^uVQ;#F zpZ@uu!G2R=XJ;Qr)@a!MlwpTtSL!xZsgv1ic)tvdvRumej7In~YEJId5)^Z3m6BS?K{ z{c?svSU*ob#OmnAf`}tKVwxG!%9z3h;G8ryzUgMu`;_s^GP1g!?zXZ5Egj+lR;mAK z0E$3$zgrVdI7i&W2TP$VC(--eF7U28Bvzxlykr`c9y~ejc?u!cd-Jd#C!jy-6bKDMr@^8I>NdsHU8$@jqw6!UKwOP;ltH$t95p~}+k>JJlR?sOkenm~e%XHL&xL5G z(x5ASE<_bQA?h}&;#{LQS&=Wbxi(H|u_2UfZt=WYi7H?V!P2t<+BXipltcP+@I6#`#ke zOw4e9Ya3zE!_L+Y?rrVyuus0nMZ-bWORrqR`O_!yz9%k$T6<2cui&NKEi9)s9{do% z%QrbNYtYB`WQmiqT$Nb2QAs|{NtFLkHH-!jM?p@s#uS)mT58bN zh>oa4E(o$o(7e6924DZy3wZOb+xV%ce;n_+@-Y6NfB)O~i@$t^skD0zi>2~r67I~7 zCIg{^e-WMIB96J83mB-~2A_@6R!)dpNbef}<-#t~T<$SB=P+q#z7hmgt}180L(;>nubrSmul9#4{9TsetL(=jR& zDcH{=JJL33Aa0?ZS%<>6fF`!voY-h;^0k`l!1dH$i(GK6`Fn>Vj>CG;16>1Xjz{^>tsXzO2o^~?C`AAb!mynYoo z?`~mtQeky%jKy?r=f0JJ*v42XRZen-sU-k)ru(l2+8YHjsEqUKvl3i(HlML9u?`I> ziAcSRmoJ^eQu}0S6iXejwY`zXMMzLd|5Mvf75%|*#MRuMFgz2*M<01ORcsX{WJQR)KiyY$9}9232s*sFIPfyP+ZnPP3K0<7?F0VK{S@wW z$ia+#IQ_aZPsgVf%49w-2b(Mz?CKF{oQLh*~r2}yv9*maLw{o_D%?>DV-f6w=x zG8EalGsD^qh+_U(!kFh?ii24NIK^AsL>8#xoz77d4Qoc!WvUB#C_ZUUkyXI#cWJ#^os&|hrfRE9w2AP+H-1t{i%R-b-FmRSgSC|vF4+ej zmYRm=CEs5&qf3^{3OXkS3?tI!TALLnL6&#yf>Z|#?~G(nE9t(}Dh$7;O2(To;|YeB z0yK6m+w62Abf9;!Jg9J)O(oQ*lpW0$v~*B|Qf3zh+F_t2nYGGvN^E5aYYD~>RC9((nB3uz%&@MDI5E-92V`fx)&8)oMw&F>i|>K@7HFt4QEb1xy^Xk> zVaj`-=HE>x6SRvNHnxE0UcHG+m(F2z*vF|8>#Vb;^Cfn+HqcvH!AGCCi0$nOszr^r zuD*%)TpHrN?>di@r_bPD{pRm8wB_8HleqcTRct(X0uP@#%Qw~tBqvCgwa;7&~aGgB|#a_m5U8N@ZR_E46eP|5{vnq!|OU$*|sB91S_os%e=Na)Ok&` zdfEugZZXAz{x_fDv4@Z1eOFH7)i-YN8xna|*7H<_SY2O3Jzl}vOZJMfH(TIq-}pAJ zUcbW$qw~jx_~5%Qq2KGFsRulGoglwG(L1%xsY|f)=ng3dJ6r}yj&h}=8rp`5X8b}2 zslo=41FCLN-%-Cxeg+icYaA*nRXKofZ)E_nA`eh2DO!g2*WxD;EAl#x zO^8c0i#aY_xPU8HF5uc5SMj-j{~L^6>4yf#PanhPcb`X~y^b@?rZa{%oA%acp(JR( z=3(U2i_OF`a^F;;9Y`N$6y4b8>xtv9Ej2L_4y9rA+^{Z{tO~0uL+ozvqB(h#`@jj_ zNHEGHN7gxk))Uw_{k$hSRui7YAlfcFgWe(SIlT3G)CHaAt(`sg2Z-2<{s#%zNCuhy zJY*zx3AO9y>JR!9=;)IJFD-spTT=dxt_tY}L7{UE7{aVAKM0RvE3acohENj0#O~+) zQ)m(d*@r6wLg%OZNm*8n<7CIY;j{}RhJCc4(N|Y$)^-TEL5HE?-Z-NU5z%Z z**nFtGw(rRDgx(tLTh}HiW9f zs?Kc1tawpM-i zk*Jz2g0O%iD2_@pLyMHTZ7WP>Q!MM6DT@1|I23M}=Uv6jAd6ra@zxPt8gW(B04Ohi znG%v|3so?h+BD>}6?Pm)YU7|cdXix7zXr!5ZAynIkRodftl`}>7Pn+R$iIrX7EZGO9Kq@*6Rn(4E9pmT!ObuY+??g6Lk$x zqsLHpvupaj0T>T@IC*phKla{7aC8)m#yMy&s2D~Y?5WIo7Nkn>D6knd#Nn zCcUCdql|Gn+<38=F$I0f=r_#Jd2?eEH}5{ct&LsmEr9XrfGe>?G=QqXi?3b9hu`-I z9$GuaOr98wF`F*9FM;}IsSlDWRsBW4y{%nLXA7(iXE=TQ7&{%)**2E*DaK)jJ8!;@ z%O_5yfyt8K(Ll!sEm7fEQO`%T0jQcJV`nc&0IJ3Kgbj2=NDh|dW+%$%W_}Op^+udV z?vD&nl6f}yH1*mH`W7(cB#1hwUPG&6;CjSdPnu6o_#{E_6hz3>j3kll)YohhB(y`X_%JKl!PT;R~PtT`ccybJky-XN1};B81si zRdHp(a_jVZx;HvjbLy9A7l>hoOJ^^l-%K%|PV$ZluYtUF?v25Y0Z9zhL9c-<}Gis>r%!>=fgqbo}xFxp7 z!DcfRewA&DKS!RlBj&4@F0`MGmkob#a??3FF8QY-T4gzrKJBIma$uEl*3pBcpUD6} z{`ixa>@P4lMg52mVYWZR-p&Jj{|7H23`VHt#OB#b02nPPqx-|_)Kn}(i^ZJfvd4O` z&$_hId6*EA9T{Dc>{Gfg4&HPW6MdEwrzvN&pxz%&s#e@*-lGa|yWlE_B5gPjs464x z&}FNuV199uc{o^UCU#>OFOdyZHC9GrjK`xyIK{0Rm9RqV;zuDn^85rSHz=zK^EU$y zCegbuUuY?jC|PDbQmpto=NFb~q*$18eM9y;%UAaCLq}&HcEhmevbLsodO1X2?j6pR zZoOV338vzM77JwJDWa#>F$RrP^g}@5^TWPRS5;k#tUr21vNQWC`4HNjAAE4nl;bz6 zMP9^maZwr$sUm5H&m5fM(P0h+LT1`>mGumlQmA5;AqUoQA5qjIvk*DlJ@Q5rNrs?K zW9yVVa@4Lu8cV@#ty+<@HhHar#Tlxg3ey|&wnw{0h;UZ;(!1GwtgUacAbMSQ&Ix;j2N|jp&MlevgMX&)X%&{e;8j zkA7jD=0`1htB>+na9)=qZ334L7TZtHae9tb#QG<{oIXEJ7-ZV(RomBH=`ac zO4nNuLJSE;b#6u$gy_zhSJ34()bWfl4-3wPh;)780$3gNur}^vG_X@x)xCQL~g zYxU2w-bkbxRlhD00@-TiY-SXBZDM0|=9;un9n-cwGd3Zlf%R9;pTy?w1kb&G3(vlI z4f}0{mK?cx%L9H10{HFkK946J{pl1yR(*D`YNE1UOmOecZ5%&#ilMXTj;tgj&fMU(q6ZI9dxAa-<!~jYPR9qte!>^OtQ9W}(Xxb@DZ#|F#|0aj{^7)7GcYoz?;>NXW451$O zYYKxH%AFE3xlc3M*SsB-!r)@IacQ1dn)MZ%1?ynSFPuJkoLdCQ!I1$OoY>_mEfEpK zfH74=L%_VZ6r?5cpMi9iv7XX-mLWU+9`R8H2geln zSLNly;x#9SuGN8Flw4_4W`ffGWnZS1F*sr3;LqhCslT@b7I6h*?OO?1;(0)NPCo^``iOQ z7-HGdzOP`lUO|5_#D_lo0lfaw>$v{bbD3hvCfum92giT-4Dzdn?2a{lEz1#CX>Dtw+pbZby#i`o<9gAlWq!GEUV z@*(wviEayw!b$cq2y?A(^EF-IdMkTucx=J)Lg&m`RXEZ)lULMx%=w8@aWK5IRlcJA zsZNy{6Bm7JX4(v2$QhX^Oo))7ySjedX6cj`gcg|S}`Ab{OquLu$kkvb`YB*UVVyzV*yq5K*b7#7!z zD1Op)?7Nrg-i>#BJ^V2r)|d}Rsqtk#P(=*KiT=EjjGG=9im|F>TzClUGI9lioN{8F z1NU)6tF$WJvgYckr>u^FtEOaR`>gmR=x~C;oE>7p)UfBunL2EgB^BJaz`1lK(s0|# zIaOI3#&Tus=gKgoGm3mL35Dy5Jo&<`8CT6#xw9SMl~^*&RjeI+t17-H&%a51VxB(U zE}?a|P}}dwnPa-@#X?9J95u7)0hDLo>4z+Ku{b*%+@KK{R*=T_1Pz0(x#$%h=Bvia zLF?3b2Iy#kCVLy^Jjk$3N65qV*O=G4aAw-v=L)GRl5r-O;mW9wV@FnTVs!<7^2`sh zO>k8?js!t@@ufHL!kc%nG90rrK;soot<7_)4`Xo`uH3-(oQ8 z;llZI7*_K_Z=@=pAPp?A)S;@akSXLLlMKzRDuG-^VVm_QT1k&I`>x*=T|z~wC!%vI znH3o&7}ufQoZaW&C-||~B_`AM%~?Ato19j!vYm1cfZ5bcncu?eOR2a?Z;K6>jyf~V z>m{wyH+D{`PwCG6ZT!d2{~^Y!Yxv~HK8QE3UdNyR<@b0jKpnEoY2v~|VJxX>ndJ84j-dWEPm zwUil1RHM3d{vrHe(8tTKzlCYTco#fzU7-F6r@F1*-tt1`z{IuHJll!B^s(i|E`-}S7Xc0%Q*r=k98LCXSn0lr5 zXA9nUs$5O?8?GkbxN{A=yZcn$#J8V)7Wc43)7jq)#fX`+=yA!e>6}kPWmmjmE zL_(@}T%t9&ds0~mzL~6(JUDHb^4KbF7aDmJqm>S(U) z_hsKXF=vw8uuRuAqhC~CWF72L9jc=;;g#Mt!>NrZLvJOv0?TlL5290YrNfl>H)e;` z4yb#tW%?`0m}wR|v+-!=N~mv-2-mp~y}Icsm*(!Jgx&zEI3!!*r# zaPTa>A!}CFYRSP>$^Uk3WWjxDs%UkUq-IB8&}J&!!Nu}K&0B{*I! zw9!@__2qlFFs1-PK2_#IDS4W%M(Z+JHrq?f>3P6wu->h*dX@f^KuP9>CGkiVA-#`Q zopuwQ1X+~9Dt7yxw8H`wsYKU<0Y>97!$X4# z!AJ&`+*35xKS4*^faQps8P}e9JF!}M3E2oH*>lF#hS#QR27}Og-z|NY_Ro^x9Q1k^ z4hHzKCol6L<Wam#w4irXN znO;pye2|Kj!klvReIgC;E^EFQrmvQ*Qr5%toxv*08sxNEJwalPC zJ9qBmqaXedPMto1|LfoW2JUWdsfKj6CYsDRX|td|n`aMAc0rjVWAKN?92_@OQ=e3O zj3F%ol~l8P(w9mE0exb3+u6ZC{crwjeC#9dLtHGewYQ7OQs(PXFU;yOG)f@>Rq=sXFRX)=(x|bkO-bQld&B{FHg=al}d@%bI~lB z`S8Tib?(8r{b0ty+_AL*KJxx6SRbeGG&#{~E0m%?+DMAle2kb#I0)(BwT|^qaa zpiEd5fnd;MU2vk&Csk52`9oxePIipjXgaV8uyqKosutWHGZfCeX7?S1U!Vb{CjrQP zHZ}w{AXoIPi_FYyVNuL;Gyd=_hyD)ik0>oDmcY@=YCS3FGCTe3iDe}DSS8pmjG2-k zeS`pb5kL8NRN05>X(Z-JNbh_f>Y9YY8{_K zj%8x8W!-H=;ajobL4({!+zhYMGz<$QPwIWivlFbStH06&q5HRl_tp7GW0V&LRx@e*%xN3 zX(Og{YBZd2^CJy{?6D(~@Z~jfub9QyT1wX_yF#u|=;l-qic;~oWbh*?_o@w<%}yDJ z_}+wG*j6D29jK?kyjgP4HefcoCL*|3xBBGW7lP>T& zOqjEAf#I|dJAK~tA9hl5WS{S^h~z{0eWjZn^B+nyg_5aD4@rVi2&1Jm*6RCGHd+P~ z2kmTiSwNYS!&Re}%ENu^&Ssd-8yr~~Vb}xuY9!?}wowDPmfpvOpqCBd>t%{S7+ z7~q_Asjk_BBqxrup-Ib2)xl-Gf&>n(3I9Mk=0H9u2dJ_F1wCyNmo{@!i_)nilV9m9 zIzTe*QuT2Z!nvX?O3%xmKVy>LpmSWA@yG*3bHLupv$x#XKcCH{-=og&agJz~q4G>< zFNDt1({t7eVMFA!c`IyJ>8zVq8q->{K~uS`{nvKqN@n?JZx6v zuGS`Zb#^P0TZUng;~UeADXNNn^odIxG=A<+{t}xrt<=}Je(NrF_vftCN2@)=`99Xh zJzRX~5*}>sa8JVK&K!%F)^kDgz-n?N_JtTF>n~-M)aoM*3ypA$vNB*hN)@QmiiGsj z%-cD7svp&Ixdl{5RbiPiXz;7!04k{{r7DySapr!BB!A2{D6DZBJkdI&J8iRpY_lQP zqy~K-HLSNyf&j&sD{-ZcOIOa!vsp{2%1r%>wFF|CQTBtTHOU|p|8*Z<`Ll1}8_zt4 z#~ywdKl|67#vgp~EBN7yukoepDp#O#cD965;?UD>nmxPG(RsLPtzF-jAt-zq9OZgh z(nHh)>BpMGq6)wIU;It{!q5FI`c)6Ri*3y2Q)Zq0Z(*@a6wGh|OCp)j z{>#)iGv_K1SZ}w@oC6s0AZAp(UCeO$$WeZ_WvsEezhE+gs)j&@E2hV%o}AV30PTFv zegWyq4JSrGy5{-RSCS^-E*h-376b6(@fFztvt_a5N6 z7hc6P&wL+ee)^L*zIp_M3m5R-_q`u4z5X(`x2D+K+{2vKph^ShwY6i}Ecm+2P#V+V z9}9p<$aE?6i3|IPuJ z#p^k+DfN*LFcis_A1=#NDYI=MQl%~Ke!pKoJ3Bt`G_lNqng6-kV!gQP??WH76Sexl zPxm<|z+75S3IMc66u?uWndBtNk|YQvk&_rua{)p9S+iwwlRXmBN@j*=_M?{G1bu05 z2Yr~7>h}Hw&0?9zHtIg(%}0YiXV{dQv|)CnB}et7$meZRE5wpG8!b5qtEJ&^Jn9>c zR}kw)W{@(NQRX6v5{vnuXShUbesLP_5qWSQ^<5~8NC&5N3tPDanhlvc_qN^U7?y$- zTQ%&Ck;hkUJbcavU)}F_&!RC?%zCh+9i1BWnF0H?qn9l{<7H7VTq@FoLmcfl=4`2O zW@Uf)_Y{{hDK4q|RVf7u{z>-Q+GQ&#Ji~+_f*zK}$Lktw&OWT5I&zDjpYbxlRf!5?Ko+gsCESZ+jbG`SuU- zV3GPADBHQYy@S)oj^g37$IkgU&N4xBM0E^ zw{P=Ix@NvW8yf6ZyV#phkK;0tmqtE+~8s5B+n0@JAn^Aei>t_;x$rfOAebn zd!>$GZiz5^9sKZlWwK4#Y@M-KRk?T8#>L71M>+ph8?m=Pw|$~>)Du0Fd$Sa#th!Ns ziL6Mok5SoQ*s znca7EXDyaK5n_h2NA3O8>IO22nxBvEM@jw5s{|jPG zHl$`4;?i9Cw5Egpko9FEUR#PSOnX2+BtgU$9GGbfLSs6MA+G{Kr-WDAXp*r?L>|OI zxXfrGW-zQ0GKPabk$=zrN<=bxxYHW9(%YH+vb^vaCTehKpMNJPB|pQG3n7pSFOw%h zlhtjmq=k1#p1)I|^`l+~+{27y>wb#{N#5VIs!x{yB*sE=yo?lId`OVxgDp+Am6s^r zXA&F_Ue;??UGLI!%KJra0j}m@5n@t5N&k_IQ9`vh93=Zm{*4ZV@2pi$aHuY7^S=`u zF)P&8mDEx;Snq*K`l2)!3ycQ?gyAS*X=iin?@zJ6AJG?j;?%Dp<$FZwovAVGC%)pg zSui$yAtmDJlx9EmnGt44hpb9%yP9!TVPi97^DwkQHqpUq<71!UKRxPpV`q9Uy&)@Z12r5MG8dN zDG99%piOLst;~PZpcoNm$n<-4L`B{dchoEZOsuWC>k5Z5r%MoQL8Ti{Qhc>(iSry;-$+X2pkV6h}@T!`9>suHSqc z)H$GCpk2=R8TW}&oH6V@wDjz;vK2MDcYzA3PNFkrFdhjQDKH`!Mk|RH3(&L05{Z&3 zn98Sv*QE2aM7lveYpL%C2~i;*C*83#U*LED`0IG<+AVziuY44zPoBoV{x9@IX z(lj`>GQy)*E@E#s$4hTLkaZ#`?otNVE3zfC!Fn`{ArAtq{^S!#R^``3q`~mBuGR0L zGjZeI7M76`c{Jjo9Pv^nKy!d4yoVV*aF}AT_l80i_}AU!UE$asboTPKfbt7M$4~Le zBu|7BE!d0BZdnq;?m7x2YD`V%at3l7kkQI+OD67w7q>A`e1#cVd?L?0()WE>1J$+kkQkyse3 zGReeeqUO;yEss$Wf(=BBSH?JUbRBo!zUQo<&WF?9KMB?;nI%k(=9>mR`!ce@C4CYM z)%E?mJ+<1XqJG3_r`c1){;b4uMTOia!-_rq|L0Y-0qN}_SM{>}b~4cks?2XWQ1j2{ zEk97Vsm(njAPKpw|9;fdc5(q7w>F29vHJ%74EvzV&c(#1ay?=VSHc^CoW?xnDrDL5 zj!x8ApcoG!D6Z7c0_*i*8!k{o?Jr3GS8+2q^&teA0hIb3`qIH3$C@)`b^e_vevkozoZFdA{${Y48Bbo7BE zzZN2d{4_dnv6p2*jhU^LWVl0`yO5OL5(9ERM}5Xs?@t^4lgJWAeLq}JZMNe1lZ;Yr zhuN7p*h!PnwKppIQnwi*?H@}st8|uKnoko8IZ+0Fa7C>~ zc!L}d^fv~pDoRSOV32d!E#JH69P%RimVk%geEivzm zCIS*iy9@*-{nthe2Q^klBb+~d0$1-mNYdT3*xuR0Yj0h{9cN4?aBRGBL zH1;NYc=hTnT)lk}4_!RVBnFE`WSORlZ@W@6T+|;(HQ?G~%atc4dTFqnO{LlstbdK+ zJ%n7CxBOnFOm1U_OF@$pZ4NqGue%b9Vnz9D()k*fIQbOiEzpt1g7*y1$YwTrLk5K# zHE0QoFF)pLn^hu$vAe38OhJo>!sr7zzjpawzx8V*(@rNORtP?@M3Bx4!d3 zoH>04AOF}#@gINZ3wZ7Ix7_?M=nyEE@N@EZ2zRoHmeakK)wKX0`P_QQPO&BV+O1`b z^BgRW!$ZW+{p{2Dm0$h^oH@CUelPWhkq)G)!}{6?!}F(b_RI+;A0Yijy^NIvU9;JO zp@vlXszVgptd+4IJI8c`)b}-CE-_n9Fq`f&N@jC!g4@r(g6p^Lb1+A&c=xxrG2P$8 z>sN2#EZ82LSzpJ!JNIz+*6rj3k}Yj3gVI*I9)K`-X1(c?evDqx z#FPbRaPL)EVh+Oc`AO{%v&9@Y?{5h;ytj)gp5AJkQktgLO9iG}=Rc2U>~4F0y9EfCa)>tR%X#7qi}*_h7ccM#}f zi&4MEd!Kj&Kk?~L;9K8*2JgA@E?l^99>>;)_&Bj6zVaGwU%#Em4+x??7$x>%NsAjF7DFudC9=U|sWGX$(rGFOe3Msir z@W+%8Y#l_?B~Wdn)PCggCprk(?^QNVxu2PI9r>`SqPH|(q8p5P3CX|s{}_}V7WmkH zc6$M{$eHXEGw6Z~KGi=JRE?a+;%eR7^TAW$t2&scvq9=t7ngAULeWBGd5i2j<DBBpmUeii)UMk`e%)e98EjWGEef}OboO0EvPC=43IVUxqdbXBQ)lx>e zR)`3A8hF2tdB4Yj6e;FD3uwi{%r_Vlv@jjYlr>izPci{nZtQhy)FWLMQ@{Z2#OYbVBDeQ$k@| zuz=l5PQrnz)hsum5E6&sE~0gH5WOQ8P-cMr9Ut`C9h}ljl@qw&o>Qto!5MU*d!XDs zhtB;*o6hP2OZYdqANa*6pWTKrE3L5%*-T~Kbgv4nYUKb`p~?zBFRB>^%{T_hFmWcg zqM)p0I{K!qv0RYzK1Va^^Q@^#t2+h(lmMTx;H@|tN%^N4IRagx{tC^I5!JHvEwz%= z&>2-c3=};V)MRHs4MUm@hQhE%FQFor-qBCKqOgOt{!r^0v^iKnM|l?&UL{z_LlU8+ z6e>58?bA%4!apK(2yMbhs}oK*{r$;)hKxCpJVfu8a_#5pInfDzqyg<3v0663?%ovR z@j&|Eq8YGsu2LVNR;LuA8=N;A&4?$bDH^OK&lifwSn$~9ygM8OPnoTB&02u~wvEng zs~D2a38x49XqpW?eEA}#%O&2vzm*udsum9(>|l4lP1Mb+HHM=-gdPp1UEsl9gWvwj zw{iaBL)e@w`8%je(_(9909CbYr*@R>lW^>}NtWghXfchY@lS)Y`?U7@*mHr&- zWv_A-PimJr*rT6PFGjD=bFBD1Oze@RsjBjORZnSVT6JWUIWV=1@a_>-V>VC2qS-l1 z&Xo}RanSMgZ+str@a3g`0QoV0UlEe#2zi;)PeQ zVRxP!mr*^$TUT%5*3CDW9A>^~u{~L0I-T*rW?J;~r_bQT@#D#^*F#RK)s>Jv=oxm7 zRssVg>?qR?R5d4N%U8BNz6zb~g>&f5S;>AxE4|uE zW(4hhamkfRtC0c+Tptbbu@AftA9?SS*u8TXU-*OH$3Omu{|GCifU_r7@C!flQ+V_0 zHQfK<%S?#0r~*brrXhhG`IbDWs7e*Gl<2I50TVo8i9h z6=__^6YqHszW<$PnG7Sf=^6#zN1^V^$C!!FIhyU(ZO*K ze`yPX_cDEpkUf(_o7q>rgKyl8yv+X%kOEOAi_`eRbJ}WKk?LdWO@!!`1XFGD^CSBL z8Mdoz)!8T0p#fFGvjvau^! zixOIB6C_fGDO7q$17|u`M?);?0S98Y@7={iXHLte$OybfW^u?h)GB@G=T!GTpp6W$dakqL*)A~NJQx{cucPfepGS~C&b2!cyezE zf?7d*rhE`3ldDRLg;xz`$eAU}Srvp9X%7Z5q3K9c`lBAh*(QX$Zd$C3`rNle2E3L) z$~RF~LZ?k@k!FguNjX+EH)mIpvY^TVG4@ffV`76+wkG}EP#`I?A`VUz&1oxxY+L^_ zCvMJ&jzQ2K9EmIA^eAVcVFAP@EU2JyJnrtyRZFKFgWP`3&>f zf*q?U!CPkS)u1wFc&#GVzhGOSYjgSO+Jz|BCVWHKsVIxn(MAP{kdwaV$fA$3K z-n+*EWjk-M@n8q*YrteWLxZDOwmnqK2?ng|fZJOQ?(bg1WZC0EyHs)d?ceGGGmDOcVD{A z&@{;S4+`W`5SDr`qCkvNGOWg}w;y1CQS+4Am)^LG?fqw%Nh}RbO^ef0;+R_cf$JnM zJ%XUuwGql_wlP6ag^Yx5y6)ljt=qW!U>|?^z1ML3t$PMrC(3gs+0d*z1z7za#zePX zRh-N-COrxyW>enF2M@MU5u|RginngxPf#PIKE2U+h>guH{MPS$frI3aeB}K&fBroF z_kZy(d2U-}a3dwcXibg`o>>H9<=+qVbE*C5vd-oLq6HB;++H1Kn*nC*Lk;U9A|3ks zfA3fE^d~=zUQM$R7tG{H@y>WOM1MHM#@+;5(==eb#RJ^Bb1$uDPsbsEL)OV;hGkRn znD`|n6=J~l_7wvR~^EZ|VCGU#f{Z|IW<^MTX;+`MkG4o zBO!}gTUo29N}`qZX3T4@{Y^PJm|<+Ba~5qQ%)))~Z*$T!%Tus>({p0Zzw6ENEe>UV z=ir_zaY#`ya!D?26HuAcq0M2K)nXqC*7MSrutaia z{q)+pS3%ATCnS|6R-VK3yE~VpkJvs@A7R@Fgg@F@^>Aer0eH7aK^ib5W)Db~L7iWv z!Oq#>$c#r!SVO|zwAi0bu)Dv9AsK!m){wT5V(_he75Oa-#_INE$fDq-x&Jvq(#Q$! z4N3X0VQX(6x9>i{k+oH>zNIPF+IvyCDA+-#LUM>hl*#PswpNxKDl+VOk=&XfQFOZTNuV|~S(t!%7MG0AOfh9d>tG7Q#d!yWx}nzta?N@Zb_YlL=(CIkNS43SM)X8^%;zGe%y|=1zX<)VFO}Zph*nYv zQp)-yL+vs-M0GtZ3}Pte14XGW)CZIhn&_y_4Ov_aPg&+m(`J=y+K41u1#VUn*I|riyR##Tj9tr%IVP8?H!pq8@iBwe= z@*jg&T+%B_f77{fLW@p;7p;4gppB|=>JNB$k_xM39$Rm)kd>zpI9S$P{#Us*w7_%O zh*1jWl$?(I!6tZRJueUD=>9^t`*tpvlO z$}7p~V1WJoIR_O~N?0tGxOHa>yW6|$co2k;2S*A~4Lu{l6{icCeG+Nr(G1VOdJ`|c zc0Kjcaua+ev`E>#JGRz(<}GJl)m#y&s#K+>1T7klhG^UCX#VU6wqKD+0Ei6bHfFO1=g&Qar=EHWU-d1NviB{XTZ@O}M(1hIcOvM#Va_H@2B_Ol;6L zIJrK?^;>svXJZT7+uL^52U1Zat;sMxCDsUmVaj#vVRITe817-tx_NzV6<02wXN1Ch zIz`V|nNCuYmFIqiM3xj%g}+@ic=uCR(9ZW6 zqDVwZV;{&wNg6hZH9UtKQ=7RWM{R8-8qvwrVkf!G1B zF_gb8V!7x(k>%Nchxx?j)0EdMS0-OG#%P5d2#Tp#F{uD6DI80;p?rk6$Pz&iBvQ$J zU>e;DHaV{9Wq&(k&#YNBs?v&Fg(67JY&l0WT{1xjF@y|;LkxRE)S(p!fRw3SPZBBZ zM39k`WTW)oQHO=XWq2aPWR9+ku{WJzdv_0OtK$S8VQ6B=&59*XquAFd%y*{Xxz z4ZI3I*8^e^eK6#=uam(l%fy{`yNg;iQ5wUog5{LIiFlTrxZ4<=upJcNqUT2s zj5|0*Hp6{7JC!J)TKTi?n(vg7DBjt9MO**ud#kbw3>#|20fHIJoN0*~usUqDKTHNg ziJ8HR4Wk(ZVFeVrdy?1Qpu)Tva#f6Q;p2W}Xe?E8Gr@)HHRD+dHB%}t1)9hiFjqCy zOliwmw$vXrne1UWSViUr2qh^7KZgWLR{RVm8!`9|7nzI#g%d~w&qsj`tH}!9_QY~@ z2Fo%>0;=Sz>^I8i3i}N8m-FUFo9UHhYe~9cPJ}&s91LaHMSd;~jO-rOTav$4ArskH zp;wJj6i6FaG+NHsH;c@a6{Yu7qbF-PFY*+5sA46-LzX**JX?L$9Iz@VB!m&_V*?Xt^DZw--Q=neVqwMrn7x!5c|x}e;Ox`9>ZjB zAJe^UOlEWbzB~8#@%=Y8aQFTl)~i)DV7Vp6HX>hWr9wcnZ0Ozx(*?p_HGM@jo+z~TOi4}=d>f^IDGhXIoWDwU zufq0pj*Z<3hIJ25J@y{ldHX(|`OdScso%2B(HxqL{V223U1gb*0zR3gfA?&7odB)S zubEJ$(xi^8FZFaieBlg!^>2L!Pd<8?&-J+rXEB-2u(CSDjhlB^Ul1eb+R-Ce?~SvOd^WsXxHS${Cb>u=n^=FT2=cBb6#IH($&J9Qim$>dv9+6iy4j%E1WrX1Q*Vq#dtWtY%)Xt$bb`F3ArJT zK7?T}=0p(5aia(c@==I%M)iDESpu$=T$BZFbxI0RNpL(GrQWcRXGsRN!329=rt{6! zS||inbz`oC+nzg=jdyl~%DML;EMu>_KPP{!8n0)l6J)upsL6>XbKTs}j^Guf4&A^r z6Mtp>>~(Z@CPTJ2QAwH{Vp0A>J%F@tG*mt=W>^^y@zj%#Gn|$5#;8|eQC0ZF$3KSq z_cyV=GQie@4gBRdzk$;yPhc^BnFB9ESM+)VL7Ajyp&oJaE!m%xqJcu5)hFY27b21~ z-7SHd3<#$R+okho(Jm&OlvN^^+;#z*uM?!rhI{~SwP}N`nIbJ@^>cvZdgWN1N$+vg zo-!Hs&BcX^`lwgf&n5XL)=(Rgeo%qf{&_#OTLF8gmuVkgakcQw!tO%0y5eNg=YpTg z4DCS&vHYn^0{Ax+e+_vpJB;5s;5`UIJoI^8F~U~L>FD5m9YZjv?Gt<;RNN!1LK%gy zP@$=n%)HDfqAUYy2cstjqry`gbpWbg)O>(7b3-a{wrsGqyUUObqPkrfjX8R+bue8_ z3Q~BYJWT86 zaCM_`Zyyg6Fne~*h~xmw6q9AdiX4UamF>HtEAhrsyv(`ucTg(X{I;$DgFt-0PK_Ob z^x1)K_CXI_4$iv2%+H>`u<%^-7ouFd!(NA9UbVIVp;il$^UJ+hp%zEEHOMMgcw$@Z zxmFI_sAc`6h+DXG)V5|kePBrkYRJy(5VP45yKRG&VU0nZ4!oLIW_gn4YGc4_TN(DO zv$<-{x`nVbhNf1?LMD@`i!}0srynJ(WcIUiHdF&7Z%lRKdN4LqO`cSerP5UwmZs3= z>a5!dt$M^_Gn>K&`}xpX-D%qnBt!350#J>W^qeY$Gs2x4JUo0Aw)iag~H-xDchglKb>}sgXKVDce}rwJCPZpmP9akfuD6LJxdZg}i$T zd6jAnB3vJYyJ4*uN`|n~Ok&J4wn(>8^Ll^S$M?>z;Tzw39(#)xKltHGSQ}ONJD>d} zJpRaK)M1`TjZkBAZ-K$eOZd}o-e+jog@;b!;fK~(?`oqk1t(Rn&%w#|?gY!`0cO6Yec}HQw{qG!eRUO4lKRF`YOdbv!$fl%t>Dh)Ch9oDiS-(P_2VDHBbU!In=QDSN6^*Q*adke963E9 z&1Pz)>e*<;Gzx@>A-nRwCdo_Fq$&-=S*z3!SRn;rbRp_x?K4$>FlM?m)*__yK*UTm z8?{O32cl2sfL+#Kp^+^z35UvC4#Y&pLnyZ0?6U@DU7`!9?ud3xLjb9bP-W_>H(jYJ zPIA}Is{^evb%@Vzm4c9aUVW`ELgzC&h@G?z%qc*sN1PB^E+!bS4DsQQehAxlH?UHr z`CG%$08c#eE{vBETics>?dqGD%@;Uz^d!z4JBr&ITl`$4D~Hukh~Ikr{Y;Qix2dO9 zs&v|;8)c3h&jTC`Qs3Gl$r8gzW5oG~PUE4|C(yPtuAp)Msu2fClBrjVgPkhz6x`FF z(p6!$1P;Px)p1!Mk|{!K&{-p&cFFVi8VrYt_kh2n7ckk~W1UTBVPj)cdWt)H=Yk%m zISL=Nu&aJA{hwZ;yDJs{(u6=Ed*!v%YUdPWN60!tSD?O3fZX?Gm{;~?ElGgv&m1D} z|G8HYc&Z=l7M9O))4H>TVg(c8N_zj15;Hjor|2QOO}8z@Kl1fxq>>Ren5UDM6)^`2 zBnlLO(a>cIj(Ytx+basyXF9~mFeSljISa9D5=@9-AC<5tQYJe(oaMo2BmIb+sfO|9 zGxVteIOvQ|Ra$WPTL>;!+QwtI(O&(cPDj=|1rZitl-U8lEq43<3%XFf&Of_?Za=kk z$h~dF1(2V)dmqIOA9fC0z|}nt(Z2h@jV5IjLJ@}@mbrMRSS*%ra{-0WPYW9mOyQ+q zrm94NNx-48pax(bP7!2KusX%Y2`kE7P8{99HzpFJ^abd)MNP9`aa%5Pa_cb>IaTL9m~qXL9c;b3r#m0Q;B-Qop_to}D-9~zB=?seI*C&! z*72pk_ztGyF`j?%75wIZ_&om3XMYh_E}fRSO#w&N#(4bUGkE!xRor>7gA1qE@X-&x zn+Z44!=!uVY5+BQH%ol$2e0D!m-ny~f`b9U@cKQ=EDK|O3W|b~KIqy+ae`G|HQY%* znDNZAXarBx3r0@FfQgmT5aw1YW$Khjq;A2CLTiGv2aS=M=+Nbgo9!pFDcgfVZzPrH zTFzf@cDJ2ca49I(E+j_LkHdbrcKP(_1KFx2lw z367Pub$s`gH*sfYk5AQ^qpSGLU;O}{dh7xZfM)u7ng!Y)V%%H7{$dX|Zoi0)tvyt` zQ#7-ETs*ykzxA`9z`HLIBcl%X?ui^IF-~-|sw$~arCv3X>ohk|X3lA*SrcR&gf)qL zBxc#u9`jU%Xk?U%w`VOwhgn}V5gYq6JooAwg7C>u?ZVVM9TiRYnv%$S8Di;#O3(2@ zJ?(8oDC92Rs3LsK?aO+|qkPLDh)y=$n+0I2I=K}Y(?KzET+QFoYHuaujQagrAb*vy z4*U6KlgU1+rorCs9=`h3Z(wzF1m{iFNrPh38S z`&-+Hb&rEE+B;%EgfVl1VT1&oW%#2mWt;kf`$P^@$vj26FZy{K1#wm3@};vlaeNJ1 zJ1rxxcw~lDGFl@zO2Io-;|PXJ7bFV#$#Rj?lOfv^f?hA%^cnh2s%S9^fqI7;Fqs`e zo%?m4E6RgjpP3&C=kWT~tK7Fn)w$_(+NttHzg?XlcdJUiLYD1ZDJ5Nh?;Sk3cpz>u z0V>gAUOqceR{yc$D-Kq4yZ4I&0q5b@{n4-3(bqn&<ffseET6A&k?5rfH@fe;hChDzEkGvVf@dJP(5`A~4Z8lA1~zy?d{%o(FH7>S(^ zC@jeWKzWZ2YptA7h5tKpMm#$SWum|%{c_Jx&i+P!PKv-N_o^Hwmfeb2QNp$$tAi2u z>~sz^cWC9eL}0il_DgAtCi8((LvtXF``$41@!HxL^dsgqr8#9yg77K)QZd=FiuUg$NWlzOc@AW`j0~Z3 zhKjQlY;En_x$|9xY-H?xtx{wMtgh7fiNErG965Rfzy3R4!V*Kg@ba7Z&ENh!e&v^b z9*avyT)FfR9_&pp+23I_0-Is-SFmkkAc0tBd;YP~$t_e+e5K8w@x4(EHxa_txY7 zoM5x;lr0naxVYZn#N-F3*OQK_&`95MsCu}6Zv)T2_#&=6as`(!onvB>yazc@*6OT& z2Y)`O6Rv~jTlwB9!Gw5|d+3i=@JC<&Gi+~f;>SMteykl|$5(&r&$(i$$sPd3v#5*~ za?r6QL1F0V24Gnn@;S~Q&D9Z?l`wk{4W38iG5@Ro^6zqx)eEpGRmowH#0ZitCg(4V zd%V}wgGfx6Re!{=!j-`e2WuCF#w6jgSA> zyYQi>u3*5`rW9P04WG?{8`rMmtKa%QUb}V=3mP*s+rz_WPvEmZ|1&sytcTGcL0l8G zy5c~L6E+E^li;oe>@RZFk{qC>X+_uQIb*Am`&??@doBsOD*Zk(j7^xD1&&*V93Usi zS%tx{k3npt7o@D*7Q@ejPqgL4mgzO!TQ>k#gC+AMI)1SBnN%0(l9W*Y;+Ovn zpZM6P&@5{_*q-3Ta18^p$Q8|f++kG8i6cia+1|&fYH)0I758XZcH3Y!n_@UP%J(v- z9xXmMZV+2G!;IrRQ3ymanmhCd3Swe+lM~>j)`E!`;?O}I!lKh;?^9@KP ztWxIi1S3z0zCL!_X(FbQA@n2))9IXh(5ACRA|0yJ_=Z7$#8od^kG4&HscN5jFGLpi zrwgo(`s6h5_feuGTC&9j_mzC1wz#N&>8ePk5j%FO&`z=QgTjx?z(i|9DMTq0w$8V% zxKO|Rj0?2#{W|^alT*$y&i-d~UU&KO(AsX%q=btWVMCrFDnD(seZqY>MvrEb){{CX zbD|sfVtwHyr0EG&yWN%vgb~n!rtyKws*HthY^^o zJEm+CIk{AJU0Yj~!ynAaXqFj9rqjn68WgiO(Pqv_Y)HatL%3aqMJD#Vd`J+2H4R!t z#|9*~IXi|j+trn*1Ce#Hk!3Z=Hq~5UWkzv=?#UzyE_mHWwcbu4>(9gqjqVUBBrpFo zJFzMh*65Bx>PvzSH-;d?-t=1Cz|7q%kl%aw87N-C-@87imYNCs%#2h~W^HItAQ)SV zKN5pxkD_nwqzbI|7!Mw$`pLD0n8pck1;i9lY7B3*&y48msTrHFiXn8w zDmV`nL!I8bbq|j{_At(zK904qY~Yaii@Mc2EDnkpxG1dIEb6=pFdy7 zdlMySDJnay8Z+tViJAO^M;Q>SSJmK?A9y#;oLa-L{nj7i!S)<4ymlS`>firI{DZ&! zOL*$Bhk3~EnPW%r!Ka?YoA>t-R)z@XC9Hw3mr%$Zo z(aUG0dR*m)3hL-8lqWd@6pRHMhY+RjDwr zs!%^AKdJAk9-<|}tic$o>tnP;WYV;{v&e(Zx-=~42lVMrR!o?}^! zhL&L>g{VoLbpJd6K1LzuN_(w|Ud=dZVJQt$P1UoO=bL4n#>-ge9xzA+hxMw=J7khE z8t+i|#a=Z0zHUEt)~gj0IJMrh4YAnjLJ=#Xz-+#|s)uE{z*`-0gE>3WE%gmlpIUNU zlTW5xljrHHv_N(|)t5?vm%PX3TZwE3^-*H#5oJ=G+L(+R(SxLG!V(fdQnI6m2Rjp7 zzkLVu=?FL8-oxtpan$`eri(f5Z|-8evW}ChtJtRYmk0Op-uJuAT*xGK7^ z-%?_WDpmh4WAFK7+jZTEt-a69onOX74g|m`iloG#FtpN4N!Co&xa6^1W!3oOd~uck z6#JV$x@t-qYi4AP0!3w6i4?_5kN`mtz{5j$Idr;x!#Ufv^4g~xl&(rdzwUd_J!kK= zSNyHtLXntI#SY13MlgTxgc1a+)q+?U5fX{=G8s?c-0sZCs1OB$*I6u2plesWCWhw9 zmJsTS=-b4yPt`^184M1WCX<9kxa!-Ffl&}9*DhgvLh;$+7POmN+T$!JQ0XzdQgv!|Q9B_R zQ~Ab9Y;GFR4X^N4vr3B zzFNXKjR^8pXz=oiZz|`CB2_DG?ppbOO=JWzz-2yZ5%0JxuvpGvJlvo|#L86rXq4jG zP}=-=+c3Qa&lvP}{*1*=4jTx;SgFD?-Otks)P%t!hx(qhH7LDg~*6=#SLTzgk=c@SCOReuoJdJ{O&>KwaEnsIwQ4m1Bde^ zv_rmIqT8nbV$6s4(U8MYq^*SJk2FkLLogWGrdF_CQOex!a(GK48Cnm@Q>ZZNUU>FK z`_U{rq{@>rkxg%pT_j4BBU5Uk?7Gex;lU`_`K1*Nh0rAM_n8wa{_~KAWb*%!<3v@Y zAwb5yq-C9k>-(c&wLHV7Hk6}ES(sN&b?*_bn?Jaoh(gnD1 zevb^`WR!WJduoNrD4vVXm2o_~#8g=yD$UvzaLjl#UZ!(OfHuZcUE=kV-GK%-C9}hf z2!jtk{RI4n|Ml14zkTs<;FZ^J!OeR}mHq|z^?&m#@Z8gn!)TO<{NTd59STUX*I+PW z2P13sNk~U{5b=QE;mwNs=o+E#CS9$~#KL%})j~~z;WYQt@+y4c&;A;odh`+4 z+1j9L7Rm-zNXJ5Xjg?e#7jmK8=`ar|=`$fp?*dmY?ZRVMFK|B`R{lyWltHW~uy3ZU zTI%m%_R9=cE?t20yF29MA_MY};9-eKP5$)n{t<2;F9<^W)ZP~Si_iQ7JazRVWEm8V zb4r(@R*;mXYbCL!y%$Ouo{RL0b=HrevW4H(gh~(vmU8e~soD>z0>M>5?F)6?Df=K} zbqHx8hzio~4aiW8ptnswMbjPZb>;T)8?wJ6`eu9&mJI7EU6Rb)N3sP))Bv}Ds0(54 zh9?HJDy%n_^qlDWX}FOaOM>as@wsJIRbz!UyDMi|nz6GCK35Y&Yd#tnngNp=YfJzj zJi1%MVs#9Y**3g)`#wDX{L?T@E!?<$7p}c=4Q3;T>!of=_lQy9~{vtVmfR~T_s zkw8FMH#0+XEoT|Lh+bR3&2Md}AR?DSHp=3~7e{U6l zg|Q)ZD&lO%G1`efTHr^%-aj_;GaC~ks>hR`N`kK2h$6QmRiOlm&HrSk@0bAh&vmEn z$7dUwox&o63YATD+V1uFyXk_2=@b7UC8 zh&M|(;Q$w;K8229NnCbKlA&mg>U2!avS5w1v8?YsVac3%Gm1f)ESn^s3!_1L4q$(^ z-fuU97=-}E{+fDXR{V4N-dL?FqDj4q=NV&FcN!k4lWchO-rag%S2}fmw11~^aief6 z)UV$nCmC40X@j;(OhdHk5unn`c=D zaSPD<#}>xMtE0%2*AVK@F*Eu@_>5ymdumy`p#3}TkIVwHv6$875OI?&a>4>G|H zFJIh&#~!&#yf^Qp4V3^Ot1QSF|XQilzyIVvXG{SA&@Rxfc8Kcf18gMlT<4?3}j zizQsx+lK$)U;iTf`QLsWzWvf`@WxxW;5UEgkKosT?N{N&XRi>n<^1**wCiK4RCNOx z8K4FvjB6k$k&rN|K8oFUJW{#^S(Hi90nnPj zAm_4`L7Y7N`iF1df^WU@COrQ1lQcK&PyX9qLbvAg&U264h^C5aJcawHZ=_Bx=o$2k zJHK7fD3ZHGhqYa=jb&AxX6miZ4QR$gZ9{MY;A17*47Mm zwl=BP3mG|gHb=0%wE-KOTQp7rD`u<3F`V0+!0zT4y2UZW8AlBhXbIUCnQN(7J$`8q ze&*vZz&BsL4Le&~v`;G~w2();e(Ns0eP(O#H$4gsi*9cONJ{8uO6F9 z4&*eB2y$m0f=`md#Tji~B;lgwxSm0lLIMzqS|A%mZs#}pKWevHqS|)3NBi6i67>aU zM5$1K!*&pppVL_bk3Mz@e)z*T;HN(KandIT_a4BtAN&xWd;V!UsYk05IDdYR+5$fK z%wzDC2M?hjDr>!hHDa|^E7E~kdpmPBaxZpxndTppECh!{lA7rR%6bi-`uGd*b3gkT zVhH{FFMS=ZUB3-YGqSmOnkeBR^@M%p021NZZGp>|FTloR0E?3)EEX#!hgmJDm0`7N z8Ad3{1tbN*;0yJ-?@uuqNYeMJtpJ*!0ZBm684xLOuP`L~dmig4m-dY6P!d9$2(dGL z79u+J!^{$Q9^}=CDSdBW2?yI}7t^c7z$I$No?mp<{riLX0)znb)GHK4O1Rgg=Dey3 z`@QJJxfmJNTN0MqR~+v-o<9Fw@aBpy2>v+WAB6_M3Nw0;_-G>;2j-skwzpxV8BT2S zolW83WXbG9(wLux)vl$+Sz(DokV4ZaeuC+mrC(+s)Y|+$u%_B6<6XE!+pr*FfH%q` z%LoPks5W$lbuIvva#9bYUlEHx7r$tKugFDkwt|Ye)UhsU*Ud}VapM^wpgv9DH+C;$z&+j8kE{v z0x_M>AW$+h0-AxzqBx2N6D2_PIH}O_Y`W5#peVeDAa}X302YVNlAr_kHzioZXpo5h zd$~?#dOIBph z*y)h75}Z@ZxP}!;98m1-ZNkRJ7%rZ_0OK?yc0sJhBf-jJSI@(hM=rqY*WQL#Uws4K zn=fg2G-kTd2y>rFCMs@hlE(d+OolK)*kt0YIxAStKw1tvRQ6StEZ#EN^gRI!EcJK3 zp1NL1=<6v^EuHi%@(2X{^w!QceE37p!{){|eC->rz*{%(!+-kyFT$_=%ID#!r=ElJ zTbpq6_92sxgkC2QQW@Sx9)#NnA&Js^YoKJw3D5vvgpg-ZV_>opbyjqC zf;p953SA;~h8j3HTEZXx#aE!@DLnt|Gw|gveHpI3bHl1;5M{A)42l{65#eBvOZD&- zoUEUMA=qWdX9Y(*bTqVe2%DQT7>`Cwaw9z^+~bvK?WqE_YH1+y$w>>#hevSx-hCcO z+i`XutA^v@7&a$k*x4Mz&h`deI)4rxd+ai7ZA?ifb~mSVBJq4>88q7pb06w#W*p2^ z{hEv$_{GotIK24$0c>H#Lz1dpDnj3!h>5X9ommF(@aP2o;p?xE7*Hkd7_FNIQ`JjF8j;nde7-gFq6oN>L=4)yRCXTr|KE`y|2G zfFNiM!P6)?fc;0SPG;UE-|LvL(qJnnNf!f$b|pC5uG;&JK{Y_1qbBeCdX6q~*-q-> z=o%RM#rxSk&@yku?$4_9hCq{Em)`xDuOMf7iGgsYP6N6+>ILkZ#;OyJGy?6-#`&5! z{^8C&;)%a=_YT~?zYm+2&%-PG1lS?>cxp#6CHyDu)VcOStW&JY|f@|>)yTx7norla;6T=^15Xj*_NCN?*G!c z4g^cXSu@!C)k%{Z-B>1vK`RrKtweNRlemW!giq25g&r~m5Wgk!P zfG;R`sXcCEYzTxPs+RrIf0dX$h_uGZpCR-boDur?k%*Dy8Nv|n%isfQKY{@04_+bH zXNuqI&y(!m|8x}Q&!G?@W~M{u;oaL02zv7P`AudaM7fX&MT16|mvZt$rh%+MZP`IK zh=+ZblE5UviVxUH45SEJbt6UBvf)KViGg7&kRxIi6XzoV&tPi1O!)GHlQm4s5XJ)y zF1gZM6gEn*p;qMFS-w=$xgmCWbX^h%VoFe^iV8HL56*3j=>jwm!1rITt7n^!!Wm89 zLEe3TlYNWJtnV*hFB^;qv(-6)IOp1TdMh%$)z>*R#`Dhc8x4eZgkh=#~*sTi>=@ID=7Q0f7t1bZ9~ zV6w5ny~6^lEK&)!A>=8Z3-4>F40~`Sk_>IvVVeYVD+BoY_g{nWzWyeB`cof+gZp>j z+uwPaDyxH>q^jt0ddgSPKACt@teQ|)KV2EefSu0^R)TQfQHJ++_Fys{QvjxY7oZ%0 z8W1!YmMbJ4I3^ZE3gVZYkdCy(7mWQ@?a>+%923-_WRbw&O{ORjR;Yf~qxbg34x=GkoC6d1zM)B255+l2e~*&age3z;u8~mxk`; zy_@&p%BAywc@Ru|AWRvbnXACca0}3_7=5FD8g*1f&yrwcv;zi*Rz;10uWB?* zB+TXBF<7*7k_9CJ=5*`O+(Dx-u#T8+kLSyve^qzaPMafKxWYhzOY*;YA8d4-J=vrI zUDOx;C=rYZz3&Y{7Co2#zK?+M#L+3)jR+f?&**(UMTj`~a(>QA0ZSc*(bBY*2zy32 zERD-(oB^^)LpZ@%aDx%dk51s`%{y@Q(gk?^&FgUf!g z)9~!06owP>O}S@TnO=hfYJG~G+50{;&yzdy|!uKy^`YhOHC;mhcKO%Bkomk|g=xQ|&bR(Xe3N5mYAAJsH$MP-R_x z9rLGSjM}@e8p#!X?(l1?I#=uscIsj@_p1!xRT#+E z85k-!Y#`I!GIcQu=E-siBV;0@$@Jcvfl!8|4d);v8)7Wcn5)~5Qmr=W`AM;kP(zqA1H z^mz<9lm2SH@5=&TyZu7@f>iMHlQo>*n!;=(!OgrSnArB_n49{68@92*tbB{4#c732nA`*j!Hw?Zs{jV3?z088ifVLUV)N`^$WwqX57G{!&yyp z*qV$e)7Rvdk_?o6YW1 zMorF;-4uwX`*=7=p@n6HjWj-R}G5q1y8^!%^=;5B&S>Ls{*^&+v#V$hFCFv|Wn+E0)T zQmg|d@%!4&vK>@+Fx=*N2DoisgIWA9LFj|SHT?GP z{yAK}unm{@HsC-1=ii6>_YbTuuAe2f3YuRw9_65A{5@SrM0IdlaUz^|d2&J|D%fL% z^znlxF#SnlO6?cwm&1bvJa~9OgVCd7z*%@qCUI37g9=)+l4S-Pzk9Ln;O6~9xcAj> z!FPY~D!lOcUN381{>O~infIo467z;@!q(a(?!O1FwPGj<|1jbP?C>hjk z5NbtJa&nnd>8)VdLwkhP7&I6&n(I1in!uAQ_Pn5#uk6X&KJ23Uu9`5Y^z4xRE>y+D zP*fFulUtqf*|ChH?IyP2(U1~lT{jQZ`-Nujt=bXkXB^Ib_ud2e!5eSF@$wL^T)99x zg&@EsQAIL!4ICZLVSoQNeC`vUglq5If^U59yKr*C4Bhl!slI1oUT%0l$sbrkZacVg z^(s|@9Ijs8fyrn@s4h&#bu_E-gk+BmUn7;>#@NCW(aWFEm=Np*r?E>^Azd-? zh6ekE6Sr9tlc{An?t&kdJYdo_PBNY`3H-411Lzo}SzADgYA(oIvSft&^`7K6Upa~W z7yl?009?^&t4f5@dc+prU#j5UKd*9XB4xdZeaAWkI2GKrp21hW!r4hZ|F{b9PJOIK z_SB0Ql4G&3Cc(5BkgTLy#d|rUe;0zhqTZ|!N%@}=LBClM25QJefe=44V$*55eA~hN zcn;0Rn3O-Uz@d>Ijo|p?#93UVdcZ~=3?jw7U26{H41q>0b#6l0Y20o&#Aga4+UKwfJ5+h*A8h;;+H_Ob|gDDr3(>_!5PC zMnSP^k=;h>*dXQi?sP~QH45Y;Sj6F=Hpxe6 z;A3^kEMl_xRV)`WI2J&vF?#Bg4F~riJ8=e3p14E?I2{1$rq%*6upY3mPf4AjAXs7$ zR9>`lrs=^X0ayjODg~B{1yx0m5CECgjCi6c!omd=QH>{6)YwMDaUZZ+G!P<_oNPuMjWUrQ3+m4-+4kB7jmrRZ4D^_op#x3jBLZSH9b5l` z!x`1lP$#n1b0w~|yoY%mr1zpg7zcrY$Qu63?|%^vj*j71e*P2ik6-yJy!OVs^x39z zr~^Z0s0KvMSG0G)&S_64cEPDJnJEM*M7R^eVlSM-CjTK5Oj(kJVS25Mi#eXp;laa) zus9LOVdisz`#>|)Mk88N9+<6Fj?Nq*K3^Q@V9xiim&eLh0i5|xNWU2-L&imzm$UzIVd5|OpD9i7L>*idYYiP5QR5uviS zVy`+L$%56}>10HeR`l%#17_Y`6NUU5j*b@8OZEH<&%m76plBVoQQ7@Hna7qiS=4C-P8|9(ViZeW0Ta||Fz?lM(?pd{JO$|k z-mCiEb>L=StY4wfKyzbU-*#fVSx@=;MMlnu7>n?CaCLe*GZlS{AhT!niS-d){WVlF zyrSl@m}66Y)=(l98c1(ER`U46ar8>PqOt$2^B}cK3MTFeQ^z!J6wP;$KnM*ZX09IY zAJCz~hRY?*eQ01h9^D>jYm_nLl84)d|!NwH5iHV8toCKe{CC}eb08*xMf z3`w<`sc8^MaKvdR@Tbm33C#E01aPQY|Kg3W#-Jf;#aY1WtQUj;F;&&LY}k6Hn{ErkN7ktm{C zX53iR)nyL)18Y<`k6986%vhFv`NjN_<{eI`x1w8faC)+kR7KI=UY^&8KVwo0=htwu zgPF<@W{1fw?AuV0q`kx7c|2m~!JMLX+_KO4G$atH5YHkr{zLD~Dl=-2YL+8IF3zWKmWc$cb-SG zC@fQuB)IGd^PQh8;o$I)f-nq3u-_Hu4`F~!Nsr->tDyFsj3xlHw{b2cL-8{vPQ3z9dIlMoN@nA#}plc*cM4q-RT#v`Pxb zf8*!EpbUeslhq35i#6$bOqOvFmMjT{bJ5IrVUHd%-%@W825wy?TXyD?%bq3})LHhV zYcldE*LMEVtPs=W@ItehD!bLJ!DQ#6auut}h}#G?2@ysfUq--CKuAbRbu(j!N9%60pPUX1YPK8b_^=? z5jEm7qnQ#)biiaV4DXS!C2JFXGC}WbSaM?OdY#n-ta#DL(%3LD{^VF%Gc6|+x-3CP z$Ii=Wz`sXWC9;RYU`22@#iA=A0%3V7bLjg7<&=J{vOl`@rK)VnxB|Pzky~rM6VE5|ok%G|l%ZJ}O)xG>yzlvq}&!3J6O594_xM1Lp=km%e(` zftq~LTqL+l+yD(Z1*T0|3vq6cqCHiOJKV>Lf17P=(z7BVz>VAY;l&R;MY@DYD6%JF z;^`$wQ*hL4pWDxyHf4im3E2}3)Y3|-QpEU5b`)5DQecTyjl|90+@s58eL%Bva9G-k zAecpI%LiU7Dnh2w7Oz0_+@k_Rg}=01c^Zz#Fr18yh0Sg<%7+D-LTrGnUkc??6oAN0 zC-YQ%)v^V%$cCr3pw(f@m<*8XBQ>-Q$=0M$oOx*GQU0ABj#8o|C(G2BGn;@bobTSb z4`2MNFHr^RLmzky{^S4sn{fC3p$&x(8Z_*22}Zh3Ab3=HT21=^b`=Z>usTk3BGJ`! zI<=l2)e)$==F27Q?;lX*XC)&q#*+zEyhg(jR~oc8v31k{c4dCd`91#urZLmGI z>q!rq%w0S@Uco<@#9IWik9=vwQEgKz@M^Al5sa;2ghR`XW2 zBn?cFDos@w3Jb-9D0BQm?~2NjRtuqbO1zI#d@QJgfU_K1b)>mJ)1yhe{SlG1tO=T! zidXlzUX&>Kee?Qtc=Ylf93QXX&dq!9#QAfuJUJw2AP3G3JtXX-GdUbNR*-7k(Vs1YocVJg3DN98j&CqwbGTn+(L>gWKjwJdaPmxW z6c^i*1k>0-#4Cxhtd=>m(&p>7>Yq3efm|dgXb@$h6YSAZM<`V*{a%C219=DXL3Eru zazd~#W(||^5GMRbgV}JFjfcuM5;-=?(5CEY#bGTp`Nkj?oL!`S&0vgKpiFYsoGy~Y zqAgXaHLVNM)~}MzC(8`)Z4383ESCb+<$H|KDJ$3O(x{Wx%S3S;(pBpUA=s`KSbM<& ztfG|IAERHR%Be`7mE`UOc2b}O21aMkiXMo|%;mjz4)j+nnWm>woIabLT z5{+yCv|5mS2%;u7WN&ou(2>IIXQM1sIY~7%IrF0g6nf55sEkv_H#an3lOTqxHQax2 z2=he?vr*$`Oe|Kd={%6rbLG%Xao~$O#L@Wy8}JRuGh-USf{=WqL9&KxN*JU81!K%K zo2gnwi3o&nW!7^TU@@7-h`zH`igP9Dz_Yhn(F`4|^3kAQe1^dg#*-NgCS$$@V`_B= zlYLw#cIgB@qjMeAxz;DO#G3RH8Qf9eh)i|gP|!fb(xow;j5_V@;wN~#^FxDOr zxW21G_3EX6X~SS(+Jmkm;wwxb5?iE_yink90(b8}Br*e?M~DI2keEGV#8%ufJJr+d zj=9US!{JOPfykc(DMfo{slu7zWC8H<>+ivPcMjnB7e53~Uzh=uIlOc8HdU0juv*b% z*qY4@vWk06SQwQ<={M)#njw*n=JAAWt+0B{8Ir_Z%l)p~&g2e{N7pG-xWLiL8gAUV z58r?NIvlSHJbCpBT*hI#RH^7#W0{T6rId4v%!-Y`sYS3%0k$wAMI2 z1OuC+b_DA#!Gq%yIK2B19^BuD`w#cw;CK#)^95DWS}Fe@9UQ@czAFCNAnZd+T0{RfzV#a&^#IwyDZvs&>ml5Wj1+0G7cIY0WhJ216Rs% zjKz9?1*IEuA964b>g(m;`^1W246=3Ks2_OM26&sF0n=r6p1WZGd&C_v)Rs{XoXn`z zQojeR@@10=hpUuI)%3_T!n5d?obrS1j1@~xM7vnsPw*H0y6=DQF#&d#L!Ruqp?BMhdi2lWCLXzdw1(Olo=pzl@CLv^mCsWLIf3>i360IC3`0UvSTBPuU%@Jxsd$`8fcn2R)t z4+QeU6%U3kX_c)PDg`AP*Z34V?~GT3fSHpUGu=VzVgqA^v+V^t;anM{>z{n-2dV^t z9vBb2l;StS0{il*LQ$@dhtwflq3}*a`Lrb11nm|VT+|Omb-}IK_)$BQPcpl*krwI0d^u=QG}+plO7%& zX4~0JC2Ein+U3kpqQoQ-hhU3Dy)P9hKuWB&txjOg*LwW z@>*~tN-zZcIIXXm+!q*c74pdUQMoz8x9 z2wJw`tDRu)vytv-bA1*9A7%q&xC_zK4+d5>QiGASBHYOQ7;>x_$_XJ+gAUtdJY|Su z%5bvm;CQ}1#>r|lz*lY-db&s<*L~FlLBLPTTG?-@gLF~Um zqmOVYguP;TyIQitK4^5#R!5En2P=}%r*qQDkltj(AFa$=A`0)}jH+rHsIhb0`SXYz zWHDw`F-A&pWae9I1sbexCF(E=*1FEVi=3OBty0lhe~YXWChL+1P08$LNA>`;r^{gN zV6vf<+Lgnu|1O?T!t?vuwVUv#fAQDw+*41&WH^Su_=~?03GFEJ?E!SH*xdDX2i5=U zs0TQu-!(|%fTRcniXbV-_&J*eXej?bLjCXEzYp{Ik{n{RwfH`g_gpFmCHX>m5FONv z-AAbEMqRDXruUHS_Z(OZBuRifdH;9?FTZsFj6ie08$R&lhhf&tV0*8DuYT*BR59Dy z*n`pVA#6^DusI#kyhTc;2n(W;XMr#ru5=ct9GjF>9~TLJI&*qR_Xu392&9=v91_6J z){MqZAlU;3wueVYaR2^8xP9*-G1@+uui^Io5gg19!`l~xi- zs4LoaYdv(D0CHD?f9@oS$jRlF&sl;nf6SrZ$v-TzkOI;nkT+S?ESW4Nr8c*!bifb> zJ*74*23D+=B-m3&UUj>vHA=w$zh#xbB?!*$!--h!9kxd}hGb_3SXz|rvuAx>6{1(C&JOAIpI zuBj5cCY|~E+c)90>+jJSxpeUooWHmWW!(~#@k7r)0S^}_GYc3`2G#?J^XAZBCH))M zTIW}GTp?pdL=N6C5q7ddeLR7-JD~l?oY9(4I@xRi^aGz1{?qdn$ss2qo;4xRJaATV z@dQgsQ7-&imFkn<5!AV3KiL8vIplp9VpXJwIgqIDBmu{X(ro@^B%U(gz|?U3IV^+~ zC4#yJm+6=w>ifmkzXpCD;~HCm3F@!*x0dQ7F=0}nTGVbQjW6UAR!9lSE#3C&cR`_> zbK<_iK-&iO4wRJ$7nh-k*o!rWtqZ%<%#KV-5Ylp z#?>V#OS5qHAaE`=LTcpe)(&&WfSy9Eg<-`3A z4bv!htyQ!@*x^86V?{^})@^IewFtMsJ{&CgHNC28iVG-4wL~^X#Upi^J(1unDfCdP z12VtGGfO3`YnC7`l*ePn3H)Ov7}*?*MU|!q#$5lBrJ{iYbmi`4#ucx>Lx=;Jfdw9Z z28vRX%OSCzA#nt>YDS3`@>#Nt&KPzrj0loAaL7yMJ{6-oPf6e=iGmSYTG_WE6x`^% z;fGfp4+y5&h*AykL!)QIc2a^C?=g%_Q7!g&4c= z6Qki6hT{>T_1XnGF(ayak%;nSWe#MALzqrx2J6K6I7)ayJu?kM2iM37hHPNDf$?-q zupVP~tFPV`K+UM2r@5ose#=;cUg*uEyhIOM|C~H4o&`2OG1RfpBEDeQj z1YT)dAam5Dw=7nKEyz{9s=}>=E?V79JUI5w{eAe|FMI(elPP@ULodJ|{^1|NyEpfl z*)M0;(Y@f?zDu5`l8kg(TkAa;J6v#3bR+@V#htAU7?0Rit!bnN5QGYu3S8RVfuH{D z=isZ~c?sURbswONV0nB*Bshz;%xuJYkkX)Dqz4ZBau6O)WKHDQcLu>MQZ?71-ynnq z`aF0YtOg=QKZ@j#2$PUeFTvsAoOB}&Ge5t#ONr!*dqdjahlhvo(huK)4?O-DJaKUc zhUhpCn2;<?7bd8_ja<$3X(?;jq)fBoG*fajij0mj1-EDr9&#U~zv`-k^nI2yvsueOtm~P*G^DTJe2R|eL zdSY{_VE3r1Vpu)cST;oVZj#OF`~eoSbsmzZ>F zg~I@eMaIY1_ZyYQUrXpspXz&O8mFgtm`@K?p_vzmk z@I+avehwAM__2Ttj7T4Sb>aMLp~;e0pe958_hbnt|DIaU4)jZH>*ViBxHuV)V0UXq zK@gze&1P`zt@o(JkIolhvo~fMaBk0J3iIVEWXr`_L)IqD?23cU46((GH66|zncyVr z4GA`88?d>tLBny8!KT3ud&Mmatf?p=ve-+4KQtX@3n2yL7>Fip^J|#Vsn|Ga*4p8k z?<)%y?4;nVx>xIPkcj2g?+HgFW+dJxSkgT^^_LX?UcXAIWjqDxbq76#&zJi5QK$n9 z<43+y{olUhO6+N(d3k_@PGCQp{Q zucIYn?)She?c3c(BvaA`q0Xv25W5Kh)6i<0XQ4#P9SKv?DIs+cK5OnhOvL`R|8 zCq1OqW_a_e9bORncy-XtyA;i*EDUbb1Nlg{fxT*k<8CQ;Bj|h`%g%%EwFX|5O#4H0 z2Bpnamfs+(Nn%A%IAFGFpE?7ksvKf1So#2&l=)M%Ze5Z}cO$(>nS$y;(^#)q7FzD; z{3e^tBEyM`_geuGiEsmUTX-}E5+6X>vuEdPl%D$3H3Z*>q``8CKjhhv@eQkXIqCQh z4m{P_)AP12OH&=XcL+@!&6p{0Je|Su!4aG+n6@6PVC$BN5DDI%r0TP!3&}@ak)Cz)yYl)9~8& zzYpL1#&>ztiZOA@b9b(fos^^4wH-o)O9FuTt^U~^iR z4eS>qsA$pnH_U?y*E5}AUk@&f{yROZB^ZSgY-Bj)vUW~ff#16~9l=LmcpMrGq(q)@ z)W~Ol{G)Jia11wY-GvAH58?WqLwNhv5%rB>qGZ$*qWhMV4K%4``ur}yX4PpF$SR&? z9ca#fljM)m@Gl3J$i=^7@Ve?obdC9n&j3OS@g6VkZd1S0gX1~8^u}AzmdD|#i#yO@ zLT4~E^p8Qk+Cp=xEDr|EQaZ{p&QHNLD4N*aU^K^ULBEsHMgXv9!~`FsT{ zY2w#F6Za1joAY@K*RI`wx8J!7TiaXIrJ1HfSRNigyW+&r;*&aqO#)bAQ~sF9AIX) z?Ygj;43)@hfTa)vES4+jBT<9gU-4e!DnuW&C;cU+WzP}>4^}GSGF)vkQL8qhx-Y+` zRt|MzExR6H!O5`i2sP<5vk2*|pVR5Tc|;ci0H_7|N4!c;=;Fh0BR*Fjs6Q;VLf^_b zestOt+N2lLj7B23TOy}+j@8+NHEc{U7#onW%}^v;oQyC=m6g)_>Wj8hW*wm%776&M zzc71H$jRrPL(;iJOVtiyUv5?N5ZMR$RrsuN_E)W+!|xl_fMTCL5LPEPNrj8MESv&8 z=x5n7pMm9Y!tBbzl54I^73&|jzmip@o)wvn9Fy_ObIKL0v#KPYQv5m=BhDMKFX!GN zW4~}XA61x|Y`q^ej$oh_FsT+QN2w!}J| zvk{cc=QtPXkQhKc00RrCV)`xKUku1h*F@M;gi~sEpn@rDwC(yq9UEOsJde*k`8ZrY zw`+rX5t@oCH%tXC>}|lM^P8jt-@JJMfBZM!fxGwjVKQjo(Q`A{8gn&89lv_a(Q=$ zK6~$A4&S@>4pXCF+=VIj+YK7g={&a$z!5y!)2L@8tK0?KY>BhrmGrAkMV)86mg*MY zM88HI;MeEJWvMS~k+!~634xw~rv44MEV!ps`-K`(8gSC8u|lmskkJ>#NpN^(t2m;T zYyemZy!720H(`5w1MWQ7hcWi~jwkSQKm8ea;l&r>nJ1rs&GC@PX>cq7C)k9IGjV{8 zdSN!1zz3dr8lHLjDNahsjNA2c1t-S~n@NlMrmPDb93H^;UVa6>^~x)7>wB-s{IZs2 z!)=!>7>}^>yg~E&Fc80Ya13u;zXj(noP%^Shf%{k1kB8-cAz_*u%)+|@zO~l9P-{Gmasd`V}7wRorj03A+Ek=ytQeG!c{XcvEtgB1*SB#*rwTdiEh`nJ;Q#4qH-`(DX2m23*EzbFk1VSZQ zQDm4YGSiA4q-9tJ(HSEPjW9BjLopdqb`~>R=E@Z?7Q7-RKowO|c$N}^0JF+Q1*i*L zf%sxoC)jPh|H}EQ4hU2~8+%jF0jYqxsi)HH{z`Q(hBY-+e0D!p&xYDPrhr$CfmqRa zB)Nd8Q*CgFGlWh*ZJE=vB)xuX?Ffb6X||)-W7TjsgM3n7MrHzxP~z4sBSKFo5L>Ka z|9A<9i#6MvG)pwRD6dGIjF51 zJbWSas|1LpZ@ny}1Ur;5iTtnTUUdOe?Ko&}9s86iZnSg#4w5e8U?vwO|5vBTU0-IZ# z&(>2;ZD6?P)$DbKiJ!pi)fN>xgG<5{00NfU#lh40Io@kplHV)K30N;<5(8MI3WV#le>{i(^1FXPbmbrY><8gn-}olH z`hzzp2qg$4^r}XEKPv2P)ZK1VOEm+poMA8g!ik_#2#Lf%EJ*;mUbJvm_tPra`^UiYRc>t75?+uWvm%NWFWD4xg(kn2s9w%%?vA!+(mkdc&NDR)g=ChF0#U8DN%y^IvZMr zrHE~rFP1Q0&EVm|3~t`J2k+jw3zsjPgE2yn2Mt`>-Xd!8hx0jn|DD@#yeja-#XZ=X zCh9>?NfUNDBBD-!s!x!Vl0N9+N)}AJsh#rxOnnS@7gUC8jqE{=Uy1iJ?w9Le-uX`K zi8#Eq@b!Yb=!F*1*-Bmo(0><*?#r4aG$fI?KTv{6WQh8;X$G93rbAGfC}2`1&Xc1B zy!hc4;M1S{ad`f@XJKn^2ZlKI1^d5NYj}X998@7bgv0%PI6T~k)nZAqbLZ|uI66G0 z_hL|nL~$0iV>l@Y6Tth){_SvmG~9=9vxlaZa^~s zw68LuA|-=Ue}6xhG=^r?XF^0*?ElXCe5rmeJ^iSCy&!})ZN~$dsfVnSWLt6O)>7S5 zf!nu1@h?O1>ePO=f&+4ThKk#91MDC56V?%s~YYY7a{SS!VrZ>F4Px%#OAj&dLd3Cv&UixHyI5H zwV=>!a%^SZV=J)j)&@HxgQ?ClxfURla5jW|#b%js0|ln?{_L;61Yi5= zH{s`h?(-Cg{r%s61&)zKs%a!(b@r~lNmjY6lLuh;>aZeLvMGfune`5+qsAu=?ItpO zqCQz-FX>_lN5{t`Ge{`VfCkXXW(8U%+ThE6FIM@8IycBLs6$wa-J|Yzk=cfz&}b4O ztxC7lWBBBwkHNE#U7_F#$A{3<MorW3b1tc2Q!Jhv`Pf6uo?v+luisI>`dfS9r167Fh#rZAF-L zP6QQXT^IIQdMXt`k_3e@ObtA8@dAAQXFdy8FJFSq*#=Cf6FR5g_|A9XAHMQ6c<0^s zh@u`VVrVPSzT(;*Ethcf#vM)&$yg(lF$@NC@;M@%%-zePqciR)($AxfRycUOg8ls^ zAfx@w8!i1ikEbx(m;pR;2@VgBVSaQB&1^zXelkBM;y6qQd+Nyd)qOHuONTWVA^GY= z7v_dZ=8y;vuRWmT%%a|%=-*lV9olT7*eFStwOT+ZVpIZXIy8p-A-0nQAdfDv@9z19 zMNk;}eBSERll2JLihqvCpb*?u)qI0ddqLwg!lw5sXZ%wWE0*8~J9Du`%hp_e=ZJ*5 zIAeaaw4_kwyi*9T-$cAs{L~;e$ywYk_9021%l(5R`v2|em?q5^Ayve`FW0RNp2T0A z+ueeD4<2w&h4uIdJ#okV7Mc}jhO@?KU+uvQ@UU0O{MKdJ6a)Z5)+lQ{=TJ0R!W^>J zMa#van6d>f-m?`8SGMu*`$G_z(Eq{s_TC-mW22qZvZP+Ixw8lKrBbB+cB4j@lXPGE-k@uE%D;eQ>@ zPp>SE)#{|{n#D$00Ipu%D*Ufy&*fY^bU(3V&EaoftO1lWm-g?g`BL1jHG4FgdQ4P7a8)~ znd8?HAynz`dm8WSlfPkRTjA$XT{YUvl?I~ETk6{+X1=zCmtKAa{_L;*4xWDEad_ba zPr?8BfBau?>+S=3?_iLvC(C3yC8wjW6suQ8PdO1WaiYe$Dm3~0HN7UmRME+&W_%

tm>`nbm^Rz(B7yA04E)7{#qW;QieW5BB8*$e}$dOh>l1(;2SEEhvgP+-3hLxVv`Xo{IHia38skmBTobk}e4 zSHB^SUVzGXabquiCt)YE^y#|3i$sbpE9ziYfE8u_4R7kq>8+XXA`QQa8o`y3NTV6E zoYQd6M3r>c2}*O%dN_9tY;A17M?UgFc;=bsV2VA}?FzpBwXehP{=paF?!9|37))S3 zUr^Hj@c5XL6*zbs*}4&ax?HS@@I{k2pkR2N{b}o!bVMERWm-{1mq>XUo<)ji79!fB zu{Q&lO$PAjrStIQV^=9CM7VHSuVJ~)6bO>fP&y}+0!2BPByge=6NhV-YfLH>L0u3e z90^8F7L@3Kc18A1b$mF~vTnVzZGo`+Y_WKo#fNhHRX2*1n8fPT$Ff+X3jDGqZJ;iu zi0@G)pGxV;m+JUnV=OID!np|uu8<_?-*fcUQ$R>SxOZQtQk^GFJb5B7sKn}j`>w86 z_PS2FC?uIc1*NsIrGi$ri@^CcNf?k&gKT%~3O7`$tv8qO0NeSmI3xOs$~+Jno}p?<@n( z4jU?_F0BQ^noP;X!^;T)yss5(juB2Wg_C6qcOD$U(Rc`3voTBu03*%3g{)L(80jR` z>5&$j_m3I!I5?x>&YAlllPWstf6U^&u23nrS~cLsWwL~1@>65`A$WA9p37x)@Np2X zzC9!;K#K!Kstt{Asu}L$GfU85bgp$`_~olAS2l|k{NBtF*@K3sn=flEX%Udx3PeQWA%|5hg;=K-8X14Plh|?75175@zRMz_7pUfh7fD zQo+kc_goAnVaGtoTO!t@3(}v}5f?`iox>&%#h7K21#f^)K066m?i-=k*Q5ajQe?!} zR7Ju6PXc?T0Ng75EHk;``7=atPaX za2gwF-uHx5v3{UYzUUY4OI}Z-w z&;GwJ!_mPB{PM5<68!%E`v>s-S6^o);6_IloT?YQZ1+^0LH)q9+WK>{&jp;Ix)`e8 zOqvLPM7mJKV-&i)d2_`Io->y1MJ`XCMaML$upemq*Y8_Rk z*2H)^9**HtpZXMh?4uv0Idp3rbSn;CE}(LFSpx)q1tyIgK=cy%iP8&x0(>SN68(vo~+urR3dgGA2gKNA|Xf zj%NRO0k6Mzi_Y2ePhEwK>>IFxg1wim_A@nH?XikbNbD$#FUSa}LoSIfotLP@OdiyL zE6~#ODZ;C>zGP2^oifO&7}PnkU-v>QQ|X!*a2T1Mh2%+tSl3ID0a}yKs!@2X5Z>iF zw@kH8`_oFoRC=0=LihL@v*{R~c>GcLrGNP^VRL&A%K8MZzx5{k)_?qM7|u2zHA5oX z!2ZAE`GQ6_;59KI!>SlE5f@3yb!`{cP7)sAfn(Cjq^_F~QZ+JvwiD!3k^Q=OeiwfE zmp%vBl{=YEDCmFt-8-5F?YO}CfjO&2s2sDvfT4{v< z@^i81urV9MY&wLi=g+}#Sm5|%UiC1SlEPm3UIrK1_bnnavi4_aHdjHYK2B%@u%)OS`QEbzLJ({H zsqU(}PdhKgeKhmeL+&f3&^K>G=Q;4U6$=Rv)q4ZZ=J)|D#YaKtM&QMUlM!6Jut$xn ztK}LN2dmKh9!ks!U^X7Zg>&cN_PqzGnp<9a2-n|eZ_3@W-GrUK28O3?eN@b6^TPfBPIGA|wk)>&1nLY+~QyQ6!)Lxr1s9depb1-(ICN&Hp;jyz z5<(?fLd^(z}07><4Q2p>Tsf4pko;A9CW>jGPoA#6>D#A=0ZY7-cAEThsf z+(e!Aq}49$Q&ebO!)$zs29S0ZPXmPh6j^6dz{t8a%tU~YwdY3D=lTHU^tx(=ssadT zzo6Z-Lwj}a)ZI&^F*)X|$0|pW24blCSLB;r52dqz?ebRYYntPydkx;h1Pn7$=1X0r zCVRFQs{o6|!h$%1GB*5oB92Hxej-`=sEhSRiw0)NR>w_ph#r)6kMv*CN;>PB)p{My zesp?-VGzQ(P1)}w`OsHZv5ml;`8^7g$qhHFbC3e&$Z9o{v|!;Vj`Sl{jRvBhT3Sa8 z>_<444w%>g>FyJM3H2r-e37aK8U~9zCsXjDY7>sGt0IS~OXx$6guw>8I8@rdLj#(k z{eX}SX3YIQ$zlMV=N1DXn>z$T(4omb8;0w8)tz5~fg2n*$-wnBEZYKq`}LRL8{c^a zKK-eW!M(e;;jjPp%Uqr91@rpwUFD^g>O2^7qN4bA2el`V=D@mhtp+$*HBhgs^97L% zfSDybV_mf@s(zpK7kDpReMt$Rn3v zd9?4WXF6S?FdRDp~S5>hnwu3=)p4SX1I6CnlWfi1CnT-e^CUbc5`-=>*U+nbv(84lsX&Ni&O zeK?vIcqy zO#OcErw-y)CAa+&Djz<$w(9>p!&itNkK2ywi!5IlxR7{s!3a39Cge(l0#Vq$$QZ%} zkqZC=;$Ql?&%^HK7SYk)xOX4^@K62{9vmM693K%Y;mKl7)gxrF+?+H7(e9}CYXIxn z1n%5>2+QgrVuGYze_wiCbJhKEHXucHu)Q;br=NHX?%a5fEb_hk58!an!1e2gutwc6 z$Z&9U2uH_9W^;`5fUeDQk8Km!`#B`|aYInUG5Q6HLZU7y3|SN^*LKfVV&s1h+z}7KhnDS32^84f z+JueSgqm9O#SHUR2YEDQA_AG6P>MHSpWE4m<+6i=qa$W5YK37)@R2GUp7j)mRvN(@ ztxDMaB~u_?vghCHMs{k9)oB%l4K#vQD2}_{e3#1k2rgSMNqE+#c(yqTebAi-DXhPv zdSm$B$Pnl6ae|Eky^DF67S`$XJy)4FP(vOabT}npRh$sNpjxy93F^a8UxODS`!DRV zh(=sz#Oc=;-Y0g}S_-U&)T`kRT8i+nP&!5jo>}qu-`wzzb7N+3yjsJ<;{_ZoR95T}9o*1)$g&36D|hUyITqZ`hxFDZ z&9HT`YU1?mXl#&vT?bMqCAzM&-nV`(pLz^;U^TGyo;)yJqB&GHS}E*F&p^Wflp&Lx3}|fphJF`+j;@P|2!tZa zvtTj+;jmbt1qtH2F6amS-=qT8`O|7fwPTn?(Sw)x>GdpY53b9pjE9h!kqnpOzvV{z zW)+^KL!71hLDcm!T)Q;Ep#%$j?R$#xVhTez<>WMzX1RCSAKyQCGiu-2W##Tlgdyl&F8$Y z2qoj|AYuRmV}w_A!u-gv?Lxi4!-i)Jt_5{5#7SaB=;~z@1@XvW;3lMAn8+aL7tSXX z0toz`(O?Km9YrMpcq;@o9WeRBAR(l33hQo<=9=Qnu+7Pgk{RcBH%Y%>E5$o^_UYU` zd-Xhw$4ce{G8V^M2Ra>K?goVQPh!Y!3ref6e{~}rVNrdB%$ExgLkl2OsnwqMnN?5? zxKxIMzH>w3NrCuhzY)Jyv7~rs8VV$7+Sm|lhMH^Df<}peqaYxub{4p>^p<||lOKc6 zfBvT+b!#|2oWmb|;ZNY}-}o*}XG7TC*@ln2_yTP2Y|_Ab+-IyDwL%?_H-U5E{?qUL zA-sG0zCTuk@cY)BdTCWViSKE)i4uSStJM-#%M;j`&B(5e$75#W9nD}e8N&|2Oquuz zlg5L=K*pqGVo1gylX}gy_q}sHk1`5s^DvQ?3aq5kjXn)4pAsChnDjg|hPMZe0g$y5 zST)`cyDdq8r$P!9+KQOVlLQ`EXyKujZ9NlNX2YIZ_uyl@zo`zi*lQi3P{ma}gqhi# zWcJk7p;nRhek(@UnnfR~9}reyt*=#xk-RkotlG=TN^RvxE?2g1{PUpLtQ>zp5a&W+ z09Y!XO-4MVvE|?G?QCPi3_GOM=M>hl|Aan(IvOH?M!hPqj8c@v$Ayw-sdzOlXPtarlN@+VSC>#@S>855OY%V( zTKN?;n;$6UA!JWWs<-h><{6hKb<~nNwL!=tyI=fli4ct2;9un43=*s36m8ybB(U!!+o|8ug#!RqPNw=+QHUVlC=L;w3_60M zEY<@`9Na&g!(ugro$VW z4S(-gmfp#-BLYg|#P3+G*5bq~>^i%Lq5&`ni3S<`t~$Z7dXeIhjfy9n+A8NKzwg>s zo@Wh@T-k;H>EHev`1#NOG@RetrV101b7_Se(`HGCTw0l@$S|xT1TkFsE!0z%iSUN{ z$kA!Vpeqk4fI~Q;I_=cQmj*VY38a6tlhGzc;76(9WE%PlAOr{857=72d0H15e}Yv1 zWz`YK2)_3m&6&#Z=G*TPTx@%5lh6|vx3}Of24W{Gc<;_by7wm@dqhw_4G?R+wLS2v z(K>WcSp;HVmG$uLa{?#J?pF%5)~2W06HJc>tzA{H41`^O%KGL#TXWiWlyKhc2F&SK z*(lcc$@1FvDlA1{sK`#+5iGPJ_CdvLnB!hJQHnb8gD*Y@|Nb}rXJSFbcPvll@RL9B zarp61e3*K)1_<94A|_1m;p|wHEhMkGd+$D6f9E~;!E4uG|KM0qRE-I}`3T`Li=|j% zQn{G?O6b5chq7>VLgONydHfOBn$2J`-JObrEujQv`m8)un_R79Wg^6me zVxQW7?@60d-lvq}2lzW)jy1#&}8@0h~3~AOl$k(o|op(t$k+c-Sy2cKiN4xc6{h9HM}&w+LO?wZQs$ zs7fINL-k=bE6Z??#tfqx^H3OYLAJ_KXWy;a;5sw!RlIoJQ?H&iOyCffx=Iy(jskZ^ z%;c~gJw&GsX$c#z%UAWWS(CggUg}9GB|IaT!|R!o_)zs@_EoHA3OnAjKo+s$HW+4t)GSs5I9{${e*c*0>|sRa zg0rrokTBb|7A86TnX6*S293K@Sge0XlNnlx17XMkZQks}>jm915ZF9yee8TeURGm_r3;)C6}oSxxtzVsFN zhkyJweD*URhyDG#@ONMOD$I{pHi9MjX|l8F|63_mbKv~_lKhjz5e0V2{MoBOscz>r zu6s7rJx!o+O+SVeI>Y*@vn+QQS3!TU)Q0!%RGtUebJ^Pig>_N6Cx{rphd%TI{QKYd zcktmCo`dOlEW>OQ5y4P}BM)G;SdcSK|He6>xCY3aj59_Xo_l5}1rd%x!&O=g#@3m~ zM&(52Q!b#wZ{Y@|wwzw91HnMQ&(z*t)F6e@N7au{)c= z(~n+-*WZ2*?mWB?I~$t>9zKTwS)Nlx?CqQPVFlbT%>8W*^*AM|_H;!n^PZ5=Vam+@ znw`wBKTJ0C$2$xzRK%?^5f!}l>;?539nNyvVFsP)D2ZzjCzly|v$5$ya2^vB)B6zF zZROS)ooOkW!zyt|*^aszE0xPNv`Ma?2Qrp|<$Z{7=_bLCee5IfzyELl0j^v)4?N;< z4V#-&c;N%j5#h!D!9Em$sV^2wcyMqCuV1?k-~H~(@WVIXpc!!YA0ET}q=m(r`w8_# zadq9RHFgZbSvD6fM_VERKaN>Q2@a3u@a>mhg(n|-oLF?n!$fjFOk$7a{IpTW8mx`K zhx)`yD`+Pe%)R$ zR{5Hp-=SC7^itXbW(7LiU)>Y4jXIu3zB`Lt=yTgl(I9&R+dH4^$LuibU}PY??*7Av zu`|b3G>Ksf+z;YVJXEOY z9IT}&pL-`73jCDWC4(Ai85JwDWpvSF;G+(YR>YL*-ruc68lktuA_Dg-qnxCu6%$kj zH%d;5url4);-B%irb>uZ*b;=M##0yf+lzl`z$cT0p8;b zqtO_SmL1%>cLMOKruPb?){}twZq0@)#NyzqCIvS!yj>f86z;d~y?;@EiOuo@} zJm41B3gw(e5F}nx9eS<0Nc$awfPjj#KpSjriH<&LIZM%V%avlL z5$}wJ(&5Dgx-}>6kd3UNK@r&u89U8Peb9ck#^V88ytoIy_}~33{QAH9HQ3oem|vm5rU(oW*+FqQGY)V5 z?)P4SmtOily!QH=aO=(;*gra=(E%%}t~Um6)mW<&9a}<`PLULq?-dxRDPfzzn0qq@ z#e+=pwOkkY=J(!!ot^K%&wTpFplr1;8;!Y2i=-noUW60FxygoVpo){hzHuD~QpI=X z>=N2@&{`bK7u-)r1U4;=H8EsB<$S5{?6xg>dOA>9b(#$e)*dobKtVbJIgz~=Jiw@Y z7(qdRG5vaCw?c&!4T!<2q-uXiFBB(iin8vuC#pB?u?z(jVM0%(mhsvXjMs@ZT}iA5 zUzNC&n|wx_O{v#C$HGRh%_7*)*rsLYx(5Oul(3jFo1)oW5;QTG_x2CDp^)Yv@mz(6 z$8+k{K;d2D&^!XmW^S@wuNX>ZkQc`M4|)(gg}YFOWRPtGs5d8KONDJwAA^imbh6Ay z>Lv^9CFd|%!#CWkTag_lY@Z2zC41p#bE}ik$@N|d3Eb_wIkk> zM(K5wSpQh;jczFQIsD@>G>yhQ2pLo#x4*w{Uc}Nhe$e&%6qb-1m5tCZ*sBKV^)V1z zOS5;I!Z2*yazF2!GRd0VUGjGJ;>?dw!m8gO3=@h7XFJI=paU)KgILq(+4%M8{Yqsi*NQgZk#8merp`h0k8Qy>$PAb}}g6-;6HWTr=f zssc9$ED-&B%u0g5 zRNcb>2of0^J!^#69TR~Jw{0aODnGQlr2%#txS^RlCap;tSfQ-NKzjR3*n- zMW`W{H6WsUp>W2PWRBP%2XJj`2mbUwejd(WxCsC9UwsUodg^=d%ByE-?;6=d71b@K zBGi%cKw5nUfbC&_QDCucB~ajfi54Lw%nZ=EHzEO~kJ7N%~cfW|3 zug9XG{dZ&SwFyT+Chg7^?(Bq!_pFEIipuPf#nv; z&f$JTW4WU}(vp*><$!C;Be?taTj1=u%LD;iUtgheisfbm$B(pd_1Y#(4km20Nq`uV z2NQI@`B`OeTFr!_HN>VWA=nkOUd|tHau*jd0!}NvAC7-B&jZTE_6a!Dzm}+Al=i%L zhfEjOsHFskM>VjM1l3ee@YzewJGPUMIl=nNwbd1P^x+5LH-Gcj;O9U50U{BCJcAk1 z%jYbu8VX#zbP4|Y^IwLqJn>C9cj*c-bSKdzvn~l!apPoK+4Vs@AM1VV5WW)jQPHds zlD%M0IPrRj>`Ur+cXlW6#Jk<$ouanI~D&<4aNsUZn=>f3)+}-7aVInpJ*Qi z2T>hrB&3;UKf7n0X0}VU#-?!Qbas%J3X&MG&${Oz1S13S#~i#b8iwwJ^z_@j&0KnR zsfDt7nXX#mLUsxkn!j_;7_)kPM=V}FS~#HgOK|k`U#{hA1NoC94Sd{cGw8jGosYIw zfxJm?tl7+DQi}ybt4y@y8X1WTD89!8jhxKY_icO#d-+)8ak%tq=)YZ^7a+<0;KtHcs!j>buCNh72zvA`Hu z4Z;!{r)dm_vqFXXvuT238!ONz?K_htZpz=xL9ye0m?BGE2B|X;hCN9xP(kisU^rl| zu_#vOBoAl*lu`qusts-%Hw)ygRvvSUF<0N`*S0W)YD7+kLnXB4G$&I={U!D#(pok* z+%tqrMtPHYQeDFoy^TfcG$6q+H!j-OyD?LFLs7yeIjdYrez;m66h74qzU*^=nX9f+ ztUlOQAd@@>syz|Xokp5OXK4~$vL1{Y;ZkxAFX~n&3gkJ9QZl#9{1zj`X7pIir)V`f z5JpSO&<;k%vPh%`RL{g2jR9S&Ba}fd(%YsP_~9b@SL=+dX=-p)%>WF_#k1<-fOXvK zQ46iL7R<*V_oPSE)$p@m8bZ4|jRte=U9t>qqRd)XW-!ugh#kuWP}a`O*S(PgPX@3* znZaX!`*-l2?>_?{c=RFI-`a-9AAb^N9Xt8fqsT<^`X_yCnjYR<5d3f>x>I9P^@SRK zy1mTkW~Y|>1@Se8k_Fc6x#wcTcWrLtMyrh%8MOSPa###qYEg0uD$Gbfjh9#8_=#h1 z|9$tuk@Xd-k#ZSG*7Jy>>Y4i*6@gvb+6pX1Wlf0_)UJ?$2r&~z`)3@?0^Vjq46%_qPN%IGn-Pzy2+F`iK7+ zR@T|fPi(9%ezTq{7iQ(6sa14~rY4{Q5 zimZr_f9)HDZus~IABGiVJ;vUj0C_-$zoM(N><0*p*P-ac9qVAwTV_=T#91&9Sb4D$ zk%&rAhht8M7p*T1*N*zejOc#ooHKS!WJNURESY##|HfBvYSiBY>z5W%pypNe?yg7@ zxwk_KdpGNmlK8d>_RxZ_*?pr;4t`HNtHl=3#_UmcBLAs{pN){i_iVJ{eBZ(1goVsW zfFsIBQ|K`x7s1{P__xE!1a@}!NI6lR6|q^N8VUjDOwS?%Q{ojJgF=B%fCNG|%b^+fS z;bRUz42Gc@G@c$eAvDz&M?2qqc`hn@y;r|LQ@@{jPNE&^{@|sGR`l+-==L`ll3yll zaKYD8|D(+01$4hA*?z4QJ4VTq^vWz+yCB2>sj0@Apsvx=8bFf^QMwvw9yXbp2#=Z( z83L0DLTuPzF{Pxqc#U#NW;hqln6+B_g+@hoXc*T!vDpg(y~%Ojqt9UDkGevYg&XG8 zA)QiBbVF^Y%6)B>*?}4tF1mE}QbxzwHjsa+3U<}TVlf(Gzc(l>QyGIag>U*UQ3i}) zsMswaN6B`Hx;`9Hfv{XL6?^Zr1DwSjlvPWZhb-k11B1%-?BxwTr$U z;i{3TF*O$GZh|#qjZW8D+27SuXV=qXY)?R4lEwYjlQyx%J`wxEnWBAhFe3j^+fBxq_1pmwb{J+Eg!GXb> zqqd0BTTJ%_38@tD0(~5qu>iD2wBuSJbrdZV5*w)Ug>YT4_+IOqF=N@JkUea4Y_UOg zKLb|cVCwhmFws}klF)5zna(8I2=nVMm-qNm#f+U?q_8!Xb#16!hAqMSFcn(4mG=J*RzbB z$`XGz23bn{UG_*M%F#8a>{JUdNkiC~X1MjXo8g~+@)zNkKK@a-`<{2h7z0XJpI17X z=PXV*+Lt&UbhI9L&z*4W$U0>>uHYhX3o{5}Q+_mxil}-4<6HijZ=1+X&1F()r14L#>t#B6hS_pxstWKT={r zZzP(d+Ost)G}MA@X07?ceIR7%tnMlXy={`h5Ot5TZb6%k0-Ty4xZb2y?Ld6}qFp~X z`~`M0p;s8n5)4;s4l8TjG-ixqQ&38g%7)cuWNmWKUz;~VNVyg18-Xc)GG3EJXtXa^ zBSd7vD2EZN{eyj2URk#9({zU#aUG{c8WuPltmJ3b__dVCMCG_tu!A=mxb*_-Uurtq z7-fKY!L4TA)os(%E7FIRB^6qA&Po*R5)_6nWD4V|iW7UE^Nr@%VDlFP%c9;ZRZdwA zktkvF&k5I}Cl3ZID>!vDwefF|i{g11Nfu0aVRl&XF-q`MKG0$;q#)&?B-nXW?4xMCyE_UPb*&O~VB?X8KKFmXLxI8|F_P=eB7Dddcr| zhN2TnYT2vFbJ9s1adRpZ)S!?(?Y-A{#FXoY_#o81s=+#q=99D5aD5zR$7s}|E8aeT z3I5_QKMxnqUx3ek_P5}xPkaqte*G*A$ndKp&}JZLeL_f#7I1?!964bh%Dk1*6DB?n z(8zCEZJ6%HKy4_q(>ytxNkAtNR1Td-{C>{NM2t{XqWF*2M6>~t-&&Qq8kWJ|vonk! zsZ!&&zBYz`^EZihVW(co6_D(JG7wr) zfjzx&Jgp!Hx*0*o62ZH$Hge2lVn})*^-MU&*tB_qf#0Pu96h=Y1DFvDN+K+e7}%~7ATwt=y%7iDEqHg;Bvn5$lp(hGIMvcSw$##0JRhNZ8mp|V$?(!-t^ zjkbqpWBe>|n4TK;+4{E{>ZiIM8Gc^olW#fHxU3mbjFv)Eo^RGhO1Yu!qux=aOvt* zxO8>XIJSpyXXJTsVjkY7I!bvncPggMkXQuI_QqPi0Ii@S1lAHMR< zXW;FNoA8-WeGG0ozD}(b5dDJtbOxQQZ&BaZGgt}$Rz0HYt${hLvm6W@%GTfCX1d1J z@15c$=$Po;FR1Nu{i^fiXP@^$jkU1e+bc`+ZS@a|^o_LgrqHq_4zZsR@-&M#yYD++ z)flQ}RJ{`D_;o(x6hO4mH5Fi5V}`9Y*$uRU}txiI(aWIEz{x9WNBVV3NhOvSz(`M3>uDdQ!l95%pQOa z>S4?9BRrgEnVdcBYqPVn$5A;d3o*?eLAKp zG$2ky6B!XjCOPV?xG^CDNC>-NLz~!BF$10&ih^QY3Kct3eNW>KPbd*MR}F5l96w?5u<(F81BX78OGjVoiT~Ti2ENQ(qwyQhxZNE@^x7P5&aEY3_h;& zx(inYyie9Lqa_q98O>c3}r~2GWL1HaMqnTihKs7zquT*OpLz#pcnlVbRnpN3K z{e;Lyx)EhDNLzFzOb=JGZPyZDVUOC}Bd~rIi|Cupkqy2{j#-nWzL(d0Ky$$@HE=;D z82lNH;NSea--8DpdI)CpJ+9|QMpPW);Xbn+Vh#0`t!;Sq^|SE(r+);`z3>xw?d)0D z-r0jgag<%(Xic3rwRc}b1;2Ji)&8?hpl5${Y`{NPk_MjjI*kQ0bR3hz1Gsc0!?*UH zhu6>q;kYZ`x_H%21e~(U5rI%B!H`IRDxoiZU9G!g2BI4dlUbCO0?kV#PmKD?IkCGkYAr?HTm0xs2be-$4V^Jq3C`(Ae$c}I(Jt4x65TcnTN2*+c zfW>sNjcKlDkB>3w*n$_Yy$lS3nu6zFf+ZRS#Af0;Zdi5r`^Ra`JFd&2XsjAp#!}`{ zqekkw+D7T)`Os}NKmZEC;D{t4PpHXr3!`=fvyPjeV&=e)U?o-x!cXCt*cTra~87G=_fE66;JF*3E^pN#&UQ)HNpZEc)*xg*3RBdBMa08_nF4%1C27_yFhFGx z6Q_#CAVuoRgvS}<#O#s5IZP4=)K&t*Gih~vC_~S``XW5`)hFQe$ql&suG`_y{`CKW z!^0_4IP#ubTo=$IvRk|}748LDhffCd58 zvBSSn3!KJT#wZ&eqV**64HLW+p~i2d4-f`^$h9Q)+Ln5gq7K>K-KCl$Y)XxKX?1ml z2pHDZkHXseHQ3$Sf-Bp*#F&>QD?;{?mV#1dmTA|Uj;Z&pf0m(KeC;BdEQtYbQkh~V zBe}gEbd%XVA=@zzLj-r*qGN7BfM5tGB~D8{RU@O)Gbo^8wB^8n8fh2efGxuzterj$ z?|$zC@Tq_DNoq?p?G8EM1FV~HPh8vHhVvIL!^^L|2H*Pb)9}5ge*ovsUnGaT3uXH` zJGob>93&s4`HBIpqUX5UyGiHLm5KaXs(JA86KyBscAA#zX3<6H=y$tQI6FIpzxcvq z@cR26gpa=eK{$Qt7;LPLLCt5i#d2^MRi9~DL@^tSky}a7Ap%O&SYA*|L4O6uoBnBB zD^wY;UeMHjGKWjeh-_#E(|H<93mLW)7^&4URz#QDpp_1S-mht1oB3H<`ywW$y+9a5 zXS-KwQH{m?5S>upG!Ttd$xUKDNxP18vZO&_(*I+bSg4LB}HZ;Wh zR49;_yv0M*6^J`CmSeD;>rPFOh#&}kL5ZKM-ZP!4wH-aDE;?vE35(FBs35fgC_rDy z)?TFxU$~E-%+)~sPz{BNAroeLUF&q?L7r0oD*ahm_=>6kBAcAdbCR(q>03gy=27oA zNeBXyjn^XWNwa1Qc}qn+@SM2c4JNWMv(hmUQ))coLb$n-B}JTq;_A!*Kqszi6G4QM z5Hv8nEO|sl4tZ?kiP5_(^Q&YNv2M*A!7v{;(p1II3|mS)Yda7!J6dPN z#$3!73sa+Otzww-BuHev)|$q^ctxU#d}wIf z2qB)4h+e0A6g*&*f*R8I37VP7V|Ig1_if@D$}H6KpaB@E6>2fKVrs5bbDgAVb|W=J z2vPc@KmIeAO*1@j|9$ZEGta_vFT6_8Wn^Wmvkn?~i#y0Y&tNXg`g!!TL<6>3d(Uts zfvtA*Y)N!Ql*?c^i=&D}1LN_S0#0}~t}HJzA=a!j2yATt*a)jJ$1_l~u?j!LECgQv zrqgHOU;O&7!_8+-6N6omeTMZ?$a<`heRVdO6-kZJLae3SIC&$ng`qamf3Xwjq3Sz?rlF3|^ANLEMOYK@vxAbzfy2?ysNQix^|=UXZY8*Z?1@xU zmM0{4tivVX)(Jco-^bo#i34a$tE+V1rSX^;c~71=2CK_U@bX*dDKj^nd2?~DTlGu; z2&5F@oDDhQN~}-|OR`u%uE4+UV0mVs2;!%*9ilGQGt~5$+8eSimJQ0(av?^{R6g`n z?L*wqu+H*q91JDw0yM4EOA|BY5cZ~1ICI@9VU@utGOx=XBd(h z*!9_FHQZL07qcr`M#FXrX7nyhX7IP)`XQXZx&t40?|b0xTTjE8lgD6ryaZ{+^PtYI zKBrX?L{kcz%OB2QZJ9%Y{hC1gr9?^T1%RSbj`I`1SlVkdMaLqA!Pspbk)_b~I7^;* z2(uRrNh8i%c4p)+E&RLwrt$H6B_`Q5!bu>f1>`s*0ri)Nve*Pz|*#_qf zs8q8hL$q|nWjfkvj(XBQVU}>B)A?3=_k_kpq$cjWt zyXh3Bvjb|p_udB{fRiVW!+1E7MuEKXxY6N2SdJz{bKgxTbnVIQx51llpMzK5cmv)% zcL8>HcVTU94VIUer3aInrO6x$*M18*KR?c6O4b$^+yPRB zw$P&sg71sw2dSr#-Me@BER_tKEEtry+Tpbef)ZAT zw-J^jIz^@D&~%phKxsJQJJh-#BVEY>{-BYf#*7gB3^F^}n#Js*Er@F6$WB?zP^*G@ zab6cKM{$F&KCu=UgVhRM&p~?!YaX&u`0s4S5G(B!qy{- zje&}kWz-cGBUuCf9nYo#Ih&vR;$OoHFT4Z~Kl}(RjhEn?Pkx&q?bOa7wTpE)*dr`3 zbQT!A`n)L^KG)fU3bUq6U_0#H!fPLj^fcPq-XX*X*1=#lbbVt@8q^+ez#;`Js&{r( zo^SH?ASkS%4yJJQ$Qs=Bt~=o9k>haW2%e*3lU=$*b$5P%001BWNkleNWa&FKYJuk*o&L78FiXrJDd?uT&}FRY)hk$* zC!YPuod+kE3-*U)gd-Bd!|5R7YOMEI5sp-q9}hw)@kR>p#76pFVo(Huo#?EWc0@sf z!Rj)6{L!C-M?drk+;!J&&~*dS<*6{d8u#k5DST;H>j&fPJvfx@{0Tk~Qx0h&p$7Zy&z@?DKGK za|^CMbPwEd^G$H-)py0??{rJ^ zMFKy9c>#UTu`*DN)mkppnk` z-U}l~gCUV-?Ck8oVbd^yhCDsi@1Sy<&ZdxOhj8z^?}iV4;88ewbb}PU)`RIYwZy|K>Y!_rYxan}j zOzB`iQQt(7x`D`X2P3pq2LqUhlh!Iu*9;<2uF|uK3geMb0oWkmR2rS*(%Yd(171;b zt!q~|LpiF?5KMK*<66e!**z!Q`UxuOEMcBX5TEF{gJ!n-OBz`gf2LReaP%=IP-W`R zQ6#cW28+lW_t$BtxvRnqDUuEz4OgX4w9&~4IcP1!c{eDSXk~)INX_BE6gJh#$h=^59gR^mC})NHcQHd;M|EMv zoUq3BU(sfqO(Lf>N!A6VL8`ccWV|!1(Z>NnKWW2o9lP#TizVtIE;E=Feke{xkt}Eb zpmM{Adplag%B=Il&&0Kz4F`crrkY{iuT4dOXL5+wQF51xU?9)AMPoVf`; z^3e~#AN;|ez}x38iEL>$vY75IVKbE|-Qkq4V7Wp3T`$XTX@P#$KMDB=lXQ6IG=~Y& z03FuHZ0+p8aJWX-Ute9NfaKMy*ISCw{>F&46|rEJKOM~4?Y6F z^;^FI=iWREZ=8Lb%j-b*U1yMAU8fYYZ${8jY`utNYsMN>*D5t0Kx$+UQ&tFP6SJM8 z1nWnRz^OCGVE5Wpp*NQrACY?uuA=Usj2mU|WL+9B%xR>TDB2{`X$b)v#s|)XB!gQy zpkvt5wP%?jgj4EO+A#cW#(NXU>Ej0MhiB?HNj0mbvsxcL zp9oUha__s2AWnSdWZO-eX%0adJt_liQ$sGyc9h*(4o@V9tVG{eYwDw^Hlx8Z{V9*l6slGwWm*APl@-k11zB z_@3G|{pxF-01YCUog8K!Bq*2L%t?n?hSy#{3wygeu=~(^>G>~QxCl3&It9m%A0v5z zG^71yW?ykf4?vS0j81D6Ca86Ba(@j-)ObB#Q=K10I5{#_lLhKH1PXp_v7?ReXVS|v z^=eV|?2pL<2v9}2{yVi3=OBhDqVk|>3luX;QM^6du#6$2 z#1W>$=@bqR_TZLNC*jfeKLSVAHVj6zxxWQ(yzv&i{>E82f9^bN?QRqFz=#V<^x8S9 zlY}9PoVWsTZD)rJxKqbB$PtTAT&n+XEb60%NwFp~ZbqtCuN$sDnxi3*s{iR+L@(OZ z!yIHq4$r^@Jv+cHyLN*uXsl6FKd zTu&wt670-ykf&nTdeJN@9_D*!gxM&IlcgCKKHv$Gf^bJ9Qy@b}YezJq>JFW5Oj8!J zCZ&{~0`fz(H-r3?F>M}vwi1^-EJ$+Eos;EyeZxs~!`Hm}ijH|TZefix%3@r-mdSM* zVKeNyDX-;VNHp2J)&rYM-1DtA7)H~jFpHVCF(C3DlqIZl>au0Hb!5ei(uh?r3nbNp zP$e8>aaw4d1d^qMAl6Gn_q;)pbY8WFLD@LP&@JBR6l-76(V}2Np!;U$e<+X#ZX#_< zE02)H$OPc*nLaOOevs5;CtT*;as!f~nNS%!Y8qwj6Gw6+{hhEuYDsYJ!Ug#9SN;~Z zb`RlqfBiS%+fRNMzWwd*v9a5>QoE9kEmaHm=VM!?k^$RKg$)tQv{&KSItW+8!T35T z-^l1U0I9<>d6ewA25s7wAo$og7-buo=8hjb29wEz5Fj{y%y4SmpCdd{7(2Jdpv(|9 zItPZp{?2dz7X1Ey{d>^O4&lk|YjAaC%ze5LI@od6iRyyT2^s*&kJi7YfaPt1lSQz? zV2E(b0Iu1>0BkGk)HG5bNmt0Qv9S*K-G46}?Cij6Z@day*LHwQ9~)`b&TEE@kwaR) zmf?>A+of}=5t0B5*ovct0kWa=6+>3hDQ3Qezy{%SW1Kf6L6Phv$TiSzVTfTSCP!){ zo!HSL@*rVrK5}$J)-4$eTn2`j(GI2H2d_z+{4Bsp7`FUuNWhZCpf1(94$hh=Fu_ic zNM@|1EDnSl!D@6`1{&P5kF3wCtWAE^P_{Ni*`Sr?d{MpEfMDWuzM?ZZEb!{JD{$vM z_rbsWjeibzyz3U~pM_YJ{mGQ9T%4=Rn_KY2-+dGQ>Wh!V^RJwRy~7!2BF!;yqe0Is z2X6!m&P}2DL#Nug#h*O|`%3zR#Wvuej%(QE;UwtYM-PDc)3Nj&4M~1rY0bHdSK)~# zzXf;SaXUPC-@D=3)m>Oyc^mG${bo3I{1`c@$bv}DJ0x?m@O=zKVW1LHBl|5;f6Qbg zEj~|iOqK;r?rf?fOa0e!_VdtOQZW5%c0-;%* z_Sxs);+4zXoKh-0w83Tp?Z@DdJ1+h$P!J9_E6i|KxM}PD;Q>r%D=-?3jgk~nG7$r9 zj$0Jx*@Uczt#(*nU(m{U3k#dVMy;H!6hEUz%X}8iuUAI^VoKP*6lzw?fpjO>&fX?Q zCF%@_Z?)byiYSfiLT>8uE;PS2f)bQ={ql$D&vz+cH9rO)5SBc0k*F?)4L8OjPw5~Y zVMFky71qH{3_2EMqVm?r1U34UjZ7zeiyT|byantuA?x8GK}&==3n{n<+TX^xs=fGL zX}|gK&+-fuH4#c$){sRa|5=(V7u%FoZr&{FdiMIRl4io(;F_OeQ!?hK#ntk9$az1k z7fo9@g5J9K{~odY7BvK+j+fwv?m1CfGm3O)=}zB3Q-)-q@PXXWoD!8f8G@b7Azc?C zP?9kjjfT`mMjK%lSFv7$7HOJkyp0XqodFO-n4v{Ye0=E%$29Q`8D>sN&wXK{PAJv` zMlzo^Zf-u`6?W*+`64J28oJp(N55mM1T^jn%Q+f*11?1LXk#ldT!PmoA{yv~%wtH6 zorQ@^$xg&E;`#`!)evJP&QDSXGB;8b710ROVU`*r$^y)U!dVD2k~GlHMJfGTlX2@a zmOvW8BIrh8O9QIkG5DKCG_$hdu};U^%(%D{_9j#K+!wwG&prPW_|&I<5oVJK{MF~a zAZ`7$ku?9OPHwg3s=%FlxEcVA@JV$DbzaQj3RX+sFjM_Y?7~7&V)EE?X7Ld*^K)fu z3r-w63PbGuHo*F=Q}EWg^RT_M1qId#icc`Swh`kkWM&)bS=Dv0G;H9eGpFHqfA?R* zr$7Bm#1go_JEdzPrTWrX>!U!NoQ~jj2-{v-UZ$teOf*LLIRnMWlc{7~iCjgVm$RDu z9%g^k@oj|wiD8%A7#jEQ^2#ba_`v(&rI&s}6y&W0y=dM#phn9&&nVl{i2x~RC169g zzny;wz2&CroOK@!TFC-r7!zR#)}Bi(8o?F0OmWomIn!ls9fLj7Fu*Y)r%mcJsXfn# z8$=5<44-QNEgYb;OAy3XMfA&jw{-_$;t{IDuzh{0Y4B`Wx`z{rAGVZn+7rY;VG; zW5?mvTW%t_F=mOO%a$1zt&KU<=hdGgSRg&yTrVDB;_;3HRFry#-#@ak2AkVku(!7lOG{F_ku#jU=`=K>5j^qrZ^GHP-l8VYEv2cKpdE(8 zSQj{?XPdypqQp>?$`@z{M{WjAf73|hIo5K71!CteOp?MUdIEdhjc=b%L4@OEsv{YG zmsg|Xv10$82QRCu^ATbczUUThuc3?41CP&J>^W`eeASC*nxffS8`#mPXu>#y;T8mI z;j8+aZ@4&Cjg(STV}+zNp87A+%oODbH%F^YV(lKupjKq?;ak*aqc!X^8uV-|D;$Ht z5Om1G7!GDd3ZMNjKx4L*8kwwyqcJhEaXmw3uU6g_tzD#1t}l^4ch04rtJuvxidu{v znV$1n#yRy8-iVp{65g~r9MA~8toNJ)20vv%7kyltNjgDEX&C;KB$B5Y%p#dYTx05m z0v#EiXk=*sr%0U@MW&~-xhyR26L!owTh@Z_$YO$5g2U_c(m>zRNeZHELY6d1 zG%3Q=YG(qadjW?a8Pv}%9S%V;Ztz(#i#r@G)0AK^N?BgDIWN*(D^s9^M`f@2OY0r= z0BuJ@qWs43wW8}98P{yW&TXWmr=DV6gj)uqq(oU)=R@?dL~NZn#GkL2qt+OmdX~%# ze^(6oRx^X)88Y_{12N7Bh@27f8+{{bAAyl~GbsK}eCL@T!OL%)g*$J%4X$h*!1=4!;N;OGaO%WS*jQbo9(DNDX*Yor z8_V<_)w@#AM$W{Zov6@F8*$PJ^}vYBNrcWVc#i(81-m)E7iY7Cq>S5{o_f$m;4Y1Q z1*!+D$00c3zQC^33}=Lk2VRFNXBK|6gh-f&xz*Kq6LScIH&{EH2q`r*UCw7M^H3x$ zm1tw;Q0>+xIA&n`Nn!Y)Cu(SjJpf1nhNhV=>9z`P@W$waEl%Pd9qX%Wuye3aFho2g zHddF3-RXxv{xMv-e3g{P>e_~x{Fdsgj7o=a=-fD^e&NQY9rxh?P!fffBS;>LmuQFg zDN?K_d%W7iL}4#Z9~<0FcV>#G9Q9KMnGEyMPn@Q3Etjj}k(jD*GzcKU@x`z+m{c9n zSmfwM*@}9*9}r0PJ>L+ichz}?=#lB(+qU-?z5>S9?j7cx?GHBG1`^fBLsp~d+^ebM zMxCPp6-+Au2E;WG2$n+NT4B%h2TW9Bn2S@}bHo^p57cqW&gSc=H4bR73`jY49QilW z2#)|^kXVWR5(Jo~Qt*SOva>{bn|UP{_JSX%KFx7)(}H#FFHDpxNKrnobAT*b*!cy$ zz9Sa?qQ<)RN7JZLL(T7DA`~nowNVK@?7`Ec5H575@ z=EGHbyEn`dCe0x?HYYk+c1VSuXWAe-fz^CK=zEql^J!7nVr*J^hd~+$Y_HH93`b*z zjCImeg`1zr?`(jkq=tGIR#Y=Fn%Pg10UOL^$tjwR^NW#en6UFh&_u~>2vcJ=<5?UP zgOB8@WriK1B%7^0dpGOEX<`Qnudhy+()E&4tNRl=@8cs^CCD%+JP$Y{M$nsVJp)US zdCWQ-JGuccy!<-+<>$Uk^Z9ch{W*B*J5RxL&%eO1un@>`zWh4t8zZK62K417)RCxc zx!f$?3pvu(>s92??#PIjS`RaJQoY|(qJSkLNsu^$WV{^^li`)C*WlXbCTw;ys*7Gm zQmo9Ge}y=X2LPY>l~2R3edeFR?YG^+azL3PDz1_?FZ>-1$Z4OwM(V26$u>MfYqTGa6>;DVZosLylQus5Gi=)c4rO3~Mx#)+I~7N32b! zrq5G8E41#T4fc~HI?cvV`&3)4WP{%F=TOH@GiQT4opaGeS@&QFEP>VNurA6bLtY2P zMxytQ)6-Yaer_OCEHjb}V$5rcXWg~EJtD1o=;8a}!ykPZ?z`t+SRRkaS?p2+Z=Jsk z&;0mBc>2fB!?Vx50MyqMqGz_~)q}^? zwosbWEsz``#mkf6;-#x_^~xr-pSb0wQ*iR=2An)`9FA>lz_Fw2aPq_v7!4Y@^Nurc z?C23*L$r&KAZ+IS8GS|7!>u#*75XV8Rw6_if`b;H!h_!&cuCH7^{d?M;HS#JdKx@U~O$3 zHg~q@Fj-n!F*QP6N%Q=Mw4eJ9ZJc*;UbtwmP#xLM?jcbx>-^|iJ3I>Ha0!NuV67`T zfjU60){YjcMj1#!(MCbG+6FV|R^$DCW`mqHG7%CrGn9 z+cepF4NWDhKoQH*IRl&+wQWG-X^#%MQpI?vp?Q!GRB0tLH?s_X57x8DfO;DtY%Qr_xqvY}*8A`Yx z2V6rzMmj>F$cP&-^Pwm6L(8(;spX^pn=-0yJ2e?ww~(lq4pdz--V= zh(iV8)soiHIGwnKQLp|0XhK$_rl+2 z#ru+WoGDP45MC7b8bbcqDIf$RKWp3Cx!4E+5Yo0M>R0B_B5D@_2@WO)(9C#0AoAi+J3=L60q?S+;}YH)8NWKwku^VoRis(`de zNuG7f#ZeM-0$pn707ILdWWww`PSV3N0c=n9;mYIm#p@I|A&e}0zAj#9_Lzn;uCD}pXSd*SltHZ`YS8IK7?cH;PPIC1O<+P?|alz)jBT;5!^;CfBHTog!O{&``JbLA3l z0%{TN5`;J?70(Eov{Zr}=cE?@UXEqa28j<)v?hf~0dTDb$d(6OOpX}o!-EM-4<}Si zjZI}SRZn-x-or>`o9j(lYTygn3^+?9mf&n17_KszIkc=% zt`IRGTWd_1gjGn^nw}R8$|;L0H&Ao$5JS8dx5R9WOX6lYU`e8&z;E41@Pjb)YI#An38!66yhYip~lqa?exwz3S% zciak>E?V~WbS~XB~hO+NWDsOD0Ee$uPMO}a5 zVKCtRl7+s$mAXgFgwCc1(zv@Nk`9D0YBo5R;?)vVW65nB5IWgPy$4aoNIV37Bzgdm8%Va11YX)%(n`*USkt2CaBd8yM($H1v|*X$46_~$ zWwkpvoE-wBp=u?QF(YOuVCzxA4=qq5W9S*39Y`H@X^7wqbqCGQU<9we`5KJJE&T3h z|0R6z(f3h649By(H-o2t_#FK8V^6>jpL+?eY%=00%X!*VFfWyRRRnSTizA7DpH5f* zrDyHjJr+5v0LqTC@b5KzuLND(!gf0v001BWNkl>+=PqBS zQj4|K71&tYfRBFQeekglJVdo)qv0~yMyYh-C^xnzQ<%>f+&1`h*tuXqEI*r=gwO3< z5V6VGWmnGzbHX%0)`LZvy&hRCd-`zUI!9YHI(y=@R$uBlihAEg>svdcVSniN?40sv zw4i(Gf3waS>i;Wgik|V>3szZX!S+RMf9PCAn|lz0C0s+BWV6of;dww}Xf*zLjehD) zQE8!)N8utvM`(?ee!9d1JDnX4+V7>upheMd4Vs9{# zSt!EG#u+zkjpA&!u@s`?r!ZrNl1o6wTmm6Rfyv~6se-#~LD1tD)qYFIkS zYDj;uB%RbHo27MrOhKKkOMN!@Y7t{gb`I4zbrt+D)qcInmrtW8+OlBMp8nM$U z%<_cZL&O2~SnQ@SK}TjbWg?rw01oyi1cjq|B!$2Uc0C0eV1rX=QFamLM4axHspA1_ zE(2R28p3Gcr<|SXPmO>^`nid0aYl2-`y@%t5&m5oaVMqg(Ks4#*05=$r_i8<*DqXz zuRrwzIC*3pKJoDn!VjN)7QX-VGX{xkn$*)%VvxoICj=!@#lq#SF+l6Blmuwb5QDH| z)z#}q(&JVu)>eaLtD`8AAI3!;?j#JL3HC9gxKpTkGiG;CE(Vgdx%tc)GTbg)yiDim zFaOFX;eGFYkO(+(VP-^i96)pfo|n|hAORWK3?Fp#2s01*S*WBGE!7i(81^8j0@37! zdqE)@W;#10J&6o?!0h~HROvm4+=$?Ryc0Vm&;qW(+BmunANs%t;Dr}ngsa!C6006M z-pCTUx-=$-bUem3BiUq%12U}{J(N)#aXm5D;uV4&mZpKJ)Fuv^MjB6d#9%oUvLKK) z51741_%LSbW$>IgEZo|JbytGPwBw$B0v(1pH(AW?kRbqpg7V&R$BZGNICn@8G=`nY zlrpELtt^|HOmA7Sh}3j}p0id?77b$$$ROh(LK3E>gR6UcaBcq(KK|)Xz-NE^HwYQh zP50r_wJmu3>rcUd`qJ0oC$GN=I1Qu{x@>iD(c#dVs8Shm*RvLCithiSUcKxggwSZJ zHZ<7J+J{S#WUhfi21)g*GWE*uD2|x0*gu%U~27uLGN1C$K2%#j!(}S?m;V4AQHj)PYrmY&C)XakKMc2 z964E9l|58{AnD2K$U;3^BW$lwh8(1MXQPfvmL`N+Jl2sj;NGfxDk(&IveeD&@9)ze zk$Dc4{tWBHN+%EH5IgJ5BTx_3FGc<(vRQ@q#E7Iq9pq@oY{$6^7l~17WqE~^d(PQ# zoMrUHhOrD$P!Y7F-zE^(1{<9p;KDv zlI0MKSqq6IWj0n77DJg8U@B~NeiD&GNDr4LOHIa+w{%!Vat9Gm3O zqC*~yg_Nyu-BZ*th+VH;Dc&fR6qPBpkdm%Mq0H&0>h)9nq&XMMHDpRkX&hA^1;A4T#4gGRo2=wuHdrv_^v45HK)`vK?60C-D~SH)9TuKnCe|%qX=< zYDFTPL5)a-9(s6Af98Lc97ubkFbP6|VpHZl!5nU&)bt*W^XOQTzClVzQn-K%hT|oI zLS?HDNdz}Rc||B9XY^V#x@N?P$Qd)Li3B%fL9%aF@0xiYvf|Q37Y|1xW}_=i_1{XZ zB1rv*5_4qfxy4yrcV8S*!cV9HFskbVFxEm;eOZg|h31^*K+ct zqzfF6>IkvX4;S!tjOR%xQup|V>&gX^5%wkbZ$slBB-m!WOp8bdU4KRf@prFYNDa z!waunfbTr>0({}|Z^Cmgy$W5|cs8|g#?JMs+8|DFR2#v5auk~n8_hq+D^)x1MsN0B z)qvem1l!ZWpkEM_wBVIN`g$KR$XEE+kQXf{E4nG2gO{fhxcK9jSRV>04iF0`+px!0 z*WjLa-wkW)D?z@*MsETFrkD?8GDdG{z(;jpkdq|maAgYzyS=hcV_?eccnLHrnUxs! zF#z3PusToXus)kdh+nzYP~pBrkVB>H0-jQ!o9XqTqEB2y=*Pr zPIeinbAaKPurbkj;0i+t10p6g7+WcL*@5n{2<7z7-X8S~;|Jvkwr*69O7oqH4Y)Op zQmTgn!NI2fbDFoA8YlQb=*Gp%SK-J;M@4nRK^v5k)^B)VTyJHE@AX$Oyr-lbxpJ@; z8O;$gWRXCFaYW(s+j$lw%zFw#t|RFWFXE0vgx+wjQMt?sygOXF(c*4&SSkXArj8SZiUJu42f%;`S%uSbPHpM&t!z zY#C#h^am=fwg_NDYBU_UzFPD=A?T5WHrnOV6?-cUT|t8!+Td7WTS|GJ0y|)(C;9qq z+ZbHAkn^6%k!+~xIQKhhR8d38__3pH1jq!>;A9>-n=Yo_OcFdH<~(t18N%7vfuEB0 ztm!z)*bIa~gpGtOTif`}fVmZ@9@U~?6mU8f=f)KlfIAscp}1hw*^S6vRxPo3NOiU;ex}&HtA)^qHD}a| z5N)38QnUJ{Ogy?$Ic`EXLisk$oIw!B7c*arKGR#h-usJQiyT`2i#pNV=+zBb&5Sa^ z07ucOcZKv5LKe1;YQGw)5g@8yF=UBe9t~bC78kf02y0Z9IpJP5ok6AW{!60)>>V6X zV@jX~(V@+ix#^m6Tvq8uThy*?z@7H7j4PnC!<0B)i^+>VK9rxyF*`dYk z4Z@7NENB5ApJlj;KVPXH#RD{85JGSmMu5sD(CnKxmjq*Htf9aR6C4-}J2pRO#!rDv z7ZBK{WYcptmPBo;$r&PMLeuD^YjLIhXR-u{`V5u2IHpj*$WipV!WApD(b?pX8#jBu z7llunlSqG^$r^AbQfd2*tubV`llB#>GKR(AS@;h{cypxlE#lMx!5)=D8)3q)zi|Pc z_{Mh$cKpl#>=W?f%df&$pZF%pQ>(Q2mA>j34|B~wud|^<*W%jVa^@t}U2X48tE~YG zwhP#P4tqE}yMHHH^LH|;x*0WcHfW$PfYBIdF>Yo#OSY%u;0B^hR+gz>=V-i4PQlYZ z_z_&Zd=dWnuYLwT_K}ak=GG2;=etkAPhNT%e*PCeO4p}03By5f>itRDM)hd6%#J;g z=+{yp$i3G}YPPtTE)2ECQD@3^D3gtJ?FdDl345b7c_t}n0gj(M4y$WRaN+H96kNlM zD8ds*?Et1}LN&z*S!}E{f-}8@hQQ#%U?`3lz<9vDz=$&mA&#@o`$jXl)w=Ro zLiK6XU<|~88^hZ>=i%(;9;{GCe!y$kX%Da{`Jn}k%p0h4lRLO&IE16?V{Wo7HOmCG zZiM8Cdjr*kSOMbZHg!J`!JpT}a3ivXK&xk8d=20~eF^Tkde34!(G3M;QC*XPdiJkwsPgQ zZ`8p@oslwJx_Slfp54a#IM}Kx6Hyl_YRb=hw>#Xqk*7}8f`@$^gG|Zn)Oq-|-&60J z%z?R{{_H0J+>u#4T@LY^|5MLpjsc9w&Cr{F)maqW>N*>E3F8MvGHLM9&b*Kb)3ds0 zUxCHWx!WU1%n_(4RdE=0F{IhTckFj8a^2qDfy-B~60?sU*G1W+VthuTh@~k4MP#L- zpdl}61v!Ydu-+G@=!z-@am&r_2wEff?(OLw>>nP&>gqBaTVI3Gc!?D3K#GlZ5$EAx zzUp3^waASKhNn3=J$4rh3M@MItFp?u43xuJ0^?IPzFHBODO?qR_HJso$|3TZs=qJF zbIm(oVV}JNhajeLjgUmf$&gZ~d{-wVOL4X86i_3$^=|EWP$4X2V1^_s33AjDXAfEk z@=v{981^+4Ha&{jwhqBnxkt#(A>sU6JH#wFMMGqW7#ZQxh%`yVzxX_v*sj>gYf7=& zKeO^o+@drrQc>YgsrT=qwJyCcg#|0|*SRmu8?W=uSNv=*zp3aHnX@UudKiXG^+d!z z)=IN$u*SdC6HAq6I0#fuv~eUGhYdNqG25H9nXj&u?$8kMQAIkR0E|CrFAz1@iv@7# z?+VxM+1Rc0A=0MOMdYE8ro}u}T5QbJ(`d|fodzHpae{#B-x3(5yVAC+ajV%>g>j<% z;XDu85f$0zMr0EY?csoG!X~o`^;@Gz{;cB+ZyOz-1p*Z68#s$ARNWMu=-_a&4;q>+ zS_>wQi~6ZmU`=79z<~^dhbY;HIH|4FPIB<0a0`QJ2m7-_cUB99*a^EXB=20ui4Rhul8apRT$*;3$C+WLI ziZ@9{I*Gih6Cu43Rfg<4nd>fc!-g83y$F%Rtj}~hBS#FgVxz$_oWFP#{`AlP0$Lcr z!wf}y*K)&a>*N)BgSfhsN_P9nE% zkk&D}NA!Q{oXJGc{bkiCiwO+RB<9dTYch||y0W?kx8D9PxP0XT>~8Ncqv&*EP7J}9 zWxlEIw-n00H_{5F5k^+Zpi851>?MabLGBb4(b%|j%Yp=xbS65<;9?0xR{6!AWJoT8 z>o<_uX(9A#0*j;@DhRmtUeN+BqYUkv3RJjDo#~Cps^-o@zc$rb4~vBt!N$=56PJy~ z0~j_fJp1Ma_`!dCoNDc^ZEeG3#%GoKbn3%JR8-tDk(_3c)A5h#fZfpf>c1A9p(U7C zss3>4xn`Cb>~oL=Zno-PHyE$}rcN%OF-(h>izFYAu%$R87Murx7?bx9f{eB4i;xmNEIxBmh*|1;(eaJ!`YCQIDbY~hnAApALs(#dB@5w$U!gL? z$Vi@M*xK2F&8~3yTT?$g>Bc2?Kkq;+_fezV=>7oH>&W(&e8ggo!SgtC}j|%@hgwWX@ z8*6?nV$pMO&2=rpn$$CQQ^3+E_0}yK=1#0{s$}yfUhnI@ zc+*nHSc759l~|;!{+=X5Ah0aydDKz%fEk`zb1E6u(#d^_BrFC=d!i`IoYXM1Y*64~ zJWNdTVD$5OW?8S2i`5HIUp{5F%FGJYCMQ+NSqr5*Yc>s1*ltE|32R-v_;vC8MaR4M zFF>uMZse3LSgZOr*E=ElpZw`JF^Dle7eo8-`7!Fgys`qr!3ekwTuZPbbzafmz_~z& zwNVyIw~|d!D!iGfd$Go;VS4E%dfTyfLC88v2u}DDBr~v7)*7M%ABwZ1Oq^^`YVWxs z0Rqc16*lOwuwSzSROmlU;;?`?OD*?lBC7ELbn5G=`yvoM5N8t_EPIbM zuCHO)H(KAEttmABn+?&R5k}3NWo-(L#x1eXF$@n6H!_fOf_7~Qp8vt~@Wn5G1#Z9P zBz)-6hvCou{IB5USI;u^E%jtZm7SeuCDg|BGIO>aqcJI&%C5l0OP66|1$%KF%Jmzo zJ*u6i3<4ztBhCO&$YN`9PYlD< zo3pXwT>}@ngjNMom%=bccSIES>+;0LBhL8Xf%f7$IrlYQebau z3#JoB8ce5!`i)V|CBkr(e2Mdo&}7#CM0f#Ax`a%L1SLuXn4mtF8dg;!nsF#rk1mbK zk*EV}%dF8dlMMl+5Qu}S{2@B}QG=G2`?2C0?;q~Nh09lAr73WHZAIici{qr0+Njxhedw|@ZZYpdo2 z6scqPWT{&GB0GWCLFG$5H-qyB@(@saxF=2}yw9SLtR7I|x@IkwSd-mFl!?gg(61H8tHZ{?4k7ELZIbpQEMBu-?IW|>{dh73 ziaXk9fWcXOASrdK?!+W;FUERflbwj7Z{X0?)FZ|?vuT(}5tpF2-|%#cA0 zJzX?V2x1_HvOT+w6MTbt_A7>n0=~U4i(V8`9h#p)e*Lmg9Q_lvX!cvUZHQ3J31>8( zdr=K_-qcA{frv%7b?r$sP8N;apLMaqQTbW?7Dox{hIm?c)5r&sz`$58ru05Bgf*== zP7DK_N<_Djs6rzbWFq2*AU~W<8At?}pA8-ILyRVi9L$Imq9InIA`Wt6>1Aa}%O)2Q zie`Zh%G7l*Ih?{|GIin>oyUr1RgIgU@z`2)cr2R#MGF<-3U-a8Ucn7si(N%CDtZwm z%_`!5oFURkkvPp+BX>zM)!e722-8`g@|Ef{+94CHsNxjK)U2fjc}!MQZ;)|>6-L61 zM^Jd8Jd-wx<(elqRE_bq3bJ@T3}w2S#?~CfVd$itg6`uA(wU@rt~hsen29bee25E@JS zEpg3K(O`qrgpolnu*D?3r}R7_M-^-1i~?OnQ|GG4p^o1l!P{?Nfj|7?zohT|{D&Te zAN}w-_`;W;Fb7uyB@v4+i&$r2`WvN0JsJ;Lmy7*u#8t}Cm@$7 zkq`$RDXjl$+Qw?M^jiagmm>`Q^vTmO9xrhwiU@u13}|37&BQ3$X#WL3qNfpMhY!09 z2a^t_of5A~@5dSM8+AtZ@v)glKtvx< z^WEE`hEZ!I45LhY`}=U|%2jH_+;yUYLncX$z2aYHLn6#ffp~58%1hYvZkiNebyF<(PnE1X0VX*5hag^+ zGqym(EL46b5A%mZqggx-H;Pl!NLJ7Ng{GQQeLPV(5-p?%j1>Pj!YcBB>T`vFRCKOB^gBMsEfg^nF`9VG*E4GH^gnUi#U3(^G^GQ#Y+NH`B+y!hL@jk5Ycdj#)M&PmgGrcC=!D<|l0v64 z8MZ}`2yEc7VOJuJu=N3SSTl#+v*h z)pFL%g^p3-Zv!~!TKKESz6P(q`8GWI=tFR1V-^1D3txcky?x0Vw$i6E)aWkQCw8)x zz|yHv;Z%F+Dyh6rTe!Np31?0ohc+5BJ)_sZTfb+y{Sb(Q*aI^J(^AL+XAA0ZZI(iE zwKfr*mL+V`Ov}Sf?Xj8jXxLDV2=*2`apDA=K63_Mc=367{p=fX;?!xX%UoJsfjr9; z98t3>=Thw-K1!v%Ozz~p0R^$d%&!#PLBnX-6$=96JVs(TDbHOVS6MLH z8-7@Sh!4A&MRTUlywHthHm= zYONT0iBOok2LN z?!gpZySRxQ=Wy$ZW3V(xWUy%V0p$gaWTjumgI62>;u;QHF5Jc%GKAC-g?D0V;vB}~ zSreuP=W#S*XmsWvtFsZIskIyTQ`A-J{R@3DNsHyC#1FcozVMVu(0gyuAzW-9_hGjn z#&;G600MMaf3~cl8cgaK*#YJS$QEf*SV1n*o6YY}>}56xxk5j}De|v7(zb*J9 z_4Zu|ifOay0_yZKj27XP%BF>|NPQl3j=F;bF;u~z%SE9bMWNklFm~Q|DC#+ak0xp8 z+*lg`P*@tVFb+)Sl0bD^aoFU8lHGP^rnJ)2kq)nx$XD8S3BLD(pTL(MdlK%tR47uwU&v4HW``l5u2l5;3@hh5=6T(IZEw9n1RK3LM#3gXye;mDOeH z8F%&a6}Y;!3#)5uaNDgnlcV+O%df!azwjma-QW3bIDYaZ?CkARq_>38W+QU~t3%YN zI`6sc@);RW3E6`Cy|JD+Am@_?H&_p54^o=J#13BDM0kENhC{92Y9*7-#7w;ZH;x^J z$!rD}&tIULtm$M5L(HZj)R!EZ%nh!k=DZPVeX0RgauEqwqye`oA)=-bNa2<# z@;|lSj8$Vh9#}1Mw~%-3ArJZ)1(h3WkwI+;TAI_DIEAIR^<#Z$rN?_Vl?4}Kosz&K z^AuomZ~#l=1WPLeDEo!bC0&)Z?41$s@Ob+F^L4#b>xLiJSAzNqHu)hce7$4(I!Eu% z{F-xq!+EVpk8rQu-93iCw-V&a0sXPiEl$C+>j#p&mtVBM?a>#=uT4kLw-j_05N!$j zJwn=3fy(Jp2eBW-GJ9abMkqlr`MzhR6ikHbBW( zspWvqWy3C+hg?MEdk+S1WgRwv<8OU|EhgdGGR#fwx;fm%jnN*k$%Vp%yHv`>1<+^T z(TKgx5Ua4S^IEL<{GgBbN<#nMNKIcOczT3C@z0IXo#*W1wro=rXe)E$nhmTO!hP}L zxh?qWGq1z$EW@d_0o;E27(8(2&2Vyk8AgLlJvlJn(W*LW*@z@+??D4YjKCtqrxSA$ zjagx}%2LCohJ!LXGK@q%BaR69A}tu@xH$@H&c(#*Po3fL*ZzqUzxdM*i+Izy5B8~@ z=GU+KdU&ZL-AF{dWGB{1Lb}3hD2#g6Gpm^FJG9Jckt55X8SbXs7iA@i^)a#m+Z-q} zV}KaQ6Sit#6=mmC$g@Pe8ZahDZBCg2E1%X|(Jc`rkTfEO5Y;Kw`+yp{r7?qCiD;Mx zy>Mg=Nhxw@a?nS*FrDvov z$R%}Tl8=R0{<_ZALg~*z8ak70kUP^;itkTYTAqK9o%cdXBHjX{_4-Y%K+Cp^BIDr6#EB< zFd7Z2+Q9-8{mhZoS5*$YpTW__ED&^4^!?pv46-hN&R(jd|3xUbj0sO`RD{Q7Lv zcG4>Y8A%#@IJRRl4AL+#o5d!3U{PoJ$%=;63CohPC=9-qnzRhF)R8kreTW)`;e<3J z5I(?-fdbakNR1UgNPSKW4p@S4Srcjqju;s9AZF1j-(J(7f!(PD58J0xji|alFCHEM zW$tHPJKK&zlNwoap&CL!~H! zoy8tZ2h&4>)gdJ^THn~bG6^iTX|*<{5c^z_njWopoX$9Fh99AN2PM0K5*$h}nbEl{ zL1Z*LQ8`EP-)dqOEktjT79K#NXk$;m@Zx%iz;s#d@gU3OR5iqani@XO4ss zXjLa`>uk=J{s z-b#ER5b21l{b)F3oz&=|&BiqbSCX*sQnP2OJz{Iq#1O|uFw6l=n-;$G^(W!Q=bwXL z_~?h=<}+vDkN@=lg166KB1bKfJ4R=wpV_Z%r#kjpZIxKYWMZAfA#PxMe;fZawlIuDX{BGv6WxCo_J9NV|96^vE2!f!2NJ?8fXwtaf5%Vq<1jBXKB>B#IJ6iQWJtKoB6jM+5D<+EkZ)F7s~ObI&>V+pb#>>yYg6Cd*5w#y-c{w<0Ej;(!^SJG{n}dac zeurDU7+9+44{Da)igWH+_r@owBei?rTx_?oHW|~iQw>+hx=Q_Q?FlX^Fm5}fO1#5f ze@VsLE}3SY>#ktX9#Rg$**e<~=k__mA2ui|OhMun5!HA!X@SZzvrXr(r z&#ooXnYVG+cl<>kSMe3|lXm*1Mi`C0b-87K)q6C}-=?~}#_6+8aH1!XY7E1tVZC2j zU&pS+xyZ~cLAp9QZKV^|P3g<(8rd?J%Oj(c3;x|{814nwJrK+50qg*`G|d%ucPGV}&43R&1>!ghKKKDNBIr{FdPs0NcpY zThTQhQN~qa=&~^Qb178Oi3*B+FdR|=Z>X2@^7e|2R87Zg)fig3>aMojW<(pBgM%bE zQniAte&bEn(b=i1O1=Ida5J2@vr(Z$mF%RaPpB;jIPXbp;3$Q}v=GJ<3@0OY@Wg0{ z_aot6q$Zm%bi%dGcFCu{@jliow;3=yd0E6_dURE=HyGe7^h)MUzMaTKjAIwAAe~dq z-8GqK415sjqsC!`nGCv1-=zZZFn$#IOV3qt6-b}$kO+_ZNQOMT${(6KXJavj;bl*LXR+61)~dGC$$ zYX>)Fhs*-FmgLS1(WVJty|=WV8&}A(wAP%+eIBoZU7A-rCb)16@l`o&>Wzq)BN#+A z)My7gu|!*6q;;AEv)BGyVcf@oyvL`AyBHoxaC-yI5!u0e*?EN|NrOzOORL$z38WTf zG0y>*O0nK#p^3Ll1SH)Ek&}8c5!h5m7$M5Bf0$%`xKAC`9gZ226`xl!1XVST+4%rk z4Ex0=sx*-!;qt+mir!&VXn~HNG7X(JJ5O=$0tBse(I^eqca3bJ)Zk@h5n->oiOR_U z=Ova>U&a>YzUC}PZ~{B3oMJ~b9p=@t1%3w|MM{r=zTP>~tG~h*|YnO}UqQX-*x_WK<=OO(V5ze2l9C>suQ*xV)SC zP>y|q3`QnZHq}`{EA_ix)Ard((cTP9Bd7>vyRD73O-)4u^Y6-qHT>`Y=fB3O)2Hz} zpZ_&1EzD!r;ymq{xmJPy<$wM|JpbGa_{oz`VQV|IZ1z~WvWbn20gl~#6ZY*sK=Me8 z`QX&5iYp2Xwg=IP>BYcN)OViORtw{Lj8?A`nGNeW=L9d5M)wpbiA=x(Ay+5MrM(<= zj?;E(J3vc+45=xF_ov z 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 z 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

UglOGP5$@&1X--fAx=l3%>BV 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¨C2sV7qbwk61Eu+ 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Ŋ+h!3j}@c{lO{ei0%?@C;yV7kWI!#9z_NCe^3KGXP0( zmy~@_z<4&td;Yc;bG@R5Oakj zVDX?7>Bf5?zX;DdPR|coC!vVoDlw>Wo#jCmBJ2z8LeH6dZfV7}+*@-gfoSEDWmgpv zGW0@5yj};BZ1gZ$ghQ>o2vt!fD8$mO=*9LZ))IwRRn|p$C7UQ?EWm2#{i;MJ+Aoz$ zj~B#LB&(b(gaopNII#|CPQ&p`+RE5diUZ@s2wAbc1dwPQK_W}(emx4PoBa+P90MNm z*=!2;AKZ`D!m41VN=+TDKT#tIm~7%?d4g6r(uin=Of(w~mYglA=JkE~b5!`UG9v(39rSq+|%$S@fSyMRzBM|8&W$BcxVQ~$Gp{>xxxnSlAnfH1r zE;@=a)9WtrpGk;L8r4Ozlwtbc@fa<|VUNOkBOEaU2HYoW3zV#uK=6|2|yU z--}A3)c!JAPM4X`#8$t=OmiQ=+$Rg8o}kfW_OgjmYLW|*rGwHKi?Sy&JtvbH9G#3Y znNh$gQHZMT9witm4E_LK3!pI)tUC?s%1Q~&SaW=GV@9FK2}2dmVSxSP@eJ-hIE203 zb1)kAf?qi@po{SQqD}&P%f9koZx4bx7lxrv3}Eer=_Fwc&j-2d+UQEd3NU;S^XH^3 zdcboAT(Vll@dOw@IGjRJbzoyyCCgy)cu0F6Xl+;%jVl?ilMu?nXiMsJbqGkIf&53I z_9VIf((w6wra479zUDnTnM~pCgE0(-19Y1UmJ3{ipd|G*=XE3ZKre?))C?Stq?NO> z2RWV=hXT=FAYHCWcj6h1IH#V|u%FzF$r2m{1PoJ2o(aKYrQhqrcwWQ*^uPQLyz$n% zAsQWC|KVHE`@eq|Q?VoOur^VTh#!~Xt0 z^5}%hv^N(Cc{=7w^KQwcZ`Rv*uBfCuQQ2=@>76@?57h=g%16B*H#`n{ zCG_c&3wLtKO748U(!u6vgvf9_Tf%rc5o;V;j|$ZKqu|EH2|a3aJBUafTFol_7mF`O zm%S+Xpg>m@JQiYt3$}<*@(ahp6I&mYe>(}0sHt_HYzfJgP~Ky~4J6r$OKx|%e_Fqi z+{Ya4Kg3n63d{g`<*^I!(#y}m`3o0NKw6TY5(|<<2NGka&VM67USU--D%5OEi|%V7 zfynXkF~-*ohePNOx{2|Z^Tuw8;6U*h(g~-j%?=OyIu%T4Lm7g)UZAiY_LGDh?NXDw z0+F%`lF$^A*}V7uN655ays!s@elK|%*U1uT86-ZFnqjlvCCXhZFJ`6Vo zXz3)8&b5qD=$u|$Sw%4z@t~Wrfqed0BIGm3=OMT?Eo*q^{f}YLAHZXeT|glWyse#O z*mY_%u^d?AS&W!-it%Hf)7S9e!5AJK9l_;G zdl(N)F-x>hvR*n9W>!w5?Xt&|VGq>MM3LBdSlC8SC|h`q`D_7q500VeR2c7$Pb>w_ zNl_qcCOn$gjq}oZ)1QGZ!ku0Wb+W+{SK7`!+E`$11)^Bd!cjaNx%&bfj%V=sm#@K3 ze*7kip0i~MfBNm$;wor5M{&=%wWM%#tz$xZjxK}?xV+Pa&%JONF70kYy_n*gtgdw8 ztpVy>C?h=5rBG5Q;G0)pxB&n2|9T6K4sOD){L+hX{&Ua5d_0DO!(%v^PB9tVM>p=m z+aKSC-}}QqgWC^gn9?54k}H(bRQAH`j)G^S>Sd%@sCS&u)EeOa{Ri0B?zwZYu`xoW zrKdP6rI0TYo#mRltk4r)nGl>lttNIb$2H!oz4F;l;uguDA6)`6%VjRt`0#TQy7Fr^ zUVbP6Y}G6Im>obh>~<|v!oPdNxUFy7D`Lj1RAXYXhEf3pg0fjjV{C$B6?04N`DF6+ zWU`OQYKaJ?ZjhwK z7OgI@xM1Jcj1(jnAr`U{gYC##K?fpPuw0ra-H$O^V()b+b}DderJuvatqr((aUbK> zf`&E}NS-fiW`Khqc643zTv?afijH0e1V zd~{o*rgAqe)sxCpMX=B3Ed_X^8^~gYY5Ri!R-vJZQVQ4EkR3BXKCQ9y1^0V$GKT4F z0(<9nP#{MnoUBryf_^RIsK-mkNN@oQIVmn8ScOBT&_GN&u9Gl`2q=_rzD4WpZvzYYV^V^h zKeq+fZ{CKZ!vV%uBSv?glOs8&;vCida?vcm)1>hBOB+isP}4lqO@2jb+4FVe^G*Vs zgVCr1x9?5h=IvW>`Qje95NbgWD`8Ln;pUj0!kWu9KDY2x(l(C`7$!-%O?W=!gxKEf z!>!wQ;J5&c+b+0tK!e)Y)l$hI8cHd}Z_p>#Twwc^)*VK*l7L9?;utmM0`=N6GR)>;jjnyUhZFJJeQdpJ2B%NT&i zMFNM=RKn$f54x~1gunN9z5&1Y2Y(Fz=fC;)@Spw7Z^4DFkO@2_W9z}rXb6{fx8a3n zovZM^Q&9f~XZ|8c}M&3r-Qb2=2YzPAz9OJr-_4FGetKP%M>xS!W{S&uLiVDFGSJDg<3vFROJo$kZFNrb|Ah ztdL=UR*+RDCV+g^i77=N-X#|0EfRBHD`BDE?ZkMXH2Cl=xhN12G2$Tv!U2W_Ocx8d zeg6Q3laLf-5eohlF*!wWMha%}ka4eY5>G@{AkrL>8ykitrBv`$a<2esz%nH?2ys$}<0+hsC&*a-zr4Navt>(GAGUJuGoO3zSaokrZ|K+EbT>^y zBMb@SKfM10KKJ>*gzx{p z?}e?=K$5sw5GgHMr_EDx0EO{5kQXmnovZ@qB5EjxEMS<%XnRE7$Dp)oGQRcvfIZ|Y zpYE0D;+Jwk;=R!MUB@Ek6c*C%YK=5T;<6s3SX4GVaVpobR=S+YwL`OVY}5oI>GYNp|D&3h+IO!GD> zujrz0bU5j%ScLUbye?)=QRKmlB8J5!2m=`X*hU`s-(OMGl)gYl%< zSL$%nXC>~5?7T2x?AESD|A;bEKQF-KVKVSqjex|~ui~6rjRL{|fQmjX^dXoVX zc`2iv(AID`pt?g>S5xTk??lGEmQXgOA8QiKAcZ3U{yg9X2~0@CiEuStbWI`2pJC< z?27xr@}TtBOYV0fmom7SxdxLls0`7aTktbK_9O6HzxPM*fBwdA!+-npKLZE-Hk4(Q zH4sg)tl%H~y^ll7mGG~B=TG7B`5e~Eb)o>(Dck8e=F-?PE^VQ9f)q7T*Vz*Q+_U8p zt}ZX(=HX2W>nzK{C}O$7W6n%QGS1H%XXJy}KxJ|On~aj8)N&Z233=s6Af9KNk7$=S z}-x>F%40c2rNwx}vurJIhd9R+P9=d>?`f>W&tRj=(FY;`+uIi6GcGDNgK z%pW0?H5PjLpfoj^d`w)eiVmUi1qF@~5G&Z<8NeNc%jd_m0=I2Hb z0-iKR#AQS@VT_!dUIoAx3`0Z(tlR0TmpJpv>a!H+g2O|rn1^$EaSojlOF`_A;lfd| z_Ly7;>0V?@qIxiOr)TF;T+6U`7s~~$D=I5|gi;N_m>0)wN)c*yNW{5uPE|4)p^p~O z7)m@{E+`c7=C1C8DTzA%Gfg>d2!*FEIGN6cBs8|$y z4bM-*{L<%IMNQjauRn+8@t!r_G|MB*FdP>eChPXvthBEwbYOTtcOVg5jmXUOWKT(^ z0EMZ~gmiDjbI;?|{1v1dj3PLGdO|#=C|ST^;l_+P?mb3W6|gI(v#bJ}7v%$Zy3BqP zwaye+miZGp4mq+rTSGV-U&68)LAO*vOy%&{kAl7J>gBL~5S=);78?aMePt430iQ^?Ov%c5inZifDLq5m1R0C;&rG!Y56rGi0SX62&Q3 zkbTMzMTt?v7o#=GIQc%_i4{wA8lhzO7e-Q0S)rY6c<0Hv$yG~sm?{rB0a<87GrKN& zaY6y&D$)!a6?8r%=Mf;G>m;8E-=Sv>3MxVLk=r-mmw)=l;n#orcj15jU;ZWhi~sJI z;Py@rT17=U{V1;;><-~azW+O*+i$_I{pNpy2gh>)ykTEhs#>^o2)>9VC0M2oN-G}^ zUc&c7#6%%894=U_*0Az3m_2wv9!*dm|bopOQwW$dpANZBu_=3;PTWGu`ZL2)o+kV~t zWOtByGkA9uVvgd?h+@&zWCru4iPv|T@E6}v=v=`?|E#G$YTD5g1`&-4832Y7A{=}x zN~1m@X^nj?oWhS+k>HBRBv25aFV}EBo&keHb0zPfu6Q$MMoufl`e*JRs^7WMQAq7x3id98NFCq-GtA`tY$=?h<^zly@wYcmwW4+&t?_HsfTqg7+Q; z^qo6Lx1eL|OBPX}tvFQGFmVSmPdt|bDiFPgvZk>Us$?ng6%mS_$)@1Euectl7z7Z7 zgtTZbP?-v$n3{tYVyeSITgDutfSOp6HxNUH20g6t)*(+CT9r;uPodu*!k{1GteGxs zANkPb|JAdn*An7o4C@(BCM5W5lLD3txT!T#m5LA+YZLJ05S9G6v~NHl1rV31y#7)jNl+|JUjxxdzg4hP&N{bcTB!5P>V-;7hh>Cxaux{lu%54bu!j^I-xdmipBzSN2y(U$>`nHj zZ_f5thlXK4)7gxyrG+VLpnEr?HT%DW2iu<8`L@TR0xiCj%*X9Sw8Yx@otZ`U z`kVc!1|WTw{Izpzep4Q-02E;N2;W__C~5)?ZM}9|z-V-QypHK}E$^`OAZNIJc0w)b zeDirK=Y0c>f$=~xcnQSPB6T`UX;3zr_b}{j!T4%M1$N0(AV$5y>?vL~ZQGn^1{|be zj^#6`oB$xkO{Gmp{souQD!;-?An#Z#RwQKi+8sf2WgeRRlIaRhLOE$?YYRU1 z>K*v@kGu-o!$B;eQpK=9Fr3=1A;`R?djv#w!E%%9$?PKut!FrKUMeO4Nri|O<3TrGEItrf#!%(Z@_V2BRTk(}9$*8LK~m?Qpo~Jf z@$0o|IX&;17F<3#$O+-^__gU-FW84BBt=b*nVV^@)JvYMbwnE8U&U894;_u?XFD^UbFb(jq5;o0RF zu4eP-Lt_Z`bwoGZxc~ql07*naR78mL5>DYncq(E&2uFER2crS>qC`!#SRi=4I)t_s zJzxw5f#4NT2udFq8@mb)MIyu}4BpuTNso&aI5?j!;PKfdoQ>zCTpVl<;Z-c?SNZ_q z&l@LNTODZLR+zTnNt-U0@aXiE!t?IlJcNE(KpWKhXxS?Oh&Dz4QN63U$z)x^{I?LM zozV~ZATSJw848DbGO`_^7a0X2NotQmCWxm}i{3IXC>)QOLl8j_6(Qy{4F(;uSQFAF z6_{L8zTegOirN|U1_VVL>eHz(qx5D?Rca*_az>=I>5S%QxYaks96{&rqFB={#7SyO*BOLF=#U%^|Ll_Lus>We{Y&EM3 zc1fG6X{DT#m6xdOVOa)z-$n0?#M0MvvV@6bz`wx;PdD?`$yW73pVY7=LlranHN>CLA>P1$FD9Y zbTRT2$h-=9$7}mEu9pp0O}mr>sj++q>54pOAA9X3*xuR#FN#bGsjj)aUe9r#pWjjDk$Qw^ zK=<&n8S$`+G65pRPNx$B|3Z2Xa;N4~yNu_gip_@gjmCTTE{&> zK(9&5 zAmNK%uf}>T71gn8*Ocwt8m6JVpnE8W?_tCjf(l?bBPNEcuy3ig2=+&(eNq%pkTndU zv#NGLv?cf$rht8JlOq5K6!U7Y{!ap134{8lqHiW$%D8JeRcIBv6{CnxE1`ys_&p(Byo%3L(aPn`}TG zzs)a+qEq(w`7ib4HvVd5y_x_L{`h1KQxV(AdI?=L>K^s^^w6-KeAbWbuWzKgTp5CN zT?k#aAV}`{d}bifmBy39u8H(=Ah<-}$P_D~-RG^4_7M#cy zAf06JBl*m|NHo^X^Yy&1>f&lc`^K+y-G1Rl(SX$LIts%&Ilmy!5(vpVX;0epd0P!a zp>s7FlV0TXov&jPy&C>yc@Y|L_jk8pJe|R0zKnb~Tbo82O8c!wyIj8W`n%!oAiQz2 z0@nPsPfm$Mzl-yRhBu53;qXiCQhlDq+hd>EWQe2O`q1muYOU)bsIT_)vI~=*HTg)a zXBN{~cDe=p!jFAFy!6s-__x3RC-9lSdK1P~h*?5;3%Tp4SHOS$gP(?<|FQ3dqx~T% zZ>})y8SkGesb-9E@1rq)t5?9MK5`en^W!hU!Ol=X+>D+YY1Tv$VLaCw(@IVW&K}Ql zF5l!p>q91qH0wLsV9% zlq=0*VMq;Y^h_`kv&EC+}zuPonD8+Bn$Qu zM8!sc2_WVJ7S4p&nDJyGPE;ZwDpuCjogNw{2Y{8fO6w+xkZc@+-UUXB-c&Flfh3$2 z9C})5_I81m^nk#(H5@>v+m5ssY7F7?5v+p{ffp;7k7w}y{fF?SFMJsuzyFMo?L-mr zN^?FI!d%DNYy<-19h_cVQqnPclAP0E94R&mSy-UgKX#9#yHF=h&y6tun1h7y_uY0^ z3iA5o-uipHujuL`C|9$^5|$XcGw4(JtO#e34!svkNgPj;AfyL`9;W=bP|pa}6awI{+b3_OjFha0_nzQI1!ro8_5?j#uoX_xlM%k;;%$d1T#NP^P4BjITI~l*9<-BJ(y#(MdVA3 z9;0}8*3a2&Al?e-O>%2Z^T}-L`eFkX))>M)H^ZDvJ|{Cdhg-@i#pP=$Jiy!A;`chS zR(fbwplpxR@dM~Ha$!&3xujJ#4k3`j-p-KrJBIDArKq#6fq*HyhUaJ9ON}>XQZ^vK zsr<;1J^3C<`>W?E(D{y_Naq)qRI{-HHJtcO^uphoXp%-IV)&(Sn+#nsZL`iBE#+lo zqu0b|bDF?vxfbDn^DBE+qDN-uNi^`Ts1D>@>sNZEvg8~Sg5t0_=BIidGbOEA46HD+ zXAQS^+VFEf{AqaQ_6_*W|M+L{@BjF#F!${s*13=$yfY}^XMXt8@K1i~N8ppM-hn|o z6jrWcbdI&1v78KYJ_H#8SLC}t`C<5pANp?ixqtYB@TpIJgi0$}J{8EQjG$ngA`p%H zRRve$F&rNs2d|UJ;f#{3^9l*wgLvC~jXo{lRg~2jj-Eq|?Rr@t8|F#A?u|=mCTEkI z&W#u4^B?p)c;SYg)3D2~a+cnGvTtllMX0T%dZ=ukVun?yk__X?7*?w#^!q(?s_?KPakwlJr1T?uKFXSj%}SzD@D^E*>8xVw4eVj|CK`t}jB?7Z~c2hSk&(?cAp}%2180L|z*F}=o>uc+t zJ~)@>ts-FiW{31Qd$~mAf@_pZZ~oQqxL~Y@PTRxHgFSe5I);nMGUlv;MCt@@k$OLx zR2F8@Rt^%L=amQ6CdQ`|A>n~?CTOm4BI`gX--7u@qrnJHPcLIt5M#h~mJYN(s?c%A z?2IWdP7GwG4WpSP_ay6((Sy)gA~`!LIa0;nFv@}ur42%#i?Wy90(Ks2B$V}UO@){- z6mLpVPN9uLjJW`5jwy(;X%>lrJiv==>7uOQVr!V||MJZ(_{Tr>LvZKz5&XvQeHQ+o z-~BTfuiLQlEut%w2XF55;YYsb6YxL%^Zy2Z`1?LVIl``NCy^dbyRS(qJ^)pBTONMo z2fq(K`r+50UAE!mk$@xqve zNq>hZq=qq6QMai~@nxADu`oth_zJX^QB+9~RSk2&Mp(NeDqfzI3Ihb= zavw^Eg|Sx=2{R~|*hfTeq8Mx!08iQ&x`lZ(mlOEL8()KOzWEkR#xqieg}$TGSVaaj zo=suCoWu6cHnrJu0a4C@&J_shd7*J1mEI&VJ^m;R(u9Zj7|w_2YqR;BfGq+Hx|wH4 zLl@1A%b}$EEUX>ofng}!u-`Y}6p)4q3K$0%fPfH+3(o98!_4J*@iQuVSio3e+f{H# z#xD%KP{wZs8O~=j1|1H+Loe~wcmfAE_JT*Rmex_@`pNue$FuRk7!R#}LuQ++$s7iQ zo(cERq-1`kDoj?`GJ=BeK&wFW0hZl32AKrMc?gz2TnYqyE(tfECD4PtqH4}(8otZU-!f*V&_JfVyknQ5gh(VsF z`3k%%rSt^2v>Oa>pDqXpFi+FV8A4WGtwXNUuNR@qMHI$@>QJ@mY?>_`)mQYO0+;dA zZ+vYsXy<~H&lS%P{L&m;JElzwW7P&Ug5rKa_O#XS!QS>ZJbd&FW{V>3&9xL321xm* zgKUrG^I`X5MmZ|PnlLUNgJ+UeK}U?GW=zaSa10ne-|d!gdVUVeRp9-!jy9LvP=xY3 z6=u`cSs+wJjKhc%US!;(DNoYSwRC)J4E8D_L@yAYlUO)=3v;Bw^v}imRX#^;bY>ta zu`!Eb<1W%M7Fxc%xQdZ9n)k~%g^(EkL+6sBOqOp5Vj#%=3MnBabc+%`d~^W+;+K9J zzU$+!!EgW3=iz_*_1}jFr!!b`XkfL5QP0DTK^s2(+AHwd-CL3W7NU%Jv;VzQV|2GH z;1_=Kzl4vxdJC5G34HU-Z^Dzuj|unnP=*o2-o4lf2s_|k?R(S0bL^f2#x)#oC zy6{5b{9tV>E<&2m8=*l@v+ll@hChQ-RV&xKa!PxLhpY!P8S%RUU2~?7?2I10Abx z#`WT2(Yg*QL@)ycr%04m0O5j>s$_ZD(19`-by7oGi%bCv;F}TJ-+*>l;tgHUa5kFr zRuO?O3RtWvSge)=M$m1Q0cjEmy-);4UWc*>B?k~`kz%jcS`-_-DCg&=u&$P{H5@^S zc~^yj48}xvjCCJh!S-mIJPxfQr7jgDz08BPY&f%FnSMMdBb0S0l=d=GqG)CfM!oIovd=bxuEX+=$(m8lLN6He1mAcCj#g zDkdlm+k3%@;wRVg0co`f00{xcP|(NEPRZ*TlBXj;hV|?x;TIrq?kT#TQ3;KwN%w(Z z=D~dF;c`5Ky`4}8E?RQL7zFt9Rd$Kv>(bppw7K$xnzb_;1dtUr z`Y;E~4h%c~>&5VTKlN`zLj83&**|to6`BVwn_`K`BcXn+z z0JOZwIAkpxA&erQ#SrMyRZW*>o<}=wBazg}CJRk;*&0g1a>Ej^!7rQ(7#V`~0Ehin zgvz!L%Ty10M%ekWOFA7ZwuC zC?*McT2GmmdFJ!n8{V2mHL8)-lGrsvsJ+TE@DD_j#aA~*Do7g^O_rbI477ifz?g)O zDgRBU-YCD>dWs<|8Hjq_eB?(mt3DV)%o-FNry9XPo-hp&J00W24ba85bZ32pcvuJd<&?8ET0 zKluZ&S|Zxv47PUqaO>7h=yb!Gxu)FXW%N2l0pEGim#sqpqGt`qgZyZ*T9B+mNYh4v zw+0xVBVKd$sHVKy5{2bswGcwb>mNR%$MWhbpd;2u(Wi9=Ya2w$LljaO_JcE;7rnO8 z^zvf2<@D_Myier{y)3*dkM_1-S6!?AVAgnLpGL-o2xRA%QwoveL(w~PU5s&M;Rh4M z#eywFqm06d2PS;xSXvA#+S}?!L^}`x9)N3$1q1e4Uq>Fh7pQT10bOdoM_2&%77U~D8QC5Ql-PNNtcy} zcwlOBfA$(C@TG0pqIjKK7sT`#fh4RuPspJdX-!(=TgM#I6uk^J+>(h5Lg+ zm?ebwpUmKDI)>3`I|5C_!^eT4;$#!qDU=9KFfkbwwkhB%hwaXlCD}DBQ0P|tY2YKNNyI^7jz@pWN(AVwtV%Y#?`C?E> zV$8G#PR`e?Q2;G)&L838%ZwX0gbxvwJ*CH zoQRb=b!tdpWlmN-8jbjO43)f`Okiu+l|8A?Xz0-2H5t?%wrLSwyd!c)G`MxUeYpSR z3G}-?LWgu*Qu>f)FF45#*l6Y{Z2sx_7{2(%Hz`yu4K+22s^wGsteQPhjW1|q zy?b*HZtjiX*3lt_13LpC!MmiMGNj&AP39vZwzd2Ug@dB4|#FMZ`rLbL`4nt!G}qc#1+D|g{ne(@)vH|)b7{n;1c zFTU~(c>CcqI6k?8>0%9Kr$fl5nBR^{3`ZY9RK~&_YE4voP$2I|;F8&59_qbfdIy!z zFmno^##I|?tC+PLat1SMFr*_gOq|m-DPdQM5@xAJ`_i;2G(Y?UhbDgDSH3YfjeEnb zKK*!IfBBd4W`wAhAF@N)&Wnq}Dq4^(CvzB27qDW4K>)+})ym8Fspq7rTkM5$N<;w* zg6f3rZiPBwL2hy;<~N2Lf)=5*z7@O#t<_gEwEQg_c%RpMVr{OieisgRw&8GR3wkXl z-WKjTD^kE<6xl(q!WRR0n0bv>s=`SVvcYjqm+K0S&o1HkVnWIohPK@~*nu0P5!D`p z7>1{Up0z-@q(%jLz|JN!xc}^w;8Sn!@527DOCGQ?T0aH#$}7AxZ#JzfWJ4dg{+BoC z;?b)myV}$n$pllrU*=PQO2AmSjMd($$4@uN=oBq}LTw53SBRRF1K{My0fYDx+hUeN6iV6j+Ic-_|4HncmPP!}q~v2vX< zZzw$hE--Vhhl5$iWcw82*;++}ueO0(=0n5lH0v94kgCNi9E=F+fq**0;T8$E9NqyI zyus9=(og^!Qs7gjZIn1J%!t-6wBjNtN{fszU`{`_w)(ug@i|^Ro)AMol~_OkZ76qg zFtUFft`m;+s!y55^x{+k=uKf)Gu zM6PjMUjB+u6mym@rxWP3%a8|ZF0UD4^A7!8%Rr3}vK-bI2+&S2T+xt7P zzqzt!lTDeVLF}Bxh;5dJpZ0^+QO?S_?$Q1Ssy?<7Rv=0UmYv= zwgS6J5AaP|Ya+9y@oOTh*>9~r8x6>qDo|6xT+@5IUzpRyb=#zf896xJV=uZJn)c-f z-ARq7OyjS%^}_p{Abs+euVx{J@`TXMxd?_4{mIS@W-e! zXb2s7xs;N-2q#CoC5MxA$J2?T&_JlKDmG=XA_{(Pt^+U-Pnf% z1ePd#LeXkD0ud@hb@f7W%FZTpc<0FzN?5(KyA21!9>pEI$e@z&ET`=TDWMR{h``L# z7b$25uuxCm8$sS$pd^mjnf90;YLq|0xm!41o+PL91~Ie~D9OBtX|pBFR-WRXQCRE5 zysVI}R0QNpCCreZ%F1dLe#4MMW?DF3>nhNAwPxu13dX1B@a{Lh32(mfHMlrECltgU z7UmUtk2!SN!QzcokT2B^88O>u#Xg;WkIWnU+&1ATb!M6G9ep`-y(hquDOu^T^a9s2 z@)0;f7#TBf1~W-`gE3#&qMpXxgbFO8H@cXV&4)qCgnTYO##S|?*$`Sd9L)hlO;(HFut0*6CS1$xuxi+Np`F-Di#VeRvMkiD|~;B0h8JZqe1 zVa1#|eC|kTnb60r{tzxMuS~>BZFcg9r&9Od@+(&=)4z3od3{Ih9tq>Y0=$O@JK$Ug z9v+_rbXzi2R@r($CSvA&eBK1)nvC{$Q@-EE-p9-FEZZAxQ3}ZE#W+UUR5T`t@DT#^ z(NMq8>c;>8AOJ~3K~&--=^gVmqnR|(_@>wxVZ6X{VHRv9AYDo(J_w2^5Q7XOu%xus=CH6|DC_>h*ojJR_hQatet3U1gV)d3a+rFG$`jy@Qwc zx8YZQ>IdMvzx^e6>)|o{>c9Ryc<0#^)~-VeTeqy>AAH{@;HQ4{d!YkM=(J*r2sYJf z!AnQ`@GJl5AHv?wHvC_|@w@QHpZf}&U(KkD#F}9DD@pGl1+3zbO_sIv{KWlDUb4yn z?Zso&C46ZIOLW)iVeNp*amR8!}zm_#vnM%t@NtC66ZdGYcVVxi? zt#78?bY1MX_5v?%87rlj!^9{cDfi5u^nn>&!#VT(SL98kq1e(j&Sl!B3I%EUELh9Dvm;3_bmB7|)Q6e$*_3(7^4ICDY9F~=kG(70Y)0}J6&RgjNr zsMDD5wW%S+G*Q_QfcRJDrt*^1D|w`jy*TUGSAcaO5TkK zO+`4kSfO06gQ69niwjc7s#p?%{`Y}dVmKW#L`=G!PiFA`gGcbzH{XTjJm!)iK#JoU zXF;r21W!GXY*H(KcBamUhWAynvZR2;I(*%3H&t!{GKJWgIrL(hv~mCVema}crRZ6p zqL8d<81HhEG%KinPWwy6*G*o8_q>i3dBIQ#!_dhxDyVEsNhm>eZDsnNJ(nN?Vt8ys zz+#x;IK5aN0M~nOXNy8ry^M$)dNz%pqcp5Ik#d@6}1N?6S2`m3cKk@}1@6Aw;nl=RvE zW}9wM9*u|B>@ncHT*DhMLSQuP5{e@l6DlURqJa<+<aA24jjoXo^xF<@-Mj%;<0+h9&f{+@3Dxuw%0D08bJXMP$EJRHIZvNAZ^=Bc(on4_ z-{{WaEqHc%29w!}K!F%6je744jVI4ARL}BTmbz)r<@8$9A8Yt9nu|BxNOX0A@ zg8IKA4@}70XL+yI-{&Zhc7r<#b+0Jr3G1CsrZbpLmx)0}^O|%j*a+&fF^K$Y%dxN` z5qT^DrjcB-CZ(wKYj|mI2>;~2`up&ykKTi~9$mq|{5QW3Z$CMMc~wAXIDkR72S59x z-w*%8Kl^3a8EplgR| z0vc1bR&N{eqq2Zcef!5@tKT8yW;7fwR&zK#KZ9o{Coo^mv{tK#W9H12yhD|}L+vlE z6PotTES2%BZ&Yi{`M+_w?H)`TX}l}_Ex&|yg^hdqTVQN*Hs$9_y=5zlls9%quP2sg zAHvNl6Jl0Hi;KWEP;&2r1QD*<%?eJQ2Snc$9IvV;rZaOSp}3%o2V(9H#@S*Fu7G8W zfa&CE&bVbAH)s;x(JG9J0EUir(F!=g5XS)=9qho-?hfo=9k3!+D`yL|%ljBCAVK-m zF%+>@1LsM}BFMeYxQIP%iZE6RDuBsy1rMK{!LzFw#p+_-*ULBeVGnZ(9J4rOnKqw9 z*<=6*nJqm$KEHxT=NC}4T5#{i9_$Z#&~lY1vR;&|DxnJYN)%E*MWJJz{Gy5%_eT`> zij{dqKcuiNLzF@x&M4+&Sz={3%{k(0BnQoD8>k@7*A=XmOV}P@2qG3&jC524hu`+E;b3&wf zWTt6_9i{Jt3R%(dky*zzB+!r9j68Q}1hF9`yboNWTv(>X1uj7a7dhB@&RA*1BIX|6 zd+9lkd|Up!&tVBb{&QrDL+8X6cOk?2#@Zp=@=G5mAf$vP|O1C^TPqIJuZmL3fOR5%gEX zlakyhd6*icHxq^SQjzv_wAW0;#xDu?3(s&wx9kq#(eWvCy945{C4-DanZowpdX-YI zZ2e(A)_pQ68~6=&iKLBe&pHzo<-Fz;pI*)3PyhT2@bqjPWP-}b7iMAQoRBVBz!b}q z!crV;58>|3ec0L>!NLAM^!lxuLSTke`^@WHJ00TrQ!)L^`N;o7FJuLjF7w)}ci_!; zAHX->JB9m?PT|h2n=snyL%&+is$XXkKuV;la*fA)_^cK%=g_kRap z{l){@hb*gz0w^JUK2cEZd^n@Xia}IR2T^93!{7h(r{Kqb@cUpgIVZk^HFMWgXLLoN zA$UC@Eyq0WCO$99nWcZ9ux(=$RGQ$NFaqWnk0U@{12xH+1da45dzt~kHtwdZ4SO~x zOvY^Dq@>ojz}So;>#rG&*&+0NrDI}VQUHN(}SER zREVW41jVcp;@LFpXif2m22>CzN4MQk`5+3YBE)!Ad|2Rg5$GZ0jR1Mmwgw&8+3LZK z?I9_4qh1Gkh-epc!2}S(rAmU6h1AoXiPS12?A38G&b-hmO$2U;L5w&Cgr0wNdI9I- zCFLvi+W>cO?8AOc^mh@)Ry`(>_PJdaRKdf%0(f+G0mleAjtbbp9vlo}J6Y}y!~;pZ zk-`L>(TEuVPrZ3f`n^~(E!-&Ani7R9DqOa>Gy4aej|g1`O)(-)Izu6a0g9+x3nmC9 zj|$kZ5B*Ln1SS$%P!YYJ=wvKozhfdEXpJ%#Jth^y>_^CXkohfQEwMFJ$joBG{dBgV zaHI8d4riw)lyuxjc=uMU4aYTI3Zr;>RUnz35`o7nlkxF4%vnQ5*>1H{)XHed5$~^f zh8lJ|??V^zvrsX@oPrkRm8o~C&Uf+WeHgq_klk;Fp*dZd9Ocx~2bu69jED0h(VIA5!o_$F zJKF>3wac2I&ja%Y1vQM1!<3y-M9sP~uP~l-UBh^v^uNB?EQHUND>4@B?(9IPWCIK+ z&#d*;wr9C=DuJg5WldwLD_ZuqCUUC1T=H*)Wl%0Ji2o0%3_wOd4Z^VPqMRAY9N9BC zz1gatPShq&Oy49LWO=_aJZCzelF<)q$fJAJ)Pkz3_gk zSh})BHJ19lz+?1yNXsJB6xzQf1uV(;NrXI|Z>xA2*)N%wtpVJtY52~MzY2q1hl+qtCS&4L z3slDNyvDSPG9W1CwCX|SGW&d+CSop395B59)~gkaV@_BD>ouR7sZD!i^omVa8iR2o zKWrA1{#FyqHYI;!AsAEJF3DrXaMP0WlGhxN&A|*XUK0{_D1md(X+syo6EO_Y1qkxOC{nB} z*#lK3l$DUEFceVAVUg0BtKF+ptqE}$N^m}%!Q<0QxSX%)*R5_zVUfFt>;{T>15QIc zxlM02hDQ(B%EN<`3wU-uCdQ0;ZM(e|d4|A&Rlx!PiBoI1752Q;uHrE`8C!Ck*u%vI z7Y+lK6oLlHs7;)+mrMt+fk)TRM=u7qr8SZm8lL9P7ciMG$#S%VD2VNnprBoZ*oTM= z#a_)&D~^?aFLddpAT$eR!6WCHCWOfV0j69|=VakVuN3Bjwa^ncT~M7ZT&MnUNDQoq z%#WEM=lyK7h{m@C?~xcsk40Z`-de3l`*K!m2pad#HE>~P4li7PWV)y@qW31*YqIB4 z#VaT?Y4{8a^0CL-x*Q+{S=SH}cMuT@ot|usLUXOtz!pGnKvIH09`Xj`A@2bui;AFv z@7%r#!+wXtteOto+9R4j#69O_Y-*%X9*3bAsDRCv73}Q{DZ$@0FnK8%5F-l&;D*;O zJ48f4#<_T^X#0#EC ztnTpTRZ&vj5|(2a##(GilT8OX%gLryFmu>&YRI=mqHUyVXw%G&Hp(f&P-VD}&Xur*` zdfw=qi7w&6A~@4zI)~X}LG)F`@)*up4qZ1wHCl^guZT8M8%4r5Hn^8O)0y07kQoYq zcDDy_zV$A=@s0NgS(_1_W%XUQKY9H!h1c>cLeFlMaPR1VqEfcE`f#wn1KzKt5ufx@ zwJ4pX*#G2v&i!{>%Q>A&RyM8DS*_vb?l$c2j^M%LC-Cw-S=i2rP!4Fnoq= zsqBon?l~#1%tzgPr3%W;SN(1AvLMSErO*6e_ih?iuWv{Rllu&_R>95*EISIan6q>~ zox|DX6&11dpw>IfqQr{e!od_qT_j;PdXpaVvE&{-v)3tMci1EAj~qVnCLM!e;O0OQ z?Om?1!hIp{eZu(FTIlRwYNw3w{JgcjoKY?l+5&o@6Qdb#28xNs`csoBJU+XG$ufXs z^xFlze0T%4qaf+{U@4Sogki7<8lHzUHC|Tm;Pf0$u4XXkw&10k`&87q6;I8|tFl-R zkKidxR}MruW5E=3Gg`Mds8O(pMK3v23?g!5eNz?*p*XG~<~S@-UE*QwlyC_UVHx07 zF$7@HDPmA(v;cA)3?Ht>a6T;TOt7pZ#B0&%kwMB0l|=ncDn#qrrxD|4wUqb0U*vIjsrt1OR-8xE6E9&dL>j~ zXcDL=lL@ri9jdt(?o|MaTo6qqMxR(w(Ll4VQYrSR25X=IaPXmgs8u~x}v?RN?3LP zC*F6`r^Tgo#NOucO#z((;NH;gL*eAlrPsk&@ zqVU8e)jq}j5zvg&@WeEyF(Qj5eA~!{mRC>?{t7O!PFS@89noojuYWl+>ZaeUSwJUA z!UWA3opZ|TUbV;-`_%m0Y_@FHpA+Afhx=NrnTKC+C>SR=yO0FBTst@&&*0>I4C_@T z)w_#?=~NmU2@Hu_s-;69&rK{VXxu!+%InxuF)m+Dx~%l z7ffc4R$LsGW$dBtQfs3K69ULlCB=vFM=Ho%F#de#TTv7;sm=uf>FjC-51*aGY#I8D z36rlJ9l)^NB2+)Jj1)m30kObqm{#!U1l8ke9`eZ$iXH()UcGe_wy-`{VFGD*9C3FS zW?eDv9neVJ10STVglq13tE!E&;hTrS*k>-CPA`@UNi%9TSV{|q`~QY zMQBL-+XLv9KzV$TKvhAGd1WfJ2T10Ch!~!Pko4$fsv@nCD;|*%*DE0iL`htEN07z{ zH;ttWs4f{}QQ;%YP~f>*Rd9K62~VFM!|whbv^#AHMe|IT=44b+4H9}L%k*kNpW88H zkk?6&`;z^e2@R3Sa3M^}nZnv46~Lh1rw~a}bQuZJSlz6UR~MhGHQh_zNdT|mFk=VP z`J8H`U>;b(+lEn>B=j*;M$8^k8nd(k!bLfx6`yrAS;E7|&*1j$L)hx^esMA`W*7V{ zVe*#mTEjvz)IxG&A(p==Q4YwItNn@+O`~NDeL=5?n_lw92?M3vCa$ zqs#I^Af(2KS1q?=6;vnSZ~p^ou80qZcHwvi^Ui5FXe?TDhmH;wX_}; zUF(a~+m_@w+o$_vJhJBvJ=Ml+=G^Y(x^f-EgS~^rqM~r>(o}(v5a&#|s{2N+6E>c& zv{(fkeYJZ<5#{(Hp2D;o42C1P|L`$%x&x|5N@#;wBvrH0>8=^K znWZGp_IY%cb9bHNB8GBvUMz-BqLAEb_2K>FQ|J%3pj}i^F0nn(eVz)%R@hg0#rDj5 zhC6RogAEJKzEiUi(`!YD!vMX(2>$f*UxFtm7x8?zOyZj96xjqsj`1wZ_zLbG-Gm#v zJ7kzWJls#{Qt~I0eZ*ib`9rc4jzUT?bwWVMyhJ$#9EA!F_jh1tX9vFd&O`X} z*WZSZfAl2+&i_}x{#)?nZ$2d6z_N+i&MCV!d@kn<%m?j$PDqURYQf@Y5sbv6E_~ao zAA(-tVKC^xtM~4~y`!7(@bUX3TVXCSrY$TMa|%_&w2LA!1V=vSL-`>E60&RAcP_j=Pg)JPMW2H_H#%<0o5j4_op8ai;zOYsqO|Jd6l9jftkGlSv&WDL7J z+#S6xHJ&UL7$FJszA(?=@yQvSqm^|nI)NU{CO1o(VkN*RVPN7&eFXoIK^R7gM2=x! zsD!nOLg3yLPnQ{qov7f2s-l`?a=Rep3~Ajmos7bMl)q6Ch;u?YMqU*VzK+BDe6&ym zWX2+*NQM`B5KpcqaR2E!EUJ=fNFWscOE>ml&~~A)XJvD!;<$`N;p1H5dYn&Y@ZRwW zT+L?WEqv|h5Qf-}fMi4;Q;`{y#8aS(S14H=tm#FZ%OdkkF#(5zr4nI71%dg5=pg)jH+Y+j);ngbv@7nw!O7Q9=DPeWX60#=H#6u-lI`s zIbXs1kKd2sQ+;Y1e=Z#x8Jtl>Sc%uQ30A0*6fl`%VJOW)i2qoxh!Stt0f?h0 zc-O7tS~aqYxIlHQkF99$s4zghy9m$1yezb=4JbUuM2sck4|JgHtV1?3P}c zmy3rAF5O}c@b2TM(C>HQXn&gokQC$~JKWj2FJAZ@TPl|%BCjgeqD%*#Qo{Qu=X5m| z2yHnA%z)&%gdk-=B!owrwRYM6++Q0dz=Bh1$4vzm=kz`_ERf;g^a2K*7J2G;zu7&Q zs1n(^p?p2-tDV2=WXeXnzF`MoAD}#!4Mq_&IZ&A^VLX`-?QCrgxVVVSXOn=u$pD#n z1vnue?3|>?giPtW2Kn!~U>bTA1e0K@xth!<->TgTYZE*ItcWREuY$v*v!LOq&Zs%vQU42X0`RKsRa!tKW$7vn1 z=AmLpwR=DQC=eC&kB08r{+F!+hJz7#EJj;H=y$UX>eK7f9zI{e%=cU(ux77BuJbzB zFti8?<^$kV5v?AW+dJqD;O%$bft~Fkvr{reblkZ$-(|Cw_Pw?e0uqsUNaF@p z<0mUu1$lb7i6DcN@MmBAYk2$qV?hDV#pt{reC}vpE0wPx)W5>qtJ?=VusiI+;n87; zCbIk8Y3tthTY#9N{AzBHRWrQU%uYUAajn9*F;eF4jXk)1coV+zjd$P=KL2I-Pk;VZ zc;n6cgvbn4WsKCAq|(nME4HGHt6`EF5fbD#tTQ*B%;1%~M{uw^B!tFp zyA5}a_Tbw;_7S+8jN$U?92Sc;p-v)z$9l0O8H^%wTtn`&YM(`8o*ke`_ z0LKzNmX}vBLWo()ABakeaXYW6Zbv2bPZpjCeS3O(N|3z6!B$YHoV6G^*=b>Jg5thf z2j!@2mF57{mp2B8M6`(mV-^(Vq@WOk1wq84C7weEcvb>9jIMFkZY?3$3P5UfVMQL5 zVa(CPSaP)b7tSD#F$LvJHx~iKJ*IRJ35t~BGOiJ}dv-N}lk-bBI@p6zzhxAI4E{ao zJm}s^z%BB_l?@<1mNke9SQYHd?>u@;Ua--iqXq|E4Wph-q6MCTv`r#%bL!2G{T|eL}VY!I}AR zQLW^jurb0Df;2`RJbwBN`u$-9SZPqZ6O>_{b$hOuQOG^XH?G#xTK~f%G`HF^hIXe1 zUwHFf_|n(jq6iZ1lQS!(I!Ve+<;+eD0^y&%oe|aC+8K7?_MKbGzl|(eUnkM7?7^3; z5dW2)Y%pAUrb9HoMFd+{E#c0MJ-Bsv1O5~h&xen}Evw)hAcIT+J~}6C4q`2&Fxlt) zU8Uz3d(#AusxlwKTQ;VTCksmP`N*qx12`9f?RnT5^x)e*{2C1UU8=WsHJ#C!j)s|# zGa8DW7lolg*-v^dx#V0;CumJMVUrpc|nNSIka2D<+Gxv(n5r=qyMIjZyB)D51k)YR9LX>im zob^725z4L+fmc8PoGN3?L{#B&84-9HHzO9BTG0W@e_6rt*_ae3^yr`xfdCwb+gs2r zl^G_?#m-MW67kDL1@H_Z(oZkQy^RXk?Y$jB2XwKf7SFGx3gJn1eIn8u&uOCY$+W85 zTYwU>4HGP}>WT1X<#ScojtV$?xo zUDGo^t&Axc0&1OK3VxP{_p?rWr2E@#Ds>gn+PYXfcyxRMtxg+`4z|h5!0zH;HMKF84I9Cl*K02)HN)6&;{-GX5y_@- za&`fCZXH6W#m%HbT`m*q!DN@K36ZisMS0JX$&-!kl({=c{N{2pBad;nQ>J{ytY3CU zB?lB_*VkvM-cKv0){j%ZwoYe;lcdjZAf7NhV$dK`xT;|uvS)4Tv<#f-UWGKXi>?{5 zdrsqN2arEu9thSH8V~}XhT#Kb`CtvY+M}WD^z4GXg2R3{=FGC3 za1B8>bk4a=zr4t+VFN~9=3`MCXY$R%nNmTkY?E>K@@fi0MCvV^U0@?eq|Jgi$_Uu# zCw(QSjPTC<70>?UoHFzh`OUg=@TY(ARru=H-xgzO@CIeZoelF6V=AJYrFl_{9h90q7M>k>RI`EfY{95pW z6(w}~L+Fh5pw%DJXCLcsxmstHE6EmedggfGh%UQIT$e|Qmd~VW?O=R$39sI}12^`z zsecfQfg_&4EBEfg&4YcIOeb)9en~Pv0d36}#K$nYsEp-%K;$|;qOYxIK&c+hN*FZK z-F2@tyf=Sknz9&Z(|oq%623Df^cp=jtfP4L3Jr*u;`%+#>rg<_N8OF|zr*m*9#1=saD-%ZVBH4Md z+$A=_M7WE+b8JN_fH53INf3Um%)}~N-h^n_$!5rNVL~n>Lt@y}qmxTG9nb0Wu-hU9 zY=5hd;;SyC)T7cOg4{1&n`O0zr0UfZV;MW09Ta9507Yi2O2REs0V^DX zaKx|-DGHU=dg8;DUGru1a#Ae}2T^Hr1d>9YtoS@kq(8g7q+Flvew)^al=i{}RG%u) z8j};Yg}@xx4=#)wysH4K`2tR!JSF(okAD0kaN}qnps=-`LKq(vh+b6$oT1^KcH4SL z*@4+9rU0_g3joX)bGj;o7a6|9Ma(%*%L-FcJUe5Gn-1QnU|}6I^a7%_Uqk&&F-)3g zuXJdXL0*5KpMYR$%*1>>qEG|{nk*=O{r0VW=(Jee3V)ro>Lf4gaWUdq0~givjKfR9 zjToMKe0omdsoi#q)OA6~N&q<^*}s-7t$t{NF7sX~A4)i5K1U{x)5kh$R9t*T?PL8q zRuU6*H5=8PomVz8hUcdiEt3h-$rN65VlnrrkK5iR)l`M!T7hVT+Lb=?y8bfHa^76$ zOv}wu1otDC6Xd)zf->((ycYMw)#L(vm1`G1S-Zp|v)Y>zOg>A0} z&=A&Y*l)qjz5Niz+v~z;*bZ5)4pKVHI*{j4UH{rlU)o2@n|KkGaVV9l1qIg$kDmSA zZ8&~<2G7o};Ku$I3D)W3t7xt6Yv zhG<7%7qj^pymaeks1Hldh!%9W_n^}okxW;%dax|oFdtulU#&TCHaqd{GBF`|lT&6Q zYkaE83EV!Gsi~Im=;;YOIUU0%O*#olW8OipaPVJz;=^#bzYl-#`M-qEeD(`)c0M5k z4d%QfVAyatgnoZO@(vrkE0bW9$Ri?p#!cKv{w|_=rnCZ(P4V-0kX)ra&nMp-Mqow7 z?C$!xxark&DtWU}eeLIZuZU)lbPywAyj;PPt1&z{xr8U@V;IjCu&RPG!9W>h3?r+! zS~d`bl@Y9zScPD5Q>-iVMO4U&kY~dd!osNl&wXF4J=G(lWdBwtBDU0-V&TjoXT4Y~ z?3nsMLgJ;P@G~x2D=utHFVd$}5KsZuAeBXnj*kiDSVZ=n;}dvxHKF;!dKNF=I)H<% z9=U*-?p(~S3B?P&3Z^j!3|-c&B>kJuK5`QdXg1P>W(MYTydFA@8REh<6G=;o~|zJw1b7ze_d$3K94e z{j3&7V6}}T8Qa&51E5MvsEy22?O?K8z}a{T2m8BFkjJ%>J)~RAXKQ3WCvtGJ@Fw!6 zv$y0v2{TU5d%uwH@SsE*w*Wk~hZv!*_LKdv3E9ot&Kg14E@jiKN8MwGzUU&so~nnv!qA*?Bn67w~fdJXM^60nM&!0Og>(%vF_n;hZG>*XJk|93-rU z^I7cwl@%Xz+5;nuBrS%&2IZ|F*!C8k0mxS&DcYOPPpY{3nqZNsImst;L?{2J56Wge zTQ0T#y`V;x^}*6DiJufHQ4zFw>Dq8|a!E!x6#zGjVw<)`^DCZ>O&3^zLQr~=Gur!j z&Q~$-%0+}&5C9d7*x29Qp}KDumy0HoZ^gJkIn61&rHHr%6LCRGx=Klc-G@76B#x+U?p>0}CL zXXkKnaY6a(Ja0O`PUcO{tT-IyW9j?!u<+UHq$_WSD{^k_GDZ_r+Dq=Ygk#sR){s@K zAg7qDP18tD!pU-|d~UxhTb=gn&n~8LayfwsA*5(Y%&>5nE7OXhhmkOBI#8N9Q^{FzO66NU;`mSl7T&V=X^0;yXIgwX z$Y-&}6u2bR(Q~+*wdBNq3g83PKzIg;fl&1>r%Skhd`f>YB<#jkA6`B@fKfM8xM%Mc z3reA|GYjFNH$_B1oGe$A|Mhe{Bea^k2fJ{zJrG4svTj^D*7W7&Kv%&*>oDc>m=ItA zMgdW(;tek%RJ24TlO++UaV;2-!k{%uoO)DZQ3jY`A@G<3HXslVAFaj(Fx-legAZtu zsK^8>TNqavtvp!t7`Rp$3m1s|(<;R3v;apTw-~Z`bF>Ams6e`S$oZH>h5aQU4))NP zv>cvG5p0Su=M|wRuHoeLj6!O+cShh^=wn+GVo|%*(fVSnq^O1>?XyChuBR1d9SKm= z*_5nRA(__l4D}8wc^Dy9Xh#)zVW6PWk1A9EH z_{DGhS3?dHm-)vlkH^Wl1(Dz}KI^VIaMYaX{ftEF4v z;pk23_l8vC35qtM7E`FX*B0vGVw;|yzO3U!{%*QAahe(l-|<?wS4la$>K~TytSyu3`e(iVQ*?0vWBWBt?Xm@QGOdN6v`CW&AS8c9?U@5cPH+<$O2SVbT$Ufb6L3V;wh9(Tr`T2E4kV zqk%Azw@ka&-Bs(~<|DlMc^KU{n^&)6oe=Mfn2yUzj*G~31$k@MeoY1Ga&G7x2x1_2 z!g&>_WL)B*si>VQdL>XuCPB3dpJQwo-H1M-tpUP=_Y5G0de2fK138q~)hvpd@s7zg zg`(5Bn5!emIkLGbY1_q|pTH}!(<2fcDiCLr1-$?C0E0k$zl;=GOqxB~8^OK911c&^ zG2E5T84ISCDe#eo#c8L@H9UBF1{X0$3G=@Ww)#*An1oCIrjWSJMB+j7sGL#4z!WJ4 z?w43^izGwMImS@b`DWoxHltjl>tzKV4kcs@OsJt&5(+2Q*cnm|Sc~9z35UZK63Xgg z=p}lwRxzHM*R3qlFoDu&N$N;^*xOp+evxF6JX>hg(Yv_V{2rGfJx1P|b z%$H&FQ)z^lBelkQVpo?ionfe83&vMd==b{2>vW}vv1E76DDawmqc*GP~i}UIOq?EdFx>wQpkNGP;+RqT7eRw2#lvX zv!sP<3s|`py#4O`FdX&Z@L-#aGAvMrrOmqtP&U158ANRh&hjZj@Y7XyQ~2 zSMfUk-cCw7|GqYd2@ROT4=v!c`GWe-#z)Bd>Nql@p$}Hc2CMKHnv!c>y{|PRqFi8= zJRcY$dD5#8UR{8R%&;E0yk8AT?7We4BWP__je^xcHu)6W`RARL?7#TiCK`0+&h$Ak zG6%uPssi49{|W5x?GcYbW11iyzkm|Py)zaj`)zF=lCdW2s{X8IpQDRu1VO$*k0!o< z^7JWeZEcegIO(@2p}Kd{PC)X#p^)s_JX9=RCxpzh0Yt+?Fg{RpN_PNXeDiIX&z5nl z5Isl`4Otb~8COa({SbKxC?EdgAHG9C829enf(%vNP^;~`^+*_=r z$gjW$qc6nrL{Ba*;otn;=V87M`>50DLaWmW5jH48Q~^P9y<9-Gnn_q={bjhP$b2nP zVk8VOgm9!sQe1;J0%w&iI6l3EH{bpy+`e@PyW7EFOXI8}z59SrjShohw*#O4&QH-< zczSULi^YnJ$ynfdHkr{pvN8q{ncEo|%*DNfQAp$QILQ5a1U7i?HoejfQrpAX8aHur z`@J(Fe6kZZ-S{_sSsgApE42fqFS@UbTQV-NBzBUp84J@|-)mxvYzV@4AjuW7C#@8s zv5GcY9_$5ZTnV=Kvyge8k*N*~OYipymR#0gtfkJf(gj~?Da;_lhv!j^7694Uv7l^Pd{8y2xv9Jj(`Q^h3W#e4~m9zTV*-+2$t zPsecY-pkNI3ppw=g;#H~S*$=NbwR_f2`c}K<$??*m=!v}T5xuL4x_Ctsoy9MG^nY%HVqPh zJ;=?za!qrd(VjQ=r;5HYREl6yK(+EwU^6w0Omewhp-q89c}J|=@1Wkt7Z-dKr7?ZR z#+83g&ytpj4-W0&^Freu zLXw|eT)_ZK{D{X^+pp}Mkx0^9v1aaMIg{S3ovZCEPOV@Hs+O>Kun%AU#(VJS@v)|| zI5lR2ud*?!tm&87X|4{@@Au_FBxHF&M-^B$wfZ; z=wgWgG`xa?zxw(+@P~i(7Oa+G7P`G2)e%MGakW|oK((rZrE8H@)i(K zhMqaxr#N@U6NM$74t56cLx1m6@X3$7O3^a!JUN3m-+cswZV&c$cc9a<5cEzIP7EFG zlmH)k`5qkI+=JOWl^dm@!iDgJE@Q5#6qi# zKYBW(@NBSnAXNO5(@S`Ab_I)d1^rG5cW;E+6(N)^MIN#Tp9-vw1SurZi|GR1Kf53W z484H2_I6;06fjnf*xk>p+Z(jQbb&VtJsd^{5zs?6MaopUDV+z9!-bUuXBt$nbZ=x^ zRal^4mz1#}IrKKH$?AID@UBw*vZ(N3A!nqsl}Esv zIZUTBaFruV(sVX~?a_dgPT={9G@B<8>yKWUMHB*;tKdaO4_IL{vab+YygU*>a9eB<%VaLvk<8YsXp0lVN+<$aJ%I%Ha5p+t;b<6isjqhgs z+=`6)O)dhY%5&}4+!QSP3n@NNHW^wk%uG4g zG~^QcpgW5Yj<{N^X`d7s;7Zb(({VOGvp&uSc9~y7w?9uIZImU1#tXO@UqZLjgD#@j z+H;g?NYFj=b1`ersN>Ged9!M3jg$5}m%jIrs3fnnfYo{lB}Q&AWifiPOUxSAzp_2@ zyh~rK*_^(bc2}+C=eHP}2{j`UG?|gbcsO-bw z5opl*cfa!|aD09l^V(uLkXVbVGN5I3{>bxdz`v>rKKjZLeC$In!O@NV0D@sTX>J4b z=8YYWM7!vHxuK!H)qO?`;VO#KaV_}w|MAb^>-V1#x*&Qfd;KBxZ@FAk{w|Pwv4Z7% z3Q#Q~Jvt?t4KMcIf;G1KO6rUHDC?pz<>vMPe(7g_5`N*we*nJc6R*M1jUB3Y`S$xK z@ZNh5NbcI-+ogJIaUas5D$weAz#+@v| zwO+>xsJ>cBxFLlMLh7!)eyTDlq=9&3;LMQt*foXVRK7y*qH0O_0Y zcm;0+)J{)6aMC1GuZt29dz=|apf-t0%Z)V;-Ty~E8aX;=6S=|7s+g6?T#*G`{;ePz==R2VYU;6=|2wu;3 z)qfS=spyoE&zixeQADV<%9Yw+JO{9jqRO~T`X)wNTygP)QxNA^>-QLhqgj-JX@`)E zjm?yG@xSZ)CI!W-XmpW5){t~sgmvU5#wFdex`HXL2Y-MP8l1IM>xMY=en@rV2$ZEHHg(5YL(O2 zU@TCs^>VpDr`>XOVA==hCrTSp`g&EBD&31w-!E91r01quJ-UCd+x5au8e@tQ(D1_6 zr0KC5K%_=lj||c%8g+F+6k$F+JI9N6Z=v0^!3ZM*Ez%$vfXi4{kZPV$AxNG!BT$vb zEcJzi#&~!-!rsm%HU@2%nCl~(g}RW*t{eAFMXd_&OyD+IWYR{ZI2t!58LG@-Y`|Jz zzO=Zynqb&>@brbcsWI0ZN^;#AE)gz}dc|X8EB?OT_%X>9QCa)2EZXSzXHxwqA@x!U z%*NWl8(}7-lvYw%Dto5-igh{J9MlJ!6VX;tz|zhUHGqO*{NvICcpxtRs;F$KFMGvtYV_sw`}}g(UA}r= z-HKFppnsn_uc}6zYP({cQ;#ACjaDCzo*iOyW5Y!Stw5^BTO>g_b^TiBg&6dK?ovgv zx`z4ZYW{-L<&;BGxQbWudYvvCVT72EE&uHecc2eD?=2l>q%|wMf%%t)n8J_~kwK9!@l{ktbv>Hvc+D%p*s6lhD z+s5Xwhn=;7Z`NG+6gPb<*@!ybO_)a22ngq^Xp|HrC&z?$H7q%6nXQ;95Srs?me=bb@E2tlxP zeZa0}GxU2sbQ&)F?YueBb;w4RU2&v^qbxL!CMy5duVvFTeF_;ow7jDmMjj+)M+O!e zm@F+WuCA~->|@wAp8MM)GkbLhrhYsGF>%iu7 z-aAbX#E~*E@5#zk-~c$Il>N9;nTqWdeCvyAr_&jG%v!BRu!xJ?;6gnDz6_@Z6u|uK06+< zb7g;blhak5eqcQkX1q|HXsA9@_Bm6;G;oHjgN|UOidw2DQA#SMK~vuSpx;Bg)d*=j z2rH00b-a|dm9c2WDpwehd|!PYeRi$!lBvU$RA+yTj4&!9r#^J+YXb%&3inCSZc`;Y z9f!NNDrt<0w*q+5snyp_Q|_GB{4&y5y4R=}zbp;+4C@cNv4K5I5TSvO*Lgs+&<=9% zn)5V)tLzZ2OHI}(UpU#j?tkPrq!dus6Uc`B@ci_{Y&^;J;~VW9wE5Rx@-o>wlRUW1 z-hbJZQc8^f2LoJmJ6%ksbDWJX*ipywJUE8pRO@URtw&Uh{HW3U+eW@yYe;KQ3pLV& zwrd_!ju*y7_S(%Z&c>Gx(YM|3zz+~j2UY`J1l}A!$32#=KsZ;;W&i*Q-^99bc@hES zdT?-z_dj{)YQY%IRY+DjbCObW6AV7l@j^OcS>lZs_wWl}e+@fZn=n~cf1FaA{H=T+ zKrKw7--JO3Fr7wwh(09m)No^>tlpn|cpv}o4?o1kY{IkL84S>Dc6c79SC`J2OKFSC zDaz$cr4nY7oPQ1@)EQq6ERSt#>ig9y@H@ZuP5je;{JZ$ti?`74xIU~xr#ovyeEaLK zq1|rc!INjW|MUny{n^Ky%D#W=ChJV%#ACy~5Lz$LZWOq&y@qeR`8vvSj>DrPmW#wQ zh*xuiXGT+R#QjiOTwGqbmRFfR7@26C&}e@OKZD}=`u{d;NTv)Mqj1qNQCUVs6R4f@ zuga6;nx6cJp@pDraIQ2(0u;a^lcGbASd8)Wby!s34G1F$l7kQVZ7y zeQd1_u)V&H&9y%N+g_*7!|<1kuVI&(<*I0nC`hUspYE$9V-u!Wgn}^>2qZtw9%ewztr2nUI2`bK#9Bj51WCyuLr{)1jI4hCxIyHzYrSET zy%JF(;zu$kX`()7gwc1X>LPD)lK>E1&CZDm79r$Ji_Ng=g1f z^nmh_o9_OcQY+oOMERm3Sb)laFRAz3)f9W1YZ$Z}(E#%Xv2`itZ1h=54rPOT}KZ*H>@=2ib&u*IV9UfLNoPV$xYn(VIA3fH&FJS&7tChLqLw4qsl}S+G$Ro{ zNl{RWR?ikI9| z(Li|VV_!jgF<YC&I3PL7swD7|py~nbcot*(dt4d&Dhl{eSJRdAWO5o>Sxry)m{MT8x z3}#k7M{2cG0HCyGkG`|bf3Df3vc+5nn3nIAY#AfqPrv^Yy!+`B%vVdaC>?pQ&Yh8| zE^2ml8FwdfAKqbVQ&L1(v>{& zDSY-3x%~+&?zNZh;e}hfIJ>;U@!2JQ__GgiaCC;9?HvrL1cq;4vMgqPwklalwi^cB zW&>Y){Z-t$c>`x>r(AA9pdHI{$#RHFE*xlwb4rurn~tUWdJRL!$iS%o1>I7uWhxVF z`N%~h1Z!d}Npk}2 zHP(U$q7-W7FANl6h1p0;2pX9I=Ke?}lH7}WRGnTQ=pA zhUp4WsXnsNXojc{hv?Y=6XV{`pDVI+U?V7SIh`>r54&ydFVzt5qj3$M$(SPMN!OzS z{>kK$n;~|(9hD}elmz3t#gMnjazo~BqNr#ukkE`4H?luOXmaAQEO6p&l09VDD80Oz z@b3s%mU1O+8%=q~u8XaW+3wi)qcCmc)9Saap9 zeoXPc4m#NuvJH&i3+__K<0;NZ7r0I6rfrq#DGmbb=dO-lRy0$SvCqsnOh&5aF7w=m z0I5n7lBm(eWX?_uGFTc4b11SkZ3f!Pz4B2+B`^v#HH(=6TQ#)4ii)hbq(TUE|D$J` z&K8(l&9Sjgz!qs!b`y+~NWV$MCUIV*k+AqPn~gq8+mj#GD%J72@rZozjvF={3rwz- zCo0vpK9=u=`jPz2Uq;-K#?6Jax}a!3@&DtqGmid~;%U4bLOQEzlL@%j zbvvT^92VElYx+z5gZMV^Gp*YOpe!dNrqemb7gr2CBJEIOwuMPb&(izLUP}+fK20{^ zr|BQ>U`h-aXK2tqI6A$={V$$yPfcqD%)w>31dufS{iW-rxNWUcYo( z?``4k?Hk<8`EY!NPahoN{(~nRCEHvZa#;}I(8|T3MLG+ks2Xs3SV8O247 zPQAVUmF(BAaQ<~KRtis-m#h|0LN9v;YJIKn3gM8K+t(ifB+>&w9UywLy;+ z&wjgwE*WMFkLebTylaI|FBIda@aTnFr!k>7Mx5+qBK`jpA!sB;DeZu0C8FaWBck^q z^bT`TE-kjA_m7l&QVLGSmyB9SFzRG<-P+#3?cGf_By(iA5NQhaNSfgnY!n=h#yIuq z0^7p@*OGNT`kN@XGKQ2_lQ))kp{9209#lJ>v{Dc$|1K54%uNWeD zX$SGrHXI1Ye2yN`PRpebI=l?sBs5dD6TQJ1XTpe$f|3`5(#XBp7;12e=X5${pc8Te z6!6iq!lfSuWwvx^SSuF}Y6_KRhCZSclBlsHC7FlVc4*n%$ICeQopkz#iNSF zs}#mBJxXS2*<*Qmb;SnXVBjJeA-%#YolDBUUX^IKdm(Q-Tlz#S1Y)Y89jn(BI?XF8 zlN7PMoLpgJW8Fnq)T_cMlM$q;!m=l$G1fqGE9;}^#?2qqf)S9(joo!_7@10Q{aj+U zo1B`T^UCJT1KUW`X-Y->;^36|8>L<}BZBhvx#Wovn~&joy8Z7VZW^m_>^@-(<>XFO_r_pRiz~TT_#cUA6;|3Xhh|F#3k5FW(!bS{SG=-o!s>e>5zy7AG-_{OKO?C_O4CMMUxI$80(PpUEKL3!h2pQu*{PM; za7;S_5F9Ep-g@YaRE9?7R@WOUW!oz!3vMRcfXj3)RlTK}qA;&EUdPnkSuMadV~elc zFuvxL>wf+>er1ZCm(wKk34G|{V!~*}l$Pkqrc7`cn2M)7?1(Bo z`wy|sF1G(L=_!7!F8ha2`OeN=sl%Yx;|A553IyaUo!E2@s<8PLtEO(K*)az!Mp+DH z(Z**Fp5SCOc5bvX_Gpw_Yx!kWk5)NG-xKWpcfS21zV-Sm=y&_snCr%yI*>&1PBBMp z=F>CD737@oe0~oUo^O5rh^@m{#IUzTvGfjVMb9u5S#$FKkDUaez3w)u3@-Nw`U+HCpW(>$s*2E?0W~!m2 ziC_|>ka7)Iv%&eE^uEc)m5XH1--b`~YZRggD_D6QM%B%w3+It9Y^l6V*(M1g_vpb9 zPhTL&5TZu5(Zus!c!a??$yPQTM9FpV=LHwB77mKMFj!D()cFWcPe*J-5c=4iy=~kW z4xEB!wbw^_S*f+OHbh9c3F&-+!?O`alPRBZbA27#!ydzd8sGa!fCRO*ts@%>{7ua2 zgo>>4N>=J_!ZmXby&^^v#k=-GM4j0tbtlr$+jltz14EY1U|D%~K`B#{*%X6*mtp*k zPva{Y_(6NC-Sx|GGx1cG9{rL$W~;dORO4hTDSy=CX=O1hS6m#w-s@o4X~L8XPCq0; zuw1y-2wX_&cg4#09y7k57#mE!L9=1u)^rfGr8fYqL)Btbhps@XgS@LTABHx}%E=3z%!F(*`+BsuWAB5|O!yaA+3qDp>6EZWOFpf6XjP zo7#t&0-aqqtW2f8N5&>~B&k)B@<(@nLadx!O|e*&K{m>)*{q$5|8dQurTqPQc1kdb zf@4T%MjLBlp~u=CN?T$FsrO@2dQrPsvu4N5D#1Fyp9YmTXBvy$>nI@NrN z`D_yVuov7;hZDGE%EhYS!vh@F`7R)0W3j0Zo0VT&E%0uL9F%zUf(Qabc?cwgt zZEUR%eLA{Ldv|%8z4W!sUVWiPW!UT#_?@@Djyt;>_;-Ky4u0~{1AO;KA9AnS-~G++ z;2W>qMVo#@X^(}I=_~KFCVhFQ-@37wS|BGy}#l%1d~~b<$R9O*_onQrMQM^ zwAHCkW;|!!CS;;$=WEg@G_*fRS$i~Eui+nod1l9|oMe7F&=~gnZ*yd- z;hM}+w2EuET20rlsY^X)I_P&g{GQUsx~&#}PpCnyq6m>L>d@Zc4%%))3YCJSmFqAh ziGmd#e4XlWLJg5uu2i%tMmS<~y12>GsFN|O6F8*jmn^2Nih<675r2B&!{!Yi>6k4` zJUKbTv$HW9V8b>6aO`215D*)(A!CF<+N_0*>+8rU?}`3iEf##e@pQqb-Pl~m?)nhz z0>YWoG@zg`nmB$aLeA(SndKxk#Q$6(b~;L7L>bFyFHmkZTBaPhp~gm!-+__1bz%dI zVdy7JM?^mjL94gXpwnq;CLpG%mI1Q=JQFTVG$Q3YP!V4UT|PDq`UpKTFhfRcZ))KNmzVoW5u=Em!Ea+Gz3jD`zm3 zF=E3tWZsx46?`u<2ZFbqFL8Ku!UpTs)()D@7XN0xm~s6Z=UN8^Th=HlSYe@*42g0~ zd(wP8lceMc5ipGvY={s+uag(p3^_tj}`CJQm3Dof{V$| zFRpO=<}UXI3tJ;e4U5sww5}6sPO1i2q?JhfE;Xa!3`o<$|`5UcBSc%rDGZ=KHEO2o(MZeeKH1F!Q@|W_ za2+|P!s}}bvD9~nsmAI?r7bumbu^w}XLAj$hK;n93?x?&BaK*Sde5K5qyQ^*-#;h1 zWGa)KDbx!1gTOhcQG2u1c2M<3Yg>M=r~>aq5o6j^b%X$=QX@RJ%G^MY_-Jq{_3ari+A3|yi_S=JpT>v zWc7}_z-pzo-=U6(-q&w8@bh1L1z&sZW#`xpJip50#G#+KOKfbGZi7`Kdos3*k@ey7 zh%ghHbZK0cb&hx5{S-g>;0s32Ca|wgkI;{sY_v=-#wZsvmgVG}4f`@*y^hW>y|IQDU$}|Ia*l_G$9Q~l zfzLks0`ut{dwVCtuOOBYIQL?dsm=KV)jZv9tMhFtivrqw9J#b-UDoJ@iHMRE$Tu7hbjVxKgP~ivDa61Qn>2Jr=N+3 z3ceuTh_FMP!B~%#L7GaTx&q}8rLgpQvPSBR7=f?A#f%8?6i4GrR_xb%J-l+~CbotH z7wYxOn^DFef-#|p+gCA-rv&J6!Vu{+Z@0I%usiHCKt!|$P1r30`5rf_rY=o?HPE=> z)W~dtk#FL6k>+a9>Qs(UFbqXtDG)C44#l(?;TtY?MTX~<2jS=uoH{ArI^EQBIzg-q z$Aq4O0bYbUJ&3{X8wLy0A%%y~iDqPgT}+skx5$XVlB2n$b>(MNkL3_LoBV(d6vR0N z=$Z}F@X+%D^x_abfx^Q#dzfdbW1>80u6JAU7`wjijEpAoD2MZ`>#b2D(zF<##?LSJ zC!4Quc6N?u2L~AT*Fvfu<DROH-mK7@tH1(HeDUZRHr5B&*%+!O zy{RITuw2E2t-wi(dSlXg2?fo%IeDlZDloSVeDvuf+}_{D##&DS?HIi~l@l*b34@;T zPw2wacG1}U^QDlMOO21gtTid2WrNcX&bdpIi2pU=7QuJHFjm> zS)VDO?3E~6O@5>3RWJ#))KboWhL?$K@IUF&-ic)t0FO7sy6rY*^Aabcb8M}z@u@`- zNTpnx=HtWW#`rHk1RG4{h~FGpm|zTjm!6YqV)fwiAM)VoMPt1Sm>`Au4~iY zruoo}=70W2HajmwJXBtvvu_-D)n9-35I=bD3)i)Q&-0lrf^f_CUxnWa%^B$g>udPf znOn~BtKa!$#w5@Pq%tR^)uWBi6!eztn4|UB#vx`_q;zidA-E{=#e9iB|IvH+=>8Md z2in~pI{h`)|K`&xOfSb+EgT?8I+-TSQMyZ|@v+c(n!VI$HqdUgFzj~lYu|nefB!ds z#hI}tMg`NgvI&n8dJp{3TCDYYc;ls4vAwy8C&xz&+VTD;5Af*O5!N?08LhTqglDlE zn<4j!jtD1#kj`IwTj zvaME&|26$ah!G6Ek@W+ZY?$5vQXcD|$oRUhLTULHWfH;Bk82gIbXa5?zYFigYwrIm zJ*;TyH(}w??F!={pHD6(czAq{^T~{l6R5~5w{BvM(d){n07yME6wfhQAuX^hf%B^g z9-p3aiX3@wZf&k(tKSXvLN;3_;j&SG%To?hhF=xJ8Chun4viXuZ?aAjrYS5cNExx}t8k!-zVKkarW3j+9VGFv1+-khpKcnL+Weg$bxovH{7sVgqbt zF`3Lc4QOYri^48KdJ@D~DDwU}k@32zUip3;U`r~4@#FM8_xUhA7eFHseUd{%M>-$pi@CO>VYK4@w ztoETeF|6!k-ynIhv<$}4p}I~66%k>C&@{~e7^`6D6h6`x`GxxpML&+t zuQ0l}WYi|EwKRFEpWXuTp=`KeX5L(*_ZxMM5Mi?g4$rS}I=aM5FWlfLSa2aaG3$R5 z+(%@RE80Y$Pi-`6@1_<6snUOqhNJYh=x?)uX2}CNovpZ^){t9z*bH9k`I>1(q52Bv z=KLydp_B{7)TycfO)sp%*^pEcNejKg&gKT%O?AFr=ZcUTO0p8v_sppZi++EI z$4?G8Q;5>(C2JtAlfCx3@l(dH!guL|-2g#;(yN$Ea zB^%gl1FuXcKUFTKWE#^!B($X8YuzuWSAQ#FQ4fwrc<22`m`|qMBg=Sao0Yaf^sf-b zy@>lM@Om3$`r+w0##dLkvAv5ma%%ftHPS*R*((X8xB!gkN4H@PbZUDN?aXP)2%Omp z#}_mF#g9J5!-G?lrh!hUk7lROKbc;fV}3Q}{-bF$3L*_%zNq99$vb$kHh0b?m749@C=_n ze9Sbov%T%mQ>`;54QI4j&JrRUfl?H2@9*N??OQlJImYN}$}sl1%&&V{*qEsnES^lJ z$#E^fuDxX74ArAnU*`IH?ELRn`In!Ydom0gVVi4jhu&QRkWuK*EI{ zVT>n}#FEuDN-_vjo$%=Sj|Nou#uWNfXx?m;p&>%byDeg5CY!Y=+hqeb!tbm%!1$Tr zYTBs&hx!5$TH)iPbFSSYn0!hXymw<41Flbr8#F2%(TiH>fskjvEE!RenlR6nmX+H5 ztu<_Tz=r3Ec{Ph^T8t>4R?oGm{HAivEYg*Ge#874twUA`Jzhf2PuL^>Ss4=yFpjRa z8rmmNll=aI1?#D^bs(ER<;iCgn(11F(Ku?H?j1?k99xdOyF_) z8ZZYd@0u|ep}!TJ07wcwReGH_##W^(WT!eYO4+5lGhy=F$6h?6M&)qwb4!|{2}YQ; zQfuJq0!cQFr&ByVJY>jj>Z#W4wOyXcXE2=r03ZNKL_t(Hw0lNZ@1%?%C#YndlPE4l z5er;i&DdM%;La5dYL9&7;@ayX`yt-P!QB^eFPlhE(tw#FI`z+InKKgUr{M3EEZu#>Im>>g`(yk*Z`b7De zL{j09P1k+BY&u67AJd+|~4TC;WMWIw#lBOi`r zq#o*^3=~~QUSmRJq-2A#*=*wEe8g#%-A>^F%Nl7Stlq5Gt)NwkYuyRS;B}iE%l$gv z|NI%wPmeh*FFNH-2BDwQkJyZ^+`+92xjP>}J7god+v{@#hSTPZM>zDdM$#yQi?V8K z##L85)@WMDA}G=>2V8gnJU+g_U;gL=uKA~1_xeK=trlm)OvYy@7gw%_sL0+#X|3D) z*-<|*(!=+*H?TG6R4TEF9yJ0lRjUiX$c&hdl2Os`-QLH1xy1QsggK!n){#kF zePQ)&2+$;e?I!Y2q4mO}k~h3g-Uxvu4-n|vPc;f@L*;?{Oa$;td~*8lHEd09gL?L( zpzypvZ0u~Ty=}bby$~fyQm+aZ6?0KA54KV0v7{bA<*t8<;Ih9G;Kx>~zdEOzlPk`&%2h zv$Msp`tY?p+R!qZ@d-hDVj<7x$;BlO&M#a9tkc5n?M-ZUTh4!O;hQ+a8+Rt3E~pEq z3b1y(sVG!(EN6^HaqjHguu?{^MOEQV*EeU@;vFOdY=y~uj()exk-wHH9au+rJQEes zUA>s`qJf5GQ@fbGNHW)=w(ny2hnk6Urv(r;DUt)&EaT#>ELPGjZinE z`z0C8I5UMf)PnlxS|q!|!EwVCi%U~(;WuR99G{LczM9~LTQ|5bSP%%|uKqcK(wU~^ znh-TG;k=N>k?n=B&8%<2UNkYjoa5=UW8A)d6a9{VP9+?~OIrx|P9@N$Z=#h5TS{PP4a~XUv~H8^03v z)k!nHs1iZJ6a$@7rwH+kP?8&U^;#i^AtU3$=>!qtAu z+0xd1IIku>?{D?8$s|`4p#Wa-x44-gC?^0ofswkoC-8^M$pV+tDb|Jq-$zaDf$NNs zYn8I}N0Ham0e-}Jw1Ef4OQf}nCNb8GjfN6A&>1LZVR3jm!rGwEHT_A%ztsAMhVqFw zw9lctx@Q#~#{nFboJn>6(E+~r;sJwFEv=V{;^Z>1W;r0cA<9HOE(Y)^4UUe_@ZiZ~ z-f{ceyXX=SS2m&u?v(m%v_4mT+T2LcYwn#OB*O}W2hYy%7w^2!nNO4w+8t7VuqNiz zZsXz<<#G~vVYt6e&#Rxi@XnJdwR5_&yNOqB@8Va!`8wYE`fKPk{Z)cN9>=ZC>6ETg z9?rUlaOJ`oV-z^JcV{2HUK@ue=QzDu;L+0~937vc+wEdweIsx#2Z|<&xvNPe=iuGj zH@WQTY&7EZL(;&I+)mop?*QxLDu;1Yf zkRhY8cd<_Y`dvPcoOhI>PyOTQJsn%?cNyuF-w!;Z`=IO4-FrO@xHPNF&U6Ccqp|RK znoak&)#QIvrqvNV43CM?5}-n{pS+P*n1}{nXqBwA4%n{@InaWHC^cSU5nAQ>4`LhH z%BD;=F`BI6mZ`EX*Kp`;KH?=23oBSB(wtSL8A|Ud8;?tE35;w{?+Nh6rHgz~z}P*f z7lR(J$Mvpyb~<8%i4^*_ui3h}xz0U8EFv0N`mj(;DiS(H)Q-m&cy>PK>k+}++1})I z#=@@L)!3p>y|S9ENAF9zq2e?uCRsrOt1Bpvj5R0qsDZa`||B$dkuPj(E2JW%tM#rSf9PP@f( z%;q+MT!=zbL_Z%zzXT?pX~{TGHF*iyFtRI78(dPu%fdy%Lf^L18DV6caj&=4imyla zr8d;o_dQkJbT;gkA ze*^0qeP4TG!o+Y&fNzpmBurNnV=1nVd($EHH*j`#jDEj|PS@AODKtc=9UwBKFey_H z``+I-)_WFyziK2TFMLY3ew0?Sx3j?p7;Gy1(>Pzemo}!{soJX-+cQ-38KE>EZgV|> z#_07s9Px%-u+fEpy2Nd4{T?aQt}oSIsk5l`PO4E)!Y0TWK)QP!z+~Xw!A(bzQ)*j4 zDPuxUg5;>L7xj(|@CPwXH}yCwKBS#2=^*Q8RrrKWb(cJf8uoHoliUCOg4(AHn0 zYWPN*NxQD=U$F_S(1QRmL@J0o%c?Fl?#-az<6c?IwKl_n$LSZ8<46-CACx{H8Qrxs z^ChpG^uFv8Qak<}Q!J&1NJkFZx>T55N_Vl;76jPa+rs@vPjP%U!Twfhnq)-jklzv_3!AG<+SFtWfw9JxdAW66UKS zFj|PFUSBPEbEp8nQ7hias>d|e^Z4Hxgj`nZ69b~QrJyi*gNf0$;$w`QXkAE>JQ(BI z5|5A0IBk$v3DNV*`!}$&=2McahNLb7x{P>H88N5yg@49y0^H-{GuMQf06qF$ys*2C z0p-fFqAs;Kh82v!;!HF^P5%6P{=?L!0x%)QYjl(7b;%5{%4WrK6{asnnsE*_4rzq zm@$mA>!)K^OJ5LO_#A83oRCu{{5(PO%mdu8sLoEHh^K^TV_ueQ%=bDD>K+~ze|kB` zqx;Wres+#GzxFcrZ{0$>(+c!JQ4u!ie6$aVvqBp$&H!@j*TBW)gx8ZiM1|zJ%YIAJ zrER2%pzFtITyT;E!&!3sEh8dY-^{x310p5n^nA<#k#QSeF#;ZVk5xv4 zQ8tr5SXP97ROp-mpe;X_aznLlg}`b19|s`f=h=el7O`(k{Yyt6l$Gb#O-F&B|1xp$ zeSKHS5qKJZ!3FD0%olTBGb?prnivuV5wT7aHha#f)CaX9AuM%TLU&QkH>mN5`!t`@ zw*n!)NkAf`nv?f>V>r;;&)-6+;~DI8>IQuN99r#+)X!qFWyywIS%Y*()f!^SC3&xS zejHVXIA30ga?Yj|)(36uZf)b)=^54sJLq>Bj?Y+e*7$vk!e4Lc+%!t1NgpA87jz^q z2edOq_PbF~+|kgn2``2MW{_9umC*7-Z}(fBYWS*4A*NFODTiZ8VCP%f7zO zu+_Af8q5h^uXXj+ra=HTz%Rae5AVM94Lp2$jLCQo$Q}~CB-(E-O|)=2ll3|nA7`bt z#IW1NOZz+c<+r|x*I#=TYaQU@&p*bSFMkcaUW@C?_!rU_REDYaQukpM9a-6G*_w3> zbL891TwGjo35K(I4Xn?|zPFqbvNY@BRP> zqjUVu-}xo%t&!7g>3XdOeY|8~zl~lC-+J{9b~Xoi@BIh3m`rhVpBw-LVA89fdEgjgep(|R_mq2xqqur@l$!>kl>J(Uy) zeZ2x}Quc^3$U4E&wHu12gzRi`jNUbFZg0G8e4}Is>7IqlGWi=eTu5oWMtRSoGCDQU zAQl-4A!-5>rLjGNys*86eyhQ$LXI|7+L=}m zgHmED1d}X5e(+lPmN89b51WL9^H-XxlAPhaD?z#RFr{P+O_o#xHggTU3EH=aUWQWo zvV~N`!t2zMrdn{iXlN!70FOX$znr{2@+QA4qOs~y5LXyarkt8b-kO&0yHR>WiDI6- z*`$Cpq_|QI(lQu9We|KWb&%Jl*@UFf@;39tO^Ou(fDnW;L(q~1R=Ow`Da57kU()bB zb~tZbkRPq2vNk`SrI?r5eL-OPcm%f)3YM6~3M;Iy_CbdMeAl>Tp2zoyiVXBAaTh5;efn zwajhixL`+430zDFY1V-r7$Z^c($}VDL#jCT5=$@{Y?KFi&TS1%eaTXYp@Qd;L5)GD z_n9?S$_ld1uMf3?7>!8To?>IT=E1e1mgbZ;FUbPvim7=he>CAwl_^5Sg`mf-lyo(z zeqEIT@3WeucBd#@OQJ!41MmFoJ?!o7xUvjoj7KFp)2*^wvMlkLPcCoFC37CJfDfb4#spa0Zm3N?v4Uj*J`xz>WjDVYj3@YL9d(qHpmAt(ydMI zkrPumq75*i#Xz<;pbihaO?>;!SFy4y91!TnWQETk9^w8M53qmZCI*9n>Z|HGyf+M+ zronq=d##5TZtY-aV}QNQA$GUcv9U4a-m26FtJ^HN9Eh@Vrqek_mlMu(D!7TdZx>`E zDz@mBx$za8O*Y+VF}p(-P3UtY`g%$MksCODw1~UU7Ku|`$}Qrr6o8%IV~xGdjkk5L zB`p@UKu-Q@@u!8NqN>~g(;Lz#;SdHB?rjpKA+@(6lZ!$pdiBy~mwLF-Q`GcEX2DHB z4bHA+3_*V}Td?xF*6ZNzja_UHyOCk}krv8Y*7a86eXyL;xZsq=05LvB z?BU2)$%V;fh>8{AZ|J81mxs*I@`*s_urY_&$pE8kw%Jqcnm!vJO%q@by2one06W~i zE};2A7$-Xj3Xj_8JZFn?#pw(*jv^SK#@Cj)2sZtijK0z60#_6X?Da9|58RlGxUVI( zlXX77`J$SeutJB5qmT$lw)*PN*3-!#p z9x{S-2tpi3Z&*Ka@6-fJ3c!{oAdIUA>F)kC6m3+wb*M<{!e&mTfXLaNCieJ zi%6kp7A>^eMF8bU>MgaSBp1DPW2k#1qt?B~_`UAO%C#V)34H2uy5N3=?N;RKb<|;# z-+%dZR}FK;|MPXt?o$8wQ56LuFUfgI@(USga3slXboyTr3=ZOtgI*s`4^Nn9Fl{Q{ z=VTNq_hkgrsd-k^?l9$aNzO^Lh_s=r#~d<9vL@nCHM(+nik?u*lcO`21+=}fg?3Rf z`Qjugr+`GQB}XcChIu2!roR=nW)+Y)DJo{Mw|@&i`0IB$+NycA;`sa(?84P4Hac=+@wHrCgPLCNYm0+G0AYqG717;4kB1F2b0cGT??)FE8W5- zTP962&@woF-?+K8{&x6naGu2Fv|=!sIO^*>kjc@S=DsF5o?3?bDs`Xbu10MTgVbe| zDl0Pn7}Ya^_DCr%rNzp0=E@}p;95PBIOInzeM86- z)o3cuw&ph8a1hi{noEK#Uapqd++1fgPz2$mR5)W50FKt@Gi@PLHp0H~pG)z`@`4wb z%u5`cU0_Ig;cG4pGR#fAIuM@2BnFt?4XGzFc-u`p&n>(2f{w0cI6fI+dyBlMZKoWB zby9tU0`pPx302EjA9Tt_R-HGS@UJW)keO!b?;8xtL5c_gClo#k96H8ZrTJ(fFZ)4_ zI~}-D&x#s`k*SRuB%pq=YSuCyi)F)M6ZkxQ!?fA$bT}0yq|ut{{MJtP^XTV4^>y9- zljE@|s_c1c|FB$?9_XS})35d?()F)1@NFvo>c^4LkV)p{x;>LTM1ZU(M@7l~4XLjv zW6?@oiO`}_JZgilp=Rlt0SB^+1HaD3%zjca^^;Z44KJhQcyhw^uMi{*^1`x0-)Q#n z^xy~^tSFkOU{`LQ>owW41$|GA+~~JCO~|<7GvukIh2}^8`HiX%6HK?= z!M9$&i?_c1qH6Y&(t!03p+#w3%^`x$lkXlIo-@u)Z0t-G*o49jx2ODbx2TV4; zz{PZlIqB^vT!hnS8;PDCvZ8AkNS*5_t@F#A5IS;YQW`K?t_G2-jJI0J=XF#6uCceZ z_I4V+zh*-z1w0qFCi|s$2oh#1%+|(K8w5L;;A%f>AT#r>AE)yL8Amdz(>QhFzE=IQrI+ws1zE~|EH@J zE~YaV0rP+uQYvYKva3+u3MFQZ_01Jcj9lniseCN{cZ51g_oOtX^zsQ%0;>(<}5fGvDuai3Pp zRZkwALq{vQ7ns$?ysJB7fDkxg!z~j$?Uo*9H%4C~6ObZLIyjrnF&d4qSS&GI8=^_+ ziE2*$=23HQTrJf2l08#BQse`$jYOAibZL6x$_;|bOOtXCbZNv_Qku>#rns0aaAS9a z>jd0wii*NfRT{O5lbr~JR4>tTv>_O2*%`_Qr&m08w{C1QAWy`w)Q=r3Ock@r44JQ> zo9E-zMpc#C)mUXO1!3c&cxU4a^m;vXI)w-MfiG6}b(h+Mo$#WHh))%A9XZg?Xwq{6 z->6j`ph%*=^I&oH{2qTOk;5hi`CEGn$9{?>nkS87O_?6`^V<@@BZ>eBCI z{}fSw<=-?gq0~Nd_7x@~*Hu>DrW8^0Z23-zwLz&_Vk_4$*U*5?*3zHL83mR-(PR+2 zltk;&%B+%O5Je=8Uz=0c8enP&dKzVfU*?mnqhxj4cp;;iR#Zl-X?8ZFPj&sEc$MgM zdYDWXm`*3?_qz^38pb2PDg;+tvjzMB>LX-X&5)`Mi_56a2>eN+PM&5%L?h*g@{d#9 zTTPr^%yIwWBX&e}IFqH`AdKrNscTsyap*@*>;EkfQnXwR6V+WeFh>);wRQaQcmE?h zSM&X3JTG%me(B9=LfzHf{ax$~+j!%Z7uYcxqn8ctFG!Bb_db7!Rng*}gH5vv(ZZk( zd#9!bwn*2#>v&h(SqL>9kal_8ymR1m@-5={JljU0>VeF zUP86rN|!T^zWSXm-uk&$@Xc56L}cyUpipBL{*d@%6631QFw+ES)6w{SPCClQu#1=O z?qksF;PZ!1adtJwqk|KipO3J+v&jgA#v(YgMfMvLvC@O1+{Pzic}6wy-8OFSY+-MA zi;dmm(-EfgB`&9PESIk30vX%VKFa!aO-u{fIg)J^^h;%A2RkKA!wtMO`wwCdsC_Q> zfo8V`QJ+nynsm(@+v{)3Y`SxbV6{Z+&V;;Xd6=l2n1HI7^YlcCmm>Kh7u7j9gi)Up za&U#Fx*veaZ&*e5iWhKUQ0gJ|>}15S@ubMJ0k$#3i??pNltI6UW!Rufk+j-C^hM;x zrQtm~JZ1xogw>7h4eW1jqFre3O0HHF3dJoCMavUcUr_<5SEUe?7?XO9gV@c+kqBi) zELwS0l2L@A^${?F^e1D8QW}QsHb;e|b*)u}o8+phYVvejY-d zemTCH@^1)wwCN#0B~2W@FMc*N001BWNkl6VFLsE*AX>J;BZVNw$6skWTk8yD^#yZtCHhptg+1u9oAz3U| z2FEAooVH1*MeNO$0&^b$G6EEw(F&5i5t&hH>}XmpRX(&kxIhDs4^A0Hb7!OHYY0su z%oSx;l(8V*lm2Bo1;crSrS*Y+w!+sx%$JrMYmySRx8-1`qXCa_U!^HWXOu-{PbCAZ zvc<}-4Xo3oKdg%yn1B-M>74e$g-b(iHxb(jK*k-*g@ZjEV72u)G9^EA0)>$)2Y_-% zX9ifV`9A+8t1D^7IwC{>7F6#^Lbe~^rcW@m;qhNm^$9T-9Tm%CgJEzp_5pkVKl&S9g_g zV&vnV{-r#D&^wRM&(UmCdQ{5;8YxB3R%>*_g=+Rl1QgPI$iyrN=y_5AWMSKwaGj`k z+JwdnPa9lcwX|rp+Gw=9`1Fehn5~xB+1&KKll*lGSM^qkN1N}_a2Xom`fBcj&ZpU? zepZrOO)O0l50B6AfB&mL#lQUze~xE|=U6O7PT0tEJQ|<_2k^Rj04^!<;_Y2*_S$&k z)qCiZ?34@~pE^1m4q=Nne*D2l*xcE|Mz@{OMXHPGb&iU9I=@0Dd5C;N$yT<7y!L)3AK*bi4cyzF~5e664&-zNhE>83ghMDsi`&=Qsqjb4ZjsRyBXdrdm9{MaaZgQBA#hxOgU{JK5EHDMujCAl!d zPz~yi)pJsleTYIkg~g5UlU*8DT?u037PA;IA!E2I`-7ET7$5O){i7Zqk1(3dSfM6` zlOX8t-MqodpList_|Pe8YSy%;!Yl5Sg80SL1B@mUwA)SGB1rr7b&kv!El{%Y<Q@<1mdXO*!NBT^EW zv}&!SC4xMQtS_IzMvsSV2*$Xpuvl1N#OaqR@-?i;T9emc(79;UGYa z>yhIwEH!%uC!;AtV00_C`z%&^WVt}E9@!P>ZIO&oLN3%TN#YpK^CPZa-a6z2NtTz@>wr_$KsFA9cx zCfXbj!dXyobzSjw*Z&*5v;ma5PoMi#NlIJdymG1LMd*K4#t1*9CoNXo{It`iX7W)) z>y)23EF}+ezHZgMYtZSUL3jNsC(jd5@DS-o_3~RTOGdw?{yBzfZ;GaONJiiZE6k{7 zWwa3(XE+^qjI8=Y)u~nE&5mp5NOJQKmQN-@_Ea2lbkd#`+*khoc?mNZr}m zVu$Gue*81s+}rhy?Gbd8;OIa!Afs)PNV^J!urs!3;Ro;E$6vnlz8|MW)6VhtfBhHn z-~5BW$4#k!^5JKk_2K5MK+$NS(;uKe7^229oBT8wA!W+R+Yze6Q-QBy{PKAqzK;_x88(_19j+=;92gqcM&~Q~dC! zA7aq!VQ*)Tbs*^jC*X9UJ&}#Zl4Nzr_tqm=6I$y_clPkj*I&Zu{1jJ{OU&jgjK&i# zsc2I$!1q3u%@y~scW%Hto5QiF^E+is1%|Gv35#Y`%tVS}+@#ww(dpHE(lfb882ly@ zB|tM!t1hS*QH_AoLL%H;d&d*Wk%sHSH9|Bje%62(MJRejm{9Q)$;0Y2Hd6m6-H4(! z)c@;Zy5I$+sMr3^7H)2DFj$9CQK^dIp-d!a0J^BiXgb5=qhnmMP-W5~1`RL6HQnX|#QK{Zc>pBYW~>Ml08B4YSh z((Fnb!}1bYkmkswSQs%l3Rm4mQB(46HCP#O!bKur%g}Gb_#4Pd>&Aw{M}}YdHm8=s+fqJm8)&1#f3UE2;N7iE1Y_7L6B26NVFE z?mu~k^^GC6*ZLm)(JxX} ze`5>HhVqjso~5^5IHKw;>UVY$EJ}_kDy`J3S^eN)x1@t$T0;Z#WyydhgpSoLL@eaI zRr{bbB*avk%ST_Yl-jy;uRHctUwU$V??fL7qm&a$&81Xl5qf!aN)*nz*L5v8zU*aF z9XOSL>UvhwJ<{_MJzB{(l1a2~y>8b<)GJY|bX`)XS=kiR@S>&*m%O{Az*I3H3@n$JzM>I=vo>2Bj%p;m03-j{oqN@8D;jJjAoJF-Fq` z7Awl=XoZY|s4qoD-m$Eh+|3aAjC5`A`N0YP_kaFxadg1`BlpTqC}-aka6T;g~<#*g3o zgrneYTNG$@dTf9-sIjehHqd(F=v2O)5ZMX)z?*5ML*}KnJZs$!UVr%|uK7DUALHzDf&2F#;o|ZN8yoBB z_dD)>c^iVjq-?kcLS~c5O3OM7@y<71c@cv_2NzdYxSGsazh?lUhRbj=p&zQOm9{N} zKMSOoav}&%53EC{93~tnb=p-Nc-PAvdDO<Z*4V}F} z@i%fg>SgRFVWaUNgW+~^646rQT9smCIRPZSpupb=;-mG@_eEexA>~rUOzEOMoNvz$ zP@=E}jt>s_o@-=?wY#`j8hrmpKgQO^5VtrIEPbJLDxVkpu1d|4{TtkWL`bbvNu5?*)no=AWY2~auEeeEzo$B>hPzHt23jcmZ>|;= z_a8pN{*7&H4*MvQ-^ORs3ZE84&yT{?sgsI@YvC@89x>Xa_f*_1T9GO+nJsuuC}+Nr zDc%V`$&~u*43_7;tWs|C$EttQul_RG8`=AWoJo;BqR&CMtzCs*a@WWs|F#BLxKhT8 zL%LUXH=}67jo$`&VuL(%jzLnuE+$vpOVJtr%6@CV8K8 z)8x2L32rpF2PEB;QqZ-7G?5uvpNHMtx9(0I01 zIhL%?IB;pE1`nQ%@X!9kU*P}zmw$rq{?$+L?#G{ViuQwpQ~dC~Pw|I;_5*zPo%iw6 zj~?QO?|y`zy#EP4`{D_XPDY>-r*(<|wtZa{q5|uN6r*8eToC<#{^S|{`5%1`-~aI^ zXtp}|?Z5jQjD$BCUtqO#@+QbN(+FdxzI*Lf8?U|k3ir-@^6Zcm^mbwK#>+2YYpsV{ zH}-r+2h>cu1RIiz8|xc5IJ?C0`Iyo8s0LV&jgjqr7=1vkL6~+M2$>w11%Q+jG)isZDkW(!Cef-8R zeH*v8)&g*svX|7bV}xDrJ!D3`7(JTiQgLf*-v_!4o_hB^>1g+E?=!dtAupedr+9LB zf}`VObbCE6m1z3;b+xg6Hm%hB`E3&%!fLFZuXmcp1ylBRIC^+Cp5lVi6DJc_4nn0L zlBE?hYd>x@b_T3N15FgEqeMh*u&*^tmx@At-7=LPP+P zNC2qZvyOm(nrMak9B>%?|JYFQHDH8-NXR@6ghSE}6ypsjSTf!sna7w`6+LALhFS!J z5UN~IUC4Bf#maI>+ku_9dluTb&!Vl`7>ji@vL*rVFfe(|d_?#z2!(Ow+6r?sT!ZMn zk@3oUl`h0Cy|k25C-hR2wJOEaPbrH_7ddMcjUcCu^d|H3N_pcfRJ}lx{$i_T8EDmV zn#jV1;tLb%$gpzhie&JNFQ!=97T)>bV?2EF6u&d~y;474YaFUw7$En?TV z0#8oHxV)TlO+l-v=`>wK{mNKz6u7^oR_r==K1#T35$(icn>)^Ir+WSD(|F)mP1~n9N1`*9I9> z8EVE+>c5X;ww%R42$G}A3+`>yDijZs@dtSnhMPsgvO8LJfy^cqo}Z2o4UY6fOFzAAg8{_J@ChAN=fdE)5xv z&lu3*t)KrU?%djCbVjP}q38}lyVIDd?wcB&-`L&38?V2C;c$RYKl==$%S*oYYCdI9 z4$7#wd+U}rGE0>OBkN>1ic2+OPo5ny(9G7xnscr`C%syyiz7GOje*As!OnUgZ@zp7 z-+J>^eCxG)=uruR*H;ctNBGgZAL490;e}{WyN6z%!Lww2=~DB>49j_)5f*hmGFsM# zef;)!egQYud$FV>AR*f7Sk;hoXXbUEMPeYJYMNl_Rh&=~aW(ONq>E5=l2ZL=^BE3K z&v9^eh6hg$m?UrB*g>V(j>ViY)ePNR9b~L zNS-IijHt>=AeqPuLRx^jUJ}VkzEccReX_=VQ~v2MexpZxdd=D8spj7IYX3FhxR*!sHm?8ZEf46zAO}z z*XXWw3_p!{rD&0HZsMkh-tV}M$$c`gj`UgymAFTcumB_W5sKat6GB1kw$b;{?Cx5H zia_e{ZS(-=(#QHfM=_FVdEF4&s5$1nG7XM^O%@BR_q(8yodCzG!mD9!6!XwZV_-zm zXjJIZ7l}q8Z-u9Ftr!U&`kuUHMk6;C(%iWSyQ%cepc$D?DQpbo>U)1lUbfUcQ4_}n z8BVR1FFa18J5Ui*nLnw23(>UFr4dq3nwIZpWqllp`k6I-M3;=%)5{tD<4-@t_uu&$ zZr{F%pa1$BK7TqE*_N_4VUwjyAS!2pI4g8%a)LI#9RnXOaCSN6Rt~prY@yR~hF$d9 z+Q{$y&alY%gh_=<Oom?<-W6 zdd#9BDw7tYj3$}4Ya=z8Hd&3P8(dt?oaepW@MvQu@UI}mGesI%dY+!w=SB9eGr;0_ z{ssxZqA5P2zvZ3X}n1TivUX;SA! zNOKAZHw7!R1nW#`eL+2_SP-eumdADcBc|~|DH!pGsu(dd!h%wH-Tf-Rh;-604U8_X zIE9K0$U+;=b#to$b*g(Qux$+(2+m;tDoTy z{`H?@G6%bb#edE6Ly4dZfu}Y_~@H)b-}hStuw5W32V>imJT?A^h~-oX9yK5 zNE=^r_#K~(@uPP?!pZ28`BRtqtyGC zro_ZS#U4!7rxdzhmO%+FQiDRazD7+9&+iea{DTw2APDiJ(=o0n(HVw4QrjErxV5{B zPNVR}|4?HX5sHuFyOl7Xvm>Az>G)bBTx@AMyNo!v`T?wCw%G06?0z0a(Zuq zfvRt-y6=45OkDJUh8MC})lagZRz1p83c(zhsz-JS^z93+;gx+dVu^`T0vcoqhT#B6FuEp-%Qxe7a0&2vl)AgsSz`!929&nKd+ie zs@z|t;s${xN)*)^S?+J)*MNoHGI(IPA!O;ITyvk7-4sO6()BRo_bVUC^%LrvF}pf1 zs>y1j!L?d!BN^9t*?6YypzB@KivT>h;ULqbyU)@`ZD}l214f0ci^U=!3CUu+^PRz0 z`g%MrRQBO~V1;*A7e3n}C`B%Z z+Rvud1@y|}rc!H!aYche&W{QK%@u)htgo+gJz+t{t6YZ--G=vK#@}08Ws~t9k)HLp zazjR+6Q_=!W4aGPyU(U`y!zsfi|FdqgNzS`{UTbqHEPpZq~cl`TC%~jJ}Y9lE0~Go z*M6|-S#lV2>wD0ZK0<5b^-K}ymFw$NA%D&mLVA@nU6*xyj`dP!Y<)EYEHe{y6hNL$ zpAx)`D&n8p$IrW4KAfC9kS1I*SG0D2*FRe8NgkUAtj54OH>u!7+xu7!^3MkCAPjTsq zEqwIJBV0}!48+uGw9sm{v6wHg;$D>{)4tOa+!&~Ciy~g8QEmkG^<-FPO!#B{R6`yV~Q$Dcmq zHYw|CYb+nA?uTUaVmiUeXoTbQGt6f**kx4M$&pH`-e(UFaQ1T(1`8V!$c1<0aeEht zQt#%AqEol`hL|s3z+Zpx8EnzP*Y540C`zBoXlrz|xF2Nm*ueYXp-H5lr~lqF1NyE- z$k9e3E(mC%L0huUm=l!dsDDSM5)+Xv_e1M23QR0bFlww}w53ZK3dq#g?4ux0GkzAb zoU%x?*b3Sfv7yRB>M>TFa!Aj#x7NWw`mJBYjoo$p;h%jUN2e3~=?_1^lY>+IgWvom zym)H|U0-h>N=R@@CF#T`}_X(I`(&V zxURs23Lak<0)@gO*9>}?n?O>=$@n@vAM+Tu*Z|vRaF2#3T5ELbNE9R{d)9ouqF1$k za-#ww$Fd?}ZG0u3-zsqgrjm^z;941d4dWr<4W}niFR6aF&5idOScSAu*?%#AI}9cC zgA*ntQKJAvAbm7K5p~=RD@L9yxhQ{gZGet)^E!DWVF}7*qd=7kac#8AM9DC~n44Vx+ ze*6R%;|qp-r7ri4M&TQ=8a6l!^{h!gwXhhWaphP~goi)J8J=7`fzj0*F;9# z&7^!TK7UQHLGA5Cil)w%EOK3aIHbP~^XvpU)ndrLbi6IP)Qng3^^veGDiQEZ;jbH$ z8d9ABhRXbW$;)3a&XLKcNLHWH_LjV!gKo!1$*V@n^CEa(#bEOfrmiQ4OsJI%G?|P& zo*yHL(ZGqR^D;*kv2lsP)oh9up?NhLF^wmy2@_DBI!|OyE^gk%ur9J)+aH!WH`dl^k<1Mb-^ ztPSl-2zX<3F~#@Z`3Xm@Xe}v%)oiy>G+W9M9Lq(7{?;}(u)VvDCN(5xltR+Y8X)Yy z$H!;*=|}gue(e3v9&sPW`HbM&fnK|XjkO{6Z|-AfZx5#zV@#(rR@A9xY&x0Y?ED-D z&kpeD(IY&5Oi{8!oR2QCTr6QqZJf9a5Rxk-|8DPZF_b+@4z|3ozmL70ElydbmPVJe1=q83^t2F1 zJVHAz(I`c46OlP!umq!Qi z;^Y_xRa72B-6Uoa#idf#wtlki`#){$g!RTcrwub(@8!%LR1q^b6D7fCj4gsrP$SCC znwmF`2?enhFOK#8d!s;jxv^RmX9vVVqT+d69zfTQ=f2eO00=#;A9u9%Mz4tqO*{ z9=eGrcODNy#jPCJuuPFNaaN>zZEH?-tx1^pRLccvED7g`?tv*KEAa4#n+JG(^FaMN zUY#7mxYHrQiD*r?H+PhSKN^mpKjhfxr(Lb-suD?R5gPIpO_OOVkjzk1O`4Alx~Gc`6$wAPJcHv=-=IQ;^0=rx z%_46~b9cp|a6em79Sj0Vc^{-_X5&55A`Tswtw&0k&i5bg4}V<+3Eb2zz;<0|6z@+4(6vJ3l3UelY4K z#N-|f1_K!M2QU~633TJ+=ztnQfAZovoL`(%qzfH?*S9w?pU>l&3OY8~<oli=O z>f{B=I;r6FWDLLj`U^N2b_ks^?oqAeC+H9Cdm3zG_Lh#6H~l8 zRZR1W?JP^xJ1O*D(GiX0u9G3gpf7Bk#P$lYWdi2iQyOAoCA*X&yGwn+yjSBPI+5yR z2sY8sD(NE@A)vHbVY;r1eOd3HhwOR=>=UO^jN&R9S8YW4oN46eb|!k$ZAu87##Qi_ekdW;>> z-)PVgCy2e8ohAIcs&ct=O?ax~fje`~?KtfylwT?9bn>j0M>IF;BfKusP;@3>gJ47m z9ghZzUis%3VSnb{H3ymxFD^^bo2fL2VQFA*FrK8dryN@9By7p_b zROmh1Zucfn+sg0yF_LLs;}QaI5|8d;DnQ-BRDu5(|Wjs@Vi^?R?7u!*6UPi(dNvE zH%1lo)w2`$Prv?40{^h7(6-bj|6W-y)+BhFa%it<7+&JsFmww_pZRxrG^zZ9>e_dd zj{U`_FW~TCNOhFA(*=D0;SMH`*l%wLDesvgt{7R2ZZu{JF5`AANW5MVUG z2G7soa6E+R(+p-$3s`P;lr4ufxt&fd`)Ft}mN(eGapo$~@rv)dmaQv}r~GEn5sUrG z-;pon29Vy%di$(J!otT{HfX)aF4dqwa#Ap(XQRbNPBK;+Q=3+sE!<8XVKQG*zb4$| zQLlo}Up#}8(MSOYM0nWLg~W&q943PrVCeGQ?LGAZL&5*z^aL)Cu?e$P?@hGM!tL6g zEX+WxXW$2wk3!lqY(9VH%(aa@YcpPp&9Vvvk4?%~A_xc0AM3G3gFdAob|uQ8aaOLS zW22Lr7K2kTlGMve9xDoa@(3Ci6B%ICz;Q>$A9_Ntz_l{-u1)G!H0I32O?`>-*nF;W z?ITm=5jw7iBUGYYYWCM91I+UQPX~=6dX)B{Vd#(y(vbRt0rjx(0(a|xyS+yNw%gT& zNY(H5k|7w9;pS5DbDbi?UW%cqfn%NE)qPAYh<(SrpxW)ywSm)~LR>3MV4Uv&e*66g zSZ)G5JH|-v2ztD13H~1c+^o0o@GybL$pd*Y#|MXI9;wTHsSKJkFD6t&36JNb4js6E ze4@|Kj>pt29T<#53@|5jDE}8BkSkkGSzgOIV&fvQ=m3HiiNI6uZ|>n>Jcjd=VJg(s zd+b-lLOw1fJVVaHK*t3NcJ&_YK|GIr)? z0c?@68ao@4#+WYfVyHx?6Gjz!nA+~0C9%vrYK;QB@(op7&7d>+tSV7+DO6gQpJ+;O zyrm}(HY(GL#hSd+15sM--OI>U^JKaFYNfkOr*MVCCp6YrK5LCon*A-o7C!na6wzd=aZCm|s52vVLF?`!{m{ArJ=m) zW9l#}wm#NI14JMzMDs;ig)sEkXY>O?mfzi{7A<+2p)(5@m zk6)hC*y>DP8Tk=F3Yc(B5E=LA@EG1+-@)zli5fd&&6N`j0$)%oKRlRvB`0SHIE~IT zFLne?{}2E2d-!larM<^U7^Qrsn$z8OlTs0Pd!ypKF1ROOyf}lu{ncMW-)rqsFb1~p zM%J?ofwtZ~K$CyB8esV`580b42ZDW`*~^f42)>Evs?X2Q;Mv6`OlEV!T|ht$MBYT* z5dl*=p80Lg@&Z^yZOtPlC#7I9L_@9T0iK;4!OQ2*>6_R0Q&{bQvMiRXEqxCi?_BB; zQlDRzg3)1bn7lK5q@`_7C{q#B8Z>Aqv>9PWzT|J}&vxE#qZ0Od)8N$zP@WuLbFkWO;r8K?YE1BuAR9ay_TY=>&j^{wyC8G%2Es{=y2L;U8a(BfI)K@7 z32&$g^M=x;F#QnGU3!%FtX@7>3jT~jbP=tPumzCzXZdo@+@e)#nEI~bi$%;L8=oux zNT-RQhhy3<%-36LZjBy)li|~H-B2e_4Pds{q*D{ zMb?bh+}Sg2XjuFW>O$hkCr)#@!MylKI6XO_=nY?+8y_)R2yAo(Jwvk2Id{vHd8T@o zjBQ&d=94gecv=&>8|I6TdM=@B8G3CyZst7cJ?+`fO|&wlk13a*k>Ak>zl?R7bL{L? z9Tg!zJ*}YA>B6v|>grN$YDjJZO()gpi_mNF{BjI!QLpk^s}zcpOLyht%C3<`ZPzj1 zAjixap|PV8R(Y2j)@j2se%W}n@x%5JHugWu3AIXdo}Rb&*2X#M3_q0gV$9@N*W{2u zkTmb@!f4*Kv-d40Dj&ALnkrZOyzSH)k-s!YFZFEf9C9#UEXc@Ul+`-4KcU_5Ya55l z_Opz*vw>#ccORptnJ%ol$qih3i>w@#{kkF4)+p!siBU7{QCeSxqRE8(!cFx zO)q(tsY~W9mr;xJF`W(O$+f-EoN1?jqwGhc@zYn&C|dCQ-~S#~izNX>QNOAX2szMm zyAL0oj2J!e*bl9WitA=mQ|%4T_vT?rF!tzFMY)RqsG06!MW27Ty@xkf*Kl<+q3_iK zEMWi*g029e+_DVf(g4vd(t8Q8;j0&?@E2dchC0liKq z>3v+^m*x=^iCU)@^#;yi!ZHoiYmiA$r?24h>;$f_Zzzhpu4|Yrw`BZcnM9S^ z|9IA0Lqfr3tdX=AvKDf-O6H<=0_(hO`bDe>YkRr!zAnG1eakRN-~(PrdY5^qj99md zOkm|jm3-q{ND-!}q#AJ;(`=-?}Ft0X225$K0E#y(*tVn5F-!n zrgM0G`#=T(f--z^egc<=2eFTl)B+kbBhKgJ!hfE3Cb0Lcz6o#d^&n?kpbM^ELaV5m zwQ7KL6hDkI>ypQLi_L3STOv%Xzd%D45q+E-tW;|hV$F_KaJRu41Cc3vi!21{1xZ(A zsetQU4Uh9BMWG02z(r4$=R#NMB?rl{%IQrRxE8S!^gO%H6C}L!AWOuJSEB)jQ1sny zmkclu+^s(5zcT_PFk>adsFF;3UQhB4dM}KO+jO}E8^1{?Q{Bo(Ko@TKOelA;VPT!> z&M0KRONMV+gF4lwMFYcA)Q(eI*gzpeEu~N3EZ#oM;oF-hsH!e}b~b_&toOq2rL$F4 zkz(p?%%{etqX?ai^&VH(H!z(|skj^?W006Vh%p8tXfkeXXx*jg8J^jjhk0bUCu2%q z;^U!4bP&%Le<%#SsELs@TPK`R_2R@s*b6GLp%7qQ2l((Xqg?RIlX0x23ZmBkkT!3O zsN(a&hEgVD5b2D;o<*xN)Wy;OviE}|TpW3+m#gSB=vJV$Y><%9vc53O53B{2G^uP{zawNeuE{uT_P** zT*1%55L^ChsqphWY+86kt%KB`u%gstN?)rCNR6tZ^6XM&&uD7TI_^Webj3d~XS(fr zT|?#h1bE;&6w$zRwSFf840*3;#pPI`_*vRVtSDMXX&!;J&dm1v?6by#F=+C!q<2Eg z`EOxss;?xS#CXNoK~<;y#y#!z2Jrs<2N;gVsVAHL} zvx3euSlxx|oTI_ms{(xW`DgIr*(H4c_IsF2rUVeN+pJ-`*+j%%FXB`)bgHNqph3YY z`k0|K#Wp05Q@Fl=fUCQE_;7y@SN9KaKb?`2H>Tp&Q13Ppd60<-A%dV~M~7?d^=R6B zrppur>*8oYDT$-uxF8BJZHJQXVIpPt3HE(GJUE1Jzxy6m+Z};|q2tH1K5P(VSxJtP zwvu$ajK;~p3KSK5n9bpT{O0%Y{_c_18)b4u;3qX9KCV^^2nmp*)aPw(1EfqIERXpQ zfAtqI?7GYWnWZBJTPK*`QDNVk?g$VW+pI4GD+98_=aP~Dp_u>T z>u=!X_z>P+U&G^K3x9lj1s`s1;rQq%rYCyMB7g*T<{_`i4Ceesr*%ZF_6Z>rg9->` z|I43#1MB62QXyB{nozi(7E8JgbwTIVW(g?}!1^ON8vqNLTnT198d(WK+Y$xBny|wr zFh^5H${6u-Ac?XD5`>NJYnW!S%$5Q`qn}rJ!wn_(J6~ z`xHK1&wNAFx)!B0ftq9nUx23YWknz}Mk0(Wf{-jX8yNPx)Jv`F)c+wF$_c(-2UHU} zk&g*cX=IY@mp{`)z+xCb?h`V*r`3}B9U*d3H!(X9BtkAIu0fe;b6!zls>A>b32D$O zH0(`tDYX%e$IW&NRi}bMr-F)*kyw(&v@b|VN-m{01W}+OW0cekm+FcVD1vhe_`(IF z6!PYL?+_gdjMrHkBp~~D&3#(ZZUi>Qypy@8CKy{I;MMnwE&Tp!3iFMFi-Q5YJQ+r0 zOUKAj$)MwN;C1=4J?ndCxUN}MY37!#SGMc)t>vbM)oMim5JZ2jLQ1>Eh_5}b zjBQ|Q-L*u6u?3WJ^CjlYo*=Oqd{q}@gh94RP2slhWxi8N2}||nUaj6z1D0Vw(124s zT&NIZ?(yC9DIy?Z9;XNRq7dBGaP#;GSNBuc>~=67 z^xy@87mS9cc1Y)IK_MDSpk?TVg4VKpKd9Igm)rkkD_N?Ftd`2O zu(58hmlSMCCT>B7Y+b5MD>H{bl$STpLoxfd0jJ-JGigBuS{0x6JBo8D@wu3FU?fxk zr80>M)G!#1;dU~my*?NZN!GO1hc_PR%tyvRH)j_BWPib=!RZ|`3%a=%tXy)23Iw>k zyr5oR+sz8z-Q2)(y`uWzKrr%aO5LJN4eWpEA~+PJbVV5@%DYrQ=0s0$EcmGRC87Zm zdLi3$*{q$RiJFW*+hWMBgG(7Y_&jU?{mqYm1fRdSpqit`8U|Sv2^eS^8}=>>aCmS4 zyHLS*Z?56s-~h%5A{DjwNZU4&W&k-Gb9i|%P7!n)<%G=fCG)d1WusB85=qxYzpZtZq0L!Pz}Cw; zq(K<7S8lDxFV#)e0nSg3;nU}r)JOI1aSGGr2Hw2Cfz@hDd()>@Nuoii4~I)nG7u8G zSH@~g4Yr@1pTWz^3(^B;PjgsN`s@}Km>P;TTjWsC3@34LX0pQWnalPtljp|$!M|6R zCkKDmw3PF$-_Q71=;uAYlrca~JVHeJw<=P(cU4~n{mqj4WTIX!`sL64#$U`MK4Rt_)UG?a^+ zg&tYReO!p-MpGf)?X!YiTf>;mC{!6_E3_%pa2>GY7j_j#C4dYt1f}pnJ`ZAqaq69p ziBk$4A7e>L1Y=0VIy-u=2I=vG%JG_DZdc^lKm^8aI)KjW-t#=NMuGfXv%fNqf+z4g zF@^_wuXYI@x+Xg6P$=BK)+M(zC}#o8IAgMUNf3cJc^ZIy?1EkiTs58 zTDzb>{4%kC#(jT4b8fvt5=33B*Ti(4@o*sNv%&DWQt|n7pCQ7z9J%n$qVA{h^>V!o z4>ro7D!F`S)7)4W34!|N_4_08&awf`=es$$ro0a27!2QRHH7x2+%{D7Oh(63<+Zli z#q0x2U&iktA9sQGPL+*D?Nb(sE0AYMaDK19m90RU1~7QnI}PbP%RF|*o1dSD1h7T z3byN|M8P606<#0R2!ODqR97}~gXkoBPGa<(^*07*naRPp?wv*&0$rYQXD4_9!0cnAaX+9kjSL0(|RK1Fi4$C%Z1L#$0e^zQ%u zKYs@w?q>8UW}Bcfi+~(x+~zxJ^fmy|{Pj=N33~AI`6>ML^Gj`*Zlimal%Q?PgZ%>< z-?Yevp~*io-e{j|N!8G6Nq4~-b7ndD^kD0l&tE(zz4Yzv4Lr;@aD6j@$LS0Xj}EEr zfpfL_Qk0Ec8yE_MRP=YS`cB-bqfs9|eRcuoCx`H~oKq?->SqYtfl>a5mfbPDiSJj) zJ@X8^KH|)`ye%mMCLQtrhY^;Y`WA!1{9fMOdKZ<+J2js8{@xL4-Th-iK&)dF08^Si zy*!7LgOLDm0Mlv~MbKx-|5FOse7%OZclU5Rk9`?VM?-jVb_xfBUg}n*-jXcO)-*2U zB3ynpKQ9O1fQ;d`3KRYwfv;n=WEs^R~}RWu*%^k#73of8A8z$Ql7S3kB*8|J0TM@^*#K)jgHtkT46}F zhEmWUzq3M=!rcxA-7a*!MmRO{n&#}aAd`^@vw~aY=eYTDof&7mKH9u9RRGm-ybsF_e0v+yNS+@J;n_hSD!^Rx*y|-05GR3X zSdmW%UzGdL{iTEf1lVmh)Y$oH_5=r`144JIC<>$d<|W-KHGB>Z?jGl4@LrxD#Yl$J z^>%i1A#dl_P-fHW+jK!;v`MNu&*>3*huZ=j(-v!NzqWU z?UM=S-H`7|+iU+P#WjWX>k^_GI^EXmh}0S#8O&9KS+kEnC08J@7orDjm#OOmN!}Qhl_gU6nJUP@_YwQ^78HxW2uG)58M=VJU>W)+_}xLQee(ZPUm# zURjDze9m7rzy@G4BZIE5OA#If6Z!g!PYG2H0TUjkPjT;diB2#Ttlo+-hLJ6l6ZCJr zCSZl_dQA~E1YOu}mhwB+g1Jy9lttFigmU6Lg!;Q9Bh1-!MRwSMmaKU0i|#zNS^4$P zzJ|k5HwhK48Dj^t%5vVPknYR-O3?j>2PD7l9;R@58j_OOMnjR>=7NK zjc=AIgr=6cq-)Wq1EVq;K4Z>(#&fMTm@ZFm?1oMA4 zTf&>SAE4jw!{zx|EQ#SXLze$FXTs>zxc-j;%{Xh0!9Eb}_2TppzWnqPN)N^CpUuvZ zA-1^Rm3Z%Ucf7V=FRpzs`&6KF({Y*E= zpDmPb_cyICft#$>@U&XNVFKasq&SkrT=c-SCP&|*pJ zJ01?nG>DZ*#;AcvKT0dk7@7qm5r7DV3f4%a)4I2`|CoM?g~QZ`tnz9cg60ofJtS9l zTmmidYCxqiQH09JIo82bx)_eD*U5VTu{fucB;%R$&M0UmJuW1KND)9r^hX$6NYNvJ z#m>XOzPo|>7U2A72rmhazNVaiNV(FG1Rt-JoLfejO6j~+C)K)nr?ydzJ;e|`@eW4A z17d_#RmZ4c+8=rb!RC5`ga2@K3#Vr%)X0+yYl-pk!3SmJyw^(aIyUFjFyMMZOZ(!) zum#Lf;!@M!ch~pO>v!Se>@d!!w!M!G9c8AW)4k7*UuYSt-C@g9RhWq&Y-P1dBi0`0 zPxxNAmGi|0y4c2{--%~d($AFFT5jYT_g4@hah^DPo)VOLrg$2mV`j?t{;2%;nBvGO zl1`ta4zr3PVOSG3Bm_QNzgONj_xCrRCFixN{PLc-v;eG_$)k*6+T_^svESvWOY4(``hMjKf51{}x57Wsj^=LmY_Ce&!l`?#(@8 z|0@qqiv<~y{f@%5H})elvh`=?v@F^kG!5;Nm<%9RzUcWi=G)mHF5fe`mmx6*s>zK! z1{^Ss8Zma5uju=jhTZM-VfuvS6l*vfCkJx2nzHGqe#cs$_;X7}8)bEH zgIxfVWXLtyAt~2&ihxC$t0h`yQ-bT%LWQ*rPm#I*{MSE&^W%XSVN6BA=!n4>1CC`N z>k>Zh+412a+&?X0HeXRHTqpJAa^h&QheIjf7rYgLlp;Ffgc=r;YqhSWy-_PTiL)t< zC4G1}8uj4kU%nz#OPi|6Tbhv%J2(o1zbPF;{@sGtID4%#LF_c8;bxdBQjQ- zEsGOcgCOaMzBu45uR`|e6053`iNJ!{+r^iG%3;&`pJ)-szp+s6_Hhb}<%W8KA@QG# z2k`RZ97esafy&l~q)Nli=;=(vF#KRG#pL5IhbgrhMictiO< zx+V-T0ObnoU&>ZNxM$5J(xt2D68d1a2SO0}nyXOJ#X))_6h!O;*6+hXFQO5;f}yCg z=rZqFE2TKdX~Ti+rDt#>%zxfFT6gppjr#*iLDYQabZ3{+8YPdM4HKWj)^$^G(oZkO zi>68PP`skbZMKwxh-h9e<#V$K#idj|C*wD)Ng!3dD8w$UlcvSR{o0V1Yey)2)J!?l zlJm^UmG@4U&U=kYrM;^8co?N#4!2RFnOPxd&3D%mxS4HX*sb7`qcMzef$J@ym&GWu zr@FMN@~r(31B#KkT5d_O!}3t(%K>Uv6H*p}cD#B09{Rl=9375{G5OSU1(ITkIrWdz z6|B|^I6FInUZ(=~u*HdH)_$hUf9w?H0x2f}eyLg$g&2bPyuZ4I=a&~S?77r5(lyc^ z#o&VZ7Yc##`+_0+P!0;Q(GhM8sTy9`6=u$)vY}DS2p%B68 z|1G?S=Nj@msG(Nya&v8_5?aHqWnK1esw?CM8$d3m#!@er<&v5LBaF1BvhlN9jLY(Q zqPLYAIvWfc6XwsIoqAz=g%+dJnd{i`>55IsJ*DXjRIupbX+DR;abNgdgP)tXoN032 z7{td9Px(eR!Il|iXCS@|Z%F3{`2{)$megCan?;mA_G+Z*w1P?f;7!bMjgsD+eD+&o zd@Wy*=qB@dOJAmahJAAWe^o?dbOraV3%3tbl0gV&qF#9&w`;Sr8*Y`fFZ+zFqAm!; zC##OEY^2uv8sdql6R;Ad0Ur!I@E?EuzY%!W_3aI%2$LZel_hgtxGbR-04f)PStT2% zPeLxqM;B@_&@ck#>N?+GQ->qGKWNRiRIk@H{Ow==7+zf*Yr}eF0wzkB0J6B80*$#4 z0k{yg6u;5ydKeAHa5tIK`&hCeU=67!Y7oFKlb&XsA*n>+x8J^j@88|QuHG0go2`om zoh$Mt1j=IF%z{Fsd*WXFRBw6EK6!)fHF@iB48YS z;@_>BDo&Q5&kFgYL@(fM4h(93^ZBPR9(SoU0%7I9e|rn}_Y*ieI!;aFQ#!XeOI&Id z6dmlm&%us?r6;C`)^!45tKstWm_TZ<<iX*`J;SgS2oKX{B#_tye zLfDJ(Y8oX1h1Sji+&<0W{lk=cVfCwu>dBs;91+a3tdU(;+s8;!n~b;?g}B8N+{h{C zrB@HDYg?y}Ep40NFMbh5>k3AY3^0r?&Q}QqanOy$s|i&m^J18-QD$wGL|rna9UC@R zR7#vNA`zltjWtpjed}`g)})MC$XLCVD-6$~2E-a%Z3~yk0I^&MiXNLub|bh17ns*U z$87A5+$eC|Z_1}guSVP?1&MOKYnmgbAQHT7sldw`I%@FDrq3?KR0i%z!EQSC!Uj`2 z5Yx<^pfuLr!}a4FUQaN>*n#JVeK;L=V_Gf22B&;!DqdFYkQtOqXCxY-9Obh+oRs1u zID8T+H+OfWJXXF-Q88a}T16MuI|q07Q)(uBaL`XF6A8xGYOJ}gC#?#5_vy2(b5bQI`_Nuh>~&KKQDf32{)ka! zbQBD*X?)eb<{+Zf7>9NkMY{tvqIl%NWIE{7`DbIj_Pv{}RjHO+DODKA4vWHPgm&pG z-#$khRW;ccd0KDt>ERcMO_OU>>pd3Iw#jlOSc554Qtrx}b!!_;EJi9;7M zGE`2|7`{YtGL_nlQHZ^Dd|)Zm6b^-Cm_+A**x58D)D?dE<>&Cl%V#iOF5q_ZNQjAb zfQ$;cb&AqeF!D>^&kRU5z{oMG|J1?V9Dn`>=Rr7|2OYv;wl67=D8R{H%e{Orrm;IrrF$>?n^%*Uu&BG4_hWI7xD)1Hw=jaj2E ztc|H8 zstE%yRkR;tf%3|QT+26FY8xoF!%iQICe2NEJutD z{>g@324C&zzPHmUe0Z4BBBCL8d3*@x2V;S?2QVH+!)TjcihS0kkZTA$!$f$aGluUP z7xSGzDv+Gn1R0BMNNf*KQsNg0^<|K1z`DM8hA~=sJRwsaK>uRzzD-x*O|W&>F7E4W zwSf)PFzOFrgosLM{B@$g5G*=SuBfON3u4-$(>gT!9}iJHFXIB5Gi|KjP_a_M>Wl&CP$5a6!|C@GRGZA5Wc7n$bE=H}ShZ7+t zIx_km(JS<@faMP0cu>L1;~^nj25KaUy-L_ft;Lw)^|GGmXc*SA-Zr)y0XsY?Soj&H zd~7ybc$~~&I+@VJhL~R3?NGk@>}dtl#S@$y4=LgrPoy$Kt7zDIoM4qVQH-tSl{;RV zZUALucpcUszQ4MMlcPg89Q94RSraSeb_}JCCJeh&oImcNZ}7gxyH+%@;4P^=9}K6H zVBahRLcqQ$gb2&{%Dk6${FdvK(Q~lZ+x2WNfql0bO|tK|siyh$S?!gbW#(jwyR)lf z`sHT3p%xY$;njxU+DN?tg0pg_H3FC!i+SyCd37+?@df3T;@Gy!V9pVbRca6o&qRH9 zwO-S)M@Vx9UCnbVa{g<_)r`h~Qn-!iW+ZH7mfl)-YtLS~;_2x!R2UIijB0KB18LC# ztkgGNroK}m5qp%7u*Xu&=8_vnX1E|?rJ%)J#-w+xgTPFEA1u5Bkd!hrwLQZR)FZLu zdvJAohl@rv=qyuM7P0hgYrxy6ZGe1ZGj3IWJruvR-XEkHt##(ItVN^o#pM}%`S~jt zjYe>Le-DerD)wW-=+(YGbb3HaI2@J2LH>47tf^d^-(S<~!Bly)Xej*ts z%;Rmw3cLLgP>SlgYIC*%ONq#HC<^Z?xVpcF@fdr@`sm1oApJiIL+Y<6%xnUcNm?)r|< z4Np%_px^DP(P-=E!K`C2wSp`(OrKVljCHgRE{+f35~Ga{U^1P-au;BQQ8DbFhwTP@ zj+D)^#F=%sxD9r@4LV|>?EFAfOoVgE@iKKb&n34)PM^Yy6w%@k#`EE60qbo%Scn$& z?DPoEj}D>NQG_@feXtYC-bf$>s1#!!=@ml6?gD{&JU=-mAdX&TMwbdiUFN}o+z2bF z$+^9P+g>8i$QY_p)Gq7@#<5HA|0ykmpn#2$nVwx^s@=ARw~q^WSk%xBTlfm$=*39&!q{Vf zmefm4nlG4i0VZcq<5uSy*BgaG>|P&VD})&)2=NWv-#@@?GKKStXHZo=DnQ5Du(Q)+ zVo=U_K!x!O^K&E!*-%r(niXVTuNJ{<&XngKA>b0Mzk}&wO+4lDEW*-@QURQT+u{Qk z#huqtX+DdfsEo_be=tr6v#q(7n>~vuc^@Bf60w~x*EFxusF&&!j3NT&pEB7NwMRZu zIX`M3+v2OgkVFPF`MWsx%l=W!mLPM6xq^srXcb6R<`F)Z_!Mk*=u+16<4$BZy@ zX(-=mQXbR0mA|ceX1c~|HTk(J6;30u%S0IYo~LLh_%8hM%@v%VosePUeL`vtE_*gu zdI8-VQJRe+mSr!PzA9E3Req$pg#2Ehi-&{)mpNJ!-Jc$f$PoM4H($Yg_5^P~T+=vM zR;fuXSjP$cV(-pnFA=$g(?{hq*Z!Kn({`h?wc~2|55N8up{jC>%Llj?D#V^~PqQWbuW#QF;GFOr zIfEc;2Px}@Yjf2=N_*=a47(lpt8YGsFJHX?hvVLp%AcL>JqDQF`25r`_?Pm|wlvpr z3$p}U6ZJB;(JS-Y6?9=;Oe!m|vG!-5T*A@O2tM52z+}3hHdF7faBmLaa6C?^-3ft{ zdXLB>iQHV4EyAgTqqe}LQRoN8vqy$-xOKZBz|k5KW1NqfV=Qf@HV{9b;Z z6k6)xw@PIrBF0Yk%+R%qtzK_mO7udd5n~JTXM|)-M3_|V>`rNDE&`k^sTa)}2K_EU zes&$Fg*g$>Ixjn_w4XMz$@AiEO?kVr27!T1Vx7QjwWa5y0X9TK0O}-=U98jNbVwRb z#gZ*EI%JOxb5jwtd6iNShdzC0%}Dg|y9#KWZqUb?o}?+8U7 z2*S79?T`Rqfys4!nJ{7=SgVodQ#xn{{6P_@ok@vIBuc4-vG(kGzJ;sFioiF%cyV%3rK^+FqB^V{jL)@2608yKr(aOmOZgI>I$! zU;#Q@MqByIqLenrB?hB8A9jt~#+msz%=a~=D$~A*bI#{WI$PKy%%-5Q(Zb^}4>ZcT zd0+wj!4px%NzXeg5eJ`0c= zh{3)m`)GJ``(twy){LLJhLYB%%&Bn<;vBOMM!bL3>A-TirPOLvlAKW<_c_tZOp;)n z5+GnX#W>8I8tW@tXrcyYZ*<+u{c7IVnMr1A+roeJ4zBSIKa2AKkc_b}9HysD9w%^d zeuC}>*~_{(CvvZ{M^jPTqHEwK)x3=8m1`(-<7+H<4f7#6t3jegjVIU68Gs{}Bpl$8$f+wLVF1O!aG5aP_sTtpRsdUtxcw36b3g^1 z8nRJHJN7|3Kr5FJ5C>%8Yg8nUSXhB4;x{p|*>VN%@9wGVHqbr0@WrzWO2ZSLW3&Ng zM9wh&eRFrkclRuc2+G92k^)?;Sx|Jo)@Nki!<_lpNSv2DhO`EefvhNpbw%ks<6iVo zO1Rp3VA>|iOp}=d2vu2@pBRXf8ZUA>Q3PyF-rezF00-TQ46wkl4hQPZ3Q<9)lz?Q6 z@jiHi`XlaiC%Yp-(98iq&aT`qJ6dk&;1TLf5CCu$KFX4p)pSxT2BVtu{{Ur`2Qf4kXy z34>mr6d*jyL3jk43|84TY^G71T`I;w#-`&9_7-{{m!A%ea##bzKG&p+mr(~xdb|%t zF{gCI^%{EJE=6-2@j_?$sWD!m7>XFR(3q!{A(po^3;>yDFns*ad>NfTrzH@DaJ`An z4n(AD7!b@T(|iqPY38)Big_q$TApc?C!<%%%I3C1Lpa2BQVmMIzkzB}XHQSiCt0Is zJ=-_y)i3Uw?IoBa`U8dpi1L@8WmV40N$C*UKgsW$e@CMm>SVLm75YO~2NJ;pDvy0h z58)4Q-a)rJfbpQO28wEfc`rm+8opm%ZyXYkMJQ5m_eJ?Eo$$PL?OT*)F%mdZ8$q7N zLk~as@^kpv*I&YP_5_bl3rd?t^mS*_8<}6`jtnN~PLlhc(*6YIuGBRO=MPvK5uOZvLrefiHOuJW+0p;lxlkwPZA$%5>%j6cHdzkT zaC^O3krF-{A3)c8ql`GM1p@|waI$=OE`Il?xA4ceS1H{z)qsIlTieF_U6B53019M= z>vVB)0RQoqU%|`Ev(z}-=u^5XI)-vbtuZ1dPDRMZ!O$77(^5QlF6lFx$p+SFDxU#L zR+4#?$=DWpYf*?D)1L4IM+WfGXh6-yosVs3?w>aBr*|J`};SqGY9ci|$>7Ool zR2buto$)%9h{DdgErJjI__LRAbTESHbV5EG<%vO{rx8 z%rD6Zp09UQ2Nu&GI|MaK3OwGzv+-A_v^$p&mLhYJiZqui#4>No$i0w)QSM`t*Toj0 z==+3lZAm*ooq+^W(n*d-vs^QJg|TL)`74sybA#OVNp-Ohy@uPaY7a4=)BT zGs8NKs|H4kihGG(a_f;r*0I_GynC3#6uZa|yYTF22>mLqt2Z6qd2xKIjjP!(OOUMs zL!Z(P)eu#t9}O^7-0I{F^_5Gl1!B!u>_YD;>*I0u1W&UWHTxV6h6E$4iiM$DW1LBP zM`meT<*eifxffTBoalsjd|FW|+wtL;yjX%Dl@?xgS9Wx?E7rM3i@(!60?wXq+t)_s zm!B(WnU{@1s16(lwyPZ}xLAAF?Xsz7B2?!3(y_9Kv#4W1l=Wt0#T9dG?153l8~2y- zw>{n5v!MyQl%@{UXReF=1lb5H9eeiR+V@(Xsb@}~+b~oN{o5V1dt+1mT3>rSTfyvV zxe9fS>GK%%t0a9_y~;V=j;)#SfX|2qo(sY6qsMp z5OdJMCe9zO;Bb79jBm~qF=s~%zhd0xd6w5l9v<3_uW}7-lz!hfC%ziYctm%oBb}l{ z=$mXs`W9{;Ch)je!(v@i*#yO$$a(3F&XA&j zF3QY)C$?O{=S0Zzv}Zw$H%LJR(Kq78!{cHJ|M;7KC*CGHto6qkdgVw>hI2srLkGTi zb_)OJuYU$7lzJCygDnOH-9d~=yO}QgOXyh~qe-rW+-<4`o=Gb#{)X~8m!CZATnPh!iZE@N2I*_*%KiZ;#HV(cy=^~=cgxByTjDP!o#@}Eq$f`?)|Fud4DX9x zn$yD}JU>37?&*~o3x6~77)k01htEM%UJPNB%rKK}!Y>R)imC5%!CaT!LH}-D$xPA6 z1+wRK925FSPZSzpsK5`qF$K|wAp1~0*A@5NJA_P*ayq1b2l*5}8zY;Dm^bcM&~2=< z6^ii_^crv-l-8Poczo3pWSFr@L5df}+A1_Q5Q-iRBkU{Zg)?c2i<9pb%gKLpwAHgg z<~7>rfXyT__Ha`p9DPu4qE+OK5yukWD|SDp9;bQ6v;)s+2|lF{2L2Ra8ywusR&evU zAVGd{ID~P}fv!?$%bhNO1jZ)bn|%DT1A7+NX4lls|(j zgi$lB!(35sjX6BtKav;e=;)9%lrM>-H`A3G$08eI)6)`yO~Xo88Kr-ZD%gA(#R_kPV6pSXg8J)q zJ5J^U?Cm$aN6t~u_p)a-Y?-}UcFU@_z1zZ1TE7>H_e_eFQJ^3h%UHm^PL8B*5efVA zBT;P@QLcQp&9Yr7&DHgNDq+~;+-mGYc2_iDmeB8YlY(bb#tX&XrmWhCmX4=b?=l_J zj3*d_&$-Sgi{^l00?;hX*5xSRaigeULv#es2&O^7;p?`#eEY7P`ZX*s{Na=)H)j3^l;J^OE z|D{5JX7Z#}so6f|haTF!wz8#{P)c>xz^N3dK+`{L$)2G_Uuv|fjY zhYIe*x^QMh>UnRBogD7F`0P4mF@>7STwXo9fb-)+lE>4hIT`Yc&4$wGA@z!N(p%R^ zeMCpRI6nBhkE#Mjx&9$}S9*TzEqIv%dE;xCEtc>wTM$}bq!5GsRc)IB>ofFXK~on`(7!o*H*G1&(hL)+n3 zMa`rq6ywbvUCzb6j8)g%6BUOx4aBBTt#&(DA{rpVc2Xa(T9_8c_*`bd?3t0gX^e@q zIKkO5>fyxaB9rM$B; zpNZELOlF0#PAuMchjl^gExdi0lL2@hVRBh*OEyHK{R;QCb8?xG zYy0ZQUd*%bCju62)>|qzuPXJdYQtFb%wQy>rD-L}k3YBJ?br8h9h5y%nZn0BvuGU6 zFSlo>g(D?CiXO%FdJP>k!YT*QFw*s$HDieF=2y!NAYT~6z(ZjH2&-tWi;h8m55~xB zuBUM((ghVMjMykWqLAjPKKZp^o|nIJ)ma^jHo|G?vs{bPXv%biM7UxEX7fyrA6LP0 zxgnX`>sG>3t>TqOpub@0*X_gg{UeD0L`x)2TQ?-3E}TgL%jwQq+AT(|4y5hZ_$@K$R51-u?2B0#(QQJS z6U3<4^Rr|4>6f3t*Pp+D2h|(E-am zREDuH?Bi@s|InE7oh~`1dE6+E(I`XI?5D*NZYMJW-gy1~8oqyj4S#(50ls_t0si#v z3f_FcsM(bCR!pC)I_NCv7{_7V!h^I4GodLu5A)3y{_EfW6D-#u({am`@kTGrz`o}I zM~6fBzyH&(;3u!nBWc!VJ=AU&cy`^s()cNB!dQ+tbA4VflW9W134K_%jmw8&eF6=u zs~m$JOP&qT=Cm>ADJ|L2cnF_7yP!X=@3AClMNu)#s6a!kPo*(w7PY1KXns1+ErAS= zk=+dTw9&d(1XObX&(F``@MsM8lLrFsSW|>-LnzW!GT3=>IMboJXo-Zm@{dB`I5Yo@ zHI_z0$kvB6yWOs)FkwVMj0B4Y7$P7d3}m-*vO!j02%B-`X2!?|Dx)`#GddvnJ1UXS zPEX+Z$szPB&fkvcZW`ui*=p;-bko&tRfUF?gMFf%m7>zlCIK0zYB2JAp~ zJsF+Y|BT^V5q-)hw9@3^t30PGIudA<>s&;%J_fntl> z)79(=%k)ia(10j4jk>FNa7eL58o``&FXMJgTbtp zC{IN?k9^PBl`URnZ7>mUMMgH#3P#qYZAWsRII}OA5ygB<0EW!moLLz|>r6YM(OZ7o z)ciA>Gk4yHoZiydHrp+wX=9{E`i9!DFl39E7595f`|r00N7vO1OvELR(fQcTDpxFdc-^~~f5bOJ6_ zLri7IQnAHm3)97h0tUDDQ&QyLe7J#czkdz?`nx|+O5@uPSMao0Q0iHy+b2F9?5W_r zs3YK2@D(g~HT<`K_-B~RHfcSB=m1Vu*(gqSi(O3Je06aG|JVQVYd9Hp)BJrh_nbVP z4cF}Z5a-HrEhAwYs4zek<%wZhX^lb~r;5}ZW>JZpX4Nqmvd^s!(iUBdx=YCB=Vjq* za=^cO{sIQ0A-uo8g~@yi*Y^{6oKDFZJQ_scpqL7q_CLf_;JP;FDab8VLFOH*Yf0zF zUB_~ei<2XG_2L=9X2~hbM^hMEjcY?96!HGY zs}Lk%GMmEWX--hyjxhKEKD|7LGekg?D2RsQr5?!T0)>?lR8-N@e1G=%hQkvBBB!(i&hgXIzSzn1+a@5BPKb>luc-6IXpiDg@xE5im3Rsh;g0o6V zz9-H_fmNq(6A;CAN5MPVl&Y3^mr4JNkv0e{&=LY;aBw@{z=z3_PRa9=F^sw~EUstM^d$?Bj6z4t04W;j z1ABXF^QdGxg8d1Qo&PLYBImOSo*+&WHt<*>;}mA&lu(;6Ivud^7Zs5qfeW#7sn#?3Dh*N9AIiv*HOR{OJ7M82SE!T21PvIi zrz$rfS5R^qRP-;UH{~l3nudeDml%cFZTDEwnX}S-A;ek;N2no4p;hF2)Oy3Oj$5l|u7uQt$yB(v*acv0%Tl!iu` z`o0VOUI#9YNANd4{}KG>|M1svOn?Rtq^n@0JKnW6PEcJhHp;k}vv-=&04)uQot;Z| z&gxjEKxv5B=ywA1)spU4RWY3~g0BWu&LK7k_6en!qVn4TF#AYxU*}zDP zC_OtKo}C<1TbSGF6RfumHnl}Xe zULTGQ4^xIw4BW)>3P|8AoSoz(%2?Q|$$^}J?vgHr89@ku_x0zm2rvYJJJ9G~Z3DH4 z!hVn#r0DdzM90;|$>HCHj}%nv9~!X`!D+6@e+&8bsF-bcaQ`@?f<#oXaN_92$6U&j z@emW7RG=kKih6T+2wu{&=yw;DlDD@HFqtptS;KCZkYW&yx^g=+CT1|ExX%~`nHN_Y z1-POJyqLErHf6evKF_Y98XWsx%zRV?SZ}!e&fpHF)*3ZzWDfWbl{9Qthe&qPStdnq z_@2&qD^$TOd*wJIBtarG+)K?HLmMMtSlEif7f~pY_#+yPPd);J!e>2J@;FVY%I4?Q zcxEMm>k2J8-p+YqdfUwohP@6M_nw84SK%UyW<9&6;WNMQWL@m~#5c%GR>u@aG{7ox zC_7U`Y!o3*X-tpvRw&k*mRR`|wWyPlhzAI{ z7BmCcn+1;Bilpbq=7OAJDPlc9s_k+K*h7uD9l~6tHS$t&rfRn`J_Li=Pz0>vbufkp z&Udxk!p+@1h3F3s$I!+4Pd$_->pgwbrevs_K>30_KWT55Yk=u=3a7_osUy;emfk@}1>4QUa%H2)XUbN&4{edJj~GAYwT*Y0 zzyXlMtG%b51M+reTL4f)ywRObmDvBB_i3Q!3kG}1ySz>27ThH%)J8#zIwwB?FC zC8%s34twwd^CuC4o?yufGsbuov-J;=xub_=x>&-8y9Yu*!~-(!_o$`}jXF<8oho&D zkaSM+1Z(K1$Ts@AH9*_d4AH^OJ0-tts0Z0P=0=e+kv1=+N@6B{OhMf2wzLj|PKOF) zUG`mLfMu$Wll68j^UKZ!3-4s{Ls~1e@E=zzVq8c4K80ix4pN$$VV2qIa1vquKiaBOgylth<`gQ;(YMP`(x63Z_ccrnFswF_`FTfpOd4TCPCAr2_j zv_T$4DlZegOR1HWL_D@XE!`p6|H;);&IoE05rl-PDVvA2oPeHl~Am?U9)_Q zJf%>6m|dSm5?l5(`%CCupW290yNGT#MKsTTFGd;c`2poEHoK-7ONCrN2!&(xhYT}2 zE#4QykA?4L_ERY4xQ~KTEl&B7S#wdHYy>udHo7)ZY6P-ctu}CVcME5yr%{f(mL~_h z4xA-mXtPvKb+Pw=Gn518|2ea_O#^|y%Ba+w86nwRf?S+3B7BStp>#Mo7{FhA^Cf)! z*=NN2r;jsA|6}JjJH_larUlO}DsYg?Z#`!jFJR}daSjs56+(-zHxwPiUQd`!v`cAj z5k)xdkA-Vb_po(voDmSI$x{?;f#}~4Gx*c{Yxv!t-oPKee+S>cy@uE(E*$tAHjIoi?W*d1=hZ;;O)%=eD~%(eEaqa-dx`iJ_42jVDyDcJv7x& z8q^eacsd)2|MOWW#~DIN4Mn8g@Q;lCj2yDbZDQXPMwNYPaLQ}rc?~jt%in}Ag+zoQ zK)+ML%V(FQJE1*-SzA{(chpj$-|xX_I7$Fz_Q2XRluwvdH5sQkAcA}qbwjjE&=5lh z;tcm>GrvL@xiFg;HJLA0@GzZI${;{8z(#$l0XrBB zBwQ+%y5kh20^(ITktgMkP;KrXiO6wy*jMb6vlGfW_Mk=rH{xUHYnK}0>Sqm&A|s%t z(w1vnR=zfu(6#)QPbvSTc~x5~k4RwrVHPmfVfoaTZ7XO||h}9e)Hcw(DL}YkI+hH#3cF()?q6jB&QA|Vkw?p3E2vXB2Dzs#y({LH$qKo~L_LkNtwRm@cN;fDBdkisQ*wR+-(T04 zo{>@)fz74L!{zBA{QRrW;IrqKBxey)oa9e{1OVm4fKXe+nSUW$V_pa2anIJgNiN0OKZ)2%UZhPm2xQPv;S+ zYp)SzN1f^iI}R>Rk771U`d+3I;wf^X%RAExdmB0lt5K1K)qRrPRs0*&G&| z9k@;pT-Av~G=L~^z~$LWpNEpZb7am?{A4<@85`CZ%U;Eo^(w3H$t_#%pu9`jhw?Q? zB@z`}o}a?S=?TmibGUtYgooJ@t{*0}o+n2~35YH5ikmyLv1;Y4oE9<4qK%QBn@UZv z$L0CyDIARtXuqGHW)Wq&-la$wlgmf+?~HgY1C)lZ+Gq|55|z~{hI$dMakHhvg;wDS z!o{DRP%5Gb6sZe#Mp%Z-*nm`IxrG3C(>0#QTfSI^EVgpUe%RA?EhT|=E3 zRTEV{Hy-VLozD-i^k#I6>KfS#^u-L_lXK88er?qmTGwhDFsnd zulDIcvURTUo*I^g5OiEqz-AamW*mieF%*9|=)eF|^H>5T16MsyEnZUx`7_KY*ctl5k<^fRM`=Q+9QnF7XU1m< zO4+?R+|DMfv|fl@JpdycnRFpjr-c=7^DV&phdHGoo*nezXy~Ei3`$mk5NLH{pXyBb z4dxFTozj#k2GW3JbRk2cnnP@up2o%3vzL(W>Em7ip)Pi^6gV+5sn1G`vJrFiF@1Ek zT*KYN1Fh}x(GgT#ZHTR&d`pj9Bj99yyw)|Q?9Bro?x_F(AOJ~3K~y*7-MTnGp-5rw z5jMhupJD5Si$k0nDkkbuc*l9K_#-w{jgHm0HyApzG^2E+PKT%3EQcOza zkM}rN5_k+s-ynNw4GpWz=SS4ZJxaC`%u2Z8eb80O3=sWY*ET*vx_V1WI<>r5#X|m` zpxm0%W|p;C+XLBiGTyq+uyU+8>3U^zYBdndx`L%yYdR?aR5s>p4)Kg_cY$h9y1kBR z&`~^3sJNZaX3Cs%s3Rm>zBY#_uM6uV7QiQ~t1@%R_761e&F*~*y_h7V;#wZ0-7j5FHdo`gWBpE@ z9CL_TI~X3qx8Hvchod1iyXX7sErZb=_KdAXQO#0Vv-6m(bR+V`f0t3pAdYR$HreS+ z1M7Aiol?q+AP6q$g*BBBeERGhe){7dk$(7ak4DOx(&=^twC0rHz?&L3-v2mOZ`N2d zcM8T-=swxLgjnN)nMK%Q0fPv$`GOEjqk}R+<+Dzq^UNK%3=rk)&y?!MJOGWQ*>XWC za_t#UzyvI##VUc5!!aC>hLJA_fQveDQN4T2I2-w5Zr26pr^XJg-q=*E=pgY5Gl2u!W zTG>kB1T<8h|wFq<0oPA0|+)*lD7g3PXUbxh( z8Ir+b(;XaSq+<4gX;T?8KaZkKR?o+Mu50)(UBlgMNe+jzF+z1~{|w$Emzpix2&+rA z8T?i-%qjNz3c@rZ0|)6DMunz6r6D313Iu8|0YSZgd`7ANSio8{Ho)TdYbvBhc=$@_ ziv=TyPl4>xdpa6rAmFq$BA zYl$y#-GEIcGqppR%9+SVny+U?LfQUhIpg^qbWg3)YkIRO!*>drV)hNQ36P}^5yIND z;Ezg!H-1S4&$d06RWAsp? zHyYv2y|>?vbM#zyYWcc>3fDQ5jJ-LcP@G*0a*=VukUvjn6J)hSj#*>fVRufeQNZ(B_N9sDtLc;OOV>V6cKH%hm-6JmgP+(Io&j8 ziB0y|x+epKl0K|KW|T{zVj6p$?|aC3H}8okt6cXPf}|=Utz%1@uRs3;e)Y?rz-F_A zch^_clz11SeCxO>WpALWvr{8Tp5V++-bI_TpOp@X&qzFj@7-1N6j1<@9VKX}*r``i8?-$3%1SBGth(ja@gug0W zF4MEn@I#$xN$Hn!xO$jUZ?u2=?t6H1eM58W_YhHAd!pvN&=oww@Jjx>kZ*F(q*ZxH z`dP@PS~`Rziab_|~OnTr$N(;?< zH1K`V0G_V4r2HKXyD;hiMP+J+`UIEq!y}`uYxNREWlz&ZxnZ#NB60pdN0F>y6B4)y z8DMp+tHSvsJ#>shz#-{)@1UF1M$;Ba&NMzHriN&N3H1<}XCG7TjF(;yd}Od8^+XdT zC}=M&;5~K;Zr&)G>B8h?<1-Nv5vS`NyuO_gbG$h0!>AJ>8qv53reHQO?HbyrhZP*2 z3rT@f5yd`4;Wc2qJ81LPlH>Di#{3m26r*2Htl) zE%s#uq+#y4^FciTx_0^=f3*o@kS%HRwa*GmH*|(y@w#%vJJc~95ih_gt zO`R$qkZo&oY=*Df=!JFmG?i~-tTv3W{CCy=gN!Mo5fj-FUXrW=oHHtW9q**+x=q>e z;F|kbjKtELDW4{AhO z$=t%G0X6|PiyH#hOq$_%--?-d!Coe z*E^1G2fh9P?xzb<{Kvyl)N@KDSI(m`ve`jk9hv4mnLyC#$=SCCTe%j((F~oWeI~gO z@@HigvF+4s#z?uvw$jj3)GF0U<6a=d`O{(^ooASaiSn{aJvCd-GsC_|dZ<~A zi;*=K;mfg3s2L^FabPy&XfS~D<0BaMJ6Y=@JrhP=G5IBjs+Y2eJO+q!z?wL8s-xci z?Vn!%f4sfvk|a5fCJ3t9<+q1NL|&Cu)z#J0bBL_SK4L!R{@5Mqsjke7%kR@JQXUP-$;hT4&4BtJkCDQKSfB7h_hmH>p zOTjdts~WpBJTzD>;L&A-9mpd+I?9EoM~C#|58qM$_Uz;*TRS_SQL;zqK6)u(B++aq zi}&zSD$NwFucvqCCvHDg!KOs&U?bS`x>D-9D@@8Bu*vEA9$`YJ zmXDP;1_aC$*1k(nsG)`cAaKBcCOYb2uT7FUe2o<_E>e&xh#qVr9x51*k>o#<(@ zfw2TyMQIRE&tg`?Jv9d0vW^uz3__Q(q_rRiBxD;YGxAd5O;JwFqCD7IKJGI8a{VZZ zFNYzXEwwd(Rtkls9|xJ19l)T6HbIy*xn)T51PYN zkb)d)B^&Ji>Pb*R?^apgB(3+t`QIiUUpOAy|L(oT&?xm1>Jx(kVbaUx7+G`yNuL`I zxz%cqo~P!Xf4fHo@>7kC!_b3<@;hD_ayR-`JV@G*LwtX1B_At{E-^a^#Z)ECy_=OgbAN1|5vw<#UB8cV*dNmXVp0)W)}PB7^W5iL36qUG$w9I` z27qOp+xWm98GX<^pkp&EY^RZ%EpmlatAfd`DDa}08y@#GT z=U+Rk5lA(Uwfj#fC8^ny;mbJTNw!H830$rHfoCFI&v>lYg)~_VQ5aeA2()O(HE2G; zclh6o_jxy`%j;Y5CLS$|S2U9wrY!1!8uZ^7dVQ(%{y^BA1ND(?(_xO`0z02uSupio zGNr*6#J%NZa}AY#Y*_u%ckk)1fBJzFVxlpVeW>jlr*_}!{Z7Bm^6tH1b zFpbQsITiMbZ@}MrdCmXky~#bt9-d0N4Tlc%$=sO{)n$qE&H(FCXu#(s=TI}AVI!sG zlq*i^6D<}q2}`{=J)y(pEEtTF@lT~;(%&og%Ht}o#;Dj&u6$YWHK&+xQIG%r%dhme zk6)yDHRmU;w_B+O*jdyMfyW%rIp75`OoJ<5e=#y=mjlWJAWtGGQ{YdtYuLVwEgW>M zGwk6?6i>krhs{9eM~C#s@4gWo<&Ja3?w{%7=PTOn_H=x7SY(!_K~&lebr3a}80g^7 z^P+GGqN=jZoek^##o5VECQiU~I8sYmDVQP%V@Bi#%#ZA@ttBv7W9PzN^e9sheFVeKojJ7<<4Nkaf27Y4nU}8TI2dSUp<-1hv>CEAV&;;=C#xl`W(oQ`Rq$@oDgwlybXNc~3^{<$uJg)0LC`d7!h(YNZPE7z zNL8@th94ix4#DI7fE4vTY!tee!Y6y_b2ICbt4Z!~3PMi>TUR|^2KKVFY%mp&JWsEyN*G;YhB45Q{kmj3C{%$>DX;|bbWm*G1@1`M`CbDU7?}y z4K7^WpKQ7N`00yO6+2w^X8lV694p+%eba!;sdIUPo9ys|t#14^>4$>v0|>|<*vV~+ z)tXt}S=jnl* zz51b2SiJ8{08zsFVp|NwDxw#FV0?{AG_e}-y5RYP?_>Z}cm;;KjVIJeWwI0jKalER~!d#lL>hLV!V5CK=GL!p;l}e}s zC>>r!H-N=Vw#RafvPkrbay2zx18y;qu|)$ok2u%nno*7n$akBkLIwzpLBNmG%L#Fcx}VuceR&|K#)#UT^l)$(cvl^1ZWGMy~hH zwK_8Am#?_5Dff<=m)v&#n{xqAjt=Pj_(=XOrRZ2|cnD_YM&3n!!�m#`C8ZL)s1W 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