From c1c2f18471c6da8cfbf00bc345029987e7d80837 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Wed, 10 Jun 2026 09:39:20 -0300 Subject: [PATCH 1/6] Add admin portal --- apps/backend/prisma/auth.prisma | 3 + apps/backend/prisma/court.prisma | 18 + .../migration.sql | 23 + .../migration.sql | 4 + apps/backend/src/generated/prisma/browser.ts | 5 + apps/backend/src/generated/prisma/client.ts | 5 + .../src/generated/prisma/commonInputTypes.ts | 100 ++-- .../src/generated/prisma/internal/class.ts | 18 +- .../prisma/internal/prismaNamespace.ts | 97 +++- .../prisma/internal/prismaNamespaceBrowser.ts | 20 + apps/backend/src/generated/prisma/models.ts | 1 + .../src/generated/prisma/models/Court.ts | 266 ++++++++++- .../src/generated/prisma/models/User.ts | 126 ++++- apps/backend/src/lib/auth.ts | 16 + .../middlewares/require-auth.middleware.ts | 12 + .../backend/src/modules/admin/admin.routes.ts | 64 +++ .../admin/handlers/block-user.handler.ts | 20 + .../admin/handlers/create-plan.handler.ts | 34 ++ .../admin/handlers/delete-plan.handler.ts | 31 ++ .../handlers/get-user-sessions.handler.ts | 12 + .../admin/handlers/list-complexes.handler.ts | 7 + .../handlers/list-plans-admin.handler.ts | 24 + .../admin/handlers/list-users.handler.ts | 7 + .../handlers/revoke-all-sessions.handler.ts | 12 + .../admin/handlers/unblock-user.handler.ts | 12 + .../admin/handlers/update-plan.handler.ts | 35 ++ .../admin/services/admin-users.service.ts | 113 +++++ .../admin/services/complex-stats.service.ts | 80 ++++ apps/backend/src/register-routes.ts | 2 + apps/frontend/src/components/header.tsx | 27 ++ apps/frontend/src/components/ui/badge.tsx | 31 ++ .../src/features/admin/admin-layout.tsx | 68 +++ .../src/features/admin/admin-page.tsx | 130 ++++++ .../src/features/admin/complexes-page.tsx | 167 +++++++ .../src/features/admin/plans-page.tsx | 337 ++++++++++++++ .../src/features/admin/users-page.tsx | 437 ++++++++++++++++++ apps/frontend/src/lib/api-client.ts | 41 +- apps/frontend/src/lib/api/base.ts | 2 + apps/frontend/src/lib/api/http.ts | 4 + apps/frontend/src/lib/api/index.ts | 1 + apps/frontend/src/lib/api/resources/admin.ts | 88 ++++ apps/frontend/src/main.tsx | 8 + apps/frontend/src/routeTree.gen.ts | 120 +++++ .../_app/_authenticated/admin/complexes.tsx | 6 + .../_app/_authenticated/admin/index.tsx | 6 + .../_app/_authenticated/admin/plans.tsx | 6 + .../_app/_authenticated/admin/route.tsx | 16 + .../_app/_authenticated/admin/users.tsx | 6 + packages/api-contract/src/admin.ts | 92 ++++ packages/api-contract/src/index.ts | 22 + 50 files changed, 2713 insertions(+), 69 deletions(-) create mode 100644 apps/backend/prisma/migrations/20260608180226_maintenance_mode/migration.sql create mode 100644 apps/backend/prisma/migrations/20260609221056_add_user_banned_fields/migration.sql create mode 100644 apps/backend/src/modules/admin/admin.routes.ts create mode 100644 apps/backend/src/modules/admin/handlers/block-user.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/create-plan.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/delete-plan.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/get-user-sessions.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/list-complexes.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/list-plans-admin.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/list-users.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/revoke-all-sessions.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/unblock-user.handler.ts create mode 100644 apps/backend/src/modules/admin/handlers/update-plan.handler.ts create mode 100644 apps/backend/src/modules/admin/services/admin-users.service.ts create mode 100644 apps/backend/src/modules/admin/services/complex-stats.service.ts create mode 100644 apps/frontend/src/components/ui/badge.tsx create mode 100644 apps/frontend/src/features/admin/admin-layout.tsx create mode 100644 apps/frontend/src/features/admin/admin-page.tsx create mode 100644 apps/frontend/src/features/admin/complexes-page.tsx create mode 100644 apps/frontend/src/features/admin/plans-page.tsx create mode 100644 apps/frontend/src/features/admin/users-page.tsx create mode 100644 apps/frontend/src/lib/api/resources/admin.ts create mode 100644 apps/frontend/src/routes/_app/_authenticated/admin/complexes.tsx create mode 100644 apps/frontend/src/routes/_app/_authenticated/admin/index.tsx create mode 100644 apps/frontend/src/routes/_app/_authenticated/admin/plans.tsx create mode 100644 apps/frontend/src/routes/_app/_authenticated/admin/route.tsx create mode 100644 apps/frontend/src/routes/_app/_authenticated/admin/users.tsx create mode 100644 packages/api-contract/src/admin.ts diff --git a/apps/backend/prisma/auth.prisma b/apps/backend/prisma/auth.prisma index 56c93c9..3c8bfe7 100644 --- a/apps/backend/prisma/auth.prisma +++ b/apps/backend/prisma/auth.prisma @@ -5,6 +5,9 @@ model User { emailVerified Boolean @default(false) image String? phone String? + banned Boolean @default(false) + bannedAt DateTime? + banReason String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt sessions Session[] diff --git a/apps/backend/prisma/court.prisma b/apps/backend/prisma/court.prisma index c973dc9..4dbe350 100644 --- a/apps/backend/prisma/court.prisma +++ b/apps/backend/prisma/court.prisma @@ -34,6 +34,8 @@ model Court { name String slotDurationMinutes Int @map("slot_duration_minutes") basePrice Decimal @map("base_price") @db.Decimal(19, 2) + isUnderMaintenance Boolean @default(false) @map("is_under_maintenance") + maintenanceReason String? @map("maintenance_reason") @db.VarChar(500) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade) @@ -41,12 +43,28 @@ model Court { availabilities CourtAvailability[] priceRules CourtPriceRule[] bookings CourtBooking[] + maintenances CourtMaintenance[] @@index([complexId]) @@index([sportId]) @@map("courts") } +model CourtMaintenance { + id String @id @db.Uuid + courtId String @map("court_id") @db.Uuid + startDate DateTime @map("start_date") @db.Date + startTime String? @map("start_time") @db.VarChar(5) + endTime String? @map("end_time") @db.VarChar(5) + reason String? @db.VarChar(500) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + court Court @relation(fields: [courtId], references: [id], onDelete: Cascade) + + @@index([courtId, startDate]) + @@map("court_maintenances") +} + model CourtAvailability { id String @id @db.Uuid courtId String @map("court_id") @db.Uuid diff --git a/apps/backend/prisma/migrations/20260608180226_maintenance_mode/migration.sql b/apps/backend/prisma/migrations/20260608180226_maintenance_mode/migration.sql new file mode 100644 index 0000000..adfb718 --- /dev/null +++ b/apps/backend/prisma/migrations/20260608180226_maintenance_mode/migration.sql @@ -0,0 +1,23 @@ +-- CreateTable +CREATE TABLE "court_maintenances" ( + "id" UUID NOT NULL, + "court_id" UUID NOT NULL, + "start_date" DATE NOT NULL, + "start_time" VARCHAR(5), + "end_time" VARCHAR(5), + "reason" VARCHAR(500), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "court_maintenances_pkey" PRIMARY KEY ("id") +); + +-- AlterTable +ALTER TABLE "courts" ADD COLUMN "is_under_maintenance" BOOLEAN NOT NULL DEFAULT false; +ALTER TABLE "courts" ADD COLUMN "maintenance_reason" VARCHAR(500); + +-- CreateIndex +CREATE INDEX "court_maintenances_court_id_start_date_idx" ON "court_maintenances"("court_id", "start_date"); + +-- AddForeignKey +ALTER TABLE "court_maintenances" ADD CONSTRAINT "court_maintenances_court_id_fkey" FOREIGN KEY ("court_id") REFERENCES "courts"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/backend/prisma/migrations/20260609221056_add_user_banned_fields/migration.sql b/apps/backend/prisma/migrations/20260609221056_add_user_banned_fields/migration.sql new file mode 100644 index 0000000..316a507 --- /dev/null +++ b/apps/backend/prisma/migrations/20260609221056_add_user_banned_fields/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable +ALTER TABLE "users" ADD COLUMN "banReason" TEXT, +ADD COLUMN "banned" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "bannedAt" TIMESTAMP(3); diff --git a/apps/backend/src/generated/prisma/browser.ts b/apps/backend/src/generated/prisma/browser.ts index 57c9172..5e1069b 100644 --- a/apps/backend/src/generated/prisma/browser.ts +++ b/apps/backend/src/generated/prisma/browser.ts @@ -62,6 +62,11 @@ export type Sport = Prisma.SportModel * */ export type Court = Prisma.CourtModel +/** + * Model CourtMaintenance + * + */ +export type CourtMaintenance = Prisma.CourtMaintenanceModel /** * Model CourtAvailability * diff --git a/apps/backend/src/generated/prisma/client.ts b/apps/backend/src/generated/prisma/client.ts index c5e75b2..8577f9a 100644 --- a/apps/backend/src/generated/prisma/client.ts +++ b/apps/backend/src/generated/prisma/client.ts @@ -86,6 +86,11 @@ export type Sport = Prisma.SportModel * */ export type Court = Prisma.CourtModel +/** + * Model CourtMaintenance + * + */ +export type CourtMaintenance = Prisma.CourtMaintenanceModel /** * Model CourtAvailability * diff --git a/apps/backend/src/generated/prisma/commonInputTypes.ts b/apps/backend/src/generated/prisma/commonInputTypes.ts index 6787d9c..8a9fe7a 100644 --- a/apps/backend/src/generated/prisma/commonInputTypes.ts +++ b/apps/backend/src/generated/prisma/commonInputTypes.ts @@ -49,6 +49,17 @@ export type StringNullableFilter<$PrismaModel = never> = { not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null } +export type DateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null +} + export type DateTimeFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> @@ -109,31 +120,6 @@ export type StringNullableWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedStringNullableFilter<$PrismaModel> } -export type DateTimeWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string - _count?: Prisma.NestedIntFilter<$PrismaModel> - _min?: Prisma.NestedDateTimeFilter<$PrismaModel> - _max?: Prisma.NestedDateTimeFilter<$PrismaModel> -} - -export type DateTimeNullableFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null -} - export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null @@ -148,6 +134,20 @@ export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> } +export type DateTimeWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string + _count?: Prisma.NestedIntFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeFilter<$PrismaModel> +} + export type UuidFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -381,6 +381,17 @@ export type NestedStringNullableFilter<$PrismaModel = never> = { not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null } +export type NestedDateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null +} + export type NestedDateTimeFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> @@ -456,31 +467,6 @@ export type NestedIntNullableFilter<$PrismaModel = never> = { not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null } -export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string - _count?: Prisma.NestedIntFilter<$PrismaModel> - _min?: Prisma.NestedDateTimeFilter<$PrismaModel> - _max?: Prisma.NestedDateTimeFilter<$PrismaModel> -} - -export type NestedDateTimeNullableFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null -} - export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null @@ -495,6 +481,20 @@ export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> } +export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string + _count?: Prisma.NestedIntFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeFilter<$PrismaModel> +} + export type NestedUuidFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> diff --git a/apps/backend/src/generated/prisma/internal/class.ts b/apps/backend/src/generated/prisma/internal/class.ts index 2bc22be..9a4bc7c 100644 --- a/apps/backend/src/generated/prisma/internal/class.ts +++ b/apps/backend/src/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.6.0", "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", "activeProvider": "postgresql", - "inlineSchema": "model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n phone String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n role String @default(\"member\")\n complexes ComplexUser[]\n\n @@unique([email])\n @@map(\"users\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"sessions\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"accounts\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n invitations ComplexInvitation[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n EMPLOYEE\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\")\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nmodel ComplexInvitation {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n email String @db.VarChar(255)\n tokenHash String @unique @map(\"token_hash\")\n expiresAt DateTime @map(\"expires_at\")\n acceptedAt DateTime? @map(\"accepted_at\")\n revokedAt DateTime? @map(\"revoked_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n\n @@index([complexId, email])\n @@index([email])\n @@map(\"complex_invitations\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n NOSHOW\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel CourtBookingLog {\n id String @id @db.Uuid\n bookingCode String @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n previousStatus CourtBookingStatus @map(\"previous_status\")\n newStatus CourtBookingStatus @map(\"new_status\")\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n changedAt DateTime @default(now()) @map(\"changed_at\")\n\n @@index([courtId, newStatus])\n @@map(\"court_booking_logs\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// User model is defined in auth.prisma (Better Auth schema).\n", + "inlineSchema": "model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n phone String?\n banned Boolean @default(false)\n bannedAt DateTime?\n banReason String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n role String @default(\"member\")\n complexes ComplexUser[]\n\n @@unique([email])\n @@map(\"users\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"sessions\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"accounts\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n invitations ComplexInvitation[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n EMPLOYEE\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\")\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nmodel ComplexInvitation {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n email String @db.VarChar(255)\n tokenHash String @unique @map(\"token_hash\")\n expiresAt DateTime @map(\"expires_at\")\n acceptedAt DateTime? @map(\"accepted_at\")\n revokedAt DateTime? @map(\"revoked_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n\n @@index([complexId, email])\n @@index([email])\n @@map(\"complex_invitations\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n NOSHOW\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n isUnderMaintenance Boolean @default(false) @map(\"is_under_maintenance\")\n maintenanceReason String? @map(\"maintenance_reason\") @db.VarChar(500)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n maintenances CourtMaintenance[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtMaintenance {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n startDate DateTime @map(\"start_date\") @db.Date\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n reason String? @db.VarChar(500)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, startDate])\n @@map(\"court_maintenances\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel CourtBookingLog {\n id String @id @db.Uuid\n bookingCode String @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n previousStatus CourtBookingStatus @map(\"previous_status\")\n newStatus CourtBookingStatus @map(\"new_status\")\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n changedAt DateTime @default(now()) @map(\"changed_at\")\n\n @@index([courtId, newStatus])\n @@map(\"court_booking_logs\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// User model is defined in auth.prisma (Better Auth schema).\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phone\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"sessions\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"accounts\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"ComplexInvitation\",\"relationName\":\"ComplexToComplexInvitation\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"ComplexInvitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"token_hash\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"expires_at\"},{\"name\":\"acceptedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"accepted_at\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"revoked_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexInvitation\"}],\"dbName\":\"complex_invitations\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"courts\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"CourtBookingLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"previousStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"previous_status\"},{\"name\":\"newStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"new_status\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"changedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"changed_at\"}],\"dbName\":\"court_booking_logs\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phone\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"bannedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"sessions\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"accounts\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"ComplexInvitation\",\"relationName\":\"ComplexToComplexInvitation\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"ComplexInvitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"token_hash\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"expires_at\"},{\"name\":\"acceptedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"accepted_at\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"revoked_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexInvitation\"}],\"dbName\":\"complex_invitations\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"isUnderMaintenance\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_under_maintenance\"},{\"name\":\"maintenanceReason\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"maintenance_reason\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"},{\"name\":\"maintenances\",\"kind\":\"object\",\"type\":\"CourtMaintenance\",\"relationName\":\"CourtToCourtMaintenance\"}],\"dbName\":\"courts\"},\"CourtMaintenance\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"start_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"reason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtMaintenance\"}],\"dbName\":\"court_maintenances\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"CourtBookingLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"previousStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"previous_status\"},{\"name\":\"newStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"new_status\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"changedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"changed_at\"}],\"dbName\":\"court_booking_logs\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"sessions\",\"accounts\",\"complexes\",\"_count\",\"plan\",\"users\",\"complex\",\"invitations\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"ComplexInvitation.findUnique\",\"ComplexInvitation.findUniqueOrThrow\",\"ComplexInvitation.findFirst\",\"ComplexInvitation.findFirstOrThrow\",\"ComplexInvitation.findMany\",\"ComplexInvitation.createOne\",\"ComplexInvitation.createMany\",\"ComplexInvitation.createManyAndReturn\",\"ComplexInvitation.updateOne\",\"ComplexInvitation.updateMany\",\"ComplexInvitation.updateManyAndReturn\",\"ComplexInvitation.upsertOne\",\"ComplexInvitation.deleteOne\",\"ComplexInvitation.deleteMany\",\"ComplexInvitation.groupBy\",\"ComplexInvitation.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"_avg\",\"_sum\",\"Court.groupBy\",\"Court.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"CourtBookingLog.findUnique\",\"CourtBookingLog.findUniqueOrThrow\",\"CourtBookingLog.findFirst\",\"CourtBookingLog.findFirstOrThrow\",\"CourtBookingLog.findMany\",\"CourtBookingLog.createOne\",\"CourtBookingLog.createMany\",\"CourtBookingLog.createManyAndReturn\",\"CourtBookingLog.updateOne\",\"CourtBookingLog.updateMany\",\"CourtBookingLog.updateManyAndReturn\",\"CourtBookingLog.upsertOne\",\"CourtBookingLog.deleteOne\",\"CourtBookingLog.deleteMany\",\"CourtBookingLog.groupBy\",\"CourtBookingLog.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"AND\",\"OR\",\"NOT\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"id\",\"email\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"createdAt\",\"updatedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"CourtBookingStatus\",\"previousStatus\",\"newStatus\",\"customerName\",\"customerPhone\",\"customerEmail\",\"changedAt\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"slug\",\"tokenHash\",\"expiresAt\",\"acceptedAt\",\"revokedAt\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"identifier\",\"value\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"emailVerified\",\"image\",\"phone\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "rgaGAfABDwQAANoDACAFAADbAwAgBgAA3AMAIIoCAADYAwAwiwIAADcAEIwCAADYAwAwjgIBAJ8DACGmAgEAAAABpwIBAAAAAa4CQACiAwAhrwJAAKIDACHLAgEAnwMAIeICIADLAwAh4wIBANkDACHkAgEA2QMAIQEAAAABACAMAwAA8QMAIIoCAADzAwAwiwIAAAMAEIwCAADzAwAwpgIBAJ8DACGuAkAAogMAIa8CQACiAwAhxgJAAKIDACHJAgEAnwMAId8CAQCfAwAh4AIBANkDACHhAgEA2QMAIQMDAADsBQAg4AIAAOsEACDhAgAA6wQAIAwDAADxAwAgigIAAPMDADCLAgAAAwAQjAIAAPMDADCmAgEAAAABrgJAAKIDACGvAkAAogMAIcYCQACiAwAhyQIBAJ8DACHfAgEAAAAB4AIBANkDACHhAgEA2QMAIQMAAAADACABAAAEADACAAAFACARAwAA8QMAIIoCAADyAwAwiwIAAAcAEIwCAADyAwAwpgIBAJ8DACGuAkAAogMAIa8CQACiAwAhyQIBAJ8DACHWAgEAnwMAIdcCAQCfAwAh2AIBANkDACHZAgEA2QMAIdoCAQDZAwAh2wJAALEDACHcAkAAsQMAId0CAQDZAwAh3gIBANkDACEIAwAA7AUAINgCAADrBAAg2QIAAOsEACDaAgAA6wQAINsCAADrBAAg3AIAAOsEACDdAgAA6wQAIN4CAADrBAAgEQMAAPEDACCKAgAA8gMAMIsCAAAHABCMAgAA8gMAMKYCAQAAAAGuAkAAogMAIa8CQACiAwAhyQIBAJ8DACHWAgEAnwMAIdcCAQCfAwAh2AIBANkDACHZAgEA2QMAIdoCAQDZAwAh2wJAALEDACHcAkAAsQMAId0CAQDZAwAh3gIBANkDACEDAAAABwAgAQAACAAwAgAACQAgCQMAAPEDACAKAADlAwAgigIAAO8DADCLAgAACwAQjAIAAO8DADCuAkAAogMAIcACAQCvAwAhyQIBAJ8DACHLAgAA8APLAiICAwAA7AUAIAoAAOUFACAKAwAA8QMAIAoAAOUDACCKAgAA7wMAMIsCAAALABCMAgAA7wMAMK4CQACiAwAhwAIBAK8DACHJAgEAnwMAIcsCAADwA8sCIuYCAADuAwAgAwAAAAsAIAEAAAwAMAIAAA0AIAkGAACjAwAgigIAAJ4DADCLAgAADwAQjAIAAJ4DADCNAgEAnwMAIY4CAQCfAwAhjwIQAKADACGQAgAAoQMAIJECQACiAwAhAQAAAA8AIBIIAADsAwAgCQAA3AMAIAsAAO0DACAMAADMAwAgigIAAOsDADCLAgAAEQAQjAIAAOsDADCmAgEArwMAIa4CQACiAwAhrwJAAKIDACHMAgEAnwMAIc0CAQDZAwAhzgIBANkDACHPAgEA2QMAIdACAQDZAwAh0QIBAJ8DACHSAgEAnwMAIdMCAQDZAwAhCQgAAOoFACAJAADjBQAgCwAA6wUAIAwAAJoFACDNAgAA6wQAIM4CAADrBAAgzwIAAOsEACDQAgAA6wQAINMCAADrBAAgEggAAOwDACAJAADcAwAgCwAA7QMAIAwAAMwDACCKAgAA6wMAMIsCAAARABCMAgAA6wMAMKYCAQAAAAGuAkAAogMAIa8CQACiAwAhzAIBAJ8DACHNAgEA2QMAIc4CAQDZAwAhzwIBANkDACHQAgEA2QMAIdECAQAAAAHSAgEAnwMAIdMCAQDZAwAhAwAAABEAIAEAABIAMAIAABMAIAEAAAARACADAAAACwAgAQAADAAwAgAADQAgDQoAAOUDACCKAgAA6gMAMIsCAAAXABCMAgAA6gMAMKYCAQCvAwAhpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhwAIBAK8DACHFAgEAnwMAIcYCQACiAwAhxwJAALEDACHIAkAAsQMAIQMKAADlBQAgxwIAAOsEACDIAgAA6wQAIA0KAADlAwAgigIAAOoDADCLAgAAFwAQjAIAAOoDADCmAgEAAAABpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhwAIBAK8DACHFAgEAAAABxgJAAKIDACHHAkAAsQMAIcgCQACxAwAhAwAAABcAIAEAABgAMAIAABkAIBAKAADlAwAgDQAA5gMAIA8AAOcDACAQAADoAwAgEQAA6QMAIIoCAADkAwAwiwIAABsAEIwCAADkAwAwjgIBAJ8DACGmAgEArwMAIa4CQACiAwAhrwJAAKIDACHAAgEArwMAIcECAQCvAwAhwgICALADACHDAhAAoAMAIQUKAADlBQAgDQAA5gUAIA8AAOcFACAQAADoBQAgEQAA6QUAIBAKAADlAwAgDQAA5gMAIA8AAOcDACAQAADoAwAgEQAA6QMAIIoCAADkAwAwiwIAABsAEIwCAADkAwAwjgIBAJ8DACGmAgEAAAABrgJAAKIDACGvAkAAogMAIcACAQCvAwAhwQIBAK8DACHCAgIAsAMAIcMCEACgAwAhAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACABAAAAGwAgCg4AAN8DACCKAgAA4gMAMIsCAAAhABCMAgAA4gMAMKYCAQCvAwAhrgJAAKIDACGxAgEArwMAIbMCAQCfAwAhtAIBAJ8DACG-AgAA4wO-AiIBDgAA5AUAIAoOAADfAwAgigIAAOIDADCLAgAAIQAQjAIAAOIDADCmAgEAAAABrgJAAKIDACGxAgEArwMAIbMCAQCfAwAhtAIBAJ8DACG-AgAA4wO-AiIDAAAAIQAgAQAAIgAwAgAAIwAgDQ4AAN8DACCKAgAA4AMAMIsCAAAlABCMAgAA4AMAMI8CEACgAwAhpgIBAK8DACGuAkAAogMAIa8CQACiAwAhsQIBAK8DACGzAgEA2QMAIbQCAQDZAwAhvgIAAOEDvgIjvwIgAMsDACEEDgAA5AUAILMCAADrBAAgtAIAAOsEACC-AgAA6wQAIA0OAADfAwAgigIAAOADADCLAgAAJQAQjAIAAOADADCPAhAAoAMAIaYCAQAAAAGuAkAAogMAIa8CQACiAwAhsQIBAK8DACGzAgEA2QMAIbQCAQDZAwAhvgIAAOEDvgIjvwIgAMsDACEDAAAAJQAgAQAAJgAwAgAAJwAgEA4AAN8DACCKAgAA3gMAMIsCAAApABCMAgAA3gMAMKYCAQCvAwAhrgJAAKIDACGvAkAAogMAIbACAQCfAwAhsQIBAK8DACGyAkAAogMAIbMCAQCfAwAhtAIBAJ8DACG4AgEAnwMAIbkCAQCfAwAhugIBAJ8DACG8AgAAuAO2AiIBDgAA5AUAIBEOAADfAwAgigIAAN4DADCLAgAAKQAQjAIAAN4DADCmAgEAAAABrgJAAKIDACGvAkAAogMAIbACAQAAAAGxAgEArwMAIbICQACiAwAhswIBAJ8DACG0AgEAnwMAIbgCAQCfAwAhuQIBAJ8DACG6AgEAnwMAIbwCAAC4A7YCIuUCAADdAwAgAwAAACkAIAEAACoAMAIAACsAIAEAAAAhACABAAAAJQAgAQAAACkAIAEAAAALACABAAAAFwAgAQAAABsAIAEAAAADACABAAAABwAgAQAAAAsAIAEAAAABACAPBAAA2gMAIAUAANsDACAGAADcAwAgigIAANgDADCLAgAANwAQjAIAANgDADCOAgEAnwMAIaYCAQCfAwAhpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhywIBAJ8DACHiAiAAywMAIeMCAQDZAwAh5AIBANkDACEFBAAA4QUAIAUAAOIFACAGAADjBQAg4wIAAOsEACDkAgAA6wQAIAMAAAA3ACABAAA4ADACAAABACADAAAANwAgAQAAOAAwAgAAAQAgAwAAADcAIAEAADgAMAIAAAEAIAwEAADeBQAgBQAA3wUAIAYAAOAFACCOAgEAAAABpgIBAAAAAacCAQAAAAGuAkAAAAABrwJAAAAAAcsCAQAAAAHiAiAAAAAB4wIBAAAAAeQCAQAAAAEBFwAAPAAgCY4CAQAAAAGmAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABywIBAAAAAeICIAAAAAHjAgEAAAAB5AIBAAAAAQEXAAA-ADABFwAAPgAwDAQAALoFACAFAAC7BQAgBgAAvAUAII4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIeICIAC0BAAh4wIBAIcEACHkAgEAhwQAIQIAAAABACAXAABBACAJjgIBAPkDACGmAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcsCAQD5AwAh4gIgALQEACHjAgEAhwQAIeQCAQCHBAAhAgAAADcAIBcAAEMAIAIAAAA3ACAXAABDACADAAAAAQAgHgAAPAAgHwAAQQAgAQAAAAEAIAEAAAA3ACAFBwAAtwUAICQAALkFACAlAAC4BQAg4wIAAOsEACDkAgAA6wQAIAyKAgAA1wMAMIsCAABKABCMAgAA1wMAMI4CAQCSAwAhpgIBAJIDACGnAgEAkgMAIa4CQACVAwAhrwJAAJUDACHLAgEAkgMAIeICIAC9AwAh4wIBALwDACHkAgEAvAMAIQMAAAA3ACABAABJADAjAABKACADAAAANwAgAQAAOAAwAgAAAQAgAQAAAAUAIAEAAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACAJAwAAtgUAIKYCAQAAAAGuAkAAAAABrwJAAAAAAcYCQAAAAAHJAgEAAAAB3wIBAAAAAeACAQAAAAHhAgEAAAABARcAAFIAIAimAgEAAAABrgJAAAAAAa8CQAAAAAHGAkAAAAAByQIBAAAAAd8CAQAAAAHgAgEAAAAB4QIBAAAAAQEXAABUADABFwAAVAAwCQMAALUFACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHGAkAA-wMAIckCAQD5AwAh3wIBAPkDACHgAgEAhwQAIeECAQCHBAAhAgAAAAUAIBcAAFcAIAimAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHGAkAA-wMAIckCAQD5AwAh3wIBAPkDACHgAgEAhwQAIeECAQCHBAAhAgAAAAMAIBcAAFkAIAIAAAADACAXAABZACADAAAABQAgHgAAUgAgHwAAVwAgAQAAAAUAIAEAAAADACAFBwAAsgUAICQAALQFACAlAACzBQAg4AIAAOsEACDhAgAA6wQAIAuKAgAA1gMAMIsCAABgABCMAgAA1gMAMKYCAQCSAwAhrgJAAJUDACGvAkAAlQMAIcYCQACVAwAhyQIBAJIDACHfAgEAkgMAIeACAQC8AwAh4QIBALwDACEDAAAAAwAgAQAAXwAwIwAAYAAgAwAAAAMAIAEAAAQAMAIAAAUAIAEAAAAJACABAAAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgDgMAALEFACCmAgEAAAABrgJAAAAAAa8CQAAAAAHJAgEAAAAB1gIBAAAAAdcCAQAAAAHYAgEAAAAB2QIBAAAAAdoCAQAAAAHbAkAAAAAB3AJAAAAAAd0CAQAAAAHeAgEAAAABARcAAGgAIA2mAgEAAAABrgJAAAAAAa8CQAAAAAHJAgEAAAAB1gIBAAAAAdcCAQAAAAHYAgEAAAAB2QIBAAAAAdoCAQAAAAHbAkAAAAAB3AJAAAAAAd0CAQAAAAHeAgEAAAABARcAAGoAMAEXAABqADAOAwAAsAUAIKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIckCAQD5AwAh1gIBAPkDACHXAgEA-QMAIdgCAQCHBAAh2QIBAIcEACHaAgEAhwQAIdsCQADTBAAh3AJAANMEACHdAgEAhwQAId4CAQCHBAAhAgAAAAkAIBcAAG0AIA2mAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHJAgEA-QMAIdYCAQD5AwAh1wIBAPkDACHYAgEAhwQAIdkCAQCHBAAh2gIBAIcEACHbAkAA0wQAIdwCQADTBAAh3QIBAIcEACHeAgEAhwQAIQIAAAAHACAXAABvACACAAAABwAgFwAAbwAgAwAAAAkAIB4AAGgAIB8AAG0AIAEAAAAJACABAAAABwAgCgcAAK0FACAkAACvBQAgJQAArgUAINgCAADrBAAg2QIAAOsEACDaAgAA6wQAINsCAADrBAAg3AIAAOsEACDdAgAA6wQAIN4CAADrBAAgEIoCAADVAwAwiwIAAHYAEIwCAADVAwAwpgIBAJIDACGuAkAAlQMAIa8CQACVAwAhyQIBAJIDACHWAgEAkgMAIdcCAQCSAwAh2AIBALwDACHZAgEAvAMAIdoCAQC8AwAh2wJAAKcDACHcAkAApwMAId0CAQC8AwAh3gIBALwDACEDAAAABwAgAQAAdQAwIwAAdgAgAwAAAAcAIAEAAAgAMAIAAAkAIAmKAgAA1AMAMIsCAAB8ABCMAgAA1AMAMKYCAQAAAAGuAkAAogMAIa8CQACiAwAhxgJAAKIDACHUAgEAnwMAIdUCAQCfAwAhAQAAAHkAIAEAAAB5ACAJigIAANQDADCLAgAAfAAQjAIAANQDADCmAgEAnwMAIa4CQACiAwAhrwJAAKIDACHGAkAAogMAIdQCAQCfAwAh1QIBAJ8DACEAAwAAAHwAIAEAAH0AMAIAAHkAIAMAAAB8ACABAAB9ADACAAB5ACADAAAAfAAgAQAAfQAwAgAAeQAgBqYCAQAAAAGuAkAAAAABrwJAAAAAAcYCQAAAAAHUAgEAAAAB1QIBAAAAAQEXAACBAQAgBqYCAQAAAAGuAkAAAAABrwJAAAAAAcYCQAAAAAHUAgEAAAAB1QIBAAAAAQEXAACDAQAwARcAAIMBADAGpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxgJAAPsDACHUAgEA-QMAIdUCAQD5AwAhAgAAAHkAIBcAAIYBACAGpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxgJAAPsDACHUAgEA-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-wMAIa8CQAD7AwAhwAIBAPkDACHFAgEA-QMAIcYCQAD7AwAhxwJAANMEACHIAkAA0wQAIQIAAAAZACAXAADKAQAgCaYCAQD5AwAhpwIBAPkDACGuAkAA-wMAIa8CQAD7AwAhwAIBAPkDACHFAgEA-QMAIcYCQAD7AwAhxwJAANMEACHIAkAA0wQAIQIAAAAXACAXAADMAQAgAgAAABcAIBcAAMwBACADAAAAGQAgHgAAxQEAIB8AAMoBACABAAAAGQAgAQAAABcAIAUHAACbBQAgJAAAnQUAICUAAJwFACDHAgAA6wQAIMgCAADrBAAgDIoCAADNAwAwiwIAANMBABCMAgAAzQMAMKYCAQClAwAhpwIBAJIDACGuAkAAlQMAIa8CQACVAwAhwAIBAKUDACHFAgEAkgMAIcYCQACVAwAhxwJAAKcDACHIAkAApwMAIQMAAAAXACABAADSAQAwIwAA0wEAIAMAAAAXACABAAAYADACAAAZACAKDAAAzAMAIIoCAADKAwAwiwIAANkBABCMAgAAygMAMI4CAQAAAAGmAgEAAAABrgJAAKIDACGvAkAAogMAIb8CIADLAwAhxAIBAAAAAQEAAADWAQAgAQAAANYBACAKDAAAzAMAIIoCAADKAwAwiwIAANkBABCMAgAAygMAMI4CAQCfAwAhpgIBAK8DACGuAkAAogMAIa8CQACiAwAhvwIgAMsDACHEAgEAnwMAIQEMAACaBQAgAwAAANkBACABAADaAQAwAgAA1gEAIAMAAADZAQAgAQAA2gEAMAIAANYBACADAAAA2QEAIAEAANoBADACAADWAQAgBwwAAJkFACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABvwIgAAAAAcQCAQAAAAEBFwAA3gEAIAaOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABvwIgAAAAAcQCAQAAAAEBFwAA4AEAMAEXAADgAQAwBwwAAI8FACCOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb8CIAC0BAAhxAIBAPkDACECAAAA1gEAIBcAAOMBACAGjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG_AiAAtAQAIcQCAQD5AwAhAgAAANkBACAXAADlAQAgAgAAANkBACAXAADlAQAgAwAAANYBACAeAADeAQAgHwAA4wEAIAEAAADWAQAgAQAAANkBACADBwAAjAUAICQAAI4FACAlAACNBQAgCYoCAADJAwAwiwIAAOwBABCMAgAAyQMAMI4CAQCSAwAhpgIBAKUDACGuAkAAlQMAIa8CQACVAwAhvwIgAL0DACHEAgEAkgMAIQMAAADZAQAgAQAA6wEAMCMAAOwBACADAAAA2QEAIAEAANoBADACAADWAQAgAQAAAB0AIAEAAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACANCgAAiwUAIA0AAMUEACAPAADGBAAgEAAAxwQAIBEAAMgEACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABwAIBAAAAAcECAQAAAAHCAgIAAAABwwIQAAAAAQEXAAD0AQAgCI4CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAHAAgEAAAABwQIBAAAAAcICAgAAAAHDAhAAAAABARcAAPYBADABFwAA9gEAMA0KAACKBQAgDQAAmAQAIA8AAJkEACAQAACaBAAgEQAAmwQAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhwAIBAPkDACHBAgEA-QMAIcICAgCWBAAhwwIQAPoDACECAAAAHQAgFwAA-QEAIAiOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcACAQD5AwAhwQIBAPkDACHCAgIAlgQAIcMCEAD6AwAhAgAAABsAIBcAAPsBACACAAAAGwAgFwAA-wEAIAMAAAAdACAeAAD0AQAgHwAA-QEAIAEAAAAdACABAAAAGwAgBQcAAIUFACAkAACIBQAgJQAAhwUAIKYBAACGBQAgpwEAAIkFACALigIAAMgDADCLAgAAggIAEIwCAADIAwAwjgIBAJIDACGmAgEApQMAIa4CQACVAwAhrwJAAJUDACHAAgEApQMAIcECAQClAwAhwgICAKYDACHDAhAAkwMAIQMAAAAbACABAACBAgAwIwAAggIAIAMAAAAbACABAAAcADACAAAdACABAAAAIwAgAQAAACMAIAMAAAAhACABAAAiADACAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAcOAACEBQAgpgIBAAAAAa4CQAAAAAGxAgEAAAABswIBAAAAAbQCAQAAAAG-AgAAAL4CAgEXAACKAgAgBqYCAQAAAAGuAkAAAAABsQIBAAAAAbMCAQAAAAG0AgEAAAABvgIAAAC-AgIBFwAAjAIAMAEXAACMAgAwBw4AAIMFACCmAgEA-QMAIa4CQAD7AwAhsQIBAPkDACGzAgEA-QMAIbQCAQD5AwAhvgIAAMEEvgIiAgAAACMAIBcAAI8CACAGpgIBAPkDACGuAkAA-wMAIbECAQD5AwAhswIBAPkDACG0AgEA-QMAIb4CAADBBL4CIgIAAAAhACAXAACRAgAgAgAAACEAIBcAAJECACADAAAAIwAgHgAAigIAIB8AAI8CACABAAAAIwAgAQAAACEAIAMHAACABQAgJAAAggUAICUAAIEFACAJigIAAMQDADCLAgAAmAIAEIwCAADEAwAwpgIBAKUDACGuAkAAlQMAIbECAQClAwAhswIBAJIDACG0AgEAkgMAIb4CAADFA74CIgMAAAAhACABAACXAgAwIwAAmAIAIAMAAAAhACABAAAiADACAAAjACABAAAAJwAgAQAAACcAIAMAAAAlACABAAAmADACAAAnACADAAAAJQAgAQAAJgAwAgAAJwAgAwAAACUAIAEAACYAMAIAACcAIAoOAAD_BAAgjwIQAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAbECAQAAAAGzAgEAAAABtAIBAAAAAb4CAAAAvgIDvwIgAAAAAQEXAACgAgAgCY8CEAAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAGxAgEAAAABswIBAAAAAbQCAQAAAAG-AgAAAL4CA78CIAAAAAEBFwAAogIAMAEXAACiAgAwCg4AAP4EACCPAhAA-gMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIbECAQD5AwAhswIBAIcEACG0AgEAhwQAIb4CAACzBL4CI78CIAC0BAAhAgAAACcAIBcAAKUCACAJjwIQAPoDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACGxAgEA-QMAIbMCAQCHBAAhtAIBAIcEACG-AgAAswS-AiO_AiAAtAQAIQIAAAAlACAXAACnAgAgAgAAACUAIBcAAKcCACADAAAAJwAgHgAAoAIAIB8AAKUCACABAAAAJwAgAQAAACUAIAgHAAD5BAAgJAAA_AQAICUAAPsEACCmAQAA-gQAIKcBAAD9BAAgswIAAOsEACC0AgAA6wQAIL4CAADrBAAgDIoCAAC6AwAwiwIAAK4CABCMAgAAugMAMI8CEACTAwAhpgIBAKUDACGuAkAAlQMAIa8CQACVAwAhsQIBAKUDACGzAgEAvAMAIbQCAQC8AwAhvgIAALsDvgIjvwIgAL0DACEDAAAAJQAgAQAArQIAMCMAAK4CACADAAAAJQAgAQAAJgAwAgAAJwAgAQAAACsAIAEAAAArACADAAAAKQAgAQAAKgAwAgAAKwAgAwAAACkAIAEAACoAMAIAACsAIAMAAAApACABAAAqADACAAArACANDgAA-AQAIKYCAQAAAAGuAkAAAAABrwJAAAAAAbACAQAAAAGxAgEAAAABsgJAAAAAAbMCAQAAAAG0AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABvAIAAAC2AgIBFwAAtgIAIAymAgEAAAABrgJAAAAAAa8CQAAAAAGwAgEAAAABsQIBAAAAAbICQAAAAAGzAgEAAAABtAIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbwCAAAAtgICARcAALgCADABFwAAuAIAMA0OAAD3BAAgpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhsAIBAPkDACGxAgEA-QMAIbICQAD7AwAhswIBAPkDACG0AgEA-QMAIbgCAQD5AwAhuQIBAPkDACG6AgEA-QMAIbwCAACmBLYCIgIAAAArACAXAAC7AgAgDKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIbACAQD5AwAhsQIBAPkDACGyAkAA-wMAIbMCAQD5AwAhtAIBAPkDACG4AgEA-QMAIbkCAQD5AwAhugIBAPkDACG8AgAApgS2AiICAAAAKQAgFwAAvQIAIAIAAAApACAXAAC9AgAgAwAAACsAIB4AALYCACAfAAC7AgAgAQAAACsAIAEAAAApACADBwAA9AQAICQAAPYEACAlAAD1BAAgD4oCAAC5AwAwiwIAAMQCABCMAgAAuQMAMKYCAQClAwAhrgJAAJUDACGvAkAAlQMAIbACAQCSAwAhsQIBAKUDACGyAkAAlQMAIbMCAQCSAwAhtAIBAJIDACG4AgEAkgMAIbkCAQCSAwAhugIBAJIDACG8AgAAtAO2AiIDAAAAKQAgAQAAwwIAMCMAAMQCACADAAAAKQAgAQAAKgAwAgAAKwAgD4oCAAC3AwAwiwIAAMoCABCMAgAAtwMAMKYCAQAAAAGwAgEAnwMAIbECAQCvAwAhsgJAAKIDACGzAgEAnwMAIbQCAQCfAwAhtgIAALgDtgIitwIAALgDtgIiuAIBAJ8DACG5AgEAnwMAIboCAQCfAwAhuwJAAKIDACEBAAAAxwIAIAEAAADHAgAgD4oCAAC3AwAwiwIAAMoCABCMAgAAtwMAMKYCAQCvAwAhsAIBAJ8DACGxAgEArwMAIbICQACiAwAhswIBAJ8DACG0AgEAnwMAIbYCAAC4A7YCIrcCAAC4A7YCIrgCAQCfAwAhuQIBAJ8DACG6AgEAnwMAIbsCQACiAwAhAAMAAADKAgAgAQAAywIAMAIAAMcCACADAAAAygIAIAEAAMsCADACAADHAgAgAwAAAMoCACABAADLAgAwAgAAxwIAIAymAgEAAAABsAIBAAAAAbECAQAAAAGyAkAAAAABswIBAAAAAbQCAQAAAAG2AgAAALYCArcCAAAAtgICuAIBAAAAAbkCAQAAAAG6AgEAAAABuwJAAAAAAQEXAADPAgAgDKYCAQAAAAGwAgEAAAABsQIBAAAAAbICQAAAAAGzAgEAAAABtAIBAAAAAbYCAAAAtgICtwIAAAC2AgK4AgEAAAABuQIBAAAAAboCAQAAAAG7AkAAAAABARcAANECADABFwAA0QIAMAymAgEA-QMAIbACAQD5AwAhsQIBAPkDACGyAkAA-wMAIbMCAQD5AwAhtAIBAPkDACG2AgAApgS2AiK3AgAApgS2AiK4AgEA-QMAIbkCAQD5AwAhugIBAPkDACG7AkAA-wMAIQIAAADHAgAgFwAA1AIAIAymAgEA-QMAIbACAQD5AwAhsQIBAPkDACGyAkAA-wMAIbMCAQD5AwAhtAIBAPkDACG2AgAApgS2AiK3AgAApgS2AiK4AgEA-QMAIbkCAQD5AwAhugIBAPkDACG7AkAA-wMAIQIAAADKAgAgFwAA1gIAIAIAAADKAgAgFwAA1gIAIAMAAADHAgAgHgAAzwIAIB8AANQCACABAAAAxwIAIAEAAADKAgAgAwcAAPEEACAkAADzBAAgJQAA8gQAIA-KAgAAswMAMIsCAADdAgAQjAIAALMDADCmAgEApQMAIbACAQCSAwAhsQIBAKUDACGyAkAAlQMAIbMCAQCSAwAhtAIBAJIDACG2AgAAtAO2AiK3AgAAtAO2AiK4AgEAkgMAIbkCAQCSAwAhugIBAJIDACG7AkAAlQMAIQMAAADKAgAgAQAA3AIAMCMAAN0CACADAAAAygIAIAEAAMsCADACAADHAgAgDYoCAACuAwAwiwIAAOMCABCMAgAArgMAMKYCAQAAAAGnAgEAnwMAIagCAQCfAwAhqQJAAKIDACGqAgIAsAMAIasCQACiAwAhrAICALADACGtAkAAsQMAIa4CQACiAwAhrwJAAKIDACEBAAAA4AIAIAEAAADgAgAgDYoCAACuAwAwiwIAAOMCABCMAgAArgMAMKYCAQCvAwAhpwIBAJ8DACGoAgEAnwMAIakCQACiAwAhqgICALADACGrAkAAogMAIawCAgCwAwAhrQJAALEDACGuAkAAogMAIa8CQACiAwAhAa0CAADrBAAgAwAAAOMCACABAADkAgAwAgAA4AIAIAMAAADjAgAgAQAA5AIAMAIAAOACACADAAAA4wIAIAEAAOQCADACAADgAgAgCqYCAQAAAAGnAgEAAAABqAIBAAAAAakCQAAAAAGqAgIAAAABqwJAAAAAAawCAgAAAAGtAkAAAAABrgJAAAAAAa8CQAAAAAEBFwAA6AIAIAqmAgEAAAABpwIBAAAAAagCAQAAAAGpAkAAAAABqgICAAAAAasCQAAAAAGsAgIAAAABrQJAAAAAAa4CQAAAAAGvAkAAAAABARcAAOoCADABFwAA6gIAMAqmAgEA-QMAIacCAQD5AwAhqAIBAPkDACGpAkAA-wMAIaoCAgCWBAAhqwJAAPsDACGsAgIAlgQAIa0CQADTBAAhrgJAAPsDACGvAkAA-wMAIQIAAADgAgAgFwAA7QIAIAqmAgEA-QMAIacCAQD5AwAhqAIBAPkDACGpAkAA-wMAIaoCAgCWBAAhqwJAAPsDACGsAgIAlgQAIa0CQADTBAAhrgJAAPsDACGvAkAA-wMAIQIAAADjAgAgFwAA7wIAIAIAAADjAgAgFwAA7wIAIAMAAADgAgAgHgAA6AIAIB8AAO0CACABAAAA4AIAIAEAAADjAgAgBgcAAOwEACAkAADvBAAgJQAA7gQAIKYBAADtBAAgpwEAAPAEACCtAgAA6wQAIA2KAgAApAMAMIsCAAD2AgAQjAIAAKQDADCmAgEApQMAIacCAQCSAwAhqAIBAJIDACGpAkAAlQMAIaoCAgCmAwAhqwJAAJUDACGsAgIApgMAIa0CQACnAwAhrgJAAJUDACGvAkAAlQMAIQMAAADjAgAgAQAA9QIAMCMAAPYCACADAAAA4wIAIAEAAOQCADACAADgAgAgCQYAAKMDACCKAgAAngMAMIsCAAAPABCMAgAAngMAMI0CAQAAAAGOAgEAnwMAIY8CEACgAwAhkAIAAKEDACCRAkAAogMAIQEAAAD5AgAgAQAAAPkCACABBgAA6gQAIAMAAAAPACABAAD8AgAwAgAA-QIAIAMAAAAPACABAAD8AgAwAgAA-QIAIAMAAAAPACABAAD8AgAwAgAA-QIAIAYGAADpBAAgjQIBAAAAAY4CAQAAAAGPAhAAAAABkAKAAAAAAZECQAAAAAEBFwAAgAMAIAWNAgEAAAABjgIBAAAAAY8CEAAAAAGQAoAAAAABkQJAAAAAAQEXAACCAwAwARcAAIIDADAGBgAA_AMAII0CAQD5AwAhjgIBAPkDACGPAhAA-gMAIZACgAAAAAGRAkAA-wMAIQIAAAD5AgAgFwAAhQMAIAWNAgEA-QMAIY4CAQD5AwAhjwIQAPoDACGQAoAAAAABkQJAAPsDACECAAAADwAgFwAAhwMAIAIAAAAPACAXAACHAwAgAwAAAPkCACAeAACAAwAgHwAAhQMAIAEAAAD5AgAgAQAAAA8AIAUHAAD0AwAgJAAA9wMAICUAAPYDACCmAQAA9QMAIKcBAAD4AwAgCIoCAACRAwAwiwIAAI4DABCMAgAAkQMAMI0CAQCSAwAhjgIBAJIDACGPAhAAkwMAIZACAACUAwAgkQJAAJUDACEDAAAADwAgAQAAjQMAMCMAAI4DACADAAAADwAgAQAA_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_AwAgkgIgAAAAAZkCIAC-AwAhBQcAAJcDACAkAAC_AwAgJQAAvwMAIJICIAAAAAGZAiAAvgMAIQKSAiAAAAABmQIgAL8DACEOBwAAqQMAICQAAMEDACAlAADBAwAgkgIBAAAAAZMCAQAAAAWUAgEAAAAFlQIBAAAAAZYCAQAAAAGXAgEAAAABmAIBAAAAAZkCAQDAAwAhoAIBAAAAAaECAQAAAAGiAgEAAAABC5ICAQAAAAGTAgEAAAAFlAIBAAAABZUCAQAAAAGWAgEAAAABlwIBAAAAAZgCAQAAAAGZAgEAwQMAIaACAQAAAAGhAgEAAAABogIBAAAAAQcHAACpAwAgJAAAwwMAICUAAMMDACCSAgAAAL4CA5MCAAAAvgIJlAIAAAC-AgmZAgAAwgO-AiMEkgIAAAC-AgOTAgAAAL4CCZQCAAAAvgIJmQIAAMMDvgIjCYoCAADEAwAwiwIAAJgCABCMAgAAxAMAMKYCAQClAwAhrgJAAJUDACGxAgEApQMAIbMCAQCSAwAhtAIBAJIDACG-AgAAxQO-AiIHBwAAlwMAICQAAMcDACAlAADHAwAgkgIAAAC-AgKTAgAAAL4CCJQCAAAAvgIImQIAAMYDvgIiBwcAAJcDACAkAADHAwAgJQAAxwMAIJICAAAAvgICkwIAAAC-AgiUAgAAAL4CCJkCAADGA74CIgSSAgAAAL4CApMCAAAAvgIIlAIAAAC-AgiZAgAAxwO-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-AgAA4QO-AiO_AiAAywMAIQSSAgAAAL4CA5MCAAAAvgIJlAIAAAC-AgmZAgAAwwO-AiMKDgAA3wMAIIoCAADiAwAwiwIAACEAEIwCAADiAwAwpgIBAK8DACGuAkAAogMAIbECAQCvAwAhswIBAJ8DACG0AgEAnwMAIb4CAADjA74CIgSSAgAAAL4CApMCAAAAvgIIlAIAAAC-AgiZAgAAxwO-AiIQCgAA5QMAIA0AAOYDACAPAADnAwAgEAAA6AMAIBEAAOkDACCKAgAA5AMAMIsCAAAbABCMAgAA5AMAMI4CAQCfAwAhpgIBAK8DACGuAkAAogMAIa8CQACiAwAhwAIBAK8DACHBAgEArwMAIcICAgCwAwAhwwIQAKADACEUCAAA7AMAIAkAANwDACALAADtAwAgDAAAzAMAIIoCAADrAwAwiwIAABEAEIwCAADrAwAwpgIBAK8DACGuAkAAogMAIa8CQACiAwAhzAIBAJ8DACHNAgEA2QMAIc4CAQDZAwAhzwIBANkDACHQAgEA2QMAIdECAQCfAwAh0gIBAJ8DACHTAgEA2QMAIecCAAARACDoAgAAEQAgDAwAAMwDACCKAgAAygMAMIsCAADZAQAQjAIAAMoDADCOAgEAnwMAIaYCAQCvAwAhrgJAAKIDACGvAkAAogMAIb8CIADLAwAhxAIBAJ8DACHnAgAA2QEAIOgCAADZAQAgA6MCAAAhACCkAgAAIQAgpQIAACEAIAOjAgAAJQAgpAIAACUAIKUCAAAlACADowIAACkAIKQCAAApACClAgAAKQAgDQoAAOUDACCKAgAA6gMAMIsCAAAXABCMAgAA6gMAMKYCAQCvAwAhpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhwAIBAK8DACHFAgEAnwMAIcYCQACiAwAhxwJAALEDACHIAkAAsQMAIRIIAADsAwAgCQAA3AMAIAsAAO0DACAMAADMAwAgigIAAOsDADCLAgAAEQAQjAIAAOsDADCmAgEArwMAIa4CQACiAwAhrwJAAKIDACHMAgEAnwMAIc0CAQDZAwAhzgIBANkDACHPAgEA2QMAIdACAQDZAwAh0QIBAJ8DACHSAgEAnwMAIdMCAQDZAwAhCwYAAKMDACCKAgAAngMAMIsCAAAPABCMAgAAngMAMI0CAQCfAwAhjgIBAJ8DACGPAhAAoAMAIZACAAChAwAgkQJAAKIDACHnAgAADwAg6AIAAA8AIAOjAgAAFwAgpAIAABcAIKUCAAAXACACwAIBAAAAAckCAQAAAAEJAwAA8QMAIAoAAOUDACCKAgAA7wMAMIsCAAALABCMAgAA7wMAMK4CQACiAwAhwAIBAK8DACHJAgEAnwMAIcsCAADwA8sCIgSSAgAAAMsCApMCAAAAywIIlAIAAADLAgiZAgAA0QPLAiIRBAAA2gMAIAUAANsDACAGAADcAwAgigIAANgDADCLAgAANwAQjAIAANgDADCOAgEAnwMAIaYCAQCfAwAhpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhywIBAJ8DACHiAiAAywMAIeMCAQDZAwAh5AIBANkDACHnAgAANwAg6AIAADcAIBEDAADxAwAgigIAAPIDADCLAgAABwAQjAIAAPIDADCmAgEAnwMAIa4CQACiAwAhrwJAAKIDACHJAgEAnwMAIdYCAQCfAwAh1wIBAJ8DACHYAgEA2QMAIdkCAQDZAwAh2gIBANkDACHbAkAAsQMAIdwCQACxAwAh3QIBANkDACHeAgEA2QMAIQwDAADxAwAgigIAAPMDADCLAgAAAwAQjAIAAPMDADCmAgEAnwMAIa4CQACiAwAhrwJAAKIDACHGAkAAogMAIckCAQCfAwAh3wIBAJ8DACHgAgEA2QMAIeECAQDZAwAhAAAAAAAB7AIBAAAAAQXsAhAAAAAB8gIQAAAAAfMCEAAAAAH0AhAAAAAB9QIQAAAAAQHsAkAAAAABCx4AAP0DADAfAACCBAAw6QIAAP4DADDqAgAA_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-QMAIa4CQAD7AwAhrwJAAPsDACHBAgEA-QMAIcICAgCWBAAhwwIQAPoDACEF7AICAAAAAfICAgAAAAHzAgIAAAAB9AICAAAAAfUCAgAAAAELDQAAmAQAIA8AAJkEACAQAACaBAAgEQAAmwQAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhwQIBAPkDACHCAgIAlgQAIcMCEAD6AwAhBR4AAKUGACAfAACrBgAg6QIAAKYGACDqAgAAqgYAIO8CAADWAQAgCx4AALcEADAfAAC8BAAw6QIAALgEADDqAgAAuQQAMOsCAAC6BAAg7AIAALsEADDtAgAAuwQAMO4CAAC7BAAw7wIAALsEADDwAgAAvQQAMPECAAC-BAAwCx4AAKkEADAfAACuBAAw6QIAAKoEADDqAgAAqwQAMOsCAACsBAAg7AIAAK0EADDtAgAArQQAMO4CAACtBAAw7wIAAK0EADDwAgAArwQAMPECAACwBAAwCx4AAJwEADAfAAChBAAw6QIAAJ0EADDqAgAAngQAMOsCAACfBAAg7AIAAKAEADDtAgAAoAQAMO4CAACgBAAw7wIAAKAEADDwAgAAogQAMPECAACjBAAwC6YCAQAAAAGuAkAAAAABrwJAAAAAAbACAQAAAAGyAkAAAAABswIBAAAAAbQCAQAAAAG4AgEAAAABuQIBAAAAAboCAQAAAAG8AgAAALYCAgIAAAArACAeAACoBAAgAwAAACsAIB4AAKgEACAfAACnBAAgARcAAKkGADARDgAA3wMAIIoCAADeAwAwiwIAACkAEIwCAADeAwAwpgIBAAAAAa4CQACiAwAhrwJAAKIDACGwAgEAAAABsQIBAK8DACGyAkAAogMAIbMCAQCfAwAhtAIBAJ8DACG4AgEAnwMAIbkCAQCfAwAhugIBAJ8DACG8AgAAuAO2AiLlAgAA3QMAIAIAAAArACAXAACnBAAgAgAAAKQEACAXAAClBAAgD4oCAACjBAAwiwIAAKQEABCMAgAAowQAMKYCAQCvAwAhrgJAAKIDACGvAkAAogMAIbACAQCfAwAhsQIBAK8DACGyAkAAogMAIbMCAQCfAwAhtAIBAJ8DACG4AgEAnwMAIbkCAQCfAwAhugIBAJ8DACG8AgAAuAO2AiIPigIAAKMEADCLAgAApAQAEIwCAACjBAAwpgIBAK8DACGuAkAAogMAIa8CQACiAwAhsAIBAJ8DACGxAgEArwMAIbICQACiAwAhswIBAJ8DACG0AgEAnwMAIbgCAQCfAwAhuQIBAJ8DACG6AgEAnwMAIbwCAAC4A7YCIgumAgEA-QMAIa4CQAD7AwAhrwJAAPsDACGwAgEA-QMAIbICQAD7AwAhswIBAPkDACG0AgEA-QMAIbgCAQD5AwAhuQIBAPkDACG6AgEA-QMAIbwCAACmBLYCIgHsAgAAALYCAgumAgEA-QMAIa4CQAD7AwAhrwJAAPsDACGwAgEA-QMAIbICQAD7AwAhswIBAPkDACG0AgEA-QMAIbgCAQD5AwAhuQIBAPkDACG6AgEA-QMAIbwCAACmBLYCIgumAgEAAAABrgJAAAAAAa8CQAAAAAGwAgEAAAABsgJAAAAAAbMCAQAAAAG0AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABvAIAAAC2AgIIjwIQAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAbMCAQAAAAG0AgEAAAABvgIAAAC-AgO_AiAAAAABAgAAACcAIB4AALYEACADAAAAJwAgHgAAtgQAIB8AALUEACABFwAAqAYAMA0OAADfAwAgigIAAOADADCLAgAAJQAQjAIAAOADADCPAhAAoAMAIaYCAQAAAAGuAkAAogMAIa8CQACiAwAhsQIBAK8DACGzAgEA2QMAIbQCAQDZAwAhvgIAAOEDvgIjvwIgAMsDACECAAAAJwAgFwAAtQQAIAIAAACxBAAgFwAAsgQAIAyKAgAAsAQAMIsCAACxBAAQjAIAALAEADCPAhAAoAMAIaYCAQCvAwAhrgJAAKIDACGvAkAAogMAIbECAQCvAwAhswIBANkDACG0AgEA2QMAIb4CAADhA74CI78CIADLAwAhDIoCAACwBAAwiwIAALEEABCMAgAAsAQAMI8CEACgAwAhpgIBAK8DACGuAkAAogMAIa8CQACiAwAhsQIBAK8DACGzAgEA2QMAIbQCAQDZAwAhvgIAAOEDvgIjvwIgAMsDACEIjwIQAPoDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACGzAgEAhwQAIbQCAQCHBAAhvgIAALMEvgIjvwIgALQEACEB7AIAAAC-AgMB7AIgAAAAAQiPAhAA-gMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIbMCAQCHBAAhtAIBAIcEACG-AgAAswS-AiO_AiAAtAQAIQiPAhAAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABswIBAAAAAbQCAQAAAAG-AgAAAL4CA78CIAAAAAEFpgIBAAAAAa4CQAAAAAGzAgEAAAABtAIBAAAAAb4CAAAAvgICAgAAACMAIB4AAMMEACADAAAAIwAgHgAAwwQAIB8AAMIEACABFwAApwYAMAoOAADfAwAgigIAAOIDADCLAgAAIQAQjAIAAOIDADCmAgEAAAABrgJAAKIDACGxAgEArwMAIbMCAQCfAwAhtAIBAJ8DACG-AgAA4wO-AiICAAAAIwAgFwAAwgQAIAIAAAC_BAAgFwAAwAQAIAmKAgAAvgQAMIsCAAC_BAAQjAIAAL4EADCmAgEArwMAIa4CQACiAwAhsQIBAK8DACGzAgEAnwMAIbQCAQCfAwAhvgIAAOMDvgIiCYoCAAC-BAAwiwIAAL8EABCMAgAAvgQAMKYCAQCvAwAhrgJAAKIDACGxAgEArwMAIbMCAQCfAwAhtAIBAJ8DACG-AgAA4wO-AiIFpgIBAPkDACGuAkAA-wMAIbMCAQD5AwAhtAIBAPkDACG-AgAAwQS-AiIB7AIAAAC-AgIFpgIBAPkDACGuAkAA-wMAIbMCAQD5AwAhtAIBAPkDACG-AgAAwQS-AiIFpgIBAAAAAa4CQAAAAAGzAgEAAAABtAIBAAAAAb4CAAAAvgICCw0AAMUEACAPAADGBAAgEAAAxwQAIBEAAMgEACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABwQIBAAAAAcICAgAAAAHDAhAAAAABAx4AAKUGACDpAgAApgYAIO8CAADWAQAgBB4AALcEADDpAgAAuAQAMOsCAAC6BAAg7wIAALsEADAEHgAAqQQAMOkCAACqBAAw6wIAAKwEACDvAgAArQQAMAQeAACcBAAw6QIAAJ0EADDrAgAAnwQAIO8CAACgBAAwCKYCAQAAAAGnAgEAAAABrgJAAAAAAa8CQAAAAAHFAgEAAAABxgJAAAAAAccCQAAAAAHIAkAAAAABAgAAABkAIB4AANUEACADAAAAGQAgHgAA1QQAIB8AANQEACABFwAApAYAMA0KAADlAwAgigIAAOoDADCLAgAAFwAQjAIAAOoDADCmAgEAAAABpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhwAIBAK8DACHFAgEAAAABxgJAAKIDACHHAkAAsQMAIcgCQACxAwAhAgAAABkAIBcAANQEACACAAAA0QQAIBcAANIEACAMigIAANAEADCLAgAA0QQAEIwCAADQBAAwpgIBAK8DACGnAgEAnwMAIa4CQACiAwAhrwJAAKIDACHAAgEArwMAIcUCAQCfAwAhxgJAAKIDACHHAkAAsQMAIcgCQACxAwAhDIoCAADQBAAwiwIAANEEABCMAgAA0AQAMKYCAQCvAwAhpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhwAIBAK8DACHFAgEAnwMAIcYCQACiAwAhxwJAALEDACHIAkAAsQMAIQimAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcUCAQD5AwAhxgJAAPsDACHHAkAA0wQAIcgCQADTBAAhAewCQAAAAAEIpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHFAgEA-QMAIcYCQAD7AwAhxwJAANMEACHIAkAA0wQAIQimAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABxQIBAAAAAcYCQAAAAAHHAkAAAAAByAJAAAAAAQQDAADkBAAgrgJAAAAAAckCAQAAAAHLAgAAAMsCAgIAAAANACAeAADjBAAgAwAAAA0AIB4AAOMEACAfAADhBAAgARcAAKMGADAKAwAA8QMAIAoAAOUDACCKAgAA7wMAMIsCAAALABCMAgAA7wMAMK4CQACiAwAhwAIBAK8DACHJAgEAnwMAIcsCAADwA8sCIuYCAADuAwAgAgAAAA0AIBcAAOEEACACAAAA3gQAIBcAAN8EACAHigIAAN0EADCLAgAA3gQAEIwCAADdBAAwrgJAAKIDACHAAgEArwMAIckCAQCfAwAhywIAAPADywIiB4oCAADdBAAwiwIAAN4EABCMAgAA3QQAMK4CQACiAwAhwAIBAK8DACHJAgEAnwMAIcsCAADwA8sCIgOuAkAA-wMAIckCAQD5AwAhywIAAOAEywIiAewCAAAAywICBAMAAOIEACCuAkAA-wMAIckCAQD5AwAhywIAAOAEywIiBR4AAJ4GACAfAAChBgAg6QIAAJ8GACDqAgAAoAYAIO8CAAABACAEAwAA5AQAIK4CQAAAAAHJAgEAAAABywIAAADLAgIDHgAAngYAIOkCAACfBgAg7wIAAAEAIA0JAADmBAAgCwAA5wQAIAwAAOgEACCmAgEAAAABrgJAAAAAAa8CQAAAAAHMAgEAAAABzQIBAAAAAc4CAQAAAAHPAgEAAAAB0AIBAAAAAdECAQAAAAHSAgEAAAABBB4AANYEADDpAgAA1wQAMOsCAADZBAAg7wIAANoEADAEHgAAyQQAMOkCAADKBAAw6wIAAMwEACDvAgAAzQQAMAQeAACMBAAw6QIAAI0EADDrAgAAjwQAIO8CAACQBAAwBB4AAP0DADDpAgAA_gMAMOsCAACABAAg7wIAAIEEADAAAAAAAAAAAAAAAAAABR4AAJkGACAfAACcBgAg6QIAAJoGACDqAgAAmwYAIO8CAAAdACADHgAAmQYAIOkCAACaBgAg7wIAAB0AIAAAAAAABR4AAJQGACAfAACXBgAg6QIAAJUGACDqAgAAlgYAIO8CAAAdACADHgAAlAYAIOkCAACVBgAg7wIAAB0AIAAAAAUeAACPBgAgHwAAkgYAIOkCAACQBgAg6gIAAJEGACDvAgAAHQAgAx4AAI8GACDpAgAAkAYAIO8CAAAdACAAAAAAAAUeAACKBgAgHwAAjQYAIOkCAACLBgAg6gIAAIwGACDvAgAAEwAgAx4AAIoGACDpAgAAiwYAIO8CAAATACAAAAALHgAAkAUAMB8AAJQFADDpAgAAkQUAMOoCAACSBQAw6wIAAJMFACDsAgAAkAQAMO0CAACQBAAw7gIAAJAEADDvAgAAkAQAMPACAACVBQAw8QIAAJMEADALCgAAiwUAIA8AAMYEACAQAADHBAAgEQAAyAQAII4CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAHAAgEAAAABwgICAAAAAcMCEAAAAAECAAAAHQAgHgAAmAUAIAMAAAAdACAeAACYBQAgHwAAlwUAIAEXAACJBgAwAgAAAB0AIBcAAJcFACACAAAAlAQAIBcAAJYFACAHjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHAAgEA-QMAIcICAgCWBAAhwwIQAPoDACELCgAAigUAIA8AAJkEACAQAACaBAAgEQAAmwQAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhwAIBAPkDACHCAgIAlgQAIcMCEAD6AwAhCwoAAIsFACAPAADGBAAgEAAAxwQAIBEAAMgEACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABwAIBAAAAAcICAgAAAAHDAhAAAAABBB4AAJAFADDpAgAAkQUAMOsCAACTBQAg7wIAAJAEADAAAAAABR4AAIQGACAfAACHBgAg6QIAAIUGACDqAgAAhgYAIO8CAAATACADHgAAhAYAIOkCAACFBgAg7wIAABMAIAAAAAUeAAD_BQAgHwAAggYAIOkCAACABgAg6gIAAIEGACDvAgAAEwAgAx4AAP8FACDpAgAAgAYAIO8CAAATACAAAAAHHgAA-gUAIB8AAP0FACDpAgAA-wUAIOoCAAD8BQAg7QIAAA8AIO4CAAAPACDvAgAA-QIAIAMeAAD6BQAg6QIAAPsFACDvAgAA-QIAIAAAAAAAAAUeAAD1BQAgHwAA-AUAIOkCAAD2BQAg6gIAAPcFACDvAgAAAQAgAx4AAPUFACDpAgAA9gUAIO8CAAABACAAAAAFHgAA8AUAIB8AAPMFACDpAgAA8QUAIOoCAADyBQAg7wIAAAEAIAMeAADwBQAg6QIAAPEFACDvAgAAAQAgAAAACx4AANIFADAfAADXBQAw6QIAANMFADDqAgAA1AUAMOsCAADVBQAg7AIAANYFADDtAgAA1gUAMO4CAADWBQAw7wIAANYFADDwAgAA2AUAMPECAADZBQAwCx4AAMYFADAfAADLBQAw6QIAAMcFADDqAgAAyAUAMOsCAADJBQAg7AIAAMoFADDtAgAAygUAMO4CAADKBQAw7wIAAMoFADDwAgAAzAUAMPECAADNBQAwCx4AAL0FADAfAADBBQAw6QIAAL4FADDqAgAAvwUAMOsCAADABQAg7AIAANoEADDtAgAA2gQAMO4CAADaBAAw7wIAANoEADDwAgAAwgUAMPECAADdBAAwBAoAAKQFACCuAkAAAAABwAIBAAAAAcsCAAAAywICAgAAAA0AIB4AAMUFACADAAAADQAgHgAAxQUAIB8AAMQFACABFwAA7wUAMAIAAAANACAXAADEBQAgAgAAAN4EACAXAADDBQAgA64CQAD7AwAhwAIBAPkDACHLAgAA4ATLAiIECgAAowUAIK4CQAD7AwAhwAIBAPkDACHLAgAA4ATLAiIECgAApAUAIK4CQAAAAAHAAgEAAAABywIAAADLAgIMpgIBAAAAAa4CQAAAAAGvAkAAAAAB1gIBAAAAAdcCAQAAAAHYAgEAAAAB2QIBAAAAAdoCAQAAAAHbAkAAAAAB3AJAAAAAAd0CAQAAAAHeAgEAAAABAgAAAAkAIB4AANEFACADAAAACQAgHgAA0QUAIB8AANAFACABFwAA7gUAMBEDAADxAwAgigIAAPIDADCLAgAABwAQjAIAAPIDADCmAgEAAAABrgJAAKIDACGvAkAAogMAIckCAQCfAwAh1gIBAJ8DACHXAgEAnwMAIdgCAQDZAwAh2QIBANkDACHaAgEA2QMAIdsCQACxAwAh3AJAALEDACHdAgEA2QMAId4CAQDZAwAhAgAAAAkAIBcAANAFACACAAAAzgUAIBcAAM8FACAQigIAAM0FADCLAgAAzgUAEIwCAADNBQAwpgIBAJ8DACGuAkAAogMAIa8CQACiAwAhyQIBAJ8DACHWAgEAnwMAIdcCAQCfAwAh2AIBANkDACHZAgEA2QMAIdoCAQDZAwAh2wJAALEDACHcAkAAsQMAId0CAQDZAwAh3gIBANkDACEQigIAAM0FADCLAgAAzgUAEIwCAADNBQAwpgIBAJ8DACGuAkAAogMAIa8CQACiAwAhyQIBAJ8DACHWAgEAnwMAIdcCAQCfAwAh2AIBANkDACHZAgEA2QMAIdoCAQDZAwAh2wJAALEDACHcAkAAsQMAId0CAQDZAwAh3gIBANkDACEMpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAh1gIBAPkDACHXAgEA-QMAIdgCAQCHBAAh2QIBAIcEACHaAgEAhwQAIdsCQADTBAAh3AJAANMEACHdAgEAhwQAId4CAQCHBAAhDKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIdYCAQD5AwAh1wIBAPkDACHYAgEAhwQAIdkCAQCHBAAh2gIBAIcEACHbAkAA0wQAIdwCQADTBAAh3QIBAIcEACHeAgEAhwQAIQymAgEAAAABrgJAAAAAAa8CQAAAAAHWAgEAAAAB1wIBAAAAAdgCAQAAAAHZAgEAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QIBAAAAAd4CAQAAAAEHpgIBAAAAAa4CQAAAAAGvAkAAAAABxgJAAAAAAd8CAQAAAAHgAgEAAAAB4QIBAAAAAQIAAAAFACAeAADdBQAgAwAAAAUAIB4AAN0FACAfAADcBQAgARcAAO0FADAMAwAA8QMAIIoCAADzAwAwiwIAAAMAEIwCAADzAwAwpgIBAAAAAa4CQACiAwAhrwJAAKIDACHGAkAAogMAIckCAQCfAwAh3wIBAAAAAeACAQDZAwAh4QIBANkDACECAAAABQAgFwAA3AUAIAIAAADaBQAgFwAA2wUAIAuKAgAA2QUAMIsCAADaBQAQjAIAANkFADCmAgEAnwMAIa4CQACiAwAhrwJAAKIDACHGAkAAogMAIckCAQCfAwAh3wIBAJ8DACHgAgEA2QMAIeECAQDZAwAhC4oCAADZBQAwiwIAANoFABCMAgAA2QUAMKYCAQCfAwAhrgJAAKIDACGvAkAAogMAIcYCQACiAwAhyQIBAJ8DACHfAgEAnwMAIeACAQDZAwAh4QIBANkDACEHpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxgJAAPsDACHfAgEA-QMAIeACAQCHBAAh4QIBAIcEACEHpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxgJAAPsDACHfAgEA-QMAIeACAQCHBAAh4QIBAIcEACEHpgIBAAAAAa4CQAAAAAGvAkAAAAABxgJAAAAAAd8CAQAAAAHgAgEAAAAB4QIBAAAAAQQeAADSBQAw6QIAANMFADDrAgAA1QUAIO8CAADWBQAwBB4AAMYFADDpAgAAxwUAMOsCAADJBQAg7wIAAMoFADAEHgAAvQUAMOkCAAC-BQAw6wIAAMAFACDvAgAA2gQAMAAAAAUKAADlBQAgDQAA5gUAIA8AAOcFACAQAADoBQAgEQAA6QUAIAkIAADqBQAgCQAA4wUAIAsAAOsFACAMAACaBQAgzQIAAOsEACDOAgAA6wQAIM8CAADrBAAg0AIAAOsEACDTAgAA6wQAIAEMAACaBQAgAAAAAQYAAOoEACAABQQAAOEFACAFAADiBQAgBgAA4wUAIOMCAADrBAAg5AIAAOsEACAHpgIBAAAAAa4CQAAAAAGvAkAAAAABxgJAAAAAAd8CAQAAAAHgAgEAAAAB4QIBAAAAAQymAgEAAAABrgJAAAAAAa8CQAAAAAHWAgEAAAAB1wIBAAAAAdgCAQAAAAHZAgEAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QIBAAAAAd4CAQAAAAEDrgJAAAAAAcACAQAAAAHLAgAAAMsCAgsFAADfBQAgBgAA4AUAII4CAQAAAAGmAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABywIBAAAAAeICIAAAAAHjAgEAAAAB5AIBAAAAAQIAAAABACAeAADwBQAgAwAAADcAIB4AAPAFACAfAAD0BQAgDQAAADcAIAUAALsFACAGAAC8BQAgFwAA9AUAII4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIeICIAC0BAAh4wIBAIcEACHkAgEAhwQAIQsFAAC7BQAgBgAAvAUAII4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIeICIAC0BAAh4wIBAIcEACHkAgEAhwQAIQsEAADeBQAgBgAA4AUAII4CAQAAAAGmAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABywIBAAAAAeICIAAAAAHjAgEAAAAB5AIBAAAAAQIAAAABACAeAAD1BQAgAwAAADcAIB4AAPUFACAfAAD5BQAgDQAAADcAIAQAALoFACAGAAC8BQAgFwAA-QUAII4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIeICIAC0BAAh4wIBAIcEACHkAgEAhwQAIQsEAAC6BQAgBgAAvAUAII4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIeICIAC0BAAh4wIBAIcEACHkAgEAhwQAIQWNAgEAAAABjgIBAAAAAY8CEAAAAAGQAoAAAAABkQJAAAAAAQIAAAD5AgAgHgAA-gUAIAMAAAAPACAeAAD6BQAgHwAA_gUAIAcAAAAPACAXAAD-BQAgjQIBAPkDACGOAgEA-QMAIY8CEAD6AwAhkAKAAAAAAZECQAD7AwAhBY0CAQD5AwAhjgIBAPkDACGPAhAA-gMAIZACgAAAAAGRAkAA-wMAIQ4IAACpBQAgCwAA5wQAIAwAAOgEACCmAgEAAAABrgJAAAAAAa8CQAAAAAHMAgEAAAABzQIBAAAAAc4CAQAAAAHPAgEAAAAB0AIBAAAAAdECAQAAAAHSAgEAAAAB0wIBAAAAAQIAAAATACAeAAD_BQAgAwAAABEAIB4AAP8FACAfAACDBgAgEAAAABEAIAgAAKgFACALAACKBAAgDAAAiwQAIBcAAIMGACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHMAgEA-QMAIc0CAQCHBAAhzgIBAIcEACHPAgEAhwQAIdACAQCHBAAh0QIBAPkDACHSAgEA-QMAIdMCAQCHBAAhDggAAKgFACALAACKBAAgDAAAiwQAIKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcwCAQD5AwAhzQIBAIcEACHOAgEAhwQAIc8CAQCHBAAh0AIBAIcEACHRAgEA-QMAIdICAQD5AwAh0wIBAIcEACEOCAAAqQUAIAkAAOYEACAMAADoBAAgpgIBAAAAAa4CQAAAAAGvAkAAAAABzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAECAAAAEwAgHgAAhAYAIAMAAAARACAeAACEBgAgHwAAiAYAIBAAAAARACAIAACoBQAgCQAAiQQAIAwAAIsEACAXAACIBgAgpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhzAIBAPkDACHNAgEAhwQAIc4CAQCHBAAhzwIBAIcEACHQAgEAhwQAIdECAQD5AwAh0gIBAPkDACHTAgEAhwQAIQ4IAACoBQAgCQAAiQQAIAwAAIsEACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHMAgEA-QMAIc0CAQCHBAAhzgIBAIcEACHPAgEAhwQAIdACAQCHBAAh0QIBAPkDACHSAgEA-QMAIdMCAQCHBAAhB44CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAHAAgEAAAABwgICAAAAAcMCEAAAAAEOCAAAqQUAIAkAAOYEACALAADnBAAgpgIBAAAAAa4CQAAAAAGvAkAAAAABzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQAAAAHRAgEAAAAB0gIBAAAAAdMCAQAAAAECAAAAEwAgHgAAigYAIAMAAAARACAeAACKBgAgHwAAjgYAIBAAAAARACAIAACoBQAgCQAAiQQAIAsAAIoEACAXAACOBgAgpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhzAIBAPkDACHNAgEAhwQAIc4CAQCHBAAhzwIBAIcEACHQAgEAhwQAIdECAQD5AwAh0gIBAPkDACHTAgEAhwQAIQ4IAACoBQAgCQAAiQQAIAsAAIoEACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHMAgEA-QMAIc0CAQCHBAAhzgIBAIcEACHPAgEAhwQAIdACAQCHBAAh0QIBAPkDACHSAgEA-QMAIdMCAQCHBAAhDAoAAIsFACANAADFBAAgEAAAxwQAIBEAAMgEACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABwAIBAAAAAcECAQAAAAHCAgIAAAABwwIQAAAAAQIAAAAdACAeAACPBgAgAwAAABsAIB4AAI8GACAfAACTBgAgDgAAABsAIAoAAIoFACANAACYBAAgEAAAmgQAIBEAAJsEACAXAACTBgAgjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHAAgEA-QMAIcECAQD5AwAhwgICAJYEACHDAhAA-gMAIQwKAACKBQAgDQAAmAQAIBAAAJoEACARAACbBAAgjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHAAgEA-QMAIcECAQD5AwAhwgICAJYEACHDAhAA-gMAIQwKAACLBQAgDQAAxQQAIA8AAMYEACARAADIBAAgjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAcACAQAAAAHBAgEAAAABwgICAAAAAcMCEAAAAAECAAAAHQAgHgAAlAYAIAMAAAAbACAeAACUBgAgHwAAmAYAIA4AAAAbACAKAACKBQAgDQAAmAQAIA8AAJkEACARAACbBAAgFwAAmAYAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhwAIBAPkDACHBAgEA-QMAIcICAgCWBAAhwwIQAPoDACEMCgAAigUAIA0AAJgEACAPAACZBAAgEQAAmwQAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhwAIBAPkDACHBAgEA-QMAIcICAgCWBAAhwwIQAPoDACEMCgAAiwUAIA0AAMUEACAPAADGBAAgEAAAxwQAII4CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAHAAgEAAAABwQIBAAAAAcICAgAAAAHDAhAAAAABAgAAAB0AIB4AAJkGACADAAAAGwAgHgAAmQYAIB8AAJ0GACAOAAAAGwAgCgAAigUAIA0AAJgEACAPAACZBAAgEAAAmgQAIBcAAJ0GACCOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcACAQD5AwAhwQIBAPkDACHCAgIAlgQAIcMCEAD6AwAhDAoAAIoFACANAACYBAAgDwAAmQQAIBAAAJoEACCOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcACAQD5AwAhwQIBAPkDACHCAgIAlgQAIcMCEAD6AwAhCwQAAN4FACAFAADfBQAgjgIBAAAAAaYCAQAAAAGnAgEAAAABrgJAAAAAAa8CQAAAAAHLAgEAAAAB4gIgAAAAAeMCAQAAAAHkAgEAAAABAgAAAAEAIB4AAJ4GACADAAAANwAgHgAAngYAIB8AAKIGACANAAAANwAgBAAAugUAIAUAALsFACAXAACiBgAgjgIBAPkDACGmAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcsCAQD5AwAh4gIgALQEACHjAgEAhwQAIeQCAQCHBAAhCwQAALoFACAFAAC7BQAgjgIBAPkDACGmAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcsCAQD5AwAh4gIgALQEACHjAgEAhwQAIeQCAQCHBAAhA64CQAAAAAHJAgEAAAABywIAAADLAgIIpgIBAAAAAacCAQAAAAGuAkAAAAABrwJAAAAAAcUCAQAAAAHGAkAAAAABxwJAAAAAAcgCQAAAAAEGjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAb8CIAAAAAHEAgEAAAABAgAAANYBACAeAAClBgAgBaYCAQAAAAGuAkAAAAABswIBAAAAAbQCAQAAAAG-AgAAAL4CAgiPAhAAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABswIBAAAAAbQCAQAAAAG-AgAAAL4CA78CIAAAAAELpgIBAAAAAa4CQAAAAAGvAkAAAAABsAIBAAAAAbICQAAAAAGzAgEAAAABtAIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbwCAAAAtgICAwAAANkBACAeAAClBgAgHwAArAYAIAgAAADZAQAgFwAArAYAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhvwIgALQEACHEAgEA-QMAIQaOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb8CIAC0BAAhxAIBAPkDACEHjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAcECAQAAAAHCAgIAAAABwwIQAAAAAQqmAgEAAAABrgJAAAAAAa8CQAAAAAHMAgEAAAABzQIBAAAAAc4CAQAAAAHPAgEAAAAB0AIBAAAAAdECAQAAAAHSAgEAAAABBAQGAgUKAwYOBAcAEQEDAAEBAwABAgMAAQoABQUHABAIEAYJFgQLGggMHgkCBhQFBwAHAQYVAAEKAAUGBwAPCgAFDQAKDyQMECgNESwOAgcACwwfCQEMIAABDgAJAQ4ACQEOAAkDDy0AEC4AES8AAwkwAAsxAAwyAAMEMwAFNAAGNQAAAAADBwAWJAAXJQAYAAAAAwcAFiQAFyUAGAEDAAEBAwABAwcAHSQAHiUAHwAAAAMHAB0kAB4lAB8BAwABAQMAAQMHACQkACUlACYAAAADBwAkJAAlJQAmAAAAAwcALCQALSUALgAAAAMHACwkAC0lAC4BCJwBBgEIogEGAwcAMyQANCUANQAAAAMHADMkADQlADUCAwABCgAFAgMAAQoABQMHADokADslADwAAAADBwA6JAA7JQA8AQoABQEKAAUDBwBBJABCJQBDAAAAAwcAQSQAQiUAQwAAAwcASCQASSUASgAAAAMHAEgkAEklAEoCCgAFDQAKAgoABQ0ACgUHAE8kAFIlAFOmAQBQpwEAUQAAAAAABQcATyQAUiUAU6YBAFCnAQBRAQ4ACQEOAAkDBwBYJABZJQBaAAAAAwcAWCQAWSUAWgEOAAkBDgAJBQcAXyQAYiUAY6YBAGCnAQBhAAAAAAAFBwBfJABiJQBjpgEAYKcBAGEBDgAJAQ4ACQMHAGgkAGklAGoAAAADBwBoJABpJQBqAAAAAwcAcCQAcSUAcgAAAAMHAHAkAHElAHIAAAAFBwB4JAB7JQB8pgEAeacBAHoAAAAAAAUHAHgkAHslAHymAQB5pwEAegAABQcAgQEkAIQBJQCFAaYBAIIBpwEAgwEAAAAAAAUHAIEBJACEASUAhQGmAQCCAacBAIMBEgIBEzYBFDkBFToBFjsBGD0BGT8SGkATG0IBHEQSHUUUIEYBIUcBIkgSJksVJ0wZKE0CKU4CKk8CK1ACLFECLVMCLlUSL1YaMFgCMVoSMlsbM1wCNF0CNV4SNmEcN2IgOGMDOWQDOmUDO2YDPGcDPWkDPmsSP2whQG4DQXASQnEiQ3IDRHMDRXQSRncjR3gnSHooSXsoSn4oS38oTIABKE2CAShOhAEST4UBKVCHAShRiQESUooBKlOLAShUjAEoVY0BElaQAStXkQEvWJIBBVmTAQValAEFW5UBBVyWAQVdmAEFXpoBEl-bATBgngEFYaABEmKhATFjowEFZKQBBWWlARJmqAEyZ6kBNmiqAQRpqwEEaqwBBGutAQRsrgEEbbABBG6yARJvswE3cLUBBHG3ARJyuAE4c7kBBHS6AQR1uwESdr4BOXe_AT14wAEIecEBCHrCAQh7wwEIfMQBCH3GAQh-yAESf8kBPoABywEIgQHNARKCAc4BP4MBzwEIhAHQAQiFAdEBEoYB1AFAhwHVAUSIAdcBCokB2AEKigHbAQqLAdwBCowB3QEKjQHfAQqOAeEBEo8B4gFFkAHkAQqRAeYBEpIB5wFGkwHoAQqUAekBCpUB6gESlgHtAUeXAe4BS5gB7wEJmQHwAQmaAfEBCZsB8gEJnAHzAQmdAfUBCZ4B9wESnwH4AUygAfoBCaEB_AESogH9AU2jAf4BCaQB_wEJpQGAAhKoAYMCTqkBhAJUqgGFAgyrAYYCDKwBhwIMrQGIAgyuAYkCDK8BiwIMsAGNAhKxAY4CVbIBkAIMswGSAhK0AZMCVrUBlAIMtgGVAgy3AZYCErgBmQJXuQGaAlu6AZsCDbsBnAINvAGdAg29AZ4CDb4BnwINvwGhAg3AAaMCEsEBpAJcwgGmAg3DAagCEsQBqQJdxQGqAg3GAasCDccBrAISyAGvAl7JAbACZMoBsQIOywGyAg7MAbMCDs0BtAIOzgG1Ag7PAbcCDtABuQIS0QG6AmXSAbwCDtMBvgIS1AG_AmbVAcACDtYBwQIO1wHCAhLYAcUCZ9kBxgJr2gHIAmzbAckCbNwBzAJs3QHNAmzeAc4CbN8B0AJs4AHSAhLhAdMCbeIB1QJs4wHXAhLkAdgCbuUB2QJs5gHaAmznAdsCEugB3gJv6QHfAnPqAeECdOsB4gJ07AHlAnTtAeYCdO4B5wJ07wHpAnTwAesCEvEB7AJ18gHuAnTzAfACEvQB8QJ29QHyAnT2AfMCdPcB9AIS-AH3Anf5AfgCffoB-gIG-wH7Agb8Af0CBv0B_gIG_gH_Agb_AYEDBoACgwMSgQKEA36CAoYDBoMCiAMShAKJA3-FAooDBoYCiwMGhwKMAxKIAo8DgAGJApADhgE" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"sessions\",\"accounts\",\"complexes\",\"_count\",\"plan\",\"users\",\"complex\",\"invitations\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"maintenances\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"ComplexInvitation.findUnique\",\"ComplexInvitation.findUniqueOrThrow\",\"ComplexInvitation.findFirst\",\"ComplexInvitation.findFirstOrThrow\",\"ComplexInvitation.findMany\",\"ComplexInvitation.createOne\",\"ComplexInvitation.createMany\",\"ComplexInvitation.createManyAndReturn\",\"ComplexInvitation.updateOne\",\"ComplexInvitation.updateMany\",\"ComplexInvitation.updateManyAndReturn\",\"ComplexInvitation.upsertOne\",\"ComplexInvitation.deleteOne\",\"ComplexInvitation.deleteMany\",\"ComplexInvitation.groupBy\",\"ComplexInvitation.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"_avg\",\"_sum\",\"Court.groupBy\",\"Court.aggregate\",\"CourtMaintenance.findUnique\",\"CourtMaintenance.findUniqueOrThrow\",\"CourtMaintenance.findFirst\",\"CourtMaintenance.findFirstOrThrow\",\"CourtMaintenance.findMany\",\"CourtMaintenance.createOne\",\"CourtMaintenance.createMany\",\"CourtMaintenance.createManyAndReturn\",\"CourtMaintenance.updateOne\",\"CourtMaintenance.updateMany\",\"CourtMaintenance.updateManyAndReturn\",\"CourtMaintenance.upsertOne\",\"CourtMaintenance.deleteOne\",\"CourtMaintenance.deleteMany\",\"CourtMaintenance.groupBy\",\"CourtMaintenance.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"CourtBookingLog.findUnique\",\"CourtBookingLog.findUniqueOrThrow\",\"CourtBookingLog.findFirst\",\"CourtBookingLog.findFirstOrThrow\",\"CourtBookingLog.findMany\",\"CourtBookingLog.createOne\",\"CourtBookingLog.createMany\",\"CourtBookingLog.createManyAndReturn\",\"CourtBookingLog.updateOne\",\"CourtBookingLog.updateMany\",\"CourtBookingLog.updateManyAndReturn\",\"CourtBookingLog.upsertOne\",\"CourtBookingLog.deleteOne\",\"CourtBookingLog.deleteMany\",\"CourtBookingLog.groupBy\",\"CourtBookingLog.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"AND\",\"OR\",\"NOT\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"id\",\"email\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"createdAt\",\"updatedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"CourtBookingStatus\",\"previousStatus\",\"newStatus\",\"customerName\",\"customerPhone\",\"customerEmail\",\"changedAt\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"startDate\",\"reason\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"isUnderMaintenance\",\"maintenanceReason\",\"slug\",\"tokenHash\",\"expiresAt\",\"acceptedAt\",\"revokedAt\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"identifier\",\"value\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"emailVerified\",\"image\",\"phone\",\"banned\",\"bannedAt\",\"banReason\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "5gaOAYACEgQAAPYDACAFAAD3AwAgBgAA-AMAIJsCAAD0AwAwnAIAADwAEJ0CAAD0AwAwnwIBALoDACG3AgEAAAABuAIBAAAAAb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfcCIADnAwAh-AIBAPUDACH5AgEA9QMAIfoCIADnAwAh-wJAAMwDACH8AgEA9QMAIQEAAAABACAMAwAAjwQAIJsCAACRBAAwnAIAAAMAEJ0CAACRBAAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIfQCAQC6AwAh9QIBAPUDACH2AgEA9QMAIQMDAACeBgAg9QIAAJcFACD2AgAAlwUAIAwDAACPBAAgmwIAAJEEADCcAgAAAwAQnQIAAJEEADC3AgEAAAABvwJAAL0DACHAAkAAvQMAIdsCQAC9AwAh3gIBALoDACH0AgEAAAAB9QIBAPUDACH2AgEA9QMAIQMAAAADACABAAAEADACAAAFACARAwAAjwQAIJsCAACQBAAwnAIAAAcAEJ0CAACQBAAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh3gIBALoDACHrAgEAugMAIewCAQC6AwAh7QIBAPUDACHuAgEA9QMAIe8CAQD1AwAh8AJAAMwDACHxAkAAzAMAIfICAQD1AwAh8wIBAPUDACEIAwAAngYAIO0CAACXBQAg7gIAAJcFACDvAgAAlwUAIPACAACXBQAg8QIAAJcFACDyAgAAlwUAIPMCAACXBQAgEQMAAI8EACCbAgAAkAQAMJwCAAAHABCdAgAAkAQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh3gIBALoDACHrAgEAugMAIewCAQC6AwAh7QIBAPUDACHuAgEA9QMAIe8CAQD1AwAh8AJAAMwDACHxAkAAzAMAIfICAQD1AwAh8wIBAPUDACEDAAAABwAgAQAACAAwAgAACQAgCQMAAI8EACAKAACCBAAgmwIAAI0EADCcAgAACwAQnQIAAI0EADC_AkAAvQMAIdMCAQDKAwAh3gIBALoDACHgAgAAjgTgAiICAwAAngYAIAoAAJYGACAKAwAAjwQAIAoAAIIEACCbAgAAjQQAMJwCAAALABCdAgAAjQQAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIv4CAACMBAAgAwAAAAsAIAEAAAwAMAIAAA0AIAkGAAC-AwAgmwIAALkDADCcAgAADwAQnQIAALkDADCeAgEAugMAIZ8CAQC6AwAhoAIQALsDACGhAgAAvAMAIKICQAC9AwAhAQAAAA8AIBIIAACKBAAgCQAA-AMAIAsAAIsEACAMAADoAwAgmwIAAIkEADCcAgAAEQAQnQIAAIkEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAhCQgAAJwGACAJAACUBgAgCwAAnQYAIAwAAMsFACDiAgAAlwUAIOMCAACXBQAg5AIAAJcFACDlAgAAlwUAIOgCAACXBQAgEggAAIoEACAJAAD4AwAgCwAAiwQAIAwAAOgDACCbAgAAiQQAMJwCAAARABCdAgAAiQQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA9QMAIeMCAQD1AwAh5AIBAPUDACHlAgEA9QMAIeYCAQAAAAHnAgEAugMAIegCAQD1AwAhAwAAABEAIAEAABIAMAIAABMAIAEAAAARACADAAAACwAgAQAADAAwAgAADQAgDQoAAIIEACCbAgAAiAQAMJwCAAAXABCdAgAAiAQAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIQMKAACWBgAg3AIAAJcFACDdAgAAlwUAIA0KAACCBAAgmwIAAIgEADCcAgAAFwAQnQIAAIgEADC3AgEAAAABuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAAAAB2wJAAL0DACHcAkAAzAMAId0CQADMAwAhAwAAABcAIAEAABgAMAIAABkAIBMKAACCBAAgDQAAgwQAIA8AAIQEACAQAACFBAAgEQAAhgQAIBIAAIcEACCbAgAAgQQAMJwCAAAbABCdAgAAgQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAhBwoAAJYGACANAACXBgAgDwAAmAYAIBAAAJkGACARAACaBgAgEgAAmwYAINgCAACXBQAgEwoAAIIEACANAACDBAAgDwAAhAQAIBAAAIUEACARAACGBAAgEgAAhwQAIJsCAACBBAAwnAIAABsAEJ0CAACBBAAwnwIBALoDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA9QMAIQMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAQAAABsAIAoOAAD6AwAgmwIAAP8DADCcAgAAIQAQnQIAAP8DADC3AgEAygMAIb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiAQ4AAJUGACAKDgAA-gMAIJsCAAD_AwAwnAIAACEAEJ0CAAD_AwAwtwIBAAAAAb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiAwAAACEAIAEAACIAMAIAACMAIA0OAAD6AwAgmwIAAP0DADCcAgAAJQAQnQIAAP0DADCgAhAAuwMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIc8CAAD-A88CI9ACIADnAwAhBA4AAJUGACDEAgAAlwUAIMUCAACXBQAgzwIAAJcFACANDgAA-gMAIJsCAAD9AwAwnAIAACUAEJ0CAAD9AwAwoAIQALsDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIc8CAAD-A88CI9ACIADnAwAhAwAAACUAIAEAACYAMAIAACcAIBAOAAD6AwAgmwIAAPwDADCcAgAAKQAQnQIAAPwDADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHBAgEAugMAIcICAQDKAwAhwwJAAL0DACHEAgEAugMAIcUCAQC6AwAhyQIBALoDACHKAgEAugMAIcsCAQC6AwAhzQIAANMDxwIiAQ4AAJUGACARDgAA-gMAIJsCAAD8AwAwnAIAACkAEJ0CAAD8AwAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHBAgEAAAABwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiL9AgAA-wMAIAMAAAApACABAAAqADACAAArACAMDgAA-gMAIJsCAAD5AwAwnAIAAC0AEJ0CAAD5AwAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQQOAACVBgAgxAIAAJcFACDFAgAAlwUAINICAACXBQAgDA4AAPoDACCbAgAA-QMAMJwCAAAtABCdAgAA-QMAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQMAAAAtACABAAAuADACAAAvACABAAAAIQAgAQAAACUAIAEAAAApACABAAAALQAgAQAAAAsAIAEAAAAXACABAAAAGwAgAQAAAAMAIAEAAAAHACABAAAACwAgAQAAAAEAIBIEAAD2AwAgBQAA9wMAIAYAAPgDACCbAgAA9AMAMJwCAAA8ABCdAgAA9AMAMJ8CAQC6AwAhtwIBALoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfcCIADnAwAh-AIBAPUDACH5AgEA9QMAIfoCIADnAwAh-wJAAMwDACH8AgEA9QMAIQcEAACSBgAgBQAAkwYAIAYAAJQGACD4AgAAlwUAIPkCAACXBQAg-wIAAJcFACD8AgAAlwUAIAMAAAA8ACABAAA9ADACAAABACADAAAAPAAgAQAAPQAwAgAAAQAgAwAAADwAIAEAAD0AMAIAAAEAIA8EAACPBgAgBQAAkAYAIAYAAJEGACCfAgEAAAABtwIBAAAAAbgCAQAAAAG_AkAAAAABwAJAAAAAAeACAQAAAAH3AiAAAAAB-AIBAAAAAfkCAQAAAAH6AiAAAAAB-wJAAAAAAfwCAQAAAAEBGAAAQQAgDJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQEYAABDADABGAAAQwAwDwQAAOsFACAFAADsBQAgBgAA7QUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQIAAAABACAYAABGACAMnwIBAJcEACG3AgEAlwQAIbgCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeACAQCXBAAh9wIgALUEACH4AgEApQQAIfkCAQClBAAh-gIgALUEACH7AkAA_wQAIfwCAQClBAAhAgAAADwAIBgAAEgAIAIAAAA8ACAYAABIACADAAAAAQAgHwAAQQAgIAAARgAgAQAAAAEAIAEAAAA8ACAHBwAA6AUAICUAAOoFACAmAADpBQAg-AIAAJcFACD5AgAAlwUAIPsCAACXBQAg_AIAAJcFACAPmwIAAPMDADCcAgAATwAQnQIAAPMDADCfAgEArQMAIbcCAQCtAwAhuAIBAK0DACG_AkAAsAMAIcACQACwAwAh4AIBAK0DACH3AiAA2AMAIfgCAQDXAwAh-QIBANcDACH6AiAA2AMAIfsCQADCAwAh_AIBANcDACEDAAAAPAAgAQAATgAwJAAATwAgAwAAADwAIAEAAD0AMAIAAAEAIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgCQMAAOcFACC3AgEAAAABvwJAAAAAAcACQAAAAAHbAkAAAAAB3gIBAAAAAfQCAQAAAAH1AgEAAAAB9gIBAAAAAQEYAABXACAItwIBAAAAAb8CQAAAAAHAAkAAAAAB2wJAAAAAAd4CAQAAAAH0AgEAAAAB9QIBAAAAAfYCAQAAAAEBGAAAWQAwARgAAFkAMAkDAADmBQAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHeAgEAlwQAIfQCAQCXBAAh9QIBAKUEACH2AgEApQQAIQIAAAAFACAYAABcACAItwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHeAgEAlwQAIfQCAQCXBAAh9QIBAKUEACH2AgEApQQAIQIAAAADACAYAABeACACAAAAAwAgGAAAXgAgAwAAAAUAIB8AAFcAICAAAFwAIAEAAAAFACABAAAAAwAgBQcAAOMFACAlAADlBQAgJgAA5AUAIPUCAACXBQAg9gIAAJcFACALmwIAAPIDADCcAgAAZQAQnQIAAPIDADC3AgEArQMAIb8CQACwAwAhwAJAALADACHbAkAAsAMAId4CAQCtAwAh9AIBAK0DACH1AgEA1wMAIfYCAQDXAwAhAwAAAAMAIAEAAGQAMCQAAGUAIAMAAAADACABAAAEADACAAAFACABAAAACQAgAQAAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIA4DAADiBQAgtwIBAAAAAb8CQAAAAAHAAkAAAAAB3gIBAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQEYAABtACANtwIBAAAAAb8CQAAAAAHAAkAAAAAB3gIBAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQEYAABvADABGAAAbwAwDgMAAOEFACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHeAgEAlwQAIesCAQCXBAAh7AIBAJcEACHtAgEApQQAIe4CAQClBAAh7wIBAKUEACHwAkAA_wQAIfECQAD_BAAh8gIBAKUEACHzAgEApQQAIQIAAAAJACAYAAByACANtwIBAJcEACG_AkAAmQQAIcACQACZBAAh3gIBAJcEACHrAgEAlwQAIewCAQCXBAAh7QIBAKUEACHuAgEApQQAIe8CAQClBAAh8AJAAP8EACHxAkAA_wQAIfICAQClBAAh8wIBAKUEACECAAAABwAgGAAAdAAgAgAAAAcAIBgAAHQAIAMAAAAJACAfAABtACAgAAByACABAAAACQAgAQAAAAcAIAoHAADeBQAgJQAA4AUAICYAAN8FACDtAgAAlwUAIO4CAACXBQAg7wIAAJcFACDwAgAAlwUAIPECAACXBQAg8gIAAJcFACDzAgAAlwUAIBCbAgAA8QMAMJwCAAB7ABCdAgAA8QMAMLcCAQCtAwAhvwJAALADACHAAkAAsAMAId4CAQCtAwAh6wIBAK0DACHsAgEArQMAIe0CAQDXAwAh7gIBANcDACHvAgEA1wMAIfACQADCAwAh8QJAAMIDACHyAgEA1wMAIfMCAQDXAwAhAwAAAAcAIAEAAHoAMCQAAHsAIAMAAAAHACABAAAIADACAAAJACAJmwIAAPADADCcAgAAgQEAEJ0CAADwAwAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAIekCAQC6AwAh6gIBALoDACEBAAAAfgAgAQAAAH4AIAmbAgAA8AMAMJwCAACBAQAQnQIAAPADADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAIekCAQC6AwAh6gIBALoDACEAAwAAAIEBACABAACCAQAwAgAAfgAgAwAAAIEBACABAACCAQAwAgAAfgAgAwAAAIEBACABAACCAQAwAgAAfgAgBrcCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAHpAgEAAAAB6gIBAAAAAQEYAACGAQAgBrcCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAHpAgEAAAAB6gIBAAAAAQEYAACIAQAwARgAAIgBADAGtwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHpAgEAlwQAIeoCAQCXBAAhAgAAAH4AIBgAAIsBACAGtwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHpAgEAlwQAIeoCAQCXBAAhAgAAAIEBACAYAACNAQAgAgAAAIEBACAYAACNAQAgAwAAAH4AIB8AAIYBACAgAACLAQAgAQAAAH4AIAEAAACBAQAgAwcAANsFACAlAADdBQAgJgAA3AUAIAmbAgAA7wMAMJwCAACUAQAQnQIAAO8DADC3AgEArQMAIb8CQACwAwAhwAJAALADACHbAkAAsAMAIekCAQCtAwAh6gIBAK0DACEDAAAAgQEAIAEAAJMBADAkAACUAQAgAwAAAIEBACABAACCAQAwAgAAfgAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAPCAAA2gUAIAkAAJIFACALAACTBQAgDAAAlAUAILcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAHoAgEAAAABARgAAJwBACALtwIBAAAAAb8CQAAAAAHAAkAAAAAB4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAegCAQAAAAEBGAAAngEAMAEYAACeAQAwAQAAAA8AIA8IAADZBQAgCQAApwQAIAsAAKgEACAMAACpBAAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh4QIBAJcEACHiAgEApQQAIeMCAQClBAAh5AIBAKUEACHlAgEApQQAIeYCAQCXBAAh5wIBAJcEACHoAgEApQQAIQIAAAATACAYAACiAQAgC7cCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAh6AIBAKUEACECAAAAEQAgGAAApAEAIAIAAAARACAYAACkAQAgAQAAAA8AIAMAAAATACAfAACcAQAgIAAAogEAIAEAAAATACABAAAAEQAgCAcAANYFACAlAADYBQAgJgAA1wUAIOICAACXBQAg4wIAAJcFACDkAgAAlwUAIOUCAACXBQAg6AIAAJcFACAOmwIAAO4DADCcAgAArAEAEJ0CAADuAwAwtwIBAMADACG_AkAAsAMAIcACQACwAwAh4QIBAK0DACHiAgEA1wMAIeMCAQDXAwAh5AIBANcDACHlAgEA1wMAIeYCAQCtAwAh5wIBAK0DACHoAgEA1wMAIQMAAAARACABAACrAQAwJAAArAEAIAMAAAARACABAAASADACAAATACABAAAADQAgAQAAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAYDAACQBQAgCgAA1QUAIL8CQAAAAAHTAgEAAAAB3gIBAAAAAeACAAAA4AICARgAALQBACAEvwJAAAAAAdMCAQAAAAHeAgEAAAAB4AIAAADgAgIBGAAAtgEAMAEYAAC2AQAwBgMAAI4FACAKAADUBQAgvwJAAJkEACHTAgEAlwQAId4CAQCXBAAh4AIAAIwF4AIiAgAAAA0AIBgAALkBACAEvwJAAJkEACHTAgEAlwQAId4CAQCXBAAh4AIAAIwF4AIiAgAAAAsAIBgAALsBACACAAAACwAgGAAAuwEAIAMAAAANACAfAAC0AQAgIAAAuQEAIAEAAAANACABAAAACwAgAwcAANEFACAlAADTBQAgJgAA0gUAIAebAgAA6gMAMJwCAADCAQAQnQIAAOoDADC_AkAAsAMAIdMCAQDAAwAh3gIBAK0DACHgAgAA6wPgAiIDAAAACwAgAQAAwQEAMCQAAMIBACADAAAACwAgAQAADAAwAgAADQAgAQAAABkAIAEAAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACAKCgAA0AUAILcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAQEYAADKAQAgCbcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAQEYAADMAQAwARgAAMwBADAKCgAAzwUAILcCAQCXBAAhuAIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHaAgEAlwQAIdsCQACZBAAh3AJAAP8EACHdAkAA_wQAIQIAAAAZACAYAADPAQAgCbcCAQCXBAAhuAIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHaAgEAlwQAIdsCQACZBAAh3AJAAP8EACHdAkAA_wQAIQIAAAAXACAYAADRAQAgAgAAABcAIBgAANEBACADAAAAGQAgHwAAygEAICAAAM8BACABAAAAGQAgAQAAABcAIAUHAADMBQAgJQAAzgUAICYAAM0FACDcAgAAlwUAIN0CAACXBQAgDJsCAADpAwAwnAIAANgBABCdAgAA6QMAMLcCAQDAAwAhuAIBAK0DACG_AkAAsAMAIcACQACwAwAh0wIBAMADACHaAgEArQMAIdsCQACwAwAh3AJAAMIDACHdAkAAwgMAIQMAAAAXACABAADXAQAwJAAA2AEAIAMAAAAXACABAAAYADACAAAZACAKDAAA6AMAIJsCAADmAwAwnAIAAN4BABCdAgAA5gMAMJ8CAQAAAAG3AgEAAAABvwJAAL0DACHAAkAAvQMAIdACIADnAwAh2QIBAAAAAQEAAADbAQAgAQAAANsBACAKDAAA6AMAIJsCAADmAwAwnAIAAN4BABCdAgAA5gMAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0AIgAOcDACHZAgEAugMAIQEMAADLBQAgAwAAAN4BACABAADfAQAwAgAA2wEAIAMAAADeAQAgAQAA3wEAMAIAANsBACADAAAA3gEAIAEAAN8BADACAADbAQAgBwwAAMoFACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0AIgAAAAAdkCAQAAAAEBGAAA4wEAIAafAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0AIgAAAAAdkCAQAAAAEBGAAA5QEAMAEYAADlAQAwBwwAAMAFACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdACIAC1BAAh2QIBAJcEACECAAAA2wEAIBgAAOgBACAGnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHQAiAAtQQAIdkCAQCXBAAhAgAAAN4BACAYAADqAQAgAgAAAN4BACAYAADqAQAgAwAAANsBACAfAADjAQAgIAAA6AEAIAEAAADbAQAgAQAAAN4BACADBwAAvQUAICUAAL8FACAmAAC-BQAgCZsCAADlAwAwnAIAAPEBABCdAgAA5QMAMJ8CAQCtAwAhtwIBAMADACG_AkAAsAMAIcACQACwAwAh0AIgANgDACHZAgEArQMAIQMAAADeAQAgAQAA8AEAMCQAAPEBACADAAAA3gEAIAEAAN8BADACAADbAQAgAQAAAB0AIAEAAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACAQCgAAvAUAIA0AAPAEACAPAADxBAAgEAAA8gQAIBEAAPMEACASAAD0BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHUAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQEYAAD5AQAgCp8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAEBGAAA-wEAMAEYAAD7AQAwEAoAALsFACANAAC3BAAgDwAAuAQAIBAAALkEACARAAC6BAAgEgAAuwQAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhAgAAAB0AIBgAAP4BACAKnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACECAAAAGwAgGAAAgAIAIAIAAAAbACAYAACAAgAgAwAAAB0AIB8AAPkBACAgAAD-AQAgAQAAAB0AIAEAAAAbACAGBwAAtgUAICUAALkFACAmAAC4BQAgpwEAALcFACCoAQAAugUAINgCAACXBQAgDZsCAADkAwAwnAIAAIcCABCdAgAA5AMAMJ8CAQCtAwAhtwIBAMADACG_AkAAsAMAIcACQACwAwAh0wIBAMADACHUAgEAwAMAIdUCAgDBAwAh1gIQAK4DACHXAiAA2AMAIdgCAQDXAwAhAwAAABsAIAEAAIYCADAkAACHAgAgAwAAABsAIAEAABwAMAIAAB0AIAEAAAAvACABAAAALwAgAwAAAC0AIAEAAC4AMAIAAC8AIAMAAAAtACABAAAuADACAAAvACADAAAALQAgAQAALgAwAgAALwAgCQ4AALUFACC3AgEAAAABvwJAAAAAAcACQAAAAAHCAgEAAAABxAIBAAAAAcUCAQAAAAHRAkAAAAAB0gIBAAAAAQEYAACPAgAgCLcCAQAAAAG_AkAAAAABwAJAAAAAAcICAQAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABARgAAJECADABGAAAkQIAMAkOAAC0BQAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAhwgIBAJcEACHEAgEApQQAIcUCAQClBAAh0QJAAJkEACHSAgEApQQAIQIAAAAvACAYAACUAgAgCLcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIcICAQCXBAAhxAIBAKUEACHFAgEApQQAIdECQACZBAAh0gIBAKUEACECAAAALQAgGAAAlgIAIAIAAAAtACAYAACWAgAgAwAAAC8AIB8AAI8CACAgAACUAgAgAQAAAC8AIAEAAAAtACAGBwAAsQUAICUAALMFACAmAACyBQAgxAIAAJcFACDFAgAAlwUAINICAACXBQAgC5sCAADjAwAwnAIAAJ0CABCdAgAA4wMAMLcCAQDAAwAhvwJAALADACHAAkAAsAMAIcICAQDAAwAhxAIBANcDACHFAgEA1wMAIdECQACwAwAh0gIBANcDACEDAAAALQAgAQAAnAIAMCQAAJ0CACADAAAALQAgAQAALgAwAgAALwAgAQAAACMAIAEAAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAMAAAAhACABAAAiADACAAAjACAHDgAAsAUAILcCAQAAAAG_AkAAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgIBGAAApQIAIAa3AgEAAAABvwJAAAAAAcICAQAAAAHEAgEAAAABxQIBAAAAAc8CAAAAzwICARgAAKcCADABGAAApwIAMAcOAACvBQAgtwIBAJcEACG_AkAAmQQAIcICAQCXBAAhxAIBAJcEACHFAgEAlwQAIc8CAADsBM8CIgIAAAAjACAYAACqAgAgBrcCAQCXBAAhvwJAAJkEACHCAgEAlwQAIcQCAQCXBAAhxQIBAJcEACHPAgAA7ATPAiICAAAAIQAgGAAArAIAIAIAAAAhACAYAACsAgAgAwAAACMAIB8AAKUCACAgAACqAgAgAQAAACMAIAEAAAAhACADBwAArAUAICUAAK4FACAmAACtBQAgCZsCAADfAwAwnAIAALMCABCdAgAA3wMAMLcCAQDAAwAhvwJAALADACHCAgEAwAMAIcQCAQCtAwAhxQIBAK0DACHPAgAA4APPAiIDAAAAIQAgAQAAsgIAMCQAALMCACADAAAAIQAgAQAAIgAwAgAAIwAgAQAAACcAIAEAAAAnACADAAAAJQAgAQAAJgAwAgAAJwAgAwAAACUAIAEAACYAMAIAACcAIAMAAAAlACABAAAmADACAAAnACAKDgAAqwUAIKACEAAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHCAgEAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CA9ACIAAAAAEBGAAAuwIAIAmgAhAAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABARgAAL0CADABGAAAvQIAMAoOAACqBQAgoAIQAJgEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHCAgEAlwQAIcQCAQClBAAhxQIBAKUEACHPAgAA3wTPAiPQAiAAtQQAIQIAAAAnACAYAADAAgAgCaACEACYBAAhtwIBAJcEACG_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_AkAAvQMAIcACQAC9AwAhAQAAAPsCACABAAAA-wIAIA2bAgAAyQMAMJwCAAD-AgAQnQIAAMkDADC3AgEAygMAIbgCAQC6AwAhuQIBALoDACG6AkAAvQMAIbsCAgDLAwAhvAJAAL0DACG9AgIAywMAIb4CQADMAwAhvwJAAL0DACHAAkAAvQMAIQG-AgAAlwUAIAMAAAD-AgAgAQAA_wIAMAIAAPsCACADAAAA_gIAIAEAAP8CADACAAD7AgAgAwAAAP4CACABAAD_AgAwAgAA-wIAIAq3AgEAAAABuAIBAAAAAbkCAQAAAAG6AkAAAAABuwICAAAAAbwCQAAAAAG9AgIAAAABvgJAAAAAAb8CQAAAAAHAAkAAAAABARgAAIMDACAKtwIBAAAAAbgCAQAAAAG5AgEAAAABugJAAAAAAbsCAgAAAAG8AkAAAAABvQICAAAAAb4CQAAAAAG_AkAAAAABwAJAAAAAAQEYAACFAwAwARgAAIUDADAKtwIBAJcEACG4AgEAlwQAIbkCAQCXBAAhugJAAJkEACG7AgIAtAQAIbwCQACZBAAhvQICALQEACG-AkAA_wQAIb8CQACZBAAhwAJAAJkEACECAAAA-wIAIBgAAIgDACAKtwIBAJcEACG4AgEAlwQAIbkCAQCXBAAhugJAAJkEACG7AgIAtAQAIbwCQACZBAAhvQICALQEACG-AkAA_wQAIb8CQACZBAAhwAJAAJkEACECAAAA_gIAIBgAAIoDACACAAAA_gIAIBgAAIoDACADAAAA-wIAIB8AAIMDACAgAACIAwAgAQAAAPsCACABAAAA_gIAIAYHAACYBQAgJQAAmwUAICYAAJoFACCnAQAAmQUAIKgBAACcBQAgvgIAAJcFACANmwIAAL8DADCcAgAAkQMAEJ0CAAC_AwAwtwIBAMADACG4AgEArQMAIbkCAQCtAwAhugJAALADACG7AgIAwQMAIbwCQACwAwAhvQICAMEDACG-AkAAwgMAIb8CQACwAwAhwAJAALADACEDAAAA_gIAIAEAAJADADAkAACRAwAgAwAAAP4CACABAAD_AgAwAgAA-wIAIAkGAAC-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_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_AkAAsAMAIcACQACwAwAh2wJAALADACHpAgEArQMAIeoCAQCtAwAhCZsCAADwAwAwnAIAAIEBABCdAgAA8AMAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAIdsCQAC9AwAh6QIBALoDACHqAgEAugMAIRCbAgAA8QMAMJwCAAB7ABCdAgAA8QMAMLcCAQCtAwAhvwJAALADACHAAkAAsAMAId4CAQCtAwAh6wIBAK0DACHsAgEArQMAIe0CAQDXAwAh7gIBANcDACHvAgEA1wMAIfACQADCAwAh8QJAAMIDACHyAgEA1wMAIfMCAQDXAwAhC5sCAADyAwAwnAIAAGUAEJ0CAADyAwAwtwIBAK0DACG_AkAAsAMAIcACQACwAwAh2wJAALADACHeAgEArQMAIfQCAQCtAwAh9QIBANcDACH2AgEA1wMAIQ-bAgAA8wMAMJwCAABPABCdAgAA8wMAMJ8CAQCtAwAhtwIBAK0DACG4AgEArQMAIb8CQACwAwAhwAJAALADACHgAgEArQMAIfcCIADYAwAh-AIBANcDACH5AgEA1wMAIfoCIADYAwAh-wJAAMIDACH8AgEA1wMAIRIEAAD2AwAgBQAA9wMAIAYAAPgDACCbAgAA9AMAMJwCAAA8ABCdAgAA9AMAMJ8CAQC6AwAhtwIBALoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfcCIADnAwAh-AIBAPUDACH5AgEA9QMAIfoCIADnAwAh-wJAAMwDACH8AgEA9QMAIQujAgEAAAABpAIBAAAABaUCAQAAAAWmAgEAAAABpwIBAAAAAagCAQAAAAGpAgEAAAABqgIBANwDACGxAgEAAAABsgIBAAAAAbMCAQAAAAEDtAIAAAMAILUCAAADACC2AgAAAwAgA7QCAAAHACC1AgAABwAgtgIAAAcAIAO0AgAACwAgtQIAAAsAILYCAAALACAMDgAA-gMAIJsCAAD5AwAwnAIAAC0AEJ0CAAD5AwAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIRUKAACCBAAgDQAAgwQAIA8AAIQEACAQAACFBAAgEQAAhgQAIBIAAIcEACCbAgAAgQQAMJwCAAAbABCdAgAAgQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAh_wIAABsAIIADAAAbACADwgIBAAAAAcMCQAAAAAHEAgEAAAABEA4AAPoDACCbAgAA_AMAMJwCAAApABCdAgAA_AMAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcECAQC6AwAhwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiINDgAA-gMAIJsCAAD9AwAwnAIAACUAEJ0CAAD9AwAwoAIQALsDACG3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHCAgEAygMAIcQCAQD1AwAhxQIBAPUDACHPAgAA_gPPAiPQAiAA5wMAIQSjAgAAAM8CA6QCAAAAzwIJpQIAAADPAgmqAgAA3gPPAiMKDgAA-gMAIJsCAAD_AwAwnAIAACEAEJ0CAAD_AwAwtwIBAMoDACG_AkAAvQMAIcICAQDKAwAhxAIBALoDACHFAgEAugMAIc8CAACABM8CIgSjAgAAAM8CAqQCAAAAzwIIpQIAAADPAgiqAgAA4gPPAiITCgAAggQAIA0AAIMEACAPAACEBAAgEAAAhQQAIBEAAIYEACASAACHBAAgmwIAAIEEADCcAgAAGwAQnQIAAIEEADCfAgEAugMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA9QMAIRQIAACKBAAgCQAA-AMAIAsAAIsEACAMAADoAwAgmwIAAIkEADCcAgAAEQAQnQIAAIkEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAh_wIAABEAIIADAAARACAMDAAA6AMAIJsCAADmAwAwnAIAAN4BABCdAgAA5gMAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0AIgAOcDACHZAgEAugMAIf8CAADeAQAggAMAAN4BACADtAIAACEAILUCAAAhACC2AgAAIQAgA7QCAAAlACC1AgAAJQAgtgIAACUAIAO0AgAAKQAgtQIAACkAILYCAAApACADtAIAAC0AILUCAAAtACC2AgAALQAgDQoAAIIEACCbAgAAiAQAMJwCAAAXABCdAgAAiAQAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIRIIAACKBAAgCQAA-AMAIAsAAIsEACAMAADoAwAgmwIAAIkEADCcAgAAEQAQnQIAAIkEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAhCwYAAL4DACCbAgAAuQMAMJwCAAAPABCdAgAAuQMAMJ4CAQC6AwAhnwIBALoDACGgAhAAuwMAIaECAAC8AwAgogJAAL0DACH_AgAADwAggAMAAA8AIAO0AgAAFwAgtQIAABcAILYCAAAXACAC0wIBAAAAAd4CAQAAAAEJAwAAjwQAIAoAAIIEACCbAgAAjQQAMJwCAAALABCdAgAAjQQAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIgSjAgAAAOACAqQCAAAA4AIIpQIAAADgAgiqAgAA7QPgAiIUBAAA9gMAIAUAAPcDACAGAAD4AwAgmwIAAPQDADCcAgAAPAAQnQIAAPQDADCfAgEAugMAIbcCAQC6AwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh4AIBALoDACH3AiAA5wMAIfgCAQD1AwAh-QIBAPUDACH6AiAA5wMAIfsCQADMAwAh_AIBAPUDACH_AgAAPAAggAMAADwAIBEDAACPBAAgmwIAAJAEADCcAgAABwAQnQIAAJAEADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHeAgEAugMAIesCAQC6AwAh7AIBALoDACHtAgEA9QMAIe4CAQD1AwAh7wIBAPUDACHwAkAAzAMAIfECQADMAwAh8gIBAPUDACHzAgEA9QMAIQwDAACPBAAgmwIAAJEEADCcAgAAAwAQnQIAAJEEADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAId4CAQC6AwAh9AIBALoDACH1AgEA9QMAIfYCAQD1AwAhAAAAAAABhAMBAAAAAQWEAxAAAAABigMQAAAAAYsDEAAAAAGMAxAAAAABjQMQAAAAAQGEA0AAAAABCx8AAJsEADAgAACgBAAwgQMAAJwEADCCAwAAnQQAMIMDAACeBAAghAMAAJ8EADCFAwAAnwQAMIYDAACfBAAwhwMAAJ8EADCIAwAAoQQAMIkDAACiBAAwDQkAAJIFACALAACTBQAgDAAAlAUAILcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAECAAAAEwAgHwAAkQUAIAMAAAATACAfAACRBQAgIAAApgQAIAEYAADmBgAwEggAAIoEACAJAAD4AwAgCwAAiwQAIAwAAOgDACCbAgAAiQQAMJwCAAARABCdAgAAiQQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA9QMAIeMCAQD1AwAh5AIBAPUDACHlAgEA9QMAIeYCAQAAAAHnAgEAugMAIegCAQD1AwAhAgAAABMAIBgAAKYEACACAAAAowQAIBgAAKQEACAOmwIAAKIEADCcAgAAowQAEJ0CAACiBAAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA9QMAIeMCAQD1AwAh5AIBAPUDACHlAgEA9QMAIeYCAQC6AwAh5wIBALoDACHoAgEA9QMAIQ6bAgAAogQAMJwCAACjBAAQnQIAAKIEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAhCrcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAhAYQDAQAAAAENCQAApwQAIAsAAKgEACAMAACpBAAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh4QIBAJcEACHiAgEApQQAIeMCAQClBAAh5AIBAKUEACHlAgEApQQAIeYCAQCXBAAh5wIBAJcEACELHwAAggUAMCAAAIcFADCBAwAAgwUAMIIDAACEBQAwgwMAAIUFACCEAwAAhgUAMIUDAACGBQAwhgMAAIYFADCHAwAAhgUAMIgDAACIBQAwiQMAAIkFADALHwAA9QQAMCAAAPoEADCBAwAA9gQAMIIDAAD3BAAwgwMAAPgEACCEAwAA-QQAMIUDAAD5BAAwhgMAAPkEADCHAwAA-QQAMIgDAAD7BAAwiQMAAPwEADALHwAAqgQAMCAAAK8EADCBAwAAqwQAMIIDAACsBAAwgwMAAK0EACCEAwAArgQAMIUDAACuBAAwhgMAAK4EADCHAwAArgQAMIgDAACwBAAwiQMAALEEADAODQAA8AQAIA8AAPEEACAQAADyBAAgEQAA8wQAIBIAAPQEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAECAAAAHQAgHwAA7wQAIAMAAAAdACAfAADvBAAgIAAAtgQAIAEYAADlBgAwEwoAAIIEACANAACDBAAgDwAAhAQAIBAAAIUEACARAACGBAAgEgAAhwQAIJsCAACBBAAwnAIAABsAEJ0CAACBBAAwnwIBALoDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA9QMAIQIAAAAdACAYAAC2BAAgAgAAALIEACAYAACzBAAgDZsCAACxBAAwnAIAALIEABCdAgAAsQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAhDZsCAACxBAAwnAIAALIEABCdAgAAsQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAhCZ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQWEAwIAAAABigMCAAAAAYsDAgAAAAGMAwIAAAABjQMCAAAAAQGEAyAAAAABDg0AALcEACAPAAC4BAAgEAAAuQQAIBEAALoEACASAAC7BAAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhBR8AANwGACAgAADjBgAggQMAAN0GACCCAwAA4gYAIIcDAADbAQAgCx8AAOIEADAgAADnBAAwgQMAAOMEADCCAwAA5AQAMIMDAADlBAAghAMAAOYEADCFAwAA5gQAMIYDAADmBAAwhwMAAOYEADCIAwAA6AQAMIkDAADpBAAwCx8AANUEADAgAADaBAAwgQMAANYEADCCAwAA1wQAMIMDAADYBAAghAMAANkEADCFAwAA2QQAMIYDAADZBAAwhwMAANkEADCIAwAA2wQAMIkDAADcBAAwCx8AAMgEADAgAADNBAAwgQMAAMkEADCCAwAAygQAMIMDAADLBAAghAMAAMwEADCFAwAAzAQAMIYDAADMBAAwhwMAAMwEADCIAwAAzgQAMIkDAADPBAAwCx8AALwEADAgAADBBAAwgQMAAL0EADCCAwAAvgQAMIMDAAC_BAAghAMAAMAEADCFAwAAwAQAMIYDAADABAAwhwMAAMAEADCIAwAAwgQAMIkDAADDBAAwB7cCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAAB0QJAAAAAAdICAQAAAAECAAAALwAgHwAAxwQAIAMAAAAvACAfAADHBAAgIAAAxgQAIAEYAADhBgAwDA4AAPoDACCbAgAA-QMAMJwCAAAtABCdAgAA-QMAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQIAAAAvACAYAADGBAAgAgAAAMQEACAYAADFBAAgC5sCAADDBAAwnAIAAMQEABCdAgAAwwQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIdECQAC9AwAh0gIBAPUDACELmwIAAMMEADCcAgAAxAQAEJ0CAADDBAAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQe3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAh0QJAAJkEACHSAgEApQQAIQe3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAh0QJAAJkEACHSAgEApQQAIQe3AgEAAAABvwJAAAAAAcACQAAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABC7cCAQAAAAG_AkAAAAABwAJAAAAAAcECAQAAAAHDAkAAAAABxAIBAAAAAcUCAQAAAAHJAgEAAAABygIBAAAAAcsCAQAAAAHNAgAAAMcCAgIAAAArACAfAADUBAAgAwAAACsAIB8AANQEACAgAADTBAAgARgAAOAGADARDgAA-gMAIJsCAAD8AwAwnAIAACkAEJ0CAAD8AwAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHBAgEAAAABwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiL9AgAA-wMAIAIAAAArACAYAADTBAAgAgAAANAEACAYAADRBAAgD5sCAADPBAAwnAIAANAEABCdAgAAzwQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcECAQC6AwAhwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiIPmwIAAM8EADCcAgAA0AQAEJ0CAADPBAAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwQIBALoDACHCAgEAygMAIcMCQAC9AwAhxAIBALoDACHFAgEAugMAIckCAQC6AwAhygIBALoDACHLAgEAugMAIc0CAADTA8cCIgu3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHBAgEAlwQAIcMCQACZBAAhxAIBAJcEACHFAgEAlwQAIckCAQCXBAAhygIBAJcEACHLAgEAlwQAIc0CAADSBMcCIgGEAwAAAMcCAgu3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHBAgEAlwQAIcMCQACZBAAhxAIBAJcEACHFAgEAlwQAIckCAQCXBAAhygIBAJcEACHLAgEAlwQAIc0CAADSBMcCIgu3AgEAAAABvwJAAAAAAcACQAAAAAHBAgEAAAABwwJAAAAAAcQCAQAAAAHFAgEAAAAByQIBAAAAAcoCAQAAAAHLAgEAAAABzQIAAADHAgIIoAIQAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABAgAAACcAIB8AAOEEACADAAAAJwAgHwAA4QQAICAAAOAEACABGAAA3wYAMA0OAAD6AwAgmwIAAP0DADCcAgAAJQAQnQIAAP0DADCgAhAAuwMAIbcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAhzwIAAP4DzwIj0AIgAOcDACECAAAAJwAgGAAA4AQAIAIAAADdBAAgGAAA3gQAIAybAgAA3AQAMJwCAADdBAAQnQIAANwEADCgAhAAuwMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIc8CAAD-A88CI9ACIADnAwAhDJsCAADcBAAwnAIAAN0EABCdAgAA3AQAMKACEAC7AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAhzwIAAP4DzwIj0AIgAOcDACEIoAIQAJgEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAhzwIAAN8EzwIj0AIgALUEACEBhAMAAADPAgMIoAIQAJgEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAhzwIAAN8EzwIj0AIgALUEACEIoAIQAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABBbcCAQAAAAG_AkAAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CAgIAAAAjACAfAADuBAAgAwAAACMAIB8AAO4EACAgAADtBAAgARgAAN4GADAKDgAA-gMAIJsCAAD_AwAwnAIAACEAEJ0CAAD_AwAwtwIBAAAAAb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiAgAAACMAIBgAAO0EACACAAAA6gQAIBgAAOsEACAJmwIAAOkEADCcAgAA6gQAEJ0CAADpBAAwtwIBAMoDACG_AkAAvQMAIcICAQDKAwAhxAIBALoDACHFAgEAugMAIc8CAACABM8CIgmbAgAA6QQAMJwCAADqBAAQnQIAAOkEADC3AgEAygMAIb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiBbcCAQCXBAAhvwJAAJkEACHEAgEAlwQAIcUCAQCXBAAhzwIAAOwEzwIiAYQDAAAAzwICBbcCAQCXBAAhvwJAAJkEACHEAgEAlwQAIcUCAQCXBAAhzwIAAOwEzwIiBbcCAQAAAAG_AkAAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CAg4NAADwBAAgDwAA8QQAIBAAAPIEACARAADzBAAgEgAA9AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHUAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQMfAADcBgAggQMAAN0GACCHAwAA2wEAIAQfAADiBAAwgQMAAOMEADCDAwAA5QQAIIcDAADmBAAwBB8AANUEADCBAwAA1gQAMIMDAADYBAAghwMAANkEADAEHwAAyAQAMIEDAADJBAAwgwMAAMsEACCHAwAAzAQAMAQfAAC8BAAwgQMAAL0EADCDAwAAvwQAIIcDAADABAAwCLcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHaAgEAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAABAgAAABkAIB8AAIEFACADAAAAGQAgHwAAgQUAICAAAIAFACABGAAA2wYAMA0KAACCBAAgmwIAAIgEADCcAgAAFwAQnQIAAIgEADC3AgEAAAABuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAAAAB2wJAAL0DACHcAkAAzAMAId0CQADMAwAhAgAAABkAIBgAAIAFACACAAAA_QQAIBgAAP4EACAMmwIAAPwEADCcAgAA_QQAEJ0CAAD8BAAwtwIBAMoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHTAgEAygMAIdoCAQC6AwAh2wJAAL0DACHcAkAAzAMAId0CQADMAwAhDJsCAAD8BAAwnAIAAP0EABCdAgAA_AQAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIQi3AgEAlwQAIbgCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdoCAQCXBAAh2wJAAJkEACHcAkAA_wQAId0CQAD_BAAhAYQDQAAAAAEItwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHaAgEAlwQAIdsCQACZBAAh3AJAAP8EACHdAkAA_wQAIQi3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAQQDAACQBQAgvwJAAAAAAd4CAQAAAAHgAgAAAOACAgIAAAANACAfAACPBQAgAwAAAA0AIB8AAI8FACAgAACNBQAgARgAANoGADAKAwAAjwQAIAoAAIIEACCbAgAAjQQAMJwCAAALABCdAgAAjQQAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIv4CAACMBAAgAgAAAA0AIBgAAI0FACACAAAAigUAIBgAAIsFACAHmwIAAIkFADCcAgAAigUAEJ0CAACJBQAwvwJAAL0DACHTAgEAygMAId4CAQC6AwAh4AIAAI4E4AIiB5sCAACJBQAwnAIAAIoFABCdAgAAiQUAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIgO_AkAAmQQAId4CAQCXBAAh4AIAAIwF4AIiAYQDAAAA4AICBAMAAI4FACC_AkAAmQQAId4CAQCXBAAh4AIAAIwF4AIiBR8AANUGACAgAADYBgAggQMAANYGACCCAwAA1wYAIIcDAAABACAEAwAAkAUAIL8CQAAAAAHeAgEAAAAB4AIAAADgAgIDHwAA1QYAIIEDAADWBgAghwMAAAEAIA0JAACSBQAgCwAAkwUAIAwAAJQFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAABBB8AAIIFADCBAwAAgwUAMIMDAACFBQAghwMAAIYFADAEHwAA9QQAMIEDAAD2BAAwgwMAAPgEACCHAwAA-QQAMAQfAACqBAAwgQMAAKsEADCDAwAArQQAIIcDAACuBAAwBB8AAJsEADCBAwAAnAQAMIMDAACeBAAghwMAAJ8EADAAAAAAAAAAAAAAAAAABR8AANAGACAgAADTBgAggQMAANEGACCCAwAA0gYAIIcDAAAdACADHwAA0AYAIIEDAADRBgAghwMAAB0AIAAAAAAABR8AAMsGACAgAADOBgAggQMAAMwGACCCAwAAzQYAIIcDAAAdACADHwAAywYAIIEDAADMBgAghwMAAB0AIAAAAAUfAADGBgAgIAAAyQYAIIEDAADHBgAgggMAAMgGACCHAwAAHQAgAx8AAMYGACCBAwAAxwYAIIcDAAAdACAAAAAFHwAAwQYAICAAAMQGACCBAwAAwgYAIIIDAADDBgAghwMAAB0AIAMfAADBBgAggQMAAMIGACCHAwAAHQAgAAAAAAAFHwAAvAYAICAAAL8GACCBAwAAvQYAIIIDAAC-BgAghwMAABMAIAMfAAC8BgAggQMAAL0GACCHAwAAEwAgAAAACx8AAMEFADAgAADFBQAwgQMAAMIFADCCAwAAwwUAMIMDAADEBQAghAMAAK4EADCFAwAArgQAMIYDAACuBAAwhwMAAK4EADCIAwAAxgUAMIkDAACxBAAwDgoAALwFACAPAADxBAAgEAAA8gQAIBEAAPMEACASAAD0BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AAMkFACADAAAAHQAgHwAAyQUAICAAAMgFACABGAAAuwYAMAIAAAAdACAYAADIBQAgAgAAALIEACAYAADHBQAgCZ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ4KAAC7BQAgDwAAuAQAIBAAALkEACARAAC6BAAgEgAAuwQAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ4KAAC8BQAgDwAA8QQAIBAAAPIEACARAADzBAAgEgAA9AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQQfAADBBQAwgQMAAMIFADCDAwAAxAUAIIcDAACuBAAwAAAAAAUfAAC2BgAgIAAAuQYAIIEDAAC3BgAgggMAALgGACCHAwAAEwAgAx8AALYGACCBAwAAtwYAIIcDAAATACAAAAAFHwAAsQYAICAAALQGACCBAwAAsgYAIIIDAACzBgAghwMAABMAIAMfAACxBgAggQMAALIGACCHAwAAEwAgAAAABx8AAKwGACAgAACvBgAggQMAAK0GACCCAwAArgYAIIUDAAAPACCGAwAADwAghwMAAJQDACADHwAArAYAIIEDAACtBgAghwMAAJQDACAAAAAAAAAFHwAApwYAICAAAKoGACCBAwAAqAYAIIIDAACpBgAghwMAAAEAIAMfAACnBgAggQMAAKgGACCHAwAAAQAgAAAABR8AAKIGACAgAAClBgAggQMAAKMGACCCAwAApAYAIIcDAAABACADHwAAogYAIIEDAACjBgAghwMAAAEAIAAAAAsfAACDBgAwIAAAiAYAMIEDAACEBgAwggMAAIUGADCDAwAAhgYAIIQDAACHBgAwhQMAAIcGADCGAwAAhwYAMIcDAACHBgAwiAMAAIkGADCJAwAAigYAMAsfAAD3BQAwIAAA_AUAMIEDAAD4BQAwggMAAPkFADCDAwAA-gUAIIQDAAD7BQAwhQMAAPsFADCGAwAA-wUAMIcDAAD7BQAwiAMAAP0FADCJAwAA_gUAMAsfAADuBQAwIAAA8gUAMIEDAADvBQAwggMAAPAFADCDAwAA8QUAIIQDAACGBQAwhQMAAIYFADCGAwAAhgUAMIcDAACGBQAwiAMAAPMFADCJAwAAiQUAMAQKAADVBQAgvwJAAAAAAdMCAQAAAAHgAgAAAOACAgIAAAANACAfAAD2BQAgAwAAAA0AIB8AAPYFACAgAAD1BQAgARgAAKEGADACAAAADQAgGAAA9QUAIAIAAACKBQAgGAAA9AUAIAO_AkAAmQQAIdMCAQCXBAAh4AIAAIwF4AIiBAoAANQFACC_AkAAmQQAIdMCAQCXBAAh4AIAAIwF4AIiBAoAANUFACC_AkAAAAAB0wIBAAAAAeACAAAA4AICDLcCAQAAAAG_AkAAAAABwAJAAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQIAAAAJACAfAACCBgAgAwAAAAkAIB8AAIIGACAgAACBBgAgARgAAKAGADARAwAAjwQAIJsCAACQBAAwnAIAAAcAEJ0CAACQBAAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHeAgEAugMAIesCAQC6AwAh7AIBALoDACHtAgEA9QMAIe4CAQD1AwAh7wIBAPUDACHwAkAAzAMAIfECQADMAwAh8gIBAPUDACHzAgEA9QMAIQIAAAAJACAYAACBBgAgAgAAAP8FACAYAACABgAgEJsCAAD-BQAwnAIAAP8FABCdAgAA_gUAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAId4CAQC6AwAh6wIBALoDACHsAgEAugMAIe0CAQD1AwAh7gIBAPUDACHvAgEA9QMAIfACQADMAwAh8QJAAMwDACHyAgEA9QMAIfMCAQD1AwAhEJsCAAD-BQAwnAIAAP8FABCdAgAA_gUAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAId4CAQC6AwAh6wIBALoDACHsAgEAugMAIe0CAQD1AwAh7gIBAPUDACHvAgEA9QMAIfACQADMAwAh8QJAAMwDACHyAgEA9QMAIfMCAQD1AwAhDLcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIesCAQCXBAAh7AIBAJcEACHtAgEApQQAIe4CAQClBAAh7wIBAKUEACHwAkAA_wQAIfECQAD_BAAh8gIBAKUEACHzAgEApQQAIQy3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHrAgEAlwQAIewCAQCXBAAh7QIBAKUEACHuAgEApQQAIe8CAQClBAAh8AJAAP8EACHxAkAA_wQAIfICAQClBAAh8wIBAKUEACEMtwIBAAAAAb8CQAAAAAHAAkAAAAAB6wIBAAAAAewCAQAAAAHtAgEAAAAB7gIBAAAAAe8CAQAAAAHwAkAAAAAB8QJAAAAAAfICAQAAAAHzAgEAAAABB7cCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAH0AgEAAAAB9QIBAAAAAfYCAQAAAAECAAAABQAgHwAAjgYAIAMAAAAFACAfAACOBgAgIAAAjQYAIAEYAACfBgAwDAMAAI8EACCbAgAAkQQAMJwCAAADABCdAgAAkQQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIfQCAQAAAAH1AgEA9QMAIfYCAQD1AwAhAgAAAAUAIBgAAI0GACACAAAAiwYAIBgAAIwGACALmwIAAIoGADCcAgAAiwYAEJ0CAACKBgAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIfQCAQC6AwAh9QIBAPUDACH2AgEA9QMAIQubAgAAigYAMJwCAACLBgAQnQIAAIoGADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAId4CAQC6AwAh9AIBALoDACH1AgEA9QMAIfYCAQD1AwAhB7cCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdsCQACZBAAh9AIBAJcEACH1AgEApQQAIfYCAQClBAAhB7cCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdsCQACZBAAh9AIBAJcEACH1AgEApQQAIfYCAQClBAAhB7cCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAH0AgEAAAAB9QIBAAAAAfYCAQAAAAEEHwAAgwYAMIEDAACEBgAwgwMAAIYGACCHAwAAhwYAMAQfAAD3BQAwgQMAAPgFADCDAwAA-gUAIIcDAAD7BQAwBB8AAO4FADCBAwAA7wUAMIMDAADxBQAghwMAAIYFADAAAAAHCgAAlgYAIA0AAJcGACAPAACYBgAgEAAAmQYAIBEAAJoGACASAACbBgAg2AIAAJcFACAJCAAAnAYAIAkAAJQGACALAACdBgAgDAAAywUAIOICAACXBQAg4wIAAJcFACDkAgAAlwUAIOUCAACXBQAg6AIAAJcFACABDAAAywUAIAAAAAABBgAAlgUAIAAHBAAAkgYAIAUAAJMGACAGAACUBgAg-AIAAJcFACD5AgAAlwUAIPsCAACXBQAg_AIAAJcFACAHtwIBAAAAAb8CQAAAAAHAAkAAAAAB2wJAAAAAAfQCAQAAAAH1AgEAAAAB9gIBAAAAAQy3AgEAAAABvwJAAAAAAcACQAAAAAHrAgEAAAAB7AIBAAAAAe0CAQAAAAHuAgEAAAAB7wIBAAAAAfACQAAAAAHxAkAAAAAB8gIBAAAAAfMCAQAAAAEDvwJAAAAAAdMCAQAAAAHgAgAAAOACAg4FAACQBgAgBgAAkQYAIJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQIAAAABACAfAACiBgAgAwAAADwAIB8AAKIGACAgAACmBgAgEAAAADwAIAUAAOwFACAGAADtBQAgGAAApgYAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4FAADsBQAgBgAA7QUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4EAACPBgAgBgAAkQYAIJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQIAAAABACAfAACnBgAgAwAAADwAIB8AAKcGACAgAACrBgAgEAAAADwAIAQAAOsFACAGAADtBQAgGAAAqwYAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4EAADrBQAgBgAA7QUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQWeAgEAAAABnwIBAAAAAaACEAAAAAGhAoAAAAABogJAAAAAAQIAAACUAwAgHwAArAYAIAMAAAAPACAfAACsBgAgIAAAsAYAIAcAAAAPACAYAACwBgAgngIBAJcEACGfAgEAlwQAIaACEACYBAAhoQKAAAAAAaICQACZBAAhBZ4CAQCXBAAhnwIBAJcEACGgAhAAmAQAIaECgAAAAAGiAkAAmQQAIQ4IAADaBQAgCwAAkwUAIAwAAJQFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAQIAAAATACAfAACxBgAgAwAAABEAIB8AALEGACAgAAC1BgAgEAAAABEAIAgAANkFACALAACoBAAgDAAAqQQAIBgAALUGACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHhAgEAlwQAIeICAQClBAAh4wIBAKUEACHkAgEApQQAIeUCAQClBAAh5gIBAJcEACHnAgEAlwQAIegCAQClBAAhDggAANkFACALAACoBAAgDAAAqQQAILcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAh6AIBAKUEACEOCAAA2gUAIAkAAJIFACAMAACUBQAgtwIBAAAAAb8CQAAAAAHAAkAAAAAB4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAegCAQAAAAECAAAAEwAgHwAAtgYAIAMAAAARACAfAAC2BgAgIAAAugYAIBAAAAARACAIAADZBQAgCQAApwQAIAwAAKkEACAYAAC6BgAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh4QIBAJcEACHiAgEApQQAIeMCAQClBAAh5AIBAKUEACHlAgEApQQAIeYCAQCXBAAh5wIBAJcEACHoAgEApQQAIQ4IAADZBQAgCQAApwQAIAwAAKkEACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHhAgEAlwQAIeICAQClBAAh4wIBAKUEACHkAgEApQQAIeUCAQClBAAh5gIBAJcEACHnAgEAlwQAIegCAQClBAAhCZ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQ4IAADaBQAgCQAAkgUAIAsAAJMFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAQIAAAATACAfAAC8BgAgAwAAABEAIB8AALwGACAgAADABgAgEAAAABEAIAgAANkFACAJAACnBAAgCwAAqAQAIBgAAMAGACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHhAgEAlwQAIeICAQClBAAh4wIBAKUEACHkAgEApQQAIeUCAQClBAAh5gIBAJcEACHnAgEAlwQAIegCAQClBAAhDggAANkFACAJAACnBAAgCwAAqAQAILcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAh6AIBAKUEACEPCgAAvAUAIA0AAPAEACAPAADxBAAgEAAA8gQAIBEAAPMEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AAMEGACADAAAAGwAgHwAAwQYAICAAAMUGACARAAAAGwAgCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBEAALoEACAYAADFBgAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACEPCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBEAALoEACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdMCAQCXBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ8KAAC8BQAgDQAA8AQAIBAAAPIEACARAADzBAAgEgAA9AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAECAAAAHQAgHwAAxgYAIAMAAAAbACAfAADGBgAgIAAAygYAIBEAAAAbACAKAAC7BQAgDQAAtwQAIBAAALkEACARAAC6BAAgEgAAuwQAIBgAAMoGACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdMCAQCXBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ8KAAC7BQAgDQAAtwQAIBAAALkEACARAAC6BAAgEgAAuwQAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhDwoAALwFACANAADwBAAgDwAA8QQAIBEAAPMEACASAAD0BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHUAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQIAAAAdACAfAADLBgAgAwAAABsAIB8AAMsGACAgAADPBgAgEQAAABsAIAoAALsFACANAAC3BAAgDwAAuAQAIBEAALoEACASAAC7BAAgGAAAzwYAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhDwoAALsFACANAAC3BAAgDwAAuAQAIBEAALoEACASAAC7BAAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACEPCgAAvAUAIA0AAPAEACAPAADxBAAgEAAA8gQAIBIAAPQEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AANAGACADAAAAGwAgHwAA0AYAICAAANQGACARAAAAGwAgCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBIAALsEACAYAADUBgAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACEPCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBIAALsEACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdMCAQCXBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ4EAACPBgAgBQAAkAYAIJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQIAAAABACAfAADVBgAgAwAAADwAIB8AANUGACAgAADZBgAgEAAAADwAIAQAAOsFACAFAADsBQAgGAAA2QYAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4EAADrBQAgBQAA7AUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQO_AkAAAAAB3gIBAAAAAeACAAAA4AICCLcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHaAgEAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAABBp8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHQAiAAAAAB2QIBAAAAAQIAAADbAQAgHwAA3AYAIAW3AgEAAAABvwJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgIIoAIQAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABC7cCAQAAAAG_AkAAAAABwAJAAAAAAcECAQAAAAHDAkAAAAABxAIBAAAAAcUCAQAAAAHJAgEAAAABygIBAAAAAcsCAQAAAAHNAgAAAMcCAge3AgEAAAABvwJAAAAAAcACQAAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABAwAAAN4BACAfAADcBgAgIAAA5AYAIAgAAADeAQAgGAAA5AYAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0AIgALUEACHZAgEAlwQAIQafAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdACIAC1BAAh2QIBAJcEACEJnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABCrcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAEEBAYCBQoDBg4EBwASAQMAAQEDAAECAwABCgAFBQcAEQgQBgkWBAsaCAweCQIGFAUHAAcBBhUAAQoABQcHABAKAAUNAAoPJAwQKA0RLA4SMA8CBwALDB8JAQwgAAEOAAkBDgAJAQ4ACQEOAAkEDzEAEDIAETMAEjQAAwk1AAs2AAw3AAMEOAAFOQAGOgAAAAADBwAXJQAYJgAZAAAAAwcAFyUAGCYAGQEDAAEBAwABAwcAHiUAHyYAIAAAAAMHAB4lAB8mACABAwABAQMAAQMHACUlACYmACcAAAADBwAlJQAmJgAnAAAAAwcALSUALiYALwAAAAMHAC0lAC4mAC8BCKEBBgEIpwEGAwcANCUANSYANgAAAAMHADQlADUmADYCAwABCgAFAgMAAQoABQMHADslADwmAD0AAAADBwA7JQA8JgA9AQoABQEKAAUDBwBCJQBDJgBEAAAAAwcAQiUAQyYARAAAAwcASSUASiYASwAAAAMHAEklAEomAEsCCgAFDQAKAgoABQ0ACgUHAFAlAFMmAFSnAQBRqAEAUgAAAAAABQcAUCUAUyYAVKcBAFGoAQBSAQ4ACQEOAAkDBwBZJQBaJgBbAAAAAwcAWSUAWiYAWwEOAAkBDgAJAwcAYCUAYSYAYgAAAAMHAGAlAGEmAGIBDgAJAQ4ACQUHAGclAGomAGunAQBoqAEAaQAAAAAABQcAZyUAaiYAa6cBAGioAQBpAQ4ACQEOAAkDBwBwJQBxJgByAAAAAwcAcCUAcSYAcgAAAAMHAHglAHkmAHoAAAADBwB4JQB5JgB6AAAABQcAgAElAIMBJgCEAacBAIEBqAEAggEAAAAAAAUHAIABJQCDASYAhAGnAQCBAagBAIIBAAAFBwCJASUAjAEmAI0BpwEAigGoAQCLAQAAAAAABQcAiQElAIwBJgCNAacBAIoBqAEAiwETAgEUOwEVPgEWPwEXQAEZQgEaRBMbRRQcRwEdSRMeShUhSwEiTAEjTRMnUBYoURopUgIqUwIrVAIsVQItVgIuWAIvWhMwWxsxXQIyXxMzYBw0YQI1YgI2YxM3Zh04ZyE5aAM6aQM7agM8awM9bAM-bgM_cBNAcSJBcwNCdRNDdiNEdwNFeANGeRNHfCRIfShJfylKgAEpS4MBKUyEASlNhQEpTocBKU-JARNQigEqUYwBKVKOARNTjwErVJABKVWRASlWkgETV5UBLFiWATBZlwEFWpgBBVuZAQVcmgEFXZsBBV6dAQVfnwETYKABMWGjAQVipQETY6YBMmSoAQVlqQEFZqoBE2etATNorgE3aa8BBGqwAQRrsQEEbLIBBG2zAQRutQEEb7cBE3C4AThxugEEcrwBE3O9ATl0vgEEdb8BBHbAARN3wwE6eMQBPnnFAQh6xgEIe8cBCHzIAQh9yQEIfssBCH_NAROAAc4BP4EB0AEIggHSARODAdMBQIQB1AEIhQHVAQiGAdYBE4cB2QFBiAHaAUWJAdwBCooB3QEKiwHgAQqMAeEBCo0B4gEKjgHkAQqPAeYBE5AB5wFGkQHpAQqSAesBE5MB7AFHlAHtAQqVAe4BCpYB7wETlwHyAUiYAfMBTJkB9AEJmgH1AQmbAfYBCZwB9wEJnQH4AQmeAfoBCZ8B_AEToAH9AU2hAf8BCaIBgQITowGCAk6kAYMCCaUBhAIJpgGFAhOpAYgCT6oBiQJVqwGKAg-sAYsCD60BjAIPrgGNAg-vAY4CD7ABkAIPsQGSAhOyAZMCVrMBlQIPtAGXAhO1AZgCV7YBmQIPtwGaAg-4AZsCE7kBngJYugGfAly7AaACDLwBoQIMvQGiAgy-AaMCDL8BpAIMwAGmAgzBAagCE8IBqQJdwwGrAgzEAa0CE8UBrgJexgGvAgzHAbACDMgBsQITyQG0Al_KAbUCY8sBtgINzAG3Ag3NAbgCDc4BuQINzwG6Ag3QAbwCDdEBvgIT0gG_AmTTAcECDdQBwwIT1QHEAmXWAcUCDdcBxgIN2AHHAhPZAcoCZtoBywJs2wHMAg7cAc0CDt0BzgIO3gHPAg7fAdACDuAB0gIO4QHUAhPiAdUCbeMB1wIO5AHZAhPlAdoCbuYB2wIO5wHcAg7oAd0CE-kB4AJv6gHhAnPrAeMCdOwB5AJ07QHnAnTuAegCdO8B6QJ08AHrAnTxAe0CE_IB7gJ18wHwAnT0AfICE_UB8wJ29gH0AnT3AfUCdPgB9gIT-QH5Anf6AfoCe_sB_AJ8_AH9Anz9AYADfP4BgQN8_wGCA3yAAoQDfIEChgMTggKHA32DAokDfIQCiwMThQKMA36GAo0DfIcCjgN8iAKPAxOJApIDf4oCkwOFAYsClQMGjAKWAwaNApgDBo4CmQMGjwKaAwaQApwDBpECngMTkgKfA4YBkwKhAwaUAqMDE5UCpAOHAZYCpQMGlwKmAwaYAqcDE5kCqgOIAZoCqwOOAQ" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -278,6 +278,16 @@ export interface PrismaClient< */ get court(): Prisma.CourtDelegate; + /** + * `prisma.courtMaintenance`: Exposes CRUD operations for the **CourtMaintenance** model. + * Example usage: + * ```ts + * // Fetch zero or more CourtMaintenances + * const courtMaintenances = await prisma.courtMaintenance.findMany() + * ``` + */ + get courtMaintenance(): Prisma.CourtMaintenanceDelegate; + /** * `prisma.courtAvailability`: Exposes CRUD operations for the **CourtAvailability** model. * Example usage: diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts index 7eebafc..dc47dc3 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts @@ -393,6 +393,7 @@ export const ModelName = { ComplexInvitation: 'ComplexInvitation', Sport: 'Sport', Court: 'Court', + CourtMaintenance: 'CourtMaintenance', CourtAvailability: 'CourtAvailability', CourtPriceRule: 'CourtPriceRule', CourtBooking: 'CourtBooking', @@ -414,7 +415,7 @@ export type TypeMap + fields: Prisma.CourtMaintenanceFieldRefs + operations: { + findUnique: { + args: Prisma.CourtMaintenanceFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.CourtMaintenanceFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.CourtMaintenanceFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.CourtMaintenanceFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.CourtMaintenanceFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.CourtMaintenanceCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.CourtMaintenanceCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.CourtMaintenanceCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.CourtMaintenanceDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.CourtMaintenanceUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.CourtMaintenanceDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.CourtMaintenanceUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.CourtMaintenanceUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.CourtMaintenanceUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.CourtMaintenanceAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.CourtMaintenanceGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.CourtMaintenanceCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } CourtAvailability: { payload: Prisma.$CourtAvailabilityPayload fields: Prisma.CourtAvailabilityFieldRefs @@ -1574,6 +1649,9 @@ export const UserScalarFieldEnum = { emailVerified: 'emailVerified', image: 'image', phone: 'phone', + banned: 'banned', + bannedAt: 'bannedAt', + banReason: 'banReason', createdAt: 'createdAt', updatedAt: 'updatedAt', role: 'role' @@ -1688,6 +1766,8 @@ export const CourtScalarFieldEnum = { name: 'name', slotDurationMinutes: 'slotDurationMinutes', basePrice: 'basePrice', + isUnderMaintenance: 'isUnderMaintenance', + maintenanceReason: 'maintenanceReason', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const @@ -1695,6 +1775,20 @@ export const CourtScalarFieldEnum = { export type CourtScalarFieldEnum = (typeof CourtScalarFieldEnum)[keyof typeof CourtScalarFieldEnum] +export const CourtMaintenanceScalarFieldEnum = { + id: 'id', + courtId: 'courtId', + startDate: 'startDate', + startTime: 'startTime', + endTime: 'endTime', + reason: 'reason', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CourtMaintenanceScalarFieldEnum = (typeof CourtMaintenanceScalarFieldEnum)[keyof typeof CourtMaintenanceScalarFieldEnum] + + export const CourtAvailabilityScalarFieldEnum = { id: 'id', courtId: 'courtId', @@ -2067,6 +2161,7 @@ export type GlobalOmitConfig = { complexInvitation?: Prisma.ComplexInvitationOmit sport?: Prisma.SportOmit court?: Prisma.CourtOmit + courtMaintenance?: Prisma.CourtMaintenanceOmit courtAvailability?: Prisma.CourtAvailabilityOmit courtPriceRule?: Prisma.CourtPriceRuleOmit courtBooking?: Prisma.CourtBookingOmit diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts index 51b012f..3cee369 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -60,6 +60,7 @@ export const ModelName = { ComplexInvitation: 'ComplexInvitation', Sport: 'Sport', Court: 'Court', + CourtMaintenance: 'CourtMaintenance', CourtAvailability: 'CourtAvailability', CourtPriceRule: 'CourtPriceRule', CourtBooking: 'CourtBooking', @@ -91,6 +92,9 @@ export const UserScalarFieldEnum = { emailVerified: 'emailVerified', image: 'image', phone: 'phone', + banned: 'banned', + bannedAt: 'bannedAt', + banReason: 'banReason', createdAt: 'createdAt', updatedAt: 'updatedAt', role: 'role' @@ -205,6 +209,8 @@ export const CourtScalarFieldEnum = { name: 'name', slotDurationMinutes: 'slotDurationMinutes', basePrice: 'basePrice', + isUnderMaintenance: 'isUnderMaintenance', + maintenanceReason: 'maintenanceReason', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const @@ -212,6 +218,20 @@ export const CourtScalarFieldEnum = { export type CourtScalarFieldEnum = (typeof CourtScalarFieldEnum)[keyof typeof CourtScalarFieldEnum] +export const CourtMaintenanceScalarFieldEnum = { + id: 'id', + courtId: 'courtId', + startDate: 'startDate', + startTime: 'startTime', + endTime: 'endTime', + reason: 'reason', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CourtMaintenanceScalarFieldEnum = (typeof CourtMaintenanceScalarFieldEnum)[keyof typeof CourtMaintenanceScalarFieldEnum] + + export const CourtAvailabilityScalarFieldEnum = { id: 'id', courtId: 'courtId', diff --git a/apps/backend/src/generated/prisma/models.ts b/apps/backend/src/generated/prisma/models.ts index 90f253a..72a2f70 100644 --- a/apps/backend/src/generated/prisma/models.ts +++ b/apps/backend/src/generated/prisma/models.ts @@ -17,6 +17,7 @@ export type * from './models/ComplexUser' export type * from './models/ComplexInvitation' export type * from './models/Sport' export type * from './models/Court' +export type * from './models/CourtMaintenance' export type * from './models/CourtAvailability' export type * from './models/CourtPriceRule' export type * from './models/CourtBooking' diff --git a/apps/backend/src/generated/prisma/models/Court.ts b/apps/backend/src/generated/prisma/models/Court.ts index fc388ba..7607fef 100644 --- a/apps/backend/src/generated/prisma/models/Court.ts +++ b/apps/backend/src/generated/prisma/models/Court.ts @@ -43,6 +43,8 @@ export type CourtMinAggregateOutputType = { name: string | null slotDurationMinutes: number | null basePrice: runtime.Decimal | null + isUnderMaintenance: boolean | null + maintenanceReason: string | null createdAt: Date | null updatedAt: Date | null } @@ -54,6 +56,8 @@ export type CourtMaxAggregateOutputType = { name: string | null slotDurationMinutes: number | null basePrice: runtime.Decimal | null + isUnderMaintenance: boolean | null + maintenanceReason: string | null createdAt: Date | null updatedAt: Date | null } @@ -65,6 +69,8 @@ export type CourtCountAggregateOutputType = { name: number slotDurationMinutes: number basePrice: number + isUnderMaintenance: number + maintenanceReason: number createdAt: number updatedAt: number _all: number @@ -88,6 +94,8 @@ export type CourtMinAggregateInputType = { name?: true slotDurationMinutes?: true basePrice?: true + isUnderMaintenance?: true + maintenanceReason?: true createdAt?: true updatedAt?: true } @@ -99,6 +107,8 @@ export type CourtMaxAggregateInputType = { name?: true slotDurationMinutes?: true basePrice?: true + isUnderMaintenance?: true + maintenanceReason?: true createdAt?: true updatedAt?: true } @@ -110,6 +120,8 @@ export type CourtCountAggregateInputType = { name?: true slotDurationMinutes?: true basePrice?: true + isUnderMaintenance?: true + maintenanceReason?: true createdAt?: true updatedAt?: true _all?: true @@ -208,6 +220,8 @@ export type CourtGroupByOutputType = { name: string slotDurationMinutes: number basePrice: runtime.Decimal + isUnderMaintenance: boolean + maintenanceReason: string | null createdAt: Date updatedAt: Date _count: CourtCountAggregateOutputType | null @@ -242,6 +256,8 @@ export type CourtWhereInput = { name?: Prisma.StringFilter<"Court"> | string slotDurationMinutes?: Prisma.IntFilter<"Court"> | number basePrice?: Prisma.DecimalFilter<"Court"> | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFilter<"Court"> | boolean + maintenanceReason?: Prisma.StringNullableFilter<"Court"> | string | null createdAt?: Prisma.DateTimeFilter<"Court"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Court"> | Date | string complex?: Prisma.XOR @@ -249,6 +265,7 @@ export type CourtWhereInput = { availabilities?: Prisma.CourtAvailabilityListRelationFilter priceRules?: Prisma.CourtPriceRuleListRelationFilter bookings?: Prisma.CourtBookingListRelationFilter + maintenances?: Prisma.CourtMaintenanceListRelationFilter } export type CourtOrderByWithRelationInput = { @@ -258,6 +275,8 @@ export type CourtOrderByWithRelationInput = { name?: Prisma.SortOrder slotDurationMinutes?: Prisma.SortOrder basePrice?: Prisma.SortOrder + isUnderMaintenance?: Prisma.SortOrder + maintenanceReason?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder complex?: Prisma.ComplexOrderByWithRelationInput @@ -265,6 +284,7 @@ export type CourtOrderByWithRelationInput = { availabilities?: Prisma.CourtAvailabilityOrderByRelationAggregateInput priceRules?: Prisma.CourtPriceRuleOrderByRelationAggregateInput bookings?: Prisma.CourtBookingOrderByRelationAggregateInput + maintenances?: Prisma.CourtMaintenanceOrderByRelationAggregateInput } export type CourtWhereUniqueInput = Prisma.AtLeast<{ @@ -277,6 +297,8 @@ export type CourtWhereUniqueInput = Prisma.AtLeast<{ name?: Prisma.StringFilter<"Court"> | string slotDurationMinutes?: Prisma.IntFilter<"Court"> | number basePrice?: Prisma.DecimalFilter<"Court"> | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFilter<"Court"> | boolean + maintenanceReason?: Prisma.StringNullableFilter<"Court"> | string | null createdAt?: Prisma.DateTimeFilter<"Court"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Court"> | Date | string complex?: Prisma.XOR @@ -284,6 +306,7 @@ export type CourtWhereUniqueInput = Prisma.AtLeast<{ availabilities?: Prisma.CourtAvailabilityListRelationFilter priceRules?: Prisma.CourtPriceRuleListRelationFilter bookings?: Prisma.CourtBookingListRelationFilter + maintenances?: Prisma.CourtMaintenanceListRelationFilter }, "id"> export type CourtOrderByWithAggregationInput = { @@ -293,6 +316,8 @@ export type CourtOrderByWithAggregationInput = { name?: Prisma.SortOrder slotDurationMinutes?: Prisma.SortOrder basePrice?: Prisma.SortOrder + isUnderMaintenance?: Prisma.SortOrder + maintenanceReason?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder _count?: Prisma.CourtCountOrderByAggregateInput @@ -312,6 +337,8 @@ export type CourtScalarWhereWithAggregatesInput = { name?: Prisma.StringWithAggregatesFilter<"Court"> | string slotDurationMinutes?: Prisma.IntWithAggregatesFilter<"Court"> | number basePrice?: Prisma.DecimalWithAggregatesFilter<"Court"> | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolWithAggregatesFilter<"Court"> | boolean + maintenanceReason?: Prisma.StringNullableWithAggregatesFilter<"Court"> | string | null createdAt?: Prisma.DateTimeWithAggregatesFilter<"Court"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Court"> | Date | string } @@ -321,6 +348,8 @@ export type CourtCreateInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string complex: Prisma.ComplexCreateNestedOneWithoutCourtsInput @@ -328,6 +357,7 @@ export type CourtCreateInput = { availabilities?: Prisma.CourtAvailabilityCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceCreateNestedManyWithoutCourtInput } export type CourtUncheckedCreateInput = { @@ -337,11 +367,14 @@ export type CourtUncheckedCreateInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string availabilities?: Prisma.CourtAvailabilityUncheckedCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleUncheckedCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingUncheckedCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceUncheckedCreateNestedManyWithoutCourtInput } export type CourtUpdateInput = { @@ -349,6 +382,8 @@ export type CourtUpdateInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string complex?: Prisma.ComplexUpdateOneRequiredWithoutCourtsNestedInput @@ -356,6 +391,7 @@ export type CourtUpdateInput = { availabilities?: Prisma.CourtAvailabilityUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateInput = { @@ -365,11 +401,14 @@ export type CourtUncheckedUpdateInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string availabilities?: Prisma.CourtAvailabilityUncheckedUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUncheckedUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUncheckedUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUncheckedUpdateManyWithoutCourtNestedInput } export type CourtCreateManyInput = { @@ -379,6 +418,8 @@ export type CourtCreateManyInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string } @@ -388,6 +429,8 @@ export type CourtUpdateManyMutationInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -399,6 +442,8 @@ export type CourtUncheckedUpdateManyInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -420,6 +465,8 @@ export type CourtCountOrderByAggregateInput = { name?: Prisma.SortOrder slotDurationMinutes?: Prisma.SortOrder basePrice?: Prisma.SortOrder + isUnderMaintenance?: Prisma.SortOrder + maintenanceReason?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -436,6 +483,8 @@ export type CourtMaxOrderByAggregateInput = { name?: Prisma.SortOrder slotDurationMinutes?: Prisma.SortOrder basePrice?: Prisma.SortOrder + isUnderMaintenance?: Prisma.SortOrder + maintenanceReason?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -447,6 +496,8 @@ export type CourtMinOrderByAggregateInput = { name?: Prisma.SortOrder slotDurationMinutes?: Prisma.SortOrder basePrice?: Prisma.SortOrder + isUnderMaintenance?: Prisma.SortOrder + maintenanceReason?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -561,6 +612,20 @@ export type DecimalFieldUpdateOperationsInput = { divide?: runtime.Decimal | runtime.DecimalJsLike | number | string } +export type CourtCreateNestedOneWithoutMaintenancesInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.CourtCreateOrConnectWithoutMaintenancesInput + connect?: Prisma.CourtWhereUniqueInput +} + +export type CourtUpdateOneRequiredWithoutMaintenancesNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.CourtCreateOrConnectWithoutMaintenancesInput + upsert?: Prisma.CourtUpsertWithoutMaintenancesInput + connect?: Prisma.CourtWhereUniqueInput + update?: Prisma.XOR, Prisma.CourtUncheckedUpdateWithoutMaintenancesInput> +} + export type CourtCreateNestedOneWithoutAvailabilitiesInput = { create?: Prisma.XOR connectOrCreate?: Prisma.CourtCreateOrConnectWithoutAvailabilitiesInput @@ -608,12 +673,15 @@ export type CourtCreateWithoutComplexInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string sport: Prisma.SportCreateNestedOneWithoutCourtsInput availabilities?: Prisma.CourtAvailabilityCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceCreateNestedManyWithoutCourtInput } export type CourtUncheckedCreateWithoutComplexInput = { @@ -622,11 +690,14 @@ export type CourtUncheckedCreateWithoutComplexInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string availabilities?: Prisma.CourtAvailabilityUncheckedCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleUncheckedCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingUncheckedCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceUncheckedCreateNestedManyWithoutCourtInput } export type CourtCreateOrConnectWithoutComplexInput = { @@ -665,6 +736,8 @@ export type CourtScalarWhereInput = { name?: Prisma.StringFilter<"Court"> | string slotDurationMinutes?: Prisma.IntFilter<"Court"> | number basePrice?: Prisma.DecimalFilter<"Court"> | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFilter<"Court"> | boolean + maintenanceReason?: Prisma.StringNullableFilter<"Court"> | string | null createdAt?: Prisma.DateTimeFilter<"Court"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Court"> | Date | string } @@ -674,12 +747,15 @@ export type CourtCreateWithoutSportInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string complex: Prisma.ComplexCreateNestedOneWithoutCourtsInput availabilities?: Prisma.CourtAvailabilityCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceCreateNestedManyWithoutCourtInput } export type CourtUncheckedCreateWithoutSportInput = { @@ -688,11 +764,14 @@ export type CourtUncheckedCreateWithoutSportInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string availabilities?: Prisma.CourtAvailabilityUncheckedCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleUncheckedCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingUncheckedCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceUncheckedCreateNestedManyWithoutCourtInput } export type CourtCreateOrConnectWithoutSportInput = { @@ -721,17 +800,100 @@ export type CourtUpdateManyWithWhereWithoutSportInput = { data: Prisma.XOR } +export type CourtCreateWithoutMaintenancesInput = { + id: string + name: string + slotDurationMinutes: number + basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null + createdAt?: Date | string + updatedAt?: Date | string + complex: Prisma.ComplexCreateNestedOneWithoutCourtsInput + sport: Prisma.SportCreateNestedOneWithoutCourtsInput + availabilities?: Prisma.CourtAvailabilityCreateNestedManyWithoutCourtInput + priceRules?: Prisma.CourtPriceRuleCreateNestedManyWithoutCourtInput + bookings?: Prisma.CourtBookingCreateNestedManyWithoutCourtInput +} + +export type CourtUncheckedCreateWithoutMaintenancesInput = { + id: string + complexId: string + sportId: string + name: string + slotDurationMinutes: number + basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null + createdAt?: Date | string + updatedAt?: Date | string + availabilities?: Prisma.CourtAvailabilityUncheckedCreateNestedManyWithoutCourtInput + priceRules?: Prisma.CourtPriceRuleUncheckedCreateNestedManyWithoutCourtInput + bookings?: Prisma.CourtBookingUncheckedCreateNestedManyWithoutCourtInput +} + +export type CourtCreateOrConnectWithoutMaintenancesInput = { + where: Prisma.CourtWhereUniqueInput + create: Prisma.XOR +} + +export type CourtUpsertWithoutMaintenancesInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.CourtWhereInput +} + +export type CourtUpdateToOneWithWhereWithoutMaintenancesInput = { + where?: Prisma.CourtWhereInput + data: Prisma.XOR +} + +export type CourtUpdateWithoutMaintenancesInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number + basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + complex?: Prisma.ComplexUpdateOneRequiredWithoutCourtsNestedInput + sport?: Prisma.SportUpdateOneRequiredWithoutCourtsNestedInput + availabilities?: Prisma.CourtAvailabilityUpdateManyWithoutCourtNestedInput + priceRules?: Prisma.CourtPriceRuleUpdateManyWithoutCourtNestedInput + bookings?: Prisma.CourtBookingUpdateManyWithoutCourtNestedInput +} + +export type CourtUncheckedUpdateWithoutMaintenancesInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + complexId?: Prisma.StringFieldUpdateOperationsInput | string + sportId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number + basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + availabilities?: Prisma.CourtAvailabilityUncheckedUpdateManyWithoutCourtNestedInput + priceRules?: Prisma.CourtPriceRuleUncheckedUpdateManyWithoutCourtNestedInput + bookings?: Prisma.CourtBookingUncheckedUpdateManyWithoutCourtNestedInput +} + export type CourtCreateWithoutAvailabilitiesInput = { id: string name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string complex: Prisma.ComplexCreateNestedOneWithoutCourtsInput sport: Prisma.SportCreateNestedOneWithoutCourtsInput priceRules?: Prisma.CourtPriceRuleCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceCreateNestedManyWithoutCourtInput } export type CourtUncheckedCreateWithoutAvailabilitiesInput = { @@ -741,10 +903,13 @@ export type CourtUncheckedCreateWithoutAvailabilitiesInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string priceRules?: Prisma.CourtPriceRuleUncheckedCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingUncheckedCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceUncheckedCreateNestedManyWithoutCourtInput } export type CourtCreateOrConnectWithoutAvailabilitiesInput = { @@ -768,12 +933,15 @@ export type CourtUpdateWithoutAvailabilitiesInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string complex?: Prisma.ComplexUpdateOneRequiredWithoutCourtsNestedInput sport?: Prisma.SportUpdateOneRequiredWithoutCourtsNestedInput priceRules?: Prisma.CourtPriceRuleUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateWithoutAvailabilitiesInput = { @@ -783,10 +951,13 @@ export type CourtUncheckedUpdateWithoutAvailabilitiesInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string priceRules?: Prisma.CourtPriceRuleUncheckedUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUncheckedUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUncheckedUpdateManyWithoutCourtNestedInput } export type CourtCreateWithoutPriceRulesInput = { @@ -794,12 +965,15 @@ export type CourtCreateWithoutPriceRulesInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string complex: Prisma.ComplexCreateNestedOneWithoutCourtsInput sport: Prisma.SportCreateNestedOneWithoutCourtsInput availabilities?: Prisma.CourtAvailabilityCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceCreateNestedManyWithoutCourtInput } export type CourtUncheckedCreateWithoutPriceRulesInput = { @@ -809,10 +983,13 @@ export type CourtUncheckedCreateWithoutPriceRulesInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string availabilities?: Prisma.CourtAvailabilityUncheckedCreateNestedManyWithoutCourtInput bookings?: Prisma.CourtBookingUncheckedCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceUncheckedCreateNestedManyWithoutCourtInput } export type CourtCreateOrConnectWithoutPriceRulesInput = { @@ -836,12 +1013,15 @@ export type CourtUpdateWithoutPriceRulesInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string complex?: Prisma.ComplexUpdateOneRequiredWithoutCourtsNestedInput sport?: Prisma.SportUpdateOneRequiredWithoutCourtsNestedInput availabilities?: Prisma.CourtAvailabilityUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateWithoutPriceRulesInput = { @@ -851,10 +1031,13 @@ export type CourtUncheckedUpdateWithoutPriceRulesInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string availabilities?: Prisma.CourtAvailabilityUncheckedUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUncheckedUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUncheckedUpdateManyWithoutCourtNestedInput } export type CourtCreateWithoutBookingsInput = { @@ -862,12 +1045,15 @@ export type CourtCreateWithoutBookingsInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string complex: Prisma.ComplexCreateNestedOneWithoutCourtsInput sport: Prisma.SportCreateNestedOneWithoutCourtsInput availabilities?: Prisma.CourtAvailabilityCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceCreateNestedManyWithoutCourtInput } export type CourtUncheckedCreateWithoutBookingsInput = { @@ -877,10 +1063,13 @@ export type CourtUncheckedCreateWithoutBookingsInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string availabilities?: Prisma.CourtAvailabilityUncheckedCreateNestedManyWithoutCourtInput priceRules?: Prisma.CourtPriceRuleUncheckedCreateNestedManyWithoutCourtInput + maintenances?: Prisma.CourtMaintenanceUncheckedCreateNestedManyWithoutCourtInput } export type CourtCreateOrConnectWithoutBookingsInput = { @@ -904,12 +1093,15 @@ export type CourtUpdateWithoutBookingsInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string complex?: Prisma.ComplexUpdateOneRequiredWithoutCourtsNestedInput sport?: Prisma.SportUpdateOneRequiredWithoutCourtsNestedInput availabilities?: Prisma.CourtAvailabilityUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateWithoutBookingsInput = { @@ -919,10 +1111,13 @@ export type CourtUncheckedUpdateWithoutBookingsInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string availabilities?: Prisma.CourtAvailabilityUncheckedUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUncheckedUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUncheckedUpdateManyWithoutCourtNestedInput } export type CourtCreateManyComplexInput = { @@ -931,6 +1126,8 @@ export type CourtCreateManyComplexInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string } @@ -940,12 +1137,15 @@ export type CourtUpdateWithoutComplexInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string sport?: Prisma.SportUpdateOneRequiredWithoutCourtsNestedInput availabilities?: Prisma.CourtAvailabilityUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateWithoutComplexInput = { @@ -954,11 +1154,14 @@ export type CourtUncheckedUpdateWithoutComplexInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string availabilities?: Prisma.CourtAvailabilityUncheckedUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUncheckedUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUncheckedUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUncheckedUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateManyWithoutComplexInput = { @@ -967,6 +1170,8 @@ export type CourtUncheckedUpdateManyWithoutComplexInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -977,6 +1182,8 @@ export type CourtCreateManySportInput = { name: string slotDurationMinutes: number basePrice: runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: boolean + maintenanceReason?: string | null createdAt?: Date | string updatedAt?: Date | string } @@ -986,12 +1193,15 @@ export type CourtUpdateWithoutSportInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string complex?: Prisma.ComplexUpdateOneRequiredWithoutCourtsNestedInput availabilities?: Prisma.CourtAvailabilityUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateWithoutSportInput = { @@ -1000,11 +1210,14 @@ export type CourtUncheckedUpdateWithoutSportInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string availabilities?: Prisma.CourtAvailabilityUncheckedUpdateManyWithoutCourtNestedInput priceRules?: Prisma.CourtPriceRuleUncheckedUpdateManyWithoutCourtNestedInput bookings?: Prisma.CourtBookingUncheckedUpdateManyWithoutCourtNestedInput + maintenances?: Prisma.CourtMaintenanceUncheckedUpdateManyWithoutCourtNestedInput } export type CourtUncheckedUpdateManyWithoutSportInput = { @@ -1013,6 +1226,8 @@ export type CourtUncheckedUpdateManyWithoutSportInput = { name?: Prisma.StringFieldUpdateOperationsInput | string slotDurationMinutes?: Prisma.IntFieldUpdateOperationsInput | number basePrice?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + isUnderMaintenance?: Prisma.BoolFieldUpdateOperationsInput | boolean + maintenanceReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -1026,12 +1241,14 @@ export type CourtCountOutputType = { availabilities: number priceRules: number bookings: number + maintenances: number } export type CourtCountOutputTypeSelect = { availabilities?: boolean | CourtCountOutputTypeCountAvailabilitiesArgs priceRules?: boolean | CourtCountOutputTypeCountPriceRulesArgs bookings?: boolean | CourtCountOutputTypeCountBookingsArgs + maintenances?: boolean | CourtCountOutputTypeCountMaintenancesArgs } /** @@ -1065,6 +1282,13 @@ export type CourtCountOutputTypeCountBookingsArgs = { + where?: Prisma.CourtMaintenanceWhereInput +} + export type CourtSelect = runtime.Types.Extensions.GetSelect<{ id?: boolean @@ -1073,6 +1297,8 @@ export type CourtSelect @@ -1080,6 +1306,7 @@ export type CourtSelect priceRules?: boolean | Prisma.Court$priceRulesArgs bookings?: boolean | Prisma.Court$bookingsArgs + maintenances?: boolean | Prisma.Court$maintenancesArgs _count?: boolean | Prisma.CourtCountOutputTypeDefaultArgs }, ExtArgs["result"]["court"]> @@ -1090,6 +1317,8 @@ export type CourtSelectCreateManyAndReturn @@ -1103,6 +1332,8 @@ export type CourtSelectUpdateManyAndReturn @@ -1116,17 +1347,20 @@ export type CourtSelectScalar = { name?: boolean slotDurationMinutes?: boolean basePrice?: boolean + isUnderMaintenance?: boolean + maintenanceReason?: boolean createdAt?: boolean updatedAt?: boolean } -export type CourtOmit = runtime.Types.Extensions.GetOmit<"id" | "complexId" | "sportId" | "name" | "slotDurationMinutes" | "basePrice" | "createdAt" | "updatedAt", ExtArgs["result"]["court"]> +export type CourtOmit = runtime.Types.Extensions.GetOmit<"id" | "complexId" | "sportId" | "name" | "slotDurationMinutes" | "basePrice" | "isUnderMaintenance" | "maintenanceReason" | "createdAt" | "updatedAt", ExtArgs["result"]["court"]> export type CourtInclude = { complex?: boolean | Prisma.ComplexDefaultArgs sport?: boolean | Prisma.SportDefaultArgs availabilities?: boolean | Prisma.Court$availabilitiesArgs priceRules?: boolean | Prisma.Court$priceRulesArgs bookings?: boolean | Prisma.Court$bookingsArgs + maintenances?: boolean | Prisma.Court$maintenancesArgs _count?: boolean | Prisma.CourtCountOutputTypeDefaultArgs } export type CourtIncludeCreateManyAndReturn = { @@ -1146,6 +1380,7 @@ export type $CourtPayload[] priceRules: Prisma.$CourtPriceRulePayload[] bookings: Prisma.$CourtBookingPayload[] + maintenances: Prisma.$CourtMaintenancePayload[] } scalars: runtime.Types.Extensions.GetPayloadResult<{ id: string @@ -1154,6 +1389,8 @@ export type $CourtPayload @@ -1555,6 +1792,7 @@ export interface Prisma__CourtClient = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> priceRules = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> bookings = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + maintenances = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. @@ -1590,6 +1828,8 @@ export interface CourtFieldRefs { readonly name: Prisma.FieldRef<"Court", 'String'> readonly slotDurationMinutes: Prisma.FieldRef<"Court", 'Int'> readonly basePrice: Prisma.FieldRef<"Court", 'Decimal'> + readonly isUnderMaintenance: Prisma.FieldRef<"Court", 'Boolean'> + readonly maintenanceReason: Prisma.FieldRef<"Court", 'String'> readonly createdAt: Prisma.FieldRef<"Court", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"Court", 'DateTime'> } @@ -2064,6 +2304,30 @@ export type Court$bookingsArgs = { + /** + * Select specific fields to fetch from the CourtMaintenance + */ + select?: Prisma.CourtMaintenanceSelect | null + /** + * Omit specific fields from the CourtMaintenance + */ + omit?: Prisma.CourtMaintenanceOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CourtMaintenanceInclude | null + where?: Prisma.CourtMaintenanceWhereInput + orderBy?: Prisma.CourtMaintenanceOrderByWithRelationInput | Prisma.CourtMaintenanceOrderByWithRelationInput[] + cursor?: Prisma.CourtMaintenanceWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.CourtMaintenanceScalarFieldEnum | Prisma.CourtMaintenanceScalarFieldEnum[] +} + /** * Court without action */ diff --git a/apps/backend/src/generated/prisma/models/User.ts b/apps/backend/src/generated/prisma/models/User.ts index 1787905..d289dff 100644 --- a/apps/backend/src/generated/prisma/models/User.ts +++ b/apps/backend/src/generated/prisma/models/User.ts @@ -31,6 +31,9 @@ export type UserMinAggregateOutputType = { emailVerified: boolean | null image: string | null phone: string | null + banned: boolean | null + bannedAt: Date | null + banReason: string | null createdAt: Date | null updatedAt: Date | null role: string | null @@ -43,6 +46,9 @@ export type UserMaxAggregateOutputType = { emailVerified: boolean | null image: string | null phone: string | null + banned: boolean | null + bannedAt: Date | null + banReason: string | null createdAt: Date | null updatedAt: Date | null role: string | null @@ -55,6 +61,9 @@ export type UserCountAggregateOutputType = { emailVerified: number image: number phone: number + banned: number + bannedAt: number + banReason: number createdAt: number updatedAt: number role: number @@ -69,6 +78,9 @@ export type UserMinAggregateInputType = { emailVerified?: true image?: true phone?: true + banned?: true + bannedAt?: true + banReason?: true createdAt?: true updatedAt?: true role?: true @@ -81,6 +93,9 @@ export type UserMaxAggregateInputType = { emailVerified?: true image?: true phone?: true + banned?: true + bannedAt?: true + banReason?: true createdAt?: true updatedAt?: true role?: true @@ -93,6 +108,9 @@ export type UserCountAggregateInputType = { emailVerified?: true image?: true phone?: true + banned?: true + bannedAt?: true + banReason?: true createdAt?: true updatedAt?: true role?: true @@ -178,6 +196,9 @@ export type UserGroupByOutputType = { emailVerified: boolean image: string | null phone: string | null + banned: boolean + bannedAt: Date | null + banReason: string | null createdAt: Date updatedAt: Date role: string @@ -211,6 +232,9 @@ export type UserWhereInput = { emailVerified?: Prisma.BoolFilter<"User"> | boolean image?: Prisma.StringNullableFilter<"User"> | string | null phone?: Prisma.StringNullableFilter<"User"> | string | null + banned?: Prisma.BoolFilter<"User"> | boolean + bannedAt?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null + banReason?: Prisma.StringNullableFilter<"User"> | string | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string role?: Prisma.StringFilter<"User"> | string @@ -226,6 +250,9 @@ export type UserOrderByWithRelationInput = { emailVerified?: Prisma.SortOrder image?: Prisma.SortOrderInput | Prisma.SortOrder phone?: Prisma.SortOrderInput | Prisma.SortOrder + banned?: Prisma.SortOrder + bannedAt?: Prisma.SortOrderInput | Prisma.SortOrder + banReason?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder role?: Prisma.SortOrder @@ -244,6 +271,9 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{ emailVerified?: Prisma.BoolFilter<"User"> | boolean image?: Prisma.StringNullableFilter<"User"> | string | null phone?: Prisma.StringNullableFilter<"User"> | string | null + banned?: Prisma.BoolFilter<"User"> | boolean + bannedAt?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null + banReason?: Prisma.StringNullableFilter<"User"> | string | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string role?: Prisma.StringFilter<"User"> | string @@ -259,6 +289,9 @@ export type UserOrderByWithAggregationInput = { emailVerified?: Prisma.SortOrder image?: Prisma.SortOrderInput | Prisma.SortOrder phone?: Prisma.SortOrderInput | Prisma.SortOrder + banned?: Prisma.SortOrder + bannedAt?: Prisma.SortOrderInput | Prisma.SortOrder + banReason?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder role?: Prisma.SortOrder @@ -277,6 +310,9 @@ export type UserScalarWhereWithAggregatesInput = { emailVerified?: Prisma.BoolWithAggregatesFilter<"User"> | boolean image?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null phone?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null + banned?: Prisma.BoolWithAggregatesFilter<"User"> | boolean + bannedAt?: Prisma.DateTimeNullableWithAggregatesFilter<"User"> | Date | string | null + banReason?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string role?: Prisma.StringWithAggregatesFilter<"User"> | string @@ -289,6 +325,9 @@ export type UserCreateInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -304,6 +343,9 @@ export type UserUncheckedCreateInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -319,6 +361,9 @@ export type UserUpdateInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -334,6 +379,9 @@ export type UserUncheckedUpdateInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -349,6 +397,9 @@ export type UserCreateManyInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -361,6 +412,9 @@ export type UserUpdateManyMutationInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -373,6 +427,9 @@ export type UserUncheckedUpdateManyInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -385,6 +442,9 @@ export type UserCountOrderByAggregateInput = { emailVerified?: Prisma.SortOrder image?: Prisma.SortOrder phone?: Prisma.SortOrder + banned?: Prisma.SortOrder + bannedAt?: Prisma.SortOrder + banReason?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder role?: Prisma.SortOrder @@ -397,6 +457,9 @@ export type UserMaxOrderByAggregateInput = { emailVerified?: Prisma.SortOrder image?: Prisma.SortOrder phone?: Prisma.SortOrder + banned?: Prisma.SortOrder + bannedAt?: Prisma.SortOrder + banReason?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder role?: Prisma.SortOrder @@ -409,6 +472,9 @@ export type UserMinOrderByAggregateInput = { emailVerified?: Prisma.SortOrder image?: Prisma.SortOrder phone?: Prisma.SortOrder + banned?: Prisma.SortOrder + bannedAt?: Prisma.SortOrder + banReason?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder role?: Prisma.SortOrder @@ -431,6 +497,10 @@ export type NullableStringFieldUpdateOperationsInput = { set?: string | null } +export type NullableDateTimeFieldUpdateOperationsInput = { + set?: Date | string | null +} + export type DateTimeFieldUpdateOperationsInput = { set?: Date | string } @@ -484,6 +554,9 @@ export type UserCreateWithoutSessionsInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -498,6 +571,9 @@ export type UserUncheckedCreateWithoutSessionsInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -528,6 +604,9 @@ export type UserUpdateWithoutSessionsInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -542,6 +621,9 @@ export type UserUncheckedUpdateWithoutSessionsInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -556,6 +638,9 @@ export type UserCreateWithoutAccountsInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -570,6 +655,9 @@ export type UserUncheckedCreateWithoutAccountsInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -600,6 +688,9 @@ export type UserUpdateWithoutAccountsInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -614,6 +705,9 @@ export type UserUncheckedUpdateWithoutAccountsInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -628,6 +722,9 @@ export type UserCreateWithoutComplexesInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -642,6 +739,9 @@ export type UserUncheckedCreateWithoutComplexesInput = { emailVerified?: boolean image?: string | null phone?: string | null + banned?: boolean + bannedAt?: Date | string | null + banReason?: string | null createdAt?: Date | string updatedAt?: Date | string role?: string @@ -672,6 +772,9 @@ export type UserUpdateWithoutComplexesInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -686,6 +789,9 @@ export type UserUncheckedUpdateWithoutComplexesInput = { emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null phone?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.BoolFieldUpdateOperationsInput | boolean + bannedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.StringFieldUpdateOperationsInput | string @@ -749,6 +855,9 @@ export type UserSelect = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "emailVerified" | "image" | "phone" | "createdAt" | "updatedAt" | "role", ExtArgs["result"]["user"]> +export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "emailVerified" | "image" | "phone" | "banned" | "bannedAt" | "banReason" | "createdAt" | "updatedAt" | "role", ExtArgs["result"]["user"]> export type UserInclude = { sessions?: boolean | Prisma.User$sessionsArgs accounts?: boolean | Prisma.User$accountsArgs @@ -818,6 +936,9 @@ export type $UserPayload readonly image: Prisma.FieldRef<"User", 'String'> readonly phone: Prisma.FieldRef<"User", 'String'> + readonly banned: Prisma.FieldRef<"User", 'Boolean'> + readonly bannedAt: Prisma.FieldRef<"User", 'DateTime'> + readonly banReason: Prisma.FieldRef<"User", 'String'> readonly createdAt: Prisma.FieldRef<"User", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'> readonly role: Prisma.FieldRef<"User", 'String'> diff --git a/apps/backend/src/lib/auth.ts b/apps/backend/src/lib/auth.ts index f018627..836a074 100644 --- a/apps/backend/src/lib/auth.ts +++ b/apps/backend/src/lib/auth.ts @@ -22,10 +22,26 @@ export const auth = betterAuth({ }, user: { additionalFields: { + role: { + type: 'string', + required: false, + }, phone: { type: 'string', required: false, }, + banned: { + type: 'boolean', + required: false, + }, + bannedAt: { + type: 'string', + required: false, + }, + banReason: { + type: 'string', + required: false, + }, }, }, emailVerification: { diff --git a/apps/backend/src/middlewares/require-auth.middleware.ts b/apps/backend/src/middlewares/require-auth.middleware.ts index 387ff97..561cf54 100644 --- a/apps/backend/src/middlewares/require-auth.middleware.ts +++ b/apps/backend/src/middlewares/require-auth.middleware.ts @@ -11,6 +11,18 @@ export const requireAuth = createMiddleware(async (c, next) => { return c.json({ message: 'Unauthorized' }, 401); } + const user = session.user as { banned?: boolean; banReason?: string | null }; + + if (user.banned) { + return c.json( + { + message: 'Tu cuenta ha sido bloqueada.', + ...(user.banReason ? { reason: user.banReason } : {}), + }, + 403 + ); + } + c.set('user', session.user); c.set('session', session.session); diff --git a/apps/backend/src/modules/admin/admin.routes.ts b/apps/backend/src/modules/admin/admin.routes.ts new file mode 100644 index 0000000..1de3e12 --- /dev/null +++ b/apps/backend/src/modules/admin/admin.routes.ts @@ -0,0 +1,64 @@ +import { validate } from '@/lib/http/validate'; +import { requireAuth } from '@/middlewares/require-auth.middleware'; +import { requireSuperAdmin } from '@/middlewares/require-super-admin.middleware'; +import { blockUserHandler } from '@/modules/admin/handlers/block-user.handler'; +import { createPlanHandler } from '@/modules/admin/handlers/create-plan.handler'; +import { deletePlanHandler } from '@/modules/admin/handlers/delete-plan.handler'; +import { getUserSessionsHandler } from '@/modules/admin/handlers/get-user-sessions.handler'; +import { listComplexesHandler } from '@/modules/admin/handlers/list-complexes.handler'; +import { revokeAllSessionsHandler } from '@/modules/admin/handlers/revoke-all-sessions.handler'; +import { listPlansAdminHandler } from '@/modules/admin/handlers/list-plans-admin.handler'; +import { listUsersHandler } from '@/modules/admin/handlers/list-users.handler'; +import { unblockUserHandler } from '@/modules/admin/handlers/unblock-user.handler'; +import { updatePlanHandler } from '@/modules/admin/handlers/update-plan.handler'; +import type { AppEnv } from '@/types/hono'; +import { + adminBlockUserSchema, + adminCreatePlanSchema, + adminUpdatePlanSchema, +} from '@repo/api-contract'; +import { Hono } from 'hono'; +import { z } from 'zod'; + +export const adminRoutes = new Hono(); + +adminRoutes.use('*', requireAuth, requireSuperAdmin); + +adminRoutes.get('/complexes', listComplexesHandler); + +adminRoutes.get('/plans', listPlansAdminHandler); +adminRoutes.post('/plans', validate.json(adminCreatePlanSchema), createPlanHandler); +adminRoutes.patch( + '/plans/:code', + validate.param(z.object({ code: z.string().min(1).max(10) })), + validate.json(adminUpdatePlanSchema), + updatePlanHandler +); +adminRoutes.delete( + '/plans/:code', + validate.param(z.object({ code: z.string().min(1).max(10) })), + deletePlanHandler +); + +adminRoutes.get('/users', listUsersHandler); +adminRoutes.post( + '/users/:id/block', + validate.param(z.object({ id: z.string().min(1) })), + validate.json(adminBlockUserSchema), + blockUserHandler +); +adminRoutes.post( + '/users/:id/unblock', + validate.param(z.object({ id: z.string().min(1) })), + unblockUserHandler +); +adminRoutes.get( + '/users/:id/sessions', + validate.param(z.object({ id: z.string().min(1) })), + getUserSessionsHandler +); +adminRoutes.post( + '/users/:id/sessions/revoke-all', + validate.param(z.object({ id: z.string().min(1) })), + revokeAllSessionsHandler +); diff --git a/apps/backend/src/modules/admin/handlers/block-user.handler.ts b/apps/backend/src/modules/admin/handlers/block-user.handler.ts new file mode 100644 index 0000000..4a1f730 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/block-user.handler.ts @@ -0,0 +1,20 @@ +import { AdminServiceError, blockUser } from '@/modules/admin/services/admin-users.service'; +import type { AppContext } from '@/types/hono'; +import type { AdminBlockUserInput } from '@repo/api-contract'; + +type BlockUserParams = { id: string }; + +export async function blockUserHandler(c: AppContext) { + const { id } = c.req.valid('param' as never) as BlockUserParams; + const body = c.req.valid('json' as never) as AdminBlockUserInput; + + try { + await blockUser(id, body.banReason); + return c.json({ message: 'Usuario bloqueado correctamente.' }); + } catch (error) { + if (error instanceof AdminServiceError) { + return c.json({ message: error.message }, error.status); + } + throw error; + } +} diff --git a/apps/backend/src/modules/admin/handlers/create-plan.handler.ts b/apps/backend/src/modules/admin/handlers/create-plan.handler.ts new file mode 100644 index 0000000..ff52e11 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/create-plan.handler.ts @@ -0,0 +1,34 @@ +import { db } from '@/lib/prisma'; +import type { AppContext } from '@/types/hono'; +import type { AdminCreatePlanInput } from '@repo/api-contract'; + +export async function createPlanHandler(c: AppContext) { + const body = c.req.valid('json' as never) as AdminCreatePlanInput; + + const existing = await db.plan.findUnique({ + where: { code: body.code }, + }); + + if (existing) { + return c.json({ message: 'Ya existe un plan con ese código.' }, 409); + } + + const plan = await db.plan.create({ + data: { + code: body.code, + name: body.name, + price: body.price, + rules: body.rules, + }, + }); + + return c.json( + { + code: plan.code, + name: plan.name, + price: Number(plan.price), + rules: plan.rules, + }, + 201 + ); +} diff --git a/apps/backend/src/modules/admin/handlers/delete-plan.handler.ts b/apps/backend/src/modules/admin/handlers/delete-plan.handler.ts new file mode 100644 index 0000000..5d03785 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/delete-plan.handler.ts @@ -0,0 +1,31 @@ +import { db } from '@/lib/prisma'; +import type { AppContext } from '@/types/hono'; + +type DeletePlanParams = { code: string }; + +export async function deletePlanHandler(c: AppContext) { + const { code } = c.req.valid('param' as never) as DeletePlanParams; + + const existing = await db.plan.findUnique({ + where: { code }, + include: { + _count: { + select: { complexes: true }, + }, + }, + }); + + if (!existing) { + return c.json({ message: 'Plan no encontrado.' }, 404); + } + + if (existing._count.complexes > 0) { + return c.json({ message: 'No se puede eliminar un plan que tiene complejos asignados.' }, 409); + } + + await db.plan.delete({ + where: { code }, + }); + + return c.json({ message: 'Plan eliminado correctamente.' }); +} diff --git a/apps/backend/src/modules/admin/handlers/get-user-sessions.handler.ts b/apps/backend/src/modules/admin/handlers/get-user-sessions.handler.ts new file mode 100644 index 0000000..d3cb9a2 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/get-user-sessions.handler.ts @@ -0,0 +1,12 @@ +import { getUserSessions } from '@/modules/admin/services/admin-users.service'; +import type { AppContext } from '@/types/hono'; + +type UserSessionsParams = { id: string }; + +export async function getUserSessionsHandler(c: AppContext) { + const { id } = c.req.valid('param' as never) as UserSessionsParams; + + const sessions = await getUserSessions(id); + + return c.json(sessions); +} diff --git a/apps/backend/src/modules/admin/handlers/list-complexes.handler.ts b/apps/backend/src/modules/admin/handlers/list-complexes.handler.ts new file mode 100644 index 0000000..f72d8a7 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/list-complexes.handler.ts @@ -0,0 +1,7 @@ +import { getComplexStatsList } from '@/modules/admin/services/complex-stats.service'; +import type { AppContext } from '@/types/hono'; + +export async function listComplexesHandler(c: AppContext) { + const stats = await getComplexStatsList(); + return c.json(stats); +} diff --git a/apps/backend/src/modules/admin/handlers/list-plans-admin.handler.ts b/apps/backend/src/modules/admin/handlers/list-plans-admin.handler.ts new file mode 100644 index 0000000..74ad372 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/list-plans-admin.handler.ts @@ -0,0 +1,24 @@ +import { db } from '@/lib/prisma'; +import type { AppContext } from '@/types/hono'; + +export async function listPlansAdminHandler(c: AppContext) { + const plans = await db.plan.findMany({ + orderBy: { price: 'asc' }, + include: { + _count: { + select: { complexes: true }, + }, + }, + }); + + return c.json( + plans.map((plan) => ({ + code: plan.code, + name: plan.name, + price: Number(plan.price), + rules: plan.rules, + lastUpdatedAt: plan.lastUpdatedAt.toISOString(), + complexCount: plan._count.complexes, + })) + ); +} diff --git a/apps/backend/src/modules/admin/handlers/list-users.handler.ts b/apps/backend/src/modules/admin/handlers/list-users.handler.ts new file mode 100644 index 0000000..f6a757c --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/list-users.handler.ts @@ -0,0 +1,7 @@ +import { listAdminUsers } from '@/modules/admin/services/admin-users.service'; +import type { AppContext } from '@/types/hono'; + +export async function listUsersHandler(c: AppContext) { + const users = await listAdminUsers(); + return c.json(users); +} diff --git a/apps/backend/src/modules/admin/handlers/revoke-all-sessions.handler.ts b/apps/backend/src/modules/admin/handlers/revoke-all-sessions.handler.ts new file mode 100644 index 0000000..9351954 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/revoke-all-sessions.handler.ts @@ -0,0 +1,12 @@ +import { revokeAllUserSessions } from '@/modules/admin/services/admin-users.service'; +import type { AppContext } from '@/types/hono'; + +type RevokeSessionsParams = { id: string }; + +export async function revokeAllSessionsHandler(c: AppContext) { + const { id } = c.req.valid('param' as never) as RevokeSessionsParams; + + const count = await revokeAllUserSessions(id); + + return c.json({ message: `${count} sesiones cerradas correctamente.` }); +} diff --git a/apps/backend/src/modules/admin/handlers/unblock-user.handler.ts b/apps/backend/src/modules/admin/handlers/unblock-user.handler.ts new file mode 100644 index 0000000..750c18c --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/unblock-user.handler.ts @@ -0,0 +1,12 @@ +import { unblockUser } from '@/modules/admin/services/admin-users.service'; +import type { AppContext } from '@/types/hono'; + +type UnblockUserParams = { id: string }; + +export async function unblockUserHandler(c: AppContext) { + const { id } = c.req.valid('param' as never) as UnblockUserParams; + + await unblockUser(id); + + return c.json({ message: 'Usuario desbloqueado correctamente.' }); +} diff --git a/apps/backend/src/modules/admin/handlers/update-plan.handler.ts b/apps/backend/src/modules/admin/handlers/update-plan.handler.ts new file mode 100644 index 0000000..322ebb6 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/update-plan.handler.ts @@ -0,0 +1,35 @@ +import { db } from '@/lib/prisma'; +import type { AppContext } from '@/types/hono'; +import type { AdminUpdatePlanInput } from '@repo/api-contract'; + +type UpdatePlanParams = { code: string }; + +export async function updatePlanHandler(c: AppContext) { + const { code } = c.req.valid('param' as never) as UpdatePlanParams; + const body = c.req.valid('json' as never) as AdminUpdatePlanInput; + + const existing = await db.plan.findUnique({ + where: { code }, + }); + + if (!existing) { + return c.json({ message: 'Plan no encontrado.' }, 404); + } + + const plan = await db.plan.update({ + where: { code }, + data: { + ...(body.name !== undefined && { name: body.name }), + ...(body.price !== undefined && { price: body.price }), + ...(body.rules !== undefined && { rules: body.rules }), + lastUpdatedAt: new Date(), + }, + }); + + return c.json({ + code: plan.code, + name: plan.name, + price: Number(plan.price), + rules: plan.rules, + }); +} diff --git a/apps/backend/src/modules/admin/services/admin-users.service.ts b/apps/backend/src/modules/admin/services/admin-users.service.ts new file mode 100644 index 0000000..99ded34 --- /dev/null +++ b/apps/backend/src/modules/admin/services/admin-users.service.ts @@ -0,0 +1,113 @@ +import { db } from '@/lib/prisma'; + +type AdminUser = { + id: string; + name: string; + email: string; + role: string; + banned: boolean; + bannedAt: string | null; + banReason: string | null; + createdAt: string; + complexCount: number; + activeSessions: number; +}; + +export async function listAdminUsers(): Promise { + const users = await db.user.findMany({ + include: { + _count: { + select: { complexes: true, sessions: true }, + }, + }, + orderBy: { createdAt: 'desc' }, + }); + + return users.map((user) => ({ + id: user.id, + name: user.name, + email: user.email, + role: user.role, + banned: user.banned ?? false, + bannedAt: user.bannedAt?.toISOString() ?? null, + banReason: user.banReason ?? null, + createdAt: user.createdAt.toISOString(), + complexCount: user._count.complexes, + activeSessions: user._count.sessions, + })); +} + +type AdminUserSession = { + id: string; + createdAt: string; + expiresAt: string; + ipAddress: string | null; + userAgent: string | null; +}; + +export async function getUserSessions(userId: string): Promise { + const sessions = await db.session.findMany({ + where: { userId }, + orderBy: { createdAt: 'desc' }, + }); + + return sessions.map((s) => ({ + id: s.id, + createdAt: s.createdAt.toISOString(), + expiresAt: s.expiresAt.toISOString(), + ipAddress: s.ipAddress, + userAgent: s.userAgent, + })); +} + +export class AdminServiceError extends Error { + status: 400 | 403 | 404; + constructor(message: string, status: 400 | 403 | 404 = 400) { + super(message); + this.status = status; + this.name = 'AdminServiceError'; + } +} + +export async function blockUser(userId: string, banReason?: string): Promise { + const target = await db.user.findUnique({ + where: { id: userId }, + select: { role: true }, + }); + + if (!target) { + throw new AdminServiceError('Usuario no encontrado.', 404); + } + + if (target.role === 'super_admin') { + throw new AdminServiceError('No se puede bloquear un super_admin.', 403); + } + + await db.user.update({ + where: { id: userId }, + data: { + banned: true, + bannedAt: new Date(), + banReason: banReason ?? null, + }, + }); +} + +export async function unblockUser(userId: string): Promise { + await db.user.update({ + where: { id: userId }, + data: { + banned: false, + bannedAt: null, + banReason: null, + }, + }); +} + +export async function revokeAllUserSessions(userId: string): Promise { + const result = await db.session.deleteMany({ + where: { userId }, + }); + + return result.count; +} diff --git a/apps/backend/src/modules/admin/services/complex-stats.service.ts b/apps/backend/src/modules/admin/services/complex-stats.service.ts new file mode 100644 index 0000000..e5aad11 --- /dev/null +++ b/apps/backend/src/modules/admin/services/complex-stats.service.ts @@ -0,0 +1,80 @@ +import { db } from '@/lib/prisma'; + +type ComplexStats = { + id: string; + complexName: string; + complexSlug: string; + city: string | null; + planCode: string | null; + planName: string | null; + userCount: number; + courtCount: number; + totalBookings: number; + avgBookingsPerDay: number; + bookingsByStatus: { + confirmed: number; + cancelled: number; + completed: number; + noshow: number; + }; + paymentStatus: 'active' | 'no_plan' | 'expired'; +}; + +export async function getComplexStatsList(): Promise { + const complexes = await db.complex.findMany({ + include: { + plan: true, + users: true, + courts: { + include: { + bookings: true, + }, + }, + }, + }); + + return complexes.map((complex) => { + const courtCount = complex.courts.length; + const allBookings = complex.courts.flatMap((c) => c.bookings); + + const bookingsByStatus = { + confirmed: allBookings.filter((b) => b.status === 'CONFIRMED').length, + cancelled: allBookings.filter((b) => b.status === 'CANCELLED').length, + completed: allBookings.filter((b) => b.status === 'COMPLETED').length, + noshow: allBookings.filter((b) => b.status === 'NOSHOW').length, + }; + + const totalBookings = allBookings.length; + + let avgBookingsPerDay = 0; + if (allBookings.length > 0) { + const dates = allBookings.map((b) => b.bookingDate); + const minDate = new Date(Math.min(...dates.map((d) => d.getTime()))); + const daysDiff = Math.max( + 1, + Math.ceil((Date.now() - minDate.getTime()) / (1000 * 60 * 60 * 24)) + ); + avgBookingsPerDay = Math.round((totalBookings / daysDiff) * 100) / 100; + } + + let paymentStatus: 'active' | 'no_plan' | 'expired' = 'no_plan'; + if (complex.plan) { + paymentStatus = 'active'; + } + + return { + id: complex.id, + complexName: complex.complexName, + complexSlug: complex.complexSlug, + city: complex.city, + planCode: complex.planCode, + planName: complex.plan?.name ?? null, + userCount: complex.users.length, + courtCount, + totalBookings, + avgBookingsPerDay, + bookingsByStatus, + paymentStatus, + }; + }); +} diff --git a/apps/backend/src/register-routes.ts b/apps/backend/src/register-routes.ts index 1d7c48d..57d1707 100644 --- a/apps/backend/src/register-routes.ts +++ b/apps/backend/src/register-routes.ts @@ -1,5 +1,6 @@ import path from 'node:path'; import { adminBookingRoutes } from '@/modules/admin-booking/admin-booking.routes'; +import { adminRoutes } from '@/modules/admin/admin.routes'; import { authRoutes } from '@/modules/auth/auth.routes'; import { complexRoutes } from '@/modules/complex/complex.routes'; import { courtRoutes } from '@/modules/court/court.routes'; @@ -17,6 +18,7 @@ import { healthCheckRoutes } from './modules/health-check/health-check.routes'; export function registerRoutes(app: Hono) { app .route('', authRoutes) + .route('/api/admin', adminRoutes) .route('/api/user', userRoutes) .route('/api/plans', planRoutes) .route('/api/password-reset', passwordResetRoutes) diff --git a/apps/frontend/src/components/header.tsx b/apps/frontend/src/components/header.tsx index e3137df..500898c 100644 --- a/apps/frontend/src/components/header.tsx +++ b/apps/frontend/src/components/header.tsx @@ -6,6 +6,7 @@ import { Menu, Moon, Settings, + Shield, Sun, User, X, @@ -241,6 +242,18 @@ export function Header() { )} + {user?.role === 'super_admin' && ( + { + void navigate({ to: '/admin' }); + }} + > + + Admin + + )} + )} + {user?.role === 'super_admin' && ( + + )} + {isAuthenticated && ( + ); + })} + +
+ +
+ + + +
{children}
+ + ); +} diff --git a/apps/frontend/src/features/admin/admin-page.tsx b/apps/frontend/src/features/admin/admin-page.tsx new file mode 100644 index 0000000..48aafa6 --- /dev/null +++ b/apps/frontend/src/features/admin/admin-page.tsx @@ -0,0 +1,130 @@ +import { apiClient } from '@/lib/api-client'; +import { useQuery } from '@tanstack/react-query'; +import { Link, useLocation } from '@tanstack/react-router'; +import { Building2, CalendarDays, Crosshair, Users } from 'lucide-react'; +import { AdminLayout } from './admin-layout'; + +export function AdminPage() { + const location = useLocation(); + + const complexesQuery = useQuery({ + queryKey: ['admin-complexes'], + queryFn: () => apiClient.admin.listComplexes(), + }); + + const usersQuery = useQuery({ + queryKey: ['admin-users'], + queryFn: () => apiClient.admin.listUsers(), + }); + + const stats = { + totalComplexes: complexesQuery.data?.length ?? 0, + totalUsers: usersQuery.data?.length ?? 0, + totalCourts: complexesQuery.data?.reduce((sum, c) => sum + c.courtCount, 0) ?? 0, + totalBookings: + complexesQuery.data?.reduce((sum, c) => sum + Math.round(c.avgBookingsPerDay * 30), 0) ?? 0, + }; + + const cards = [ + { + label: 'Complejos', + value: stats.totalComplexes, + icon: Building2, + color: 'text-blue-600', + bg: 'bg-blue-100 dark:bg-blue-900/30', + }, + { + label: 'Usuarios', + value: stats.totalUsers, + icon: Users, + color: 'text-emerald-600', + bg: 'bg-emerald-100 dark:bg-emerald-900/30', + }, + { + label: 'Canchas', + value: stats.totalCourts, + icon: Crosshair, + color: 'text-purple-600', + bg: 'bg-purple-100 dark:bg-purple-900/30', + }, + { + label: 'Reservas (30d)', + value: stats.totalBookings.toLocaleString(), + icon: CalendarDays, + color: 'text-amber-600', + bg: 'bg-amber-100 dark:bg-amber-900/30', + }, + ]; + + return ( + +
+

Panel de Administración

+

+ Gestioná complejos, planes y usuarios de Playzer. +

+
+ +
+ {cards.map((card) => { + const Icon = card.icon; + + return ( +
+
+
+ +
+ +
+

+ {card.label} +

+

{card.value}

+
+
+
+ ); + })} +
+ +
+

Acceso rápido

+ +
+ + +

Complejos

+

+ {stats.totalComplexes} complejos registrados +

+ + + + +

Planes

+

Administrar suscripciones

+ + + + +

Usuarios

+

{stats.totalUsers} usuarios registrados

+ +
+
+
+ ); +} diff --git a/apps/frontend/src/features/admin/complexes-page.tsx b/apps/frontend/src/features/admin/complexes-page.tsx new file mode 100644 index 0000000..f7e6344 --- /dev/null +++ b/apps/frontend/src/features/admin/complexes-page.tsx @@ -0,0 +1,167 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { apiClient } from '@/lib/api-client'; +import { useQuery } from '@tanstack/react-query'; +import { useLocation } from '@tanstack/react-router'; +import { Building2, ChevronDown, ChevronUp, MapPin, RefreshCw } from 'lucide-react'; +import { useState } from 'react'; +import { AdminLayout } from './admin-layout'; + +function PaymentBadge({ status }: { status: string }) { + if (status === 'active') { + return ( + + Activo + + ); + } + + if (status === 'no_plan') { + return ( + + Sin plan + + ); + } + + return ( + + Expirado + + ); +} + +export function ComplexesPage() { + const location = useLocation(); + const [expandedId, setExpandedId] = useState(null); + + const { data, isLoading, refetch } = useQuery({ + queryKey: ['admin-complexes'], + queryFn: () => apiClient.admin.listComplexes(), + }); + + return ( + +
+
+

Complejos

+

+ {data?.length ?? 0} complejos registrados en Playzer. +

+
+ + +
+ + {isLoading ? ( +
+

Cargando complejos...

+
+ ) : data?.length === 0 ? ( +
+ +

No hay complejos registrados.

+
+ ) : ( +
+ {data?.map((complex) => { + const isExpanded = expandedId === complex.id; + + return ( +
+ + + {isExpanded && ( +
+
+
+

Plan

+

{complex.planName ?? 'Sin plan'}

+
+
+

Canchas

+

{complex.courtCount}

+
+
+

Usuarios

+

{complex.userCount}

+
+
+

Prom. reservas/día

+

{complex.avgBookingsPerDay.toFixed(1)}

+
+
+
+ )} +
+ ); + })} +
+ )} +
+ ); +} diff --git a/apps/frontend/src/features/admin/plans-page.tsx b/apps/frontend/src/features/admin/plans-page.tsx new file mode 100644 index 0000000..fa6b9ef --- /dev/null +++ b/apps/frontend/src/features/admin/plans-page.tsx @@ -0,0 +1,337 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { AdminLayout } from '@/features/admin/admin-layout'; +import { ApiClientError, apiClient } from '@/lib/api-client'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useLocation } from '@tanstack/react-router'; +import { BarChart3, Pencil, Plus, RefreshCw, Trash2 } from 'lucide-react'; +import { useState } from 'react'; + +type Plan = { + code: string; + name: string; + price: number; + rules: unknown; + lastUpdatedAt: string; + complexCount: number; +}; + +function PlanFormDialog({ + mode, + plan, + onClose, +}: { + mode: 'create' | 'edit'; + plan?: Plan; + onClose: () => void; +}) { + const queryClient = useQueryClient(); + const [code, setCode] = useState(plan?.code ?? ''); + const [name, setName] = useState(plan?.name ?? ''); + const [price, setPrice] = useState(String(plan?.price ?? '')); + + const createMutation = useMutation({ + mutationFn: (data: { code: string; name: string; price: number; rules: object }) => + apiClient.admin.createPlan(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['admin-plans'] }); + onClose(); + }, + }); + + const updateMutation = useMutation({ + mutationFn: (data: { name?: string; price?: number }) => + apiClient.admin.updatePlan(plan!.code, data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['admin-plans'] }); + onClose(); + }, + }); + + const isPending = createMutation.isPending || updateMutation.isPending; + const error = createMutation.error ?? updateMutation.error; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + if (mode === 'create') { + createMutation.mutate({ + code, + name, + price: Number.parseFloat(price), + rules: {}, + }); + } else { + updateMutation.mutate({ + name, + price: Number.parseFloat(price), + }); + } + }; + + return ( + !open && onClose()}> + + + {mode === 'create' ? 'Crear plan' : 'Editar plan'} + + {mode === 'create' + ? 'Agregá un nuevo plan de suscripción.' + : 'Actualizá los datos del plan.'} + + + +
+ {mode === 'create' && ( +
+ + setCode(e.target.value)} + placeholder="pro" + maxLength={10} + required + /> +
+ )} + +
+ + setName(e.target.value)} + placeholder="Pro" + maxLength={30} + required + /> +
+ +
+ + setPrice(e.target.value)} + placeholder="29.99" + required + /> +
+ + {error && ( +

+ {error instanceof ApiClientError + ? String(error.details ?? error.message) + : error.message} +

+ )} + +
+ + +
+
+
+
+ ); +} + +function DeleteConfirmDialog({ + plan, + onClose, +}: { + plan: Plan; + onClose: () => void; +}) { + const queryClient = useQueryClient(); + const deleteMutation = useMutation({ + mutationFn: () => apiClient.admin.deletePlan(plan.code), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['admin-plans'] }); + onClose(); + }, + }); + + return ( + !open && onClose()}> + + + Eliminar plan + + ¿Estás seguro de eliminar el plan {plan.name}? + {plan.complexCount > 0 && ( + + No se puede eliminar porque tiene {plan.complexCount} complejo + {plan.complexCount > 1 ? 's' : ''} asignado{plan.complexCount > 1 ? 's' : ''}. + + )} + + + + {deleteMutation.error && ( +

+ {deleteMutation.error instanceof ApiClientError + ? String(deleteMutation.error.details ?? deleteMutation.error.message) + : deleteMutation.error.message} +

+ )} + +
+ + +
+
+
+ ); +} + +export function PlansPage() { + const location = useLocation(); + const queryClient = useQueryClient(); + const [createOpen, setCreateOpen] = useState(false); + const [editingPlan, setEditingPlan] = useState(null); + const [deletingPlan, setDeletingPlan] = useState(null); + + const { data, isLoading } = useQuery({ + queryKey: ['admin-plans'], + queryFn: () => apiClient.admin.listPlans(), + }); + + return ( + +
+
+

Planes

+

+ {data?.length ?? 0} planes de suscripción. +

+
+ +
+ + +
+
+ + {createOpen && setCreateOpen(false)} />} + + {editingPlan && ( + setEditingPlan(null)} /> + )} + + {deletingPlan && ( + setDeletingPlan(null)} /> + )} + + {isLoading ? ( +
+

Cargando planes...

+
+ ) : data?.length === 0 ? ( +
+ +

No hay planes creados.

+
+ ) : ( +
+ + + + + + + + + + + + {data?.map((plan) => ( + + + + + + + + ))} + +
+ Código + + Nombre + + Precio + + Complejos + + Acciones +
+ + {plan.code} + + {plan.name} + ${Number(plan.price).toFixed(2)} + + {plan.complexCount} + +
+ + +
+
+
+ )} +
+ ); +} diff --git a/apps/frontend/src/features/admin/users-page.tsx b/apps/frontend/src/features/admin/users-page.tsx new file mode 100644 index 0000000..eb4560c --- /dev/null +++ b/apps/frontend/src/features/admin/users-page.tsx @@ -0,0 +1,437 @@ +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { AdminLayout } from '@/features/admin/admin-layout'; +import { ApiClientError, apiClient } from '@/lib/api-client'; +import type { AdminUser, AdminUserSession } from '@repo/api-contract'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useLocation } from '@tanstack/react-router'; +import { + Ban, + CheckCircle2, + Globe, + LogIn, + Monitor, + RefreshCw, + ShieldAlert, + Users, +} from 'lucide-react'; +import { useState } from 'react'; + +function SessionsDialog({ + user, + onClose, +}: { + user: AdminUser; + onClose: () => void; +}) { + const queryClient = useQueryClient(); + const { data, isLoading } = useQuery({ + queryKey: ['admin-user-sessions', user.id], + queryFn: () => apiClient.admin.getUserSessions(user.id), + }); + + const revokeMutation = useMutation({ + mutationFn: () => apiClient.admin.revokeAllSessions(user.id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['admin-user-sessions', user.id] }); + queryClient.invalidateQueries({ queryKey: ['admin-users'] }); + }, + }); + + return ( + !open && onClose()}> + + + Sesiones de {user.name} + {data?.length ?? 0} sesiones activas + + +
+ {isLoading ? ( +

Cargando sesiones...

+ ) : data?.length === 0 ? ( +

Sin sesiones activas.

+ ) : ( + data?.map((session) => ) + )} +
+ +
+ {revokeMutation.error && ( +

+ {revokeMutation.error instanceof ApiClientError + ? String(revokeMutation.error.details ?? revokeMutation.error.message) + : revokeMutation.error.message} +

+ )} +
+ + {data && data.length > 0 && ( + + )} +
+
+
+
+ ); +} + +function SessionRow({ session }: { session: AdminUserSession }) { + const isExpired = new Date(session.expiresAt) < new Date(); + const userAgent = session.userAgent ?? 'Desconocido'; + const ip = session.ipAddress ?? '—'; + + return ( +
+
+ + {userAgent} + {isExpired ? ( + + Expirada + + ) : ( + + Activa + + )} +
+
+ + + {ip} + + + + {new Date(session.createdAt).toLocaleString()} + +
+
+ ); +} + +function BlockDialog({ + user, + onClose, +}: { + user: AdminUser; + onClose: () => void; +}) { + const queryClient = useQueryClient(); + const [reason, setReason] = useState(''); + + const mutation = useMutation({ + mutationFn: (banReason?: string) => apiClient.admin.blockUser(user.id, { banReason }), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['admin-users'] }); + onClose(); + }, + }); + + return ( + !open && onClose()}> + + + Bloquear usuario + + ¿Estás seguro de bloquear a {user.name} ({user.email})? No podrá + iniciar sesión en Playzer. + + + +
+
+ + setReason(e.target.value)} + placeholder="Violación de términos..." + maxLength={500} + /> +
+ + {mutation.error && ( +

+ {mutation.error instanceof ApiClientError + ? String(mutation.error.details ?? mutation.error.message) + : mutation.error.message} +

+ )} + +
+ + +
+
+
+
+ ); +} + +function UnblockDialog({ + user, + onClose, +}: { + user: AdminUser; + onClose: () => void; +}) { + const queryClient = useQueryClient(); + + const mutation = useMutation({ + mutationFn: () => apiClient.admin.unblockUser(user.id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['admin-users'] }); + onClose(); + }, + }); + + return ( + !open && onClose()}> + + + Desbloquear usuario + + ¿Estás seguro de desbloquear a {user.name}? Podrá volver a iniciar + sesión en Playzer. + + + + {mutation.error && ( +

+ {mutation.error instanceof ApiClientError + ? String(mutation.error.details ?? mutation.error.message) + : mutation.error.message} +

+ )} + +
+ + +
+
+
+ ); +} + +function RoleBadge({ role }: { role: string }) { + if (role === 'super_admin') { + return ( + + + Super Admin + + ); + } + + return ( + + {role} + + ); +} + +export function UsersPage() { + const location = useLocation(); + const queryClient = useQueryClient(); + const [blockingUser, setBlockingUser] = useState(null); + const [unblockingUser, setUnblockingUser] = useState(null); + const [sessionsUser, setSessionsUser] = useState(null); + + const { data, isLoading } = useQuery({ + queryKey: ['admin-users'], + queryFn: () => apiClient.admin.listUsers(), + }); + + return ( + +
+
+

Usuarios

+

+ {data?.length ?? 0} usuarios registrados en Playzer. +

+
+ + +
+ + {blockingUser && setBlockingUser(null)} />} + + {unblockingUser && ( + setUnblockingUser(null)} /> + )} + + {sessionsUser && setSessionsUser(null)} />} + + {isLoading ? ( +
+

Cargando usuarios...

+
+ ) : data?.length === 0 ? ( +
+ +

No hay usuarios registrados.

+
+ ) : ( +
+ + + + + + + + + + + + + + {data?.map((user) => ( + + + + + + + + + + ))} + +
+ Usuario + + Rol + + Complejos + + Sesiones + + Registro + + Estado + + Acción +
+
+

{user.name}

+

{user.email}

+
+
+ + + {user.complexCount} + + + + {new Date(user.createdAt).toLocaleDateString()} + + {user.banned ? ( + + Bloqueado + + ) : ( + + Activo + + )} + +
+ {user.banned ? ( + + ) : ( + + )} +
+
+
+ )} +
+ ); +} diff --git a/apps/frontend/src/lib/api-client.ts b/apps/frontend/src/lib/api-client.ts index bc1f547..7e6f455 100644 --- a/apps/frontend/src/lib/api-client.ts +++ b/apps/frontend/src/lib/api-client.ts @@ -5,24 +5,40 @@ import * as api from './api'; const apiBaseUrl = api.apiBaseUrl; -const plugins = [ - sentinelClient(), - inferAdditionalFields({ - user: { - phone: { - type: 'string', - required: false, - }, - }, - }), -]; +const infraPlugins = import.meta.env.VITE_BETTER_AUTH_INFRA === 'true' ? [sentinelClient()] : []; export const authClient = createAuthClient({ baseURL: apiBaseUrl, fetchOptions: { credentials: 'include', }, - plugins: import.meta.env.VITE_BETTER_AUTH_INFRA === 'true' ? plugins : [], + plugins: [ + ...infraPlugins, + inferAdditionalFields({ + user: { + phone: { + type: 'string', + required: false, + }, + role: { + type: 'string', + required: false, + }, + banned: { + type: 'boolean', + required: false, + }, + bannedAt: { + type: 'string', + required: false, + }, + banReason: { + type: 'string', + required: false, + }, + }, + }), + ], }); export class ApiClientError extends Error { @@ -48,6 +64,7 @@ export const apiClient = { complexes: api.complexes, sports: api.sports, courts: api.courts, + admin: api.admin, publicBookings: { getAvailability: api.getAvailability, create: api.createPublic, diff --git a/apps/frontend/src/lib/api/base.ts b/apps/frontend/src/lib/api/base.ts index 0201e21..7ad78f7 100644 --- a/apps/frontend/src/lib/api/base.ts +++ b/apps/frontend/src/lib/api/base.ts @@ -17,6 +17,7 @@ export class ApiClientError extends Error { export type ErrorHandlers = { onForbidden?: (error: ApiClientError) => void | Promise; + onUnauthorized?: (error: ApiClientError) => void | Promise; onError?: (error: ApiClientError) => void | Promise; }; @@ -28,6 +29,7 @@ export const apiBaseUrl = export function configureApiClient(nextHandlers: ErrorHandlers) { handlers.onForbidden = nextHandlers.onForbidden; + handlers.onUnauthorized = nextHandlers.onUnauthorized; handlers.onError = nextHandlers.onError; } diff --git a/apps/frontend/src/lib/api/http.ts b/apps/frontend/src/lib/api/http.ts index 67a5a11..9a673b8 100644 --- a/apps/frontend/src/lib/api/http.ts +++ b/apps/frontend/src/lib/api/http.ts @@ -69,6 +69,10 @@ http.interceptors.response.use( async (error: AxiosError) => { const normalized = normalizeError(error); + if (normalized.status === 401 && handlers.onUnauthorized) { + await handlers.onUnauthorized(normalized); + } + if (normalized.status === 403 && handlers.onForbidden) { await handlers.onForbidden(normalized); } diff --git a/apps/frontend/src/lib/api/index.ts b/apps/frontend/src/lib/api/index.ts index 5bd919a..c175d7f 100644 --- a/apps/frontend/src/lib/api/index.ts +++ b/apps/frontend/src/lib/api/index.ts @@ -6,6 +6,7 @@ export * as courts from './resources/courts'; export * as user from './resources/user'; export * as sports from './resources/sports'; export * as plans from './resources/plans'; +export * as admin from './resources/admin'; export { cancelPublic, diff --git a/apps/frontend/src/lib/api/resources/admin.ts b/apps/frontend/src/lib/api/resources/admin.ts new file mode 100644 index 0000000..4d7409a --- /dev/null +++ b/apps/frontend/src/lib/api/resources/admin.ts @@ -0,0 +1,88 @@ +import type { + AdminBlockUserInput, + AdminComplexListItem, + AdminCreatePlanInput, + AdminGlobalStats, + AdminUpdatePlanInput, + AdminUser, + AdminUserSession, +} from '@repo/api-contract'; +import { http } from '../http'; + +type AdminPlan = { + code: string; + name: string; + price: number; + rules: unknown; + lastUpdatedAt: string; + complexCount: number; +}; + +export async function listComplexes() { + const response = await http.get('/api/admin/complexes'); + return response.data; +} + +export async function listPlans() { + const response = await http.get('/api/admin/plans'); + return response.data; +} + +export async function createPlan(data: AdminCreatePlanInput) { + const response = await http.post<{ code: string; name: string; price: number }>( + '/api/admin/plans', + JSON.stringify(data), + { headers: { 'Content-Type': 'application/json' } } + ); + return response.data; +} + +export async function updatePlan(code: string, data: AdminUpdatePlanInput) { + const response = await http.patch<{ code: string; name: string; price: number }>( + `/api/admin/plans/${code}`, + JSON.stringify(data), + { headers: { 'Content-Type': 'application/json' } } + ); + return response.data; +} + +export async function deletePlan(code: string) { + const response = await http.delete<{ message: string }>(`/api/admin/plans/${code}`); + return response.data; +} + +export async function listUsers() { + const response = await http.get('/api/admin/users'); + return response.data; +} + +export async function blockUser(userId: string, data?: AdminBlockUserInput) { + const response = await http.post<{ message: string }>( + `/api/admin/users/${userId}/block`, + JSON.stringify(data ?? {}), + { headers: { 'Content-Type': 'application/json' } } + ); + return response.data; +} + +export async function unblockUser(userId: string) { + const response = await http.post<{ message: string }>(`/api/admin/users/${userId}/unblock`); + return response.data; +} + +export async function getGlobalStats() { + const response = await http.get('/api/admin/stats'); + return response.data; +} + +export async function getUserSessions(userId: string) { + const response = await http.get(`/api/admin/users/${userId}/sessions`); + return response.data; +} + +export async function revokeAllSessions(userId: string) { + const response = await http.post<{ message: string }>( + `/api/admin/users/${userId}/sessions/revoke-all` + ); + return response.data; +} diff --git a/apps/frontend/src/main.tsx b/apps/frontend/src/main.tsx index 2d2b641..7914725 100644 --- a/apps/frontend/src/main.tsx +++ b/apps/frontend/src/main.tsx @@ -27,6 +27,14 @@ function AppRouter() { useEffect(() => { configureApiClient({ + onUnauthorized: async () => { + if (!auth.isAuthenticated) { + return; + } + + await auth.signOut(); + await router.navigate({ to: '/login' }); + }, onForbidden: async (error) => { if (error.message?.includes('verificar tu email')) { return; diff --git a/apps/frontend/src/routeTree.gen.ts b/apps/frontend/src/routeTree.gen.ts index 2de1645..2e584de 100644 --- a/apps/frontend/src/routeTree.gen.ts +++ b/apps/frontend/src/routeTree.gen.ts @@ -23,6 +23,11 @@ import { Route as ComplexSlugBookingRouteImport } from './routes/$complexSlug/bo import { Route as AppAuthenticatedRouteRouteImport } from './routes/_app/_authenticated/route' import { Route as AppAuthenticatedIndexRouteImport } from './routes/_app/_authenticated/index' import { Route as ComplexSlugBookingIndexRouteImport } from './routes/$complexSlug/booking/index' +import { Route as AppAuthenticatedAdminRouteRouteImport } from './routes/_app/_authenticated/admin/route' +import { Route as AppAuthenticatedAdminIndexRouteImport } from './routes/_app/_authenticated/admin/index' +import { Route as AppAuthenticatedAdminUsersRouteImport } from './routes/_app/_authenticated/admin/users' +import { Route as AppAuthenticatedAdminPlansRouteImport } from './routes/_app/_authenticated/admin/plans' +import { Route as AppAuthenticatedAdminComplexesRouteImport } from './routes/_app/_authenticated/admin/complexes' import { Route as ComplexSlugBookingConfirmedBookingCodeRouteImport } from './routes/$complexSlug/booking/confirmed/$bookingCode' import { Route as AppAuthenticatedComplexSlugEditRouteImport } from './routes/_app/_authenticated/complex/$slug/edit' @@ -94,6 +99,36 @@ const ComplexSlugBookingIndexRoute = ComplexSlugBookingIndexRouteImport.update({ path: '/', getParentRoute: () => ComplexSlugBookingRoute, } as any) +const AppAuthenticatedAdminRouteRoute = + AppAuthenticatedAdminRouteRouteImport.update({ + id: '/admin', + path: '/admin', + getParentRoute: () => AppAuthenticatedRouteRoute, + } as any) +const AppAuthenticatedAdminIndexRoute = + AppAuthenticatedAdminIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => AppAuthenticatedAdminRouteRoute, + } as any) +const AppAuthenticatedAdminUsersRoute = + AppAuthenticatedAdminUsersRouteImport.update({ + id: '/users', + path: '/users', + getParentRoute: () => AppAuthenticatedAdminRouteRoute, + } as any) +const AppAuthenticatedAdminPlansRoute = + AppAuthenticatedAdminPlansRouteImport.update({ + id: '/plans', + path: '/plans', + getParentRoute: () => AppAuthenticatedAdminRouteRoute, + } as any) +const AppAuthenticatedAdminComplexesRoute = + AppAuthenticatedAdminComplexesRouteImport.update({ + id: '/complexes', + path: '/complexes', + getParentRoute: () => AppAuthenticatedAdminRouteRoute, + } as any) const ComplexSlugBookingConfirmedBookingCodeRoute = ComplexSlugBookingConfirmedBookingCodeRouteImport.update({ id: '/confirmed/$bookingCode', @@ -119,8 +154,13 @@ export interface FileRoutesByFullPath { '/$complexSlug/booking': typeof ComplexSlugBookingRouteWithChildren '/profile': typeof AppProfileRoute '/onboard/setup': typeof OnboardSetupRoute + '/admin': typeof AppAuthenticatedAdminRouteRouteWithChildren '/$complexSlug/booking/': typeof ComplexSlugBookingIndexRoute '/$complexSlug/booking/confirmed/$bookingCode': typeof ComplexSlugBookingConfirmedBookingCodeRoute + '/admin/complexes': typeof AppAuthenticatedAdminComplexesRoute + '/admin/plans': typeof AppAuthenticatedAdminPlansRoute + '/admin/users': typeof AppAuthenticatedAdminUsersRoute + '/admin/': typeof AppAuthenticatedAdminIndexRoute '/complex/$slug/edit': typeof AppAuthenticatedComplexSlugEditRoute } export interface FileRoutesByTo { @@ -136,6 +176,10 @@ export interface FileRoutesByTo { '/onboard/setup': typeof OnboardSetupRoute '/$complexSlug/booking': typeof ComplexSlugBookingIndexRoute '/$complexSlug/booking/confirmed/$bookingCode': typeof ComplexSlugBookingConfirmedBookingCodeRoute + '/admin/complexes': typeof AppAuthenticatedAdminComplexesRoute + '/admin/plans': typeof AppAuthenticatedAdminPlansRoute + '/admin/users': typeof AppAuthenticatedAdminUsersRoute + '/admin': typeof AppAuthenticatedAdminIndexRoute '/complex/$slug/edit': typeof AppAuthenticatedComplexSlugEditRoute } export interface FileRoutesById { @@ -152,9 +196,14 @@ export interface FileRoutesById { '/$complexSlug/booking': typeof ComplexSlugBookingRouteWithChildren '/_app/profile': typeof AppProfileRoute '/onboard/setup': typeof OnboardSetupRoute + '/_app/_authenticated/admin': typeof AppAuthenticatedAdminRouteRouteWithChildren '/$complexSlug/booking/': typeof ComplexSlugBookingIndexRoute '/_app/_authenticated/': typeof AppAuthenticatedIndexRoute '/$complexSlug/booking/confirmed/$bookingCode': typeof ComplexSlugBookingConfirmedBookingCodeRoute + '/_app/_authenticated/admin/complexes': typeof AppAuthenticatedAdminComplexesRoute + '/_app/_authenticated/admin/plans': typeof AppAuthenticatedAdminPlansRoute + '/_app/_authenticated/admin/users': typeof AppAuthenticatedAdminUsersRoute + '/_app/_authenticated/admin/': typeof AppAuthenticatedAdminIndexRoute '/_app/_authenticated/complex/$slug/edit': typeof AppAuthenticatedComplexSlugEditRoute } export interface FileRouteTypes { @@ -171,8 +220,13 @@ export interface FileRouteTypes { | '/$complexSlug/booking' | '/profile' | '/onboard/setup' + | '/admin' | '/$complexSlug/booking/' | '/$complexSlug/booking/confirmed/$bookingCode' + | '/admin/complexes' + | '/admin/plans' + | '/admin/users' + | '/admin/' | '/complex/$slug/edit' fileRoutesByTo: FileRoutesByTo to: @@ -188,6 +242,10 @@ export interface FileRouteTypes { | '/onboard/setup' | '/$complexSlug/booking' | '/$complexSlug/booking/confirmed/$bookingCode' + | '/admin/complexes' + | '/admin/plans' + | '/admin/users' + | '/admin' | '/complex/$slug/edit' id: | '__root__' @@ -203,9 +261,14 @@ export interface FileRouteTypes { | '/$complexSlug/booking' | '/_app/profile' | '/onboard/setup' + | '/_app/_authenticated/admin' | '/$complexSlug/booking/' | '/_app/_authenticated/' | '/$complexSlug/booking/confirmed/$bookingCode' + | '/_app/_authenticated/admin/complexes' + | '/_app/_authenticated/admin/plans' + | '/_app/_authenticated/admin/users' + | '/_app/_authenticated/admin/' | '/_app/_authenticated/complex/$slug/edit' fileRoutesById: FileRoutesById } @@ -321,6 +384,41 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ComplexSlugBookingIndexRouteImport parentRoute: typeof ComplexSlugBookingRoute } + '/_app/_authenticated/admin': { + id: '/_app/_authenticated/admin' + path: '/admin' + fullPath: '/admin' + preLoaderRoute: typeof AppAuthenticatedAdminRouteRouteImport + parentRoute: typeof AppAuthenticatedRouteRoute + } + '/_app/_authenticated/admin/': { + id: '/_app/_authenticated/admin/' + path: '/' + fullPath: '/admin/' + preLoaderRoute: typeof AppAuthenticatedAdminIndexRouteImport + parentRoute: typeof AppAuthenticatedAdminRouteRoute + } + '/_app/_authenticated/admin/users': { + id: '/_app/_authenticated/admin/users' + path: '/users' + fullPath: '/admin/users' + preLoaderRoute: typeof AppAuthenticatedAdminUsersRouteImport + parentRoute: typeof AppAuthenticatedAdminRouteRoute + } + '/_app/_authenticated/admin/plans': { + id: '/_app/_authenticated/admin/plans' + path: '/plans' + fullPath: '/admin/plans' + preLoaderRoute: typeof AppAuthenticatedAdminPlansRouteImport + parentRoute: typeof AppAuthenticatedAdminRouteRoute + } + '/_app/_authenticated/admin/complexes': { + id: '/_app/_authenticated/admin/complexes' + path: '/complexes' + fullPath: '/admin/complexes' + preLoaderRoute: typeof AppAuthenticatedAdminComplexesRouteImport + parentRoute: typeof AppAuthenticatedAdminRouteRoute + } '/$complexSlug/booking/confirmed/$bookingCode': { id: '/$complexSlug/booking/confirmed/$bookingCode' path: '/confirmed/$bookingCode' @@ -338,12 +436,34 @@ declare module '@tanstack/react-router' { } } +interface AppAuthenticatedAdminRouteRouteChildren { + AppAuthenticatedAdminComplexesRoute: typeof AppAuthenticatedAdminComplexesRoute + AppAuthenticatedAdminPlansRoute: typeof AppAuthenticatedAdminPlansRoute + AppAuthenticatedAdminUsersRoute: typeof AppAuthenticatedAdminUsersRoute + AppAuthenticatedAdminIndexRoute: typeof AppAuthenticatedAdminIndexRoute +} + +const AppAuthenticatedAdminRouteRouteChildren: AppAuthenticatedAdminRouteRouteChildren = + { + AppAuthenticatedAdminComplexesRoute: AppAuthenticatedAdminComplexesRoute, + AppAuthenticatedAdminPlansRoute: AppAuthenticatedAdminPlansRoute, + AppAuthenticatedAdminUsersRoute: AppAuthenticatedAdminUsersRoute, + AppAuthenticatedAdminIndexRoute: AppAuthenticatedAdminIndexRoute, + } + +const AppAuthenticatedAdminRouteRouteWithChildren = + AppAuthenticatedAdminRouteRoute._addFileChildren( + AppAuthenticatedAdminRouteRouteChildren, + ) + interface AppAuthenticatedRouteRouteChildren { + AppAuthenticatedAdminRouteRoute: typeof AppAuthenticatedAdminRouteRouteWithChildren AppAuthenticatedIndexRoute: typeof AppAuthenticatedIndexRoute AppAuthenticatedComplexSlugEditRoute: typeof AppAuthenticatedComplexSlugEditRoute } const AppAuthenticatedRouteRouteChildren: AppAuthenticatedRouteRouteChildren = { + AppAuthenticatedAdminRouteRoute: AppAuthenticatedAdminRouteRouteWithChildren, AppAuthenticatedIndexRoute: AppAuthenticatedIndexRoute, AppAuthenticatedComplexSlugEditRoute: AppAuthenticatedComplexSlugEditRoute, } diff --git a/apps/frontend/src/routes/_app/_authenticated/admin/complexes.tsx b/apps/frontend/src/routes/_app/_authenticated/admin/complexes.tsx new file mode 100644 index 0000000..2f3fc97 --- /dev/null +++ b/apps/frontend/src/routes/_app/_authenticated/admin/complexes.tsx @@ -0,0 +1,6 @@ +import { ComplexesPage } from '@/features/admin/complexes-page'; +import { createFileRoute } from '@tanstack/react-router'; + +export const Route = createFileRoute('/_app/_authenticated/admin/complexes')({ + component: ComplexesPage, +}); diff --git a/apps/frontend/src/routes/_app/_authenticated/admin/index.tsx b/apps/frontend/src/routes/_app/_authenticated/admin/index.tsx new file mode 100644 index 0000000..c5b8c18 --- /dev/null +++ b/apps/frontend/src/routes/_app/_authenticated/admin/index.tsx @@ -0,0 +1,6 @@ +import { AdminPage } from '@/features/admin/admin-page'; +import { createFileRoute } from '@tanstack/react-router'; + +export const Route = createFileRoute('/_app/_authenticated/admin/')({ + component: AdminPage, +}); diff --git a/apps/frontend/src/routes/_app/_authenticated/admin/plans.tsx b/apps/frontend/src/routes/_app/_authenticated/admin/plans.tsx new file mode 100644 index 0000000..809b136 --- /dev/null +++ b/apps/frontend/src/routes/_app/_authenticated/admin/plans.tsx @@ -0,0 +1,6 @@ +import { PlansPage } from '@/features/admin/plans-page'; +import { createFileRoute } from '@tanstack/react-router'; + +export const Route = createFileRoute('/_app/_authenticated/admin/plans')({ + component: PlansPage, +}); diff --git a/apps/frontend/src/routes/_app/_authenticated/admin/route.tsx b/apps/frontend/src/routes/_app/_authenticated/admin/route.tsx new file mode 100644 index 0000000..33f19e6 --- /dev/null +++ b/apps/frontend/src/routes/_app/_authenticated/admin/route.tsx @@ -0,0 +1,16 @@ +import { createFileRoute, redirect } from '@tanstack/react-router'; + +export const Route = createFileRoute('/_app/_authenticated/admin')({ + beforeLoad: ({ context, location }) => { + if (!context.auth.isAuthenticated) { + throw redirect({ + to: '/login', + search: { redirect: location.href }, + }); + } + + if (context.auth.user?.role !== 'super_admin') { + throw redirect({ to: '/' }); + } + }, +}); diff --git a/apps/frontend/src/routes/_app/_authenticated/admin/users.tsx b/apps/frontend/src/routes/_app/_authenticated/admin/users.tsx new file mode 100644 index 0000000..76c025c --- /dev/null +++ b/apps/frontend/src/routes/_app/_authenticated/admin/users.tsx @@ -0,0 +1,6 @@ +import { UsersPage } from '@/features/admin/users-page'; +import { createFileRoute } from '@tanstack/react-router'; + +export const Route = createFileRoute('/_app/_authenticated/admin/users')({ + component: UsersPage, +}); diff --git a/packages/api-contract/src/admin.ts b/packages/api-contract/src/admin.ts new file mode 100644 index 0000000..2b52fc8 --- /dev/null +++ b/packages/api-contract/src/admin.ts @@ -0,0 +1,92 @@ +import { z } from 'zod' + +export const adminPaymentStatusSchema = z.enum(['active', 'no_plan', 'expired']) + +export const adminComplexListItemSchema = z.object({ + id: z.string(), + complexName: z.string(), + complexSlug: z.string(), + city: z.string().nullable(), + planCode: z.string().nullable(), + planName: z.string().nullable(), + userCount: z.number().int().nonnegative(), + courtCount: z.number().int().nonnegative(), + avgBookingsPerDay: z.number().nonnegative(), + paymentStatus: adminPaymentStatusSchema, +}) + +export const adminComplexStatsSchema = z.object({ + id: z.string(), + complexName: z.string(), + complexSlug: z.string(), + city: z.string().nullable(), + adminEmail: z.string(), + planCode: z.string().nullable(), + planName: z.string().nullable(), + userCount: z.number().int().nonnegative(), + courtCount: z.number().int().nonnegative(), + totalBookings: z.number().int().nonnegative(), + avgBookingsPerDay: z.number().nonnegative(), + bookingsByStatus: z.object({ + confirmed: z.number().int().nonnegative(), + cancelled: z.number().int().nonnegative(), + completed: z.number().int().nonnegative(), + noshow: z.number().int().nonnegative(), + }), + paymentStatus: adminPaymentStatusSchema, +}) + +export const adminCreatePlanSchema = z.object({ + code: z.string().trim().min(1).max(10), + name: z.string().trim().min(1).max(30), + price: z.number().nonnegative(), + rules: z.any(), +}) + +export const adminUpdatePlanSchema = z.object({ + name: z.string().trim().min(1).max(30).optional(), + price: z.number().nonnegative().optional(), + rules: z.any().optional(), +}) + +export const adminUserSchema = z.object({ + id: z.string(), + name: z.string(), + email: z.string(), + role: z.string(), + banned: z.boolean(), + bannedAt: z.string().datetime().nullable(), + banReason: z.string().nullable(), + createdAt: z.string().datetime(), + complexCount: z.number().int().nonnegative(), + activeSessions: z.number().int().nonnegative(), +}) + +export const adminBlockUserSchema = z.object({ + banReason: z.string().max(500).optional(), +}) + +export const adminGlobalStatsSchema = z.object({ + totalComplexes: z.number().int().nonnegative(), + totalUsers: z.number().int().nonnegative(), + totalCourts: z.number().int().nonnegative(), + totalBookings: z.number().int().nonnegative(), +}) + +export const adminUserSessionSchema = z.object({ + id: z.string(), + createdAt: z.string().datetime(), + expiresAt: z.string().datetime(), + ipAddress: z.string().nullable(), + userAgent: z.string().nullable(), +}) + +export type AdminComplexListItem = z.infer +export type AdminComplexStats = z.infer +export type AdminCreatePlanInput = z.infer +export type AdminUpdatePlanInput = z.infer +export type AdminUser = z.infer +export type AdminBlockUserInput = z.infer +export type AdminGlobalStats = z.infer +export type AdminPaymentStatus = z.infer +export type AdminUserSession = z.infer diff --git a/packages/api-contract/src/index.ts b/packages/api-contract/src/index.ts index b6443de..264766b 100644 --- a/packages/api-contract/src/index.ts +++ b/packages/api-contract/src/index.ts @@ -129,3 +129,25 @@ export type { PasswordResetVerifyResponse, PasswordResetResendResponse, } from './user' +export { + adminComplexListItemSchema, + adminComplexStatsSchema, + adminCreatePlanSchema, + adminUpdatePlanSchema, + adminUserSchema, + adminBlockUserSchema, + adminGlobalStatsSchema, + adminPaymentStatusSchema, + adminUserSessionSchema, +} from './admin' +export type { + AdminComplexListItem, + AdminComplexStats, + AdminCreatePlanInput, + AdminUpdatePlanInput, + AdminUser, + AdminBlockUserInput, + AdminGlobalStats, + AdminPaymentStatus, + AdminUserSession, +} from './admin' -- 2.49.1 From 93b3a826381a63ad91d0c11c5aaa2715791fc52b Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Wed, 10 Jun 2026 09:44:02 -0300 Subject: [PATCH 2/6] feat(admin): implement user search functionality in admin portal --- .../backend/src/modules/admin/admin.routes.ts | 2 +- .../admin/handlers/list-users.handler.ts | 3 +- .../admin/services/admin-users.service.ts | 10 ++++- .../src/features/admin/users-page.tsx | 41 ++++++++++++++----- apps/frontend/src/lib/api/resources/admin.ts | 6 ++- 5 files changed, 46 insertions(+), 16 deletions(-) diff --git a/apps/backend/src/modules/admin/admin.routes.ts b/apps/backend/src/modules/admin/admin.routes.ts index 1de3e12..9148f1c 100644 --- a/apps/backend/src/modules/admin/admin.routes.ts +++ b/apps/backend/src/modules/admin/admin.routes.ts @@ -6,9 +6,9 @@ import { createPlanHandler } from '@/modules/admin/handlers/create-plan.handler' import { deletePlanHandler } from '@/modules/admin/handlers/delete-plan.handler'; import { getUserSessionsHandler } from '@/modules/admin/handlers/get-user-sessions.handler'; import { listComplexesHandler } from '@/modules/admin/handlers/list-complexes.handler'; -import { revokeAllSessionsHandler } from '@/modules/admin/handlers/revoke-all-sessions.handler'; import { listPlansAdminHandler } from '@/modules/admin/handlers/list-plans-admin.handler'; import { listUsersHandler } from '@/modules/admin/handlers/list-users.handler'; +import { revokeAllSessionsHandler } from '@/modules/admin/handlers/revoke-all-sessions.handler'; import { unblockUserHandler } from '@/modules/admin/handlers/unblock-user.handler'; import { updatePlanHandler } from '@/modules/admin/handlers/update-plan.handler'; import type { AppEnv } from '@/types/hono'; diff --git a/apps/backend/src/modules/admin/handlers/list-users.handler.ts b/apps/backend/src/modules/admin/handlers/list-users.handler.ts index f6a757c..deaef65 100644 --- a/apps/backend/src/modules/admin/handlers/list-users.handler.ts +++ b/apps/backend/src/modules/admin/handlers/list-users.handler.ts @@ -2,6 +2,7 @@ import { listAdminUsers } from '@/modules/admin/services/admin-users.service'; import type { AppContext } from '@/types/hono'; export async function listUsersHandler(c: AppContext) { - const users = await listAdminUsers(); + const search = c.req.query('search'); + const users = await listAdminUsers(search); return c.json(users); } diff --git a/apps/backend/src/modules/admin/services/admin-users.service.ts b/apps/backend/src/modules/admin/services/admin-users.service.ts index 99ded34..5c01a43 100644 --- a/apps/backend/src/modules/admin/services/admin-users.service.ts +++ b/apps/backend/src/modules/admin/services/admin-users.service.ts @@ -13,8 +13,16 @@ type AdminUser = { activeSessions: number; }; -export async function listAdminUsers(): Promise { +export async function listAdminUsers(search?: string): Promise { const users = await db.user.findMany({ + where: search + ? { + OR: [ + { name: { contains: search, mode: 'insensitive' } }, + { email: { contains: search, mode: 'insensitive' } }, + ], + } + : undefined, include: { _count: { select: { complexes: true, sessions: true }, diff --git a/apps/frontend/src/features/admin/users-page.tsx b/apps/frontend/src/features/admin/users-page.tsx index eb4560c..7bc39f9 100644 --- a/apps/frontend/src/features/admin/users-page.tsx +++ b/apps/frontend/src/features/admin/users-page.tsx @@ -21,10 +21,11 @@ import { LogIn, Monitor, RefreshCw, + Search, ShieldAlert, Users, } from 'lucide-react'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; function SessionsDialog({ user, @@ -284,10 +285,17 @@ export function UsersPage() { const [blockingUser, setBlockingUser] = useState(null); const [unblockingUser, setUnblockingUser] = useState(null); const [sessionsUser, setSessionsUser] = useState(null); + const [searchInput, setSearchInput] = useState(''); + const [search, setSearch] = useState(''); + + useEffect(() => { + const timer = setTimeout(() => setSearch(searchInput), 300); + return () => clearTimeout(timer); + }, [searchInput]); const { data, isLoading } = useQuery({ - queryKey: ['admin-users'], - queryFn: () => apiClient.admin.listUsers(), + queryKey: ['admin-users', search], + queryFn: () => apiClient.admin.listUsers(search || undefined), }); return ( @@ -300,14 +308,25 @@ export function UsersPage() {

- +
+
+ + setSearchInput(e.target.value)} + placeholder="Buscar por nombre o email..." + className="h-9 w-56 rounded-xl pl-9 text-sm" + /> +
+ +
{blockingUser && setBlockingUser(null)} />} diff --git a/apps/frontend/src/lib/api/resources/admin.ts b/apps/frontend/src/lib/api/resources/admin.ts index 4d7409a..39cb380 100644 --- a/apps/frontend/src/lib/api/resources/admin.ts +++ b/apps/frontend/src/lib/api/resources/admin.ts @@ -51,8 +51,10 @@ export async function deletePlan(code: string) { return response.data; } -export async function listUsers() { - const response = await http.get('/api/admin/users'); +export async function listUsers(search?: string) { + const response = await http.get('/api/admin/users', { + params: search ? { search } : undefined, + }); return response.data; } -- 2.49.1 From 00f0cf511fa93fb18e459a23d79cf60ccfadac0a Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Wed, 10 Jun 2026 10:01:36 -0300 Subject: [PATCH 3/6] feat(admin): add geolocation information to user sessions and implement geo IP fetching --- apps/backend/src/lib/geoip.ts | 57 +++++++++++++++++++ .../admin/services/admin-users.service.ts | 39 ++++++++++--- .../services/password-reset.service.ts | 33 +---------- .../src/features/admin/users-page.tsx | 11 ++++ packages/api-contract/src/admin.ts | 3 + 5 files changed, 104 insertions(+), 39 deletions(-) create mode 100644 apps/backend/src/lib/geoip.ts diff --git a/apps/backend/src/lib/geoip.ts b/apps/backend/src/lib/geoip.ts new file mode 100644 index 0000000..6f82440 --- /dev/null +++ b/apps/backend/src/lib/geoip.ts @@ -0,0 +1,57 @@ +type IpGeoInfo = { + ip: string; + city: string; + country: string; + countryCode: string; +}; + +const cache = new Map(); +const CACHE_TTL_MS = 60 * 60 * 1000; + +function getCached(ip: string): IpGeoInfo | undefined { + const entry = cache.get(ip); + if (!entry) return undefined; + if (Date.now() > entry.expiresAt) { + cache.delete(ip); + return undefined; + } + return entry.data; +} + +function setCache(ip: string, info: IpGeoInfo): void { + cache.set(ip, { data: info, expiresAt: Date.now() + CACHE_TTL_MS }); +} + +async function fetchGeoInfo(ip: string): Promise { + if (ip === '127.0.0.1' || ip === '::1' || ip.startsWith('192.168.') || ip.startsWith('10.')) { + return { ip, city: 'Red local', country: 'Red local', countryCode: 'LOCAL' }; + } + + const cached = getCached(ip); + if (cached) return cached; + + try { + const response = await fetch( + `http://ip-api.com/json/${ip}?fields=status,country,countryCode,city,query` + ); + if (!response.ok) return null; + + const data = await response.json(); + if (data.status !== 'success') return null; + + const info: IpGeoInfo = { + ip: data.query, + city: data.city || 'Desconocida', + country: data.country || 'Desconocido', + countryCode: data.countryCode || '', + }; + + setCache(ip, info); + return info; + } catch { + return null; + } +} + +export type { IpGeoInfo }; +export { fetchGeoInfo }; diff --git a/apps/backend/src/modules/admin/services/admin-users.service.ts b/apps/backend/src/modules/admin/services/admin-users.service.ts index 5c01a43..7c5069e 100644 --- a/apps/backend/src/modules/admin/services/admin-users.service.ts +++ b/apps/backend/src/modules/admin/services/admin-users.service.ts @@ -1,3 +1,4 @@ +import { fetchGeoInfo } from '@/lib/geoip'; import { db } from '@/lib/prisma'; type AdminUser = { @@ -51,6 +52,9 @@ type AdminUserSession = { expiresAt: string; ipAddress: string | null; userAgent: string | null; + city: string | null; + country: string | null; + countryCode: string | null; }; export async function getUserSessions(userId: string): Promise { @@ -59,13 +63,34 @@ export async function getUserSessions(userId: string): Promise ({ - id: s.id, - createdAt: s.createdAt.toISOString(), - expiresAt: s.expiresAt.toISOString(), - ipAddress: s.ipAddress, - userAgent: s.userAgent, - })); + const uniqueIps = [...new Set(sessions.map((s) => s.ipAddress).filter(Boolean))] as string[]; + const geoResults = await Promise.all(uniqueIps.map((ip) => fetchGeoInfo(ip))); + const geoMap = new Map< + string, + { city: string | null; country: string | null; countryCode: string | null } + >(); + for (let i = 0; i < uniqueIps.length; i++) { + const info = geoResults[i]; + geoMap.set(uniqueIps[i], { + city: info?.city ?? null, + country: info?.country ?? null, + countryCode: info?.countryCode ?? null, + }); + } + + return sessions.map((s) => { + const geo = s.ipAddress ? geoMap.get(s.ipAddress) : null; + return { + id: s.id, + createdAt: s.createdAt.toISOString(), + expiresAt: s.expiresAt.toISOString(), + ipAddress: s.ipAddress, + userAgent: s.userAgent, + city: geo?.city ?? null, + country: geo?.country ?? null, + countryCode: geo?.countryCode ?? null, + }; + }); } export class AdminServiceError extends Error { diff --git a/apps/backend/src/modules/password-reset/services/password-reset.service.ts b/apps/backend/src/modules/password-reset/services/password-reset.service.ts index 9ed1c41..7b0c42e 100644 --- a/apps/backend/src/modules/password-reset/services/password-reset.service.ts +++ b/apps/backend/src/modules/password-reset/services/password-reset.service.ts @@ -1,5 +1,6 @@ import { createHash, randomInt } from 'node:crypto'; import { auth } from '@/lib/auth'; +import { type IpGeoInfo, fetchGeoInfo } from '@/lib/geoip'; import { sendMail } from '@/lib/mailer'; import { db } from '@/lib/prisma'; import type { @@ -82,13 +83,6 @@ type UserAgentInfo = { device: string; }; -type IpGeoInfo = { - ip: string; - city: string; - country: string; - countryCode: string; -}; - function parseUserAgent(ua: string | undefined): UserAgentInfo { if (!ua) { return { browser: 'Desconocido', os: 'Desconocido', device: 'Desconocido' }; @@ -118,31 +112,6 @@ function parseUserAgent(ua: string | undefined): UserAgentInfo { return { browser, os, device }; } -async function fetchGeoInfo(ip: string): Promise { - if (ip === '127.0.0.1' || ip === '::1' || ip.startsWith('192.168.') || ip.startsWith('10.')) { - return { ip, city: 'Red local', country: 'Red local', countryCode: 'LOCAL' }; - } - - try { - const response = await fetch( - `http://ip-api.com/json/${ip}?fields=status,country,countryCode,city,query` - ); - if (!response.ok) return null; - - const data = await response.json(); - if (data.status !== 'success') return null; - - return { - ip: data.query, - city: data.city || 'Desconocida', - country: data.country || 'Desconocido', - countryCode: data.countryCode || '', - }; - } catch { - return null; - } -} - async function sendResetOtpEmail(email: string, otpCode: string) { await sendMail({ to: email, diff --git a/apps/frontend/src/features/admin/users-page.tsx b/apps/frontend/src/features/admin/users-page.tsx index 7bc39f9..b3e0d39 100644 --- a/apps/frontend/src/features/admin/users-page.tsx +++ b/apps/frontend/src/features/admin/users-page.tsx @@ -19,6 +19,7 @@ import { CheckCircle2, Globe, LogIn, + MapPin, Monitor, RefreshCw, Search, @@ -99,6 +100,10 @@ function SessionRow({ session }: { session: AdminUserSession }) { const isExpired = new Date(session.expiresAt) < new Date(); const userAgent = session.userAgent ?? 'Desconocido'; const ip = session.ipAddress ?? '—'; + const location = + session.city || session.country + ? [session.city, session.country].filter(Boolean).join(', ') + : null; return (
@@ -126,6 +131,12 @@ function SessionRow({ session }: { session: AdminUserSession }) { {ip} + {location && ( + + + {location} + + )} {new Date(session.createdAt).toLocaleString()} diff --git a/packages/api-contract/src/admin.ts b/packages/api-contract/src/admin.ts index 2b52fc8..de5ebcd 100644 --- a/packages/api-contract/src/admin.ts +++ b/packages/api-contract/src/admin.ts @@ -79,6 +79,9 @@ export const adminUserSessionSchema = z.object({ expiresAt: z.string().datetime(), ipAddress: z.string().nullable(), userAgent: z.string().nullable(), + city: z.string().nullable(), + country: z.string().nullable(), + countryCode: z.string().nullable(), }) export type AdminComplexListItem = z.infer -- 2.49.1 From dc8a10a61204f20d4cd3fe520de5c5fa6a7222b1 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Wed, 10 Jun 2026 10:18:31 -0300 Subject: [PATCH 4/6] feat: add geolocation fields to session and implement geo stats endpoint - Added country, city, countryCode, latitude, and longitude fields to the Session model. - Updated geoip service to fetch and store geolocation data based on user IP. - Created a new admin endpoint to retrieve geolocation statistics, including user counts by country and city. - Enhanced admin page to display geolocation statistics with expandable city details. - Introduced caching for geolocation data to optimize performance. --- apps/backend/prisma/auth.prisma | 23 ++-- .../migration.sql | 6 + .../src/generated/prisma/commonInputTypes.ts | 54 ++++++++ .../src/generated/prisma/internal/class.ts | 8 +- .../prisma/internal/prismaNamespace.ts | 33 +++-- .../prisma/internal/prismaNamespaceBrowser.ts | 5 + apps/backend/src/lib/geoip.ts | 15 ++- .../middlewares/require-auth.middleware.ts | 38 ++++++ .../backend/src/modules/admin/admin.routes.ts | 3 + .../admin/handlers/get-geo-stats.handler.ts | 8 ++ .../admin/services/admin-geo.service.ts | 67 ++++++++++ .../src/features/admin/admin-page.tsx | 126 +++++++++++++++++- apps/frontend/src/lib/api/resources/admin.ts | 6 + packages/api-contract/src/admin.ts | 21 +++ packages/api-contract/src/index.ts | 6 + 15 files changed, 389 insertions(+), 30 deletions(-) create mode 100644 apps/backend/prisma/migrations/20260610131124_add_session_geo_fields/migration.sql create mode 100644 apps/backend/src/modules/admin/handlers/get-geo-stats.handler.ts create mode 100644 apps/backend/src/modules/admin/services/admin-geo.service.ts diff --git a/apps/backend/prisma/auth.prisma b/apps/backend/prisma/auth.prisma index 3c8bfe7..d30f47d 100644 --- a/apps/backend/prisma/auth.prisma +++ b/apps/backend/prisma/auth.prisma @@ -20,15 +20,20 @@ model User { } model Session { - id String @id - expiresAt DateTime - token String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - ipAddress String? - userAgent String? - userId String - user User @relation(fields: [userId], references: [id], onDelete: Cascade) + id String @id + expiresAt DateTime + token String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + ipAddress String? + userAgent String? + country String? + city String? + countryCode String? + latitude Float? + longitude Float? + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([token]) @@index([userId]) diff --git a/apps/backend/prisma/migrations/20260610131124_add_session_geo_fields/migration.sql b/apps/backend/prisma/migrations/20260610131124_add_session_geo_fields/migration.sql new file mode 100644 index 0000000..eb9756a --- /dev/null +++ b/apps/backend/prisma/migrations/20260610131124_add_session_geo_fields/migration.sql @@ -0,0 +1,6 @@ +-- AlterTable +ALTER TABLE "sessions" ADD COLUMN "city" TEXT, +ADD COLUMN "country" TEXT, +ADD COLUMN "countryCode" TEXT, +ADD COLUMN "latitude" DOUBLE PRECISION, +ADD COLUMN "longitude" DOUBLE PRECISION; diff --git a/apps/backend/src/generated/prisma/commonInputTypes.ts b/apps/backend/src/generated/prisma/commonInputTypes.ts index 8a9fe7a..fc8670d 100644 --- a/apps/backend/src/generated/prisma/commonInputTypes.ts +++ b/apps/backend/src/generated/prisma/commonInputTypes.ts @@ -148,6 +148,33 @@ export type DateTimeWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDateTimeFilter<$PrismaModel> } +export type FloatNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null +} + +export type FloatNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _min?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _max?: Prisma.NestedFloatNullableFilter<$PrismaModel> +} + export type UuidFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -495,6 +522,33 @@ export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDateTimeFilter<$PrismaModel> } +export type NestedFloatNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null +} + +export type NestedFloatNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null + in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel> | null + lt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + lte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gt?: number | Prisma.FloatFieldRefInput<$PrismaModel> + gte?: number | Prisma.FloatFieldRefInput<$PrismaModel> + not?: Prisma.NestedFloatNullableWithAggregatesFilter<$PrismaModel> | number | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _sum?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _min?: Prisma.NestedFloatNullableFilter<$PrismaModel> + _max?: Prisma.NestedFloatNullableFilter<$PrismaModel> +} + export type NestedUuidFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> diff --git a/apps/backend/src/generated/prisma/internal/class.ts b/apps/backend/src/generated/prisma/internal/class.ts index 9a4bc7c..b7c41c4 100644 --- a/apps/backend/src/generated/prisma/internal/class.ts +++ b/apps/backend/src/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.6.0", "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", "activeProvider": "postgresql", - "inlineSchema": "model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n phone String?\n banned Boolean @default(false)\n bannedAt DateTime?\n banReason String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n role String @default(\"member\")\n complexes ComplexUser[]\n\n @@unique([email])\n @@map(\"users\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"sessions\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"accounts\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n invitations ComplexInvitation[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n EMPLOYEE\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\")\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nmodel ComplexInvitation {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n email String @db.VarChar(255)\n tokenHash String @unique @map(\"token_hash\")\n expiresAt DateTime @map(\"expires_at\")\n acceptedAt DateTime? @map(\"accepted_at\")\n revokedAt DateTime? @map(\"revoked_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n\n @@index([complexId, email])\n @@index([email])\n @@map(\"complex_invitations\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n NOSHOW\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n isUnderMaintenance Boolean @default(false) @map(\"is_under_maintenance\")\n maintenanceReason String? @map(\"maintenance_reason\") @db.VarChar(500)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n maintenances CourtMaintenance[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtMaintenance {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n startDate DateTime @map(\"start_date\") @db.Date\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n reason String? @db.VarChar(500)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, startDate])\n @@map(\"court_maintenances\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel CourtBookingLog {\n id String @id @db.Uuid\n bookingCode String @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n previousStatus CourtBookingStatus @map(\"previous_status\")\n newStatus CourtBookingStatus @map(\"new_status\")\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n changedAt DateTime @default(now()) @map(\"changed_at\")\n\n @@index([courtId, newStatus])\n @@map(\"court_booking_logs\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// User model is defined in auth.prisma (Better Auth schema).\n", + "inlineSchema": "model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n phone String?\n banned Boolean @default(false)\n bannedAt DateTime?\n banReason String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n role String @default(\"member\")\n complexes ComplexUser[]\n\n @@unique([email])\n @@map(\"users\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n country String?\n city String?\n countryCode String?\n latitude Float?\n longitude Float?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"sessions\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"accounts\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n invitations ComplexInvitation[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n EMPLOYEE\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\")\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nmodel ComplexInvitation {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n email String @db.VarChar(255)\n tokenHash String @unique @map(\"token_hash\")\n expiresAt DateTime @map(\"expires_at\")\n acceptedAt DateTime? @map(\"accepted_at\")\n revokedAt DateTime? @map(\"revoked_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n\n @@index([complexId, email])\n @@index([email])\n @@map(\"complex_invitations\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n NOSHOW\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n isUnderMaintenance Boolean @default(false) @map(\"is_under_maintenance\")\n maintenanceReason String? @map(\"maintenance_reason\") @db.VarChar(500)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n maintenances CourtMaintenance[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtMaintenance {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n startDate DateTime @map(\"start_date\") @db.Date\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n reason String? @db.VarChar(500)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, startDate])\n @@map(\"court_maintenances\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel CourtBookingLog {\n id String @id @db.Uuid\n bookingCode String @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n previousStatus CourtBookingStatus @map(\"previous_status\")\n newStatus CourtBookingStatus @map(\"new_status\")\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n customerEmail String @map(\"customer_email\") @db.VarChar(254)\n changedAt DateTime @default(now()) @map(\"changed_at\")\n\n @@index([courtId, newStatus])\n @@map(\"court_booking_logs\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// User model is defined in auth.prisma (Better Auth schema).\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phone\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"bannedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"sessions\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"accounts\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"ComplexInvitation\",\"relationName\":\"ComplexToComplexInvitation\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"ComplexInvitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"token_hash\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"expires_at\"},{\"name\":\"acceptedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"accepted_at\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"revoked_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexInvitation\"}],\"dbName\":\"complex_invitations\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"isUnderMaintenance\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_under_maintenance\"},{\"name\":\"maintenanceReason\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"maintenance_reason\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"},{\"name\":\"maintenances\",\"kind\":\"object\",\"type\":\"CourtMaintenance\",\"relationName\":\"CourtToCourtMaintenance\"}],\"dbName\":\"courts\"},\"CourtMaintenance\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"start_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"reason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtMaintenance\"}],\"dbName\":\"court_maintenances\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"CourtBookingLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"previousStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"previous_status\"},{\"name\":\"newStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"new_status\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"changedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"changed_at\"}],\"dbName\":\"court_booking_logs\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phone\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"bannedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"countryCode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latitude\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"longitude\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"sessions\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"accounts\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"ComplexInvitation\",\"relationName\":\"ComplexToComplexInvitation\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"ComplexInvitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"token_hash\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"expires_at\"},{\"name\":\"acceptedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"accepted_at\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"revoked_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexInvitation\"}],\"dbName\":\"complex_invitations\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"isUnderMaintenance\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_under_maintenance\"},{\"name\":\"maintenanceReason\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"maintenance_reason\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"},{\"name\":\"maintenances\",\"kind\":\"object\",\"type\":\"CourtMaintenance\",\"relationName\":\"CourtToCourtMaintenance\"}],\"dbName\":\"courts\"},\"CourtMaintenance\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"start_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"reason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtMaintenance\"}],\"dbName\":\"court_maintenances\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"CourtBookingLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"previousStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"previous_status\"},{\"name\":\"newStatus\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\",\"dbName\":\"new_status\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"customerEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_email\"},{\"name\":\"changedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"changed_at\"}],\"dbName\":\"court_booking_logs\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"sessions\",\"accounts\",\"complexes\",\"_count\",\"plan\",\"users\",\"complex\",\"invitations\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"maintenances\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"ComplexInvitation.findUnique\",\"ComplexInvitation.findUniqueOrThrow\",\"ComplexInvitation.findFirst\",\"ComplexInvitation.findFirstOrThrow\",\"ComplexInvitation.findMany\",\"ComplexInvitation.createOne\",\"ComplexInvitation.createMany\",\"ComplexInvitation.createManyAndReturn\",\"ComplexInvitation.updateOne\",\"ComplexInvitation.updateMany\",\"ComplexInvitation.updateManyAndReturn\",\"ComplexInvitation.upsertOne\",\"ComplexInvitation.deleteOne\",\"ComplexInvitation.deleteMany\",\"ComplexInvitation.groupBy\",\"ComplexInvitation.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"_avg\",\"_sum\",\"Court.groupBy\",\"Court.aggregate\",\"CourtMaintenance.findUnique\",\"CourtMaintenance.findUniqueOrThrow\",\"CourtMaintenance.findFirst\",\"CourtMaintenance.findFirstOrThrow\",\"CourtMaintenance.findMany\",\"CourtMaintenance.createOne\",\"CourtMaintenance.createMany\",\"CourtMaintenance.createManyAndReturn\",\"CourtMaintenance.updateOne\",\"CourtMaintenance.updateMany\",\"CourtMaintenance.updateManyAndReturn\",\"CourtMaintenance.upsertOne\",\"CourtMaintenance.deleteOne\",\"CourtMaintenance.deleteMany\",\"CourtMaintenance.groupBy\",\"CourtMaintenance.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"CourtBookingLog.findUnique\",\"CourtBookingLog.findUniqueOrThrow\",\"CourtBookingLog.findFirst\",\"CourtBookingLog.findFirstOrThrow\",\"CourtBookingLog.findMany\",\"CourtBookingLog.createOne\",\"CourtBookingLog.createMany\",\"CourtBookingLog.createManyAndReturn\",\"CourtBookingLog.updateOne\",\"CourtBookingLog.updateMany\",\"CourtBookingLog.updateManyAndReturn\",\"CourtBookingLog.upsertOne\",\"CourtBookingLog.deleteOne\",\"CourtBookingLog.deleteMany\",\"CourtBookingLog.groupBy\",\"CourtBookingLog.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"AND\",\"OR\",\"NOT\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"id\",\"email\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"createdAt\",\"updatedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"CourtBookingStatus\",\"previousStatus\",\"newStatus\",\"customerName\",\"customerPhone\",\"customerEmail\",\"changedAt\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"startDate\",\"reason\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"isUnderMaintenance\",\"maintenanceReason\",\"slug\",\"tokenHash\",\"expiresAt\",\"acceptedAt\",\"revokedAt\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"identifier\",\"value\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"emailVerified\",\"image\",\"phone\",\"banned\",\"bannedAt\",\"banReason\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "5gaOAYACEgQAAPYDACAFAAD3AwAgBgAA-AMAIJsCAAD0AwAwnAIAADwAEJ0CAAD0AwAwnwIBALoDACG3AgEAAAABuAIBAAAAAb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfcCIADnAwAh-AIBAPUDACH5AgEA9QMAIfoCIADnAwAh-wJAAMwDACH8AgEA9QMAIQEAAAABACAMAwAAjwQAIJsCAACRBAAwnAIAAAMAEJ0CAACRBAAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIfQCAQC6AwAh9QIBAPUDACH2AgEA9QMAIQMDAACeBgAg9QIAAJcFACD2AgAAlwUAIAwDAACPBAAgmwIAAJEEADCcAgAAAwAQnQIAAJEEADC3AgEAAAABvwJAAL0DACHAAkAAvQMAIdsCQAC9AwAh3gIBALoDACH0AgEAAAAB9QIBAPUDACH2AgEA9QMAIQMAAAADACABAAAEADACAAAFACARAwAAjwQAIJsCAACQBAAwnAIAAAcAEJ0CAACQBAAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh3gIBALoDACHrAgEAugMAIewCAQC6AwAh7QIBAPUDACHuAgEA9QMAIe8CAQD1AwAh8AJAAMwDACHxAkAAzAMAIfICAQD1AwAh8wIBAPUDACEIAwAAngYAIO0CAACXBQAg7gIAAJcFACDvAgAAlwUAIPACAACXBQAg8QIAAJcFACDyAgAAlwUAIPMCAACXBQAgEQMAAI8EACCbAgAAkAQAMJwCAAAHABCdAgAAkAQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh3gIBALoDACHrAgEAugMAIewCAQC6AwAh7QIBAPUDACHuAgEA9QMAIe8CAQD1AwAh8AJAAMwDACHxAkAAzAMAIfICAQD1AwAh8wIBAPUDACEDAAAABwAgAQAACAAwAgAACQAgCQMAAI8EACAKAACCBAAgmwIAAI0EADCcAgAACwAQnQIAAI0EADC_AkAAvQMAIdMCAQDKAwAh3gIBALoDACHgAgAAjgTgAiICAwAAngYAIAoAAJYGACAKAwAAjwQAIAoAAIIEACCbAgAAjQQAMJwCAAALABCdAgAAjQQAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIv4CAACMBAAgAwAAAAsAIAEAAAwAMAIAAA0AIAkGAAC-AwAgmwIAALkDADCcAgAADwAQnQIAALkDADCeAgEAugMAIZ8CAQC6AwAhoAIQALsDACGhAgAAvAMAIKICQAC9AwAhAQAAAA8AIBIIAACKBAAgCQAA-AMAIAsAAIsEACAMAADoAwAgmwIAAIkEADCcAgAAEQAQnQIAAIkEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAhCQgAAJwGACAJAACUBgAgCwAAnQYAIAwAAMsFACDiAgAAlwUAIOMCAACXBQAg5AIAAJcFACDlAgAAlwUAIOgCAACXBQAgEggAAIoEACAJAAD4AwAgCwAAiwQAIAwAAOgDACCbAgAAiQQAMJwCAAARABCdAgAAiQQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA9QMAIeMCAQD1AwAh5AIBAPUDACHlAgEA9QMAIeYCAQAAAAHnAgEAugMAIegCAQD1AwAhAwAAABEAIAEAABIAMAIAABMAIAEAAAARACADAAAACwAgAQAADAAwAgAADQAgDQoAAIIEACCbAgAAiAQAMJwCAAAXABCdAgAAiAQAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIQMKAACWBgAg3AIAAJcFACDdAgAAlwUAIA0KAACCBAAgmwIAAIgEADCcAgAAFwAQnQIAAIgEADC3AgEAAAABuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAAAAB2wJAAL0DACHcAkAAzAMAId0CQADMAwAhAwAAABcAIAEAABgAMAIAABkAIBMKAACCBAAgDQAAgwQAIA8AAIQEACAQAACFBAAgEQAAhgQAIBIAAIcEACCbAgAAgQQAMJwCAAAbABCdAgAAgQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAhBwoAAJYGACANAACXBgAgDwAAmAYAIBAAAJkGACARAACaBgAgEgAAmwYAINgCAACXBQAgEwoAAIIEACANAACDBAAgDwAAhAQAIBAAAIUEACARAACGBAAgEgAAhwQAIJsCAACBBAAwnAIAABsAEJ0CAACBBAAwnwIBALoDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA9QMAIQMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAQAAABsAIAoOAAD6AwAgmwIAAP8DADCcAgAAIQAQnQIAAP8DADC3AgEAygMAIb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiAQ4AAJUGACAKDgAA-gMAIJsCAAD_AwAwnAIAACEAEJ0CAAD_AwAwtwIBAAAAAb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiAwAAACEAIAEAACIAMAIAACMAIA0OAAD6AwAgmwIAAP0DADCcAgAAJQAQnQIAAP0DADCgAhAAuwMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIc8CAAD-A88CI9ACIADnAwAhBA4AAJUGACDEAgAAlwUAIMUCAACXBQAgzwIAAJcFACANDgAA-gMAIJsCAAD9AwAwnAIAACUAEJ0CAAD9AwAwoAIQALsDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIc8CAAD-A88CI9ACIADnAwAhAwAAACUAIAEAACYAMAIAACcAIBAOAAD6AwAgmwIAAPwDADCcAgAAKQAQnQIAAPwDADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHBAgEAugMAIcICAQDKAwAhwwJAAL0DACHEAgEAugMAIcUCAQC6AwAhyQIBALoDACHKAgEAugMAIcsCAQC6AwAhzQIAANMDxwIiAQ4AAJUGACARDgAA-gMAIJsCAAD8AwAwnAIAACkAEJ0CAAD8AwAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHBAgEAAAABwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiL9AgAA-wMAIAMAAAApACABAAAqADACAAArACAMDgAA-gMAIJsCAAD5AwAwnAIAAC0AEJ0CAAD5AwAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQQOAACVBgAgxAIAAJcFACDFAgAAlwUAINICAACXBQAgDA4AAPoDACCbAgAA-QMAMJwCAAAtABCdAgAA-QMAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQMAAAAtACABAAAuADACAAAvACABAAAAIQAgAQAAACUAIAEAAAApACABAAAALQAgAQAAAAsAIAEAAAAXACABAAAAGwAgAQAAAAMAIAEAAAAHACABAAAACwAgAQAAAAEAIBIEAAD2AwAgBQAA9wMAIAYAAPgDACCbAgAA9AMAMJwCAAA8ABCdAgAA9AMAMJ8CAQC6AwAhtwIBALoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfcCIADnAwAh-AIBAPUDACH5AgEA9QMAIfoCIADnAwAh-wJAAMwDACH8AgEA9QMAIQcEAACSBgAgBQAAkwYAIAYAAJQGACD4AgAAlwUAIPkCAACXBQAg-wIAAJcFACD8AgAAlwUAIAMAAAA8ACABAAA9ADACAAABACADAAAAPAAgAQAAPQAwAgAAAQAgAwAAADwAIAEAAD0AMAIAAAEAIA8EAACPBgAgBQAAkAYAIAYAAJEGACCfAgEAAAABtwIBAAAAAbgCAQAAAAG_AkAAAAABwAJAAAAAAeACAQAAAAH3AiAAAAAB-AIBAAAAAfkCAQAAAAH6AiAAAAAB-wJAAAAAAfwCAQAAAAEBGAAAQQAgDJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQEYAABDADABGAAAQwAwDwQAAOsFACAFAADsBQAgBgAA7QUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQIAAAABACAYAABGACAMnwIBAJcEACG3AgEAlwQAIbgCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeACAQCXBAAh9wIgALUEACH4AgEApQQAIfkCAQClBAAh-gIgALUEACH7AkAA_wQAIfwCAQClBAAhAgAAADwAIBgAAEgAIAIAAAA8ACAYAABIACADAAAAAQAgHwAAQQAgIAAARgAgAQAAAAEAIAEAAAA8ACAHBwAA6AUAICUAAOoFACAmAADpBQAg-AIAAJcFACD5AgAAlwUAIPsCAACXBQAg_AIAAJcFACAPmwIAAPMDADCcAgAATwAQnQIAAPMDADCfAgEArQMAIbcCAQCtAwAhuAIBAK0DACG_AkAAsAMAIcACQACwAwAh4AIBAK0DACH3AiAA2AMAIfgCAQDXAwAh-QIBANcDACH6AiAA2AMAIfsCQADCAwAh_AIBANcDACEDAAAAPAAgAQAATgAwJAAATwAgAwAAADwAIAEAAD0AMAIAAAEAIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgCQMAAOcFACC3AgEAAAABvwJAAAAAAcACQAAAAAHbAkAAAAAB3gIBAAAAAfQCAQAAAAH1AgEAAAAB9gIBAAAAAQEYAABXACAItwIBAAAAAb8CQAAAAAHAAkAAAAAB2wJAAAAAAd4CAQAAAAH0AgEAAAAB9QIBAAAAAfYCAQAAAAEBGAAAWQAwARgAAFkAMAkDAADmBQAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHeAgEAlwQAIfQCAQCXBAAh9QIBAKUEACH2AgEApQQAIQIAAAAFACAYAABcACAItwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHeAgEAlwQAIfQCAQCXBAAh9QIBAKUEACH2AgEApQQAIQIAAAADACAYAABeACACAAAAAwAgGAAAXgAgAwAAAAUAIB8AAFcAICAAAFwAIAEAAAAFACABAAAAAwAgBQcAAOMFACAlAADlBQAgJgAA5AUAIPUCAACXBQAg9gIAAJcFACALmwIAAPIDADCcAgAAZQAQnQIAAPIDADC3AgEArQMAIb8CQACwAwAhwAJAALADACHbAkAAsAMAId4CAQCtAwAh9AIBAK0DACH1AgEA1wMAIfYCAQDXAwAhAwAAAAMAIAEAAGQAMCQAAGUAIAMAAAADACABAAAEADACAAAFACABAAAACQAgAQAAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIA4DAADiBQAgtwIBAAAAAb8CQAAAAAHAAkAAAAAB3gIBAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQEYAABtACANtwIBAAAAAb8CQAAAAAHAAkAAAAAB3gIBAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQEYAABvADABGAAAbwAwDgMAAOEFACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHeAgEAlwQAIesCAQCXBAAh7AIBAJcEACHtAgEApQQAIe4CAQClBAAh7wIBAKUEACHwAkAA_wQAIfECQAD_BAAh8gIBAKUEACHzAgEApQQAIQIAAAAJACAYAAByACANtwIBAJcEACG_AkAAmQQAIcACQACZBAAh3gIBAJcEACHrAgEAlwQAIewCAQCXBAAh7QIBAKUEACHuAgEApQQAIe8CAQClBAAh8AJAAP8EACHxAkAA_wQAIfICAQClBAAh8wIBAKUEACECAAAABwAgGAAAdAAgAgAAAAcAIBgAAHQAIAMAAAAJACAfAABtACAgAAByACABAAAACQAgAQAAAAcAIAoHAADeBQAgJQAA4AUAICYAAN8FACDtAgAAlwUAIO4CAACXBQAg7wIAAJcFACDwAgAAlwUAIPECAACXBQAg8gIAAJcFACDzAgAAlwUAIBCbAgAA8QMAMJwCAAB7ABCdAgAA8QMAMLcCAQCtAwAhvwJAALADACHAAkAAsAMAId4CAQCtAwAh6wIBAK0DACHsAgEArQMAIe0CAQDXAwAh7gIBANcDACHvAgEA1wMAIfACQADCAwAh8QJAAMIDACHyAgEA1wMAIfMCAQDXAwAhAwAAAAcAIAEAAHoAMCQAAHsAIAMAAAAHACABAAAIADACAAAJACAJmwIAAPADADCcAgAAgQEAEJ0CAADwAwAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAIekCAQC6AwAh6gIBALoDACEBAAAAfgAgAQAAAH4AIAmbAgAA8AMAMJwCAACBAQAQnQIAAPADADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAIekCAQC6AwAh6gIBALoDACEAAwAAAIEBACABAACCAQAwAgAAfgAgAwAAAIEBACABAACCAQAwAgAAfgAgAwAAAIEBACABAACCAQAwAgAAfgAgBrcCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAHpAgEAAAAB6gIBAAAAAQEYAACGAQAgBrcCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAHpAgEAAAAB6gIBAAAAAQEYAACIAQAwARgAAIgBADAGtwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHpAgEAlwQAIeoCAQCXBAAhAgAAAH4AIBgAAIsBACAGtwIBAJcEACG_AkAAmQQAIcACQACZBAAh2wJAAJkEACHpAgEAlwQAIeoCAQCXBAAhAgAAAIEBACAYAACNAQAgAgAAAIEBACAYAACNAQAgAwAAAH4AIB8AAIYBACAgAACLAQAgAQAAAH4AIAEAAACBAQAgAwcAANsFACAlAADdBQAgJgAA3AUAIAmbAgAA7wMAMJwCAACUAQAQnQIAAO8DADC3AgEArQMAIb8CQACwAwAhwAJAALADACHbAkAAsAMAIekCAQCtAwAh6gIBAK0DACEDAAAAgQEAIAEAAJMBADAkAACUAQAgAwAAAIEBACABAACCAQAwAgAAfgAgAQAAABMAIAEAAAATACADAAAAEQAgAQAAEgAwAgAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACAPCAAA2gUAIAkAAJIFACALAACTBQAgDAAAlAUAILcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAHoAgEAAAABARgAAJwBACALtwIBAAAAAb8CQAAAAAHAAkAAAAAB4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAegCAQAAAAEBGAAAngEAMAEYAACeAQAwAQAAAA8AIA8IAADZBQAgCQAApwQAIAsAAKgEACAMAACpBAAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh4QIBAJcEACHiAgEApQQAIeMCAQClBAAh5AIBAKUEACHlAgEApQQAIeYCAQCXBAAh5wIBAJcEACHoAgEApQQAIQIAAAATACAYAACiAQAgC7cCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAh6AIBAKUEACECAAAAEQAgGAAApAEAIAIAAAARACAYAACkAQAgAQAAAA8AIAMAAAATACAfAACcAQAgIAAAogEAIAEAAAATACABAAAAEQAgCAcAANYFACAlAADYBQAgJgAA1wUAIOICAACXBQAg4wIAAJcFACDkAgAAlwUAIOUCAACXBQAg6AIAAJcFACAOmwIAAO4DADCcAgAArAEAEJ0CAADuAwAwtwIBAMADACG_AkAAsAMAIcACQACwAwAh4QIBAK0DACHiAgEA1wMAIeMCAQDXAwAh5AIBANcDACHlAgEA1wMAIeYCAQCtAwAh5wIBAK0DACHoAgEA1wMAIQMAAAARACABAACrAQAwJAAArAEAIAMAAAARACABAAASADACAAATACABAAAADQAgAQAAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAYDAACQBQAgCgAA1QUAIL8CQAAAAAHTAgEAAAAB3gIBAAAAAeACAAAA4AICARgAALQBACAEvwJAAAAAAdMCAQAAAAHeAgEAAAAB4AIAAADgAgIBGAAAtgEAMAEYAAC2AQAwBgMAAI4FACAKAADUBQAgvwJAAJkEACHTAgEAlwQAId4CAQCXBAAh4AIAAIwF4AIiAgAAAA0AIBgAALkBACAEvwJAAJkEACHTAgEAlwQAId4CAQCXBAAh4AIAAIwF4AIiAgAAAAsAIBgAALsBACACAAAACwAgGAAAuwEAIAMAAAANACAfAAC0AQAgIAAAuQEAIAEAAAANACABAAAACwAgAwcAANEFACAlAADTBQAgJgAA0gUAIAebAgAA6gMAMJwCAADCAQAQnQIAAOoDADC_AkAAsAMAIdMCAQDAAwAh3gIBAK0DACHgAgAA6wPgAiIDAAAACwAgAQAAwQEAMCQAAMIBACADAAAACwAgAQAADAAwAgAADQAgAQAAABkAIAEAAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACAKCgAA0AUAILcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAQEYAADKAQAgCbcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAQEYAADMAQAwARgAAMwBADAKCgAAzwUAILcCAQCXBAAhuAIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHaAgEAlwQAIdsCQACZBAAh3AJAAP8EACHdAkAA_wQAIQIAAAAZACAYAADPAQAgCbcCAQCXBAAhuAIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHaAgEAlwQAIdsCQACZBAAh3AJAAP8EACHdAkAA_wQAIQIAAAAXACAYAADRAQAgAgAAABcAIBgAANEBACADAAAAGQAgHwAAygEAICAAAM8BACABAAAAGQAgAQAAABcAIAUHAADMBQAgJQAAzgUAICYAAM0FACDcAgAAlwUAIN0CAACXBQAgDJsCAADpAwAwnAIAANgBABCdAgAA6QMAMLcCAQDAAwAhuAIBAK0DACG_AkAAsAMAIcACQACwAwAh0wIBAMADACHaAgEArQMAIdsCQACwAwAh3AJAAMIDACHdAkAAwgMAIQMAAAAXACABAADXAQAwJAAA2AEAIAMAAAAXACABAAAYADACAAAZACAKDAAA6AMAIJsCAADmAwAwnAIAAN4BABCdAgAA5gMAMJ8CAQAAAAG3AgEAAAABvwJAAL0DACHAAkAAvQMAIdACIADnAwAh2QIBAAAAAQEAAADbAQAgAQAAANsBACAKDAAA6AMAIJsCAADmAwAwnAIAAN4BABCdAgAA5gMAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0AIgAOcDACHZAgEAugMAIQEMAADLBQAgAwAAAN4BACABAADfAQAwAgAA2wEAIAMAAADeAQAgAQAA3wEAMAIAANsBACADAAAA3gEAIAEAAN8BADACAADbAQAgBwwAAMoFACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0AIgAAAAAdkCAQAAAAEBGAAA4wEAIAafAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0AIgAAAAAdkCAQAAAAEBGAAA5QEAMAEYAADlAQAwBwwAAMAFACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdACIAC1BAAh2QIBAJcEACECAAAA2wEAIBgAAOgBACAGnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHQAiAAtQQAIdkCAQCXBAAhAgAAAN4BACAYAADqAQAgAgAAAN4BACAYAADqAQAgAwAAANsBACAfAADjAQAgIAAA6AEAIAEAAADbAQAgAQAAAN4BACADBwAAvQUAICUAAL8FACAmAAC-BQAgCZsCAADlAwAwnAIAAPEBABCdAgAA5QMAMJ8CAQCtAwAhtwIBAMADACG_AkAAsAMAIcACQACwAwAh0AIgANgDACHZAgEArQMAIQMAAADeAQAgAQAA8AEAMCQAAPEBACADAAAA3gEAIAEAAN8BADACAADbAQAgAQAAAB0AIAEAAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACAQCgAAvAUAIA0AAPAEACAPAADxBAAgEAAA8gQAIBEAAPMEACASAAD0BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHUAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQEYAAD5AQAgCp8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAEBGAAA-wEAMAEYAAD7AQAwEAoAALsFACANAAC3BAAgDwAAuAQAIBAAALkEACARAAC6BAAgEgAAuwQAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhAgAAAB0AIBgAAP4BACAKnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACECAAAAGwAgGAAAgAIAIAIAAAAbACAYAACAAgAgAwAAAB0AIB8AAPkBACAgAAD-AQAgAQAAAB0AIAEAAAAbACAGBwAAtgUAICUAALkFACAmAAC4BQAgpwEAALcFACCoAQAAugUAINgCAACXBQAgDZsCAADkAwAwnAIAAIcCABCdAgAA5AMAMJ8CAQCtAwAhtwIBAMADACG_AkAAsAMAIcACQACwAwAh0wIBAMADACHUAgEAwAMAIdUCAgDBAwAh1gIQAK4DACHXAiAA2AMAIdgCAQDXAwAhAwAAABsAIAEAAIYCADAkAACHAgAgAwAAABsAIAEAABwAMAIAAB0AIAEAAAAvACABAAAALwAgAwAAAC0AIAEAAC4AMAIAAC8AIAMAAAAtACABAAAuADACAAAvACADAAAALQAgAQAALgAwAgAALwAgCQ4AALUFACC3AgEAAAABvwJAAAAAAcACQAAAAAHCAgEAAAABxAIBAAAAAcUCAQAAAAHRAkAAAAAB0gIBAAAAAQEYAACPAgAgCLcCAQAAAAG_AkAAAAABwAJAAAAAAcICAQAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABARgAAJECADABGAAAkQIAMAkOAAC0BQAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAhwgIBAJcEACHEAgEApQQAIcUCAQClBAAh0QJAAJkEACHSAgEApQQAIQIAAAAvACAYAACUAgAgCLcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIcICAQCXBAAhxAIBAKUEACHFAgEApQQAIdECQACZBAAh0gIBAKUEACECAAAALQAgGAAAlgIAIAIAAAAtACAYAACWAgAgAwAAAC8AIB8AAI8CACAgAACUAgAgAQAAAC8AIAEAAAAtACAGBwAAsQUAICUAALMFACAmAACyBQAgxAIAAJcFACDFAgAAlwUAINICAACXBQAgC5sCAADjAwAwnAIAAJ0CABCdAgAA4wMAMLcCAQDAAwAhvwJAALADACHAAkAAsAMAIcICAQDAAwAhxAIBANcDACHFAgEA1wMAIdECQACwAwAh0gIBANcDACEDAAAALQAgAQAAnAIAMCQAAJ0CACADAAAALQAgAQAALgAwAgAALwAgAQAAACMAIAEAAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAMAAAAhACABAAAiADACAAAjACAHDgAAsAUAILcCAQAAAAG_AkAAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgIBGAAApQIAIAa3AgEAAAABvwJAAAAAAcICAQAAAAHEAgEAAAABxQIBAAAAAc8CAAAAzwICARgAAKcCADABGAAApwIAMAcOAACvBQAgtwIBAJcEACG_AkAAmQQAIcICAQCXBAAhxAIBAJcEACHFAgEAlwQAIc8CAADsBM8CIgIAAAAjACAYAACqAgAgBrcCAQCXBAAhvwJAAJkEACHCAgEAlwQAIcQCAQCXBAAhxQIBAJcEACHPAgAA7ATPAiICAAAAIQAgGAAArAIAIAIAAAAhACAYAACsAgAgAwAAACMAIB8AAKUCACAgAACqAgAgAQAAACMAIAEAAAAhACADBwAArAUAICUAAK4FACAmAACtBQAgCZsCAADfAwAwnAIAALMCABCdAgAA3wMAMLcCAQDAAwAhvwJAALADACHCAgEAwAMAIcQCAQCtAwAhxQIBAK0DACHPAgAA4APPAiIDAAAAIQAgAQAAsgIAMCQAALMCACADAAAAIQAgAQAAIgAwAgAAIwAgAQAAACcAIAEAAAAnACADAAAAJQAgAQAAJgAwAgAAJwAgAwAAACUAIAEAACYAMAIAACcAIAMAAAAlACABAAAmADACAAAnACAKDgAAqwUAIKACEAAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHCAgEAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CA9ACIAAAAAEBGAAAuwIAIAmgAhAAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABARgAAL0CADABGAAAvQIAMAoOAACqBQAgoAIQAJgEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHCAgEAlwQAIcQCAQClBAAhxQIBAKUEACHPAgAA3wTPAiPQAiAAtQQAIQIAAAAnACAYAADAAgAgCaACEACYBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAhwgIBAJcEACHEAgEApQQAIcUCAQClBAAhzwIAAN8EzwIj0AIgALUEACECAAAAJQAgGAAAwgIAIAIAAAAlACAYAADCAgAgAwAAACcAIB8AALsCACAgAADAAgAgAQAAACcAIAEAAAAlACAIBwAApQUAICUAAKgFACAmAACnBQAgpwEAAKYFACCoAQAAqQUAIMQCAACXBQAgxQIAAJcFACDPAgAAlwUAIAybAgAA1QMAMJwCAADJAgAQnQIAANUDADCgAhAArgMAIbcCAQDAAwAhvwJAALADACHAAkAAsAMAIcICAQDAAwAhxAIBANcDACHFAgEA1wMAIc8CAADWA88CI9ACIADYAwAhAwAAACUAIAEAAMgCADAkAADJAgAgAwAAACUAIAEAACYAMAIAACcAIAEAAAArACABAAAAKwAgAwAAACkAIAEAACoAMAIAACsAIAMAAAApACABAAAqADACAAArACADAAAAKQAgAQAAKgAwAgAAKwAgDQ4AAKQFACC3AgEAAAABvwJAAAAAAcACQAAAAAHBAgEAAAABwgIBAAAAAcMCQAAAAAHEAgEAAAABxQIBAAAAAckCAQAAAAHKAgEAAAABywIBAAAAAc0CAAAAxwICARgAANECACAMtwIBAAAAAb8CQAAAAAHAAkAAAAABwQIBAAAAAcICAQAAAAHDAkAAAAABxAIBAAAAAcUCAQAAAAHJAgEAAAABygIBAAAAAcsCAQAAAAHNAgAAAMcCAgEYAADTAgAwARgAANMCADANDgAAowUAILcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIcECAQCXBAAhwgIBAJcEACHDAkAAmQQAIcQCAQCXBAAhxQIBAJcEACHJAgEAlwQAIcoCAQCXBAAhywIBAJcEACHNAgAA0gTHAiICAAAAKwAgGAAA1gIAIAy3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHBAgEAlwQAIcICAQCXBAAhwwJAAJkEACHEAgEAlwQAIcUCAQCXBAAhyQIBAJcEACHKAgEAlwQAIcsCAQCXBAAhzQIAANIExwIiAgAAACkAIBgAANgCACACAAAAKQAgGAAA2AIAIAMAAAArACAfAADRAgAgIAAA1gIAIAEAAAArACABAAAAKQAgAwcAAKAFACAlAACiBQAgJgAAoQUAIA-bAgAA1AMAMJwCAADfAgAQnQIAANQDADC3AgEAwAMAIb8CQACwAwAhwAJAALADACHBAgEArQMAIcICAQDAAwAhwwJAALADACHEAgEArQMAIcUCAQCtAwAhyQIBAK0DACHKAgEArQMAIcsCAQCtAwAhzQIAAM8DxwIiAwAAACkAIAEAAN4CADAkAADfAgAgAwAAACkAIAEAACoAMAIAACsAIA-bAgAA0gMAMJwCAADlAgAQnQIAANIDADC3AgEAAAABwQIBALoDACHCAgEAygMAIcMCQAC9AwAhxAIBALoDACHFAgEAugMAIccCAADTA8cCIsgCAADTA8cCIskCAQC6AwAhygIBALoDACHLAgEAugMAIcwCQAC9AwAhAQAAAOICACABAAAA4gIAIA-bAgAA0gMAMJwCAADlAgAQnQIAANIDADC3AgEAygMAIcECAQC6AwAhwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHHAgAA0wPHAiLIAgAA0wPHAiLJAgEAugMAIcoCAQC6AwAhywIBALoDACHMAkAAvQMAIQADAAAA5QIAIAEAAOYCADACAADiAgAgAwAAAOUCACABAADmAgAwAgAA4gIAIAMAAADlAgAgAQAA5gIAMAIAAOICACAMtwIBAAAAAcECAQAAAAHCAgEAAAABwwJAAAAAAcQCAQAAAAHFAgEAAAABxwIAAADHAgLIAgAAAMcCAskCAQAAAAHKAgEAAAABywIBAAAAAcwCQAAAAAEBGAAA6gIAIAy3AgEAAAABwQIBAAAAAcICAQAAAAHDAkAAAAABxAIBAAAAAcUCAQAAAAHHAgAAAMcCAsgCAAAAxwICyQIBAAAAAcoCAQAAAAHLAgEAAAABzAJAAAAAAQEYAADsAgAwARgAAOwCADAMtwIBAJcEACHBAgEAlwQAIcICAQCXBAAhwwJAAJkEACHEAgEAlwQAIcUCAQCXBAAhxwIAANIExwIiyAIAANIExwIiyQIBAJcEACHKAgEAlwQAIcsCAQCXBAAhzAJAAJkEACECAAAA4gIAIBgAAO8CACAMtwIBAJcEACHBAgEAlwQAIcICAQCXBAAhwwJAAJkEACHEAgEAlwQAIcUCAQCXBAAhxwIAANIExwIiyAIAANIExwIiyQIBAJcEACHKAgEAlwQAIcsCAQCXBAAhzAJAAJkEACECAAAA5QIAIBgAAPECACACAAAA5QIAIBgAAPECACADAAAA4gIAIB8AAOoCACAgAADvAgAgAQAAAOICACABAAAA5QIAIAMHAACdBQAgJQAAnwUAICYAAJ4FACAPmwIAAM4DADCcAgAA-AIAEJ0CAADOAwAwtwIBAMADACHBAgEArQMAIcICAQDAAwAhwwJAALADACHEAgEArQMAIcUCAQCtAwAhxwIAAM8DxwIiyAIAAM8DxwIiyQIBAK0DACHKAgEArQMAIcsCAQCtAwAhzAJAALADACEDAAAA5QIAIAEAAPcCADAkAAD4AgAgAwAAAOUCACABAADmAgAwAgAA4gIAIA2bAgAAyQMAMJwCAAD-AgAQnQIAAMkDADC3AgEAAAABuAIBALoDACG5AgEAugMAIboCQAC9AwAhuwICAMsDACG8AkAAvQMAIb0CAgDLAwAhvgJAAMwDACG_AkAAvQMAIcACQAC9AwAhAQAAAPsCACABAAAA-wIAIA2bAgAAyQMAMJwCAAD-AgAQnQIAAMkDADC3AgEAygMAIbgCAQC6AwAhuQIBALoDACG6AkAAvQMAIbsCAgDLAwAhvAJAAL0DACG9AgIAywMAIb4CQADMAwAhvwJAAL0DACHAAkAAvQMAIQG-AgAAlwUAIAMAAAD-AgAgAQAA_wIAMAIAAPsCACADAAAA_gIAIAEAAP8CADACAAD7AgAgAwAAAP4CACABAAD_AgAwAgAA-wIAIAq3AgEAAAABuAIBAAAAAbkCAQAAAAG6AkAAAAABuwICAAAAAbwCQAAAAAG9AgIAAAABvgJAAAAAAb8CQAAAAAHAAkAAAAABARgAAIMDACAKtwIBAAAAAbgCAQAAAAG5AgEAAAABugJAAAAAAbsCAgAAAAG8AkAAAAABvQICAAAAAb4CQAAAAAG_AkAAAAABwAJAAAAAAQEYAACFAwAwARgAAIUDADAKtwIBAJcEACG4AgEAlwQAIbkCAQCXBAAhugJAAJkEACG7AgIAtAQAIbwCQACZBAAhvQICALQEACG-AkAA_wQAIb8CQACZBAAhwAJAAJkEACECAAAA-wIAIBgAAIgDACAKtwIBAJcEACG4AgEAlwQAIbkCAQCXBAAhugJAAJkEACG7AgIAtAQAIbwCQACZBAAhvQICALQEACG-AkAA_wQAIb8CQACZBAAhwAJAAJkEACECAAAA_gIAIBgAAIoDACACAAAA_gIAIBgAAIoDACADAAAA-wIAIB8AAIMDACAgAACIAwAgAQAAAPsCACABAAAA_gIAIAYHAACYBQAgJQAAmwUAICYAAJoFACCnAQAAmQUAIKgBAACcBQAgvgIAAJcFACANmwIAAL8DADCcAgAAkQMAEJ0CAAC_AwAwtwIBAMADACG4AgEArQMAIbkCAQCtAwAhugJAALADACG7AgIAwQMAIbwCQACwAwAhvQICAMEDACG-AkAAwgMAIb8CQACwAwAhwAJAALADACEDAAAA_gIAIAEAAJADADAkAACRAwAgAwAAAP4CACABAAD_AgAwAgAA-wIAIAkGAAC-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_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_AkAAsAMAIcACQACwAwAh2wJAALADACHpAgEArQMAIeoCAQCtAwAhCZsCAADwAwAwnAIAAIEBABCdAgAA8AMAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAIdsCQAC9AwAh6QIBALoDACHqAgEAugMAIRCbAgAA8QMAMJwCAAB7ABCdAgAA8QMAMLcCAQCtAwAhvwJAALADACHAAkAAsAMAId4CAQCtAwAh6wIBAK0DACHsAgEArQMAIe0CAQDXAwAh7gIBANcDACHvAgEA1wMAIfACQADCAwAh8QJAAMIDACHyAgEA1wMAIfMCAQDXAwAhC5sCAADyAwAwnAIAAGUAEJ0CAADyAwAwtwIBAK0DACG_AkAAsAMAIcACQACwAwAh2wJAALADACHeAgEArQMAIfQCAQCtAwAh9QIBANcDACH2AgEA1wMAIQ-bAgAA8wMAMJwCAABPABCdAgAA8wMAMJ8CAQCtAwAhtwIBAK0DACG4AgEArQMAIb8CQACwAwAhwAJAALADACHgAgEArQMAIfcCIADYAwAh-AIBANcDACH5AgEA1wMAIfoCIADYAwAh-wJAAMIDACH8AgEA1wMAIRIEAAD2AwAgBQAA9wMAIAYAAPgDACCbAgAA9AMAMJwCAAA8ABCdAgAA9AMAMJ8CAQC6AwAhtwIBALoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfcCIADnAwAh-AIBAPUDACH5AgEA9QMAIfoCIADnAwAh-wJAAMwDACH8AgEA9QMAIQujAgEAAAABpAIBAAAABaUCAQAAAAWmAgEAAAABpwIBAAAAAagCAQAAAAGpAgEAAAABqgIBANwDACGxAgEAAAABsgIBAAAAAbMCAQAAAAEDtAIAAAMAILUCAAADACC2AgAAAwAgA7QCAAAHACC1AgAABwAgtgIAAAcAIAO0AgAACwAgtQIAAAsAILYCAAALACAMDgAA-gMAIJsCAAD5AwAwnAIAAC0AEJ0CAAD5AwAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIRUKAACCBAAgDQAAgwQAIA8AAIQEACAQAACFBAAgEQAAhgQAIBIAAIcEACCbAgAAgQQAMJwCAAAbABCdAgAAgQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAh_wIAABsAIIADAAAbACADwgIBAAAAAcMCQAAAAAHEAgEAAAABEA4AAPoDACCbAgAA_AMAMJwCAAApABCdAgAA_AMAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcECAQC6AwAhwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiINDgAA-gMAIJsCAAD9AwAwnAIAACUAEJ0CAAD9AwAwoAIQALsDACG3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHCAgEAygMAIcQCAQD1AwAhxQIBAPUDACHPAgAA_gPPAiPQAiAA5wMAIQSjAgAAAM8CA6QCAAAAzwIJpQIAAADPAgmqAgAA3gPPAiMKDgAA-gMAIJsCAAD_AwAwnAIAACEAEJ0CAAD_AwAwtwIBAMoDACG_AkAAvQMAIcICAQDKAwAhxAIBALoDACHFAgEAugMAIc8CAACABM8CIgSjAgAAAM8CAqQCAAAAzwIIpQIAAADPAgiqAgAA4gPPAiITCgAAggQAIA0AAIMEACAPAACEBAAgEAAAhQQAIBEAAIYEACASAACHBAAgmwIAAIEEADCcAgAAGwAQnQIAAIEEADCfAgEAugMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA9QMAIRQIAACKBAAgCQAA-AMAIAsAAIsEACAMAADoAwAgmwIAAIkEADCcAgAAEQAQnQIAAIkEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAh_wIAABEAIIADAAARACAMDAAA6AMAIJsCAADmAwAwnAIAAN4BABCdAgAA5gMAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0AIgAOcDACHZAgEAugMAIf8CAADeAQAggAMAAN4BACADtAIAACEAILUCAAAhACC2AgAAIQAgA7QCAAAlACC1AgAAJQAgtgIAACUAIAO0AgAAKQAgtQIAACkAILYCAAApACADtAIAAC0AILUCAAAtACC2AgAALQAgDQoAAIIEACCbAgAAiAQAMJwCAAAXABCdAgAAiAQAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIRIIAACKBAAgCQAA-AMAIAsAAIsEACAMAADoAwAgmwIAAIkEADCcAgAAEQAQnQIAAIkEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAhCwYAAL4DACCbAgAAuQMAMJwCAAAPABCdAgAAuQMAMJ4CAQC6AwAhnwIBALoDACGgAhAAuwMAIaECAAC8AwAgogJAAL0DACH_AgAADwAggAMAAA8AIAO0AgAAFwAgtQIAABcAILYCAAAXACAC0wIBAAAAAd4CAQAAAAEJAwAAjwQAIAoAAIIEACCbAgAAjQQAMJwCAAALABCdAgAAjQQAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIgSjAgAAAOACAqQCAAAA4AIIpQIAAADgAgiqAgAA7QPgAiIUBAAA9gMAIAUAAPcDACAGAAD4AwAgmwIAAPQDADCcAgAAPAAQnQIAAPQDADCfAgEAugMAIbcCAQC6AwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh4AIBALoDACH3AiAA5wMAIfgCAQD1AwAh-QIBAPUDACH6AiAA5wMAIfsCQADMAwAh_AIBAPUDACH_AgAAPAAggAMAADwAIBEDAACPBAAgmwIAAJAEADCcAgAABwAQnQIAAJAEADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHeAgEAugMAIesCAQC6AwAh7AIBALoDACHtAgEA9QMAIe4CAQD1AwAh7wIBAPUDACHwAkAAzAMAIfECQADMAwAh8gIBAPUDACHzAgEA9QMAIQwDAACPBAAgmwIAAJEEADCcAgAAAwAQnQIAAJEEADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAId4CAQC6AwAh9AIBALoDACH1AgEA9QMAIfYCAQD1AwAhAAAAAAABhAMBAAAAAQWEAxAAAAABigMQAAAAAYsDEAAAAAGMAxAAAAABjQMQAAAAAQGEA0AAAAABCx8AAJsEADAgAACgBAAwgQMAAJwEADCCAwAAnQQAMIMDAACeBAAghAMAAJ8EADCFAwAAnwQAMIYDAACfBAAwhwMAAJ8EADCIAwAAoQQAMIkDAACiBAAwDQkAAJIFACALAACTBQAgDAAAlAUAILcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAECAAAAEwAgHwAAkQUAIAMAAAATACAfAACRBQAgIAAApgQAIAEYAADmBgAwEggAAIoEACAJAAD4AwAgCwAAiwQAIAwAAOgDACCbAgAAiQQAMJwCAAARABCdAgAAiQQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA9QMAIeMCAQD1AwAh5AIBAPUDACHlAgEA9QMAIeYCAQAAAAHnAgEAugMAIegCAQD1AwAhAgAAABMAIBgAAKYEACACAAAAowQAIBgAAKQEACAOmwIAAKIEADCcAgAAowQAEJ0CAACiBAAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA9QMAIeMCAQD1AwAh5AIBAPUDACHlAgEA9QMAIeYCAQC6AwAh5wIBALoDACHoAgEA9QMAIQ6bAgAAogQAMJwCAACjBAAQnQIAAKIEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD1AwAh4wIBAPUDACHkAgEA9QMAIeUCAQD1AwAh5gIBALoDACHnAgEAugMAIegCAQD1AwAhCrcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAhAYQDAQAAAAENCQAApwQAIAsAAKgEACAMAACpBAAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh4QIBAJcEACHiAgEApQQAIeMCAQClBAAh5AIBAKUEACHlAgEApQQAIeYCAQCXBAAh5wIBAJcEACELHwAAggUAMCAAAIcFADCBAwAAgwUAMIIDAACEBQAwgwMAAIUFACCEAwAAhgUAMIUDAACGBQAwhgMAAIYFADCHAwAAhgUAMIgDAACIBQAwiQMAAIkFADALHwAA9QQAMCAAAPoEADCBAwAA9gQAMIIDAAD3BAAwgwMAAPgEACCEAwAA-QQAMIUDAAD5BAAwhgMAAPkEADCHAwAA-QQAMIgDAAD7BAAwiQMAAPwEADALHwAAqgQAMCAAAK8EADCBAwAAqwQAMIIDAACsBAAwgwMAAK0EACCEAwAArgQAMIUDAACuBAAwhgMAAK4EADCHAwAArgQAMIgDAACwBAAwiQMAALEEADAODQAA8AQAIA8AAPEEACAQAADyBAAgEQAA8wQAIBIAAPQEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAECAAAAHQAgHwAA7wQAIAMAAAAdACAfAADvBAAgIAAAtgQAIAEYAADlBgAwEwoAAIIEACANAACDBAAgDwAAhAQAIBAAAIUEACARAACGBAAgEgAAhwQAIJsCAACBBAAwnAIAABsAEJ0CAACBBAAwnwIBALoDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA9QMAIQIAAAAdACAYAAC2BAAgAgAAALIEACAYAACzBAAgDZsCAACxBAAwnAIAALIEABCdAgAAsQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAhDZsCAACxBAAwnAIAALIEABCdAgAAsQQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD1AwAhCZ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQWEAwIAAAABigMCAAAAAYsDAgAAAAGMAwIAAAABjQMCAAAAAQGEAyAAAAABDg0AALcEACAPAAC4BAAgEAAAuQQAIBEAALoEACASAAC7BAAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhBR8AANwGACAgAADjBgAggQMAAN0GACCCAwAA4gYAIIcDAADbAQAgCx8AAOIEADAgAADnBAAwgQMAAOMEADCCAwAA5AQAMIMDAADlBAAghAMAAOYEADCFAwAA5gQAMIYDAADmBAAwhwMAAOYEADCIAwAA6AQAMIkDAADpBAAwCx8AANUEADAgAADaBAAwgQMAANYEADCCAwAA1wQAMIMDAADYBAAghAMAANkEADCFAwAA2QQAMIYDAADZBAAwhwMAANkEADCIAwAA2wQAMIkDAADcBAAwCx8AAMgEADAgAADNBAAwgQMAAMkEADCCAwAAygQAMIMDAADLBAAghAMAAMwEADCFAwAAzAQAMIYDAADMBAAwhwMAAMwEADCIAwAAzgQAMIkDAADPBAAwCx8AALwEADAgAADBBAAwgQMAAL0EADCCAwAAvgQAMIMDAAC_BAAghAMAAMAEADCFAwAAwAQAMIYDAADABAAwhwMAAMAEADCIAwAAwgQAMIkDAADDBAAwB7cCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAAB0QJAAAAAAdICAQAAAAECAAAALwAgHwAAxwQAIAMAAAAvACAfAADHBAAgIAAAxgQAIAEYAADhBgAwDA4AAPoDACCbAgAA-QMAMJwCAAAtABCdAgAA-QMAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQIAAAAvACAYAADGBAAgAgAAAMQEACAYAADFBAAgC5sCAADDBAAwnAIAAMQEABCdAgAAwwQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIdECQAC9AwAh0gIBAPUDACELmwIAAMMEADCcAgAAxAQAEJ0CAADDBAAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAh0QJAAL0DACHSAgEA9QMAIQe3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAh0QJAAJkEACHSAgEApQQAIQe3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAh0QJAAJkEACHSAgEApQQAIQe3AgEAAAABvwJAAAAAAcACQAAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABC7cCAQAAAAG_AkAAAAABwAJAAAAAAcECAQAAAAHDAkAAAAABxAIBAAAAAcUCAQAAAAHJAgEAAAABygIBAAAAAcsCAQAAAAHNAgAAAMcCAgIAAAArACAfAADUBAAgAwAAACsAIB8AANQEACAgAADTBAAgARgAAOAGADARDgAA-gMAIJsCAAD8AwAwnAIAACkAEJ0CAAD8AwAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHBAgEAAAABwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiL9AgAA-wMAIAIAAAArACAYAADTBAAgAgAAANAEACAYAADRBAAgD5sCAADPBAAwnAIAANAEABCdAgAAzwQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcECAQC6AwAhwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiIPmwIAAM8EADCcAgAA0AQAEJ0CAADPBAAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwQIBALoDACHCAgEAygMAIcMCQAC9AwAhxAIBALoDACHFAgEAugMAIckCAQC6AwAhygIBALoDACHLAgEAugMAIc0CAADTA8cCIgu3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHBAgEAlwQAIcMCQACZBAAhxAIBAJcEACHFAgEAlwQAIckCAQCXBAAhygIBAJcEACHLAgEAlwQAIc0CAADSBMcCIgGEAwAAAMcCAgu3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHBAgEAlwQAIcMCQACZBAAhxAIBAJcEACHFAgEAlwQAIckCAQCXBAAhygIBAJcEACHLAgEAlwQAIc0CAADSBMcCIgu3AgEAAAABvwJAAAAAAcACQAAAAAHBAgEAAAABwwJAAAAAAcQCAQAAAAHFAgEAAAAByQIBAAAAAcoCAQAAAAHLAgEAAAABzQIAAADHAgIIoAIQAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABAgAAACcAIB8AAOEEACADAAAAJwAgHwAA4QQAICAAAOAEACABGAAA3wYAMA0OAAD6AwAgmwIAAP0DADCcAgAAJQAQnQIAAP0DADCgAhAAuwMAIbcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAhzwIAAP4DzwIj0AIgAOcDACECAAAAJwAgGAAA4AQAIAIAAADdBAAgGAAA3gQAIAybAgAA3AQAMJwCAADdBAAQnQIAANwEADCgAhAAuwMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPUDACHFAgEA9QMAIc8CAAD-A88CI9ACIADnAwAhDJsCAADcBAAwnAIAAN0EABCdAgAA3AQAMKACEAC7AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA9QMAIcUCAQD1AwAhzwIAAP4DzwIj0AIgAOcDACEIoAIQAJgEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAhzwIAAN8EzwIj0AIgALUEACEBhAMAAADPAgMIoAIQAJgEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHEAgEApQQAIcUCAQClBAAhzwIAAN8EzwIj0AIgALUEACEIoAIQAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABBbcCAQAAAAG_AkAAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CAgIAAAAjACAfAADuBAAgAwAAACMAIB8AAO4EACAgAADtBAAgARgAAN4GADAKDgAA-gMAIJsCAAD_AwAwnAIAACEAEJ0CAAD_AwAwtwIBAAAAAb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiAgAAACMAIBgAAO0EACACAAAA6gQAIBgAAOsEACAJmwIAAOkEADCcAgAA6gQAEJ0CAADpBAAwtwIBAMoDACG_AkAAvQMAIcICAQDKAwAhxAIBALoDACHFAgEAugMAIc8CAACABM8CIgmbAgAA6QQAMJwCAADqBAAQnQIAAOkEADC3AgEAygMAIb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIAEzwIiBbcCAQCXBAAhvwJAAJkEACHEAgEAlwQAIcUCAQCXBAAhzwIAAOwEzwIiAYQDAAAAzwICBbcCAQCXBAAhvwJAAJkEACHEAgEAlwQAIcUCAQCXBAAhzwIAAOwEzwIiBbcCAQAAAAG_AkAAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CAg4NAADwBAAgDwAA8QQAIBAAAPIEACARAADzBAAgEgAA9AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHUAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQMfAADcBgAggQMAAN0GACCHAwAA2wEAIAQfAADiBAAwgQMAAOMEADCDAwAA5QQAIIcDAADmBAAwBB8AANUEADCBAwAA1gQAMIMDAADYBAAghwMAANkEADAEHwAAyAQAMIEDAADJBAAwgwMAAMsEACCHAwAAzAQAMAQfAAC8BAAwgQMAAL0EADCDAwAAvwQAIIcDAADABAAwCLcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHaAgEAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAABAgAAABkAIB8AAIEFACADAAAAGQAgHwAAgQUAICAAAIAFACABGAAA2wYAMA0KAACCBAAgmwIAAIgEADCcAgAAFwAQnQIAAIgEADC3AgEAAAABuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAAAAB2wJAAL0DACHcAkAAzAMAId0CQADMAwAhAgAAABkAIBgAAIAFACACAAAA_QQAIBgAAP4EACAMmwIAAPwEADCcAgAA_QQAEJ0CAAD8BAAwtwIBAMoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHTAgEAygMAIdoCAQC6AwAh2wJAAL0DACHcAkAAzAMAId0CQADMAwAhDJsCAAD8BAAwnAIAAP0EABCdAgAA_AQAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIQi3AgEAlwQAIbgCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdoCAQCXBAAh2wJAAJkEACHcAkAA_wQAId0CQAD_BAAhAYQDQAAAAAEItwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHaAgEAlwQAIdsCQACZBAAh3AJAAP8EACHdAkAA_wQAIQi3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAQQDAACQBQAgvwJAAAAAAd4CAQAAAAHgAgAAAOACAgIAAAANACAfAACPBQAgAwAAAA0AIB8AAI8FACAgAACNBQAgARgAANoGADAKAwAAjwQAIAoAAIIEACCbAgAAjQQAMJwCAAALABCdAgAAjQQAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIv4CAACMBAAgAgAAAA0AIBgAAI0FACACAAAAigUAIBgAAIsFACAHmwIAAIkFADCcAgAAigUAEJ0CAACJBQAwvwJAAL0DACHTAgEAygMAId4CAQC6AwAh4AIAAI4E4AIiB5sCAACJBQAwnAIAAIoFABCdAgAAiQUAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACOBOACIgO_AkAAmQQAId4CAQCXBAAh4AIAAIwF4AIiAYQDAAAA4AICBAMAAI4FACC_AkAAmQQAId4CAQCXBAAh4AIAAIwF4AIiBR8AANUGACAgAADYBgAggQMAANYGACCCAwAA1wYAIIcDAAABACAEAwAAkAUAIL8CQAAAAAHeAgEAAAAB4AIAAADgAgIDHwAA1QYAIIEDAADWBgAghwMAAAEAIA0JAACSBQAgCwAAkwUAIAwAAJQFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAABBB8AAIIFADCBAwAAgwUAMIMDAACFBQAghwMAAIYFADAEHwAA9QQAMIEDAAD2BAAwgwMAAPgEACCHAwAA-QQAMAQfAACqBAAwgQMAAKsEADCDAwAArQQAIIcDAACuBAAwBB8AAJsEADCBAwAAnAQAMIMDAACeBAAghwMAAJ8EADAAAAAAAAAAAAAAAAAABR8AANAGACAgAADTBgAggQMAANEGACCCAwAA0gYAIIcDAAAdACADHwAA0AYAIIEDAADRBgAghwMAAB0AIAAAAAAABR8AAMsGACAgAADOBgAggQMAAMwGACCCAwAAzQYAIIcDAAAdACADHwAAywYAIIEDAADMBgAghwMAAB0AIAAAAAUfAADGBgAgIAAAyQYAIIEDAADHBgAgggMAAMgGACCHAwAAHQAgAx8AAMYGACCBAwAAxwYAIIcDAAAdACAAAAAFHwAAwQYAICAAAMQGACCBAwAAwgYAIIIDAADDBgAghwMAAB0AIAMfAADBBgAggQMAAMIGACCHAwAAHQAgAAAAAAAFHwAAvAYAICAAAL8GACCBAwAAvQYAIIIDAAC-BgAghwMAABMAIAMfAAC8BgAggQMAAL0GACCHAwAAEwAgAAAACx8AAMEFADAgAADFBQAwgQMAAMIFADCCAwAAwwUAMIMDAADEBQAghAMAAK4EADCFAwAArgQAMIYDAACuBAAwhwMAAK4EADCIAwAAxgUAMIkDAACxBAAwDgoAALwFACAPAADxBAAgEAAA8gQAIBEAAPMEACASAAD0BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AAMkFACADAAAAHQAgHwAAyQUAICAAAMgFACABGAAAuwYAMAIAAAAdACAYAADIBQAgAgAAALIEACAYAADHBQAgCZ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ4KAAC7BQAgDwAAuAQAIBAAALkEACARAAC6BAAgEgAAuwQAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ4KAAC8BQAgDwAA8QQAIBAAAPIEACARAADzBAAgEgAA9AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQQfAADBBQAwgQMAAMIFADCDAwAAxAUAIIcDAACuBAAwAAAAAAUfAAC2BgAgIAAAuQYAIIEDAAC3BgAgggMAALgGACCHAwAAEwAgAx8AALYGACCBAwAAtwYAIIcDAAATACAAAAAFHwAAsQYAICAAALQGACCBAwAAsgYAIIIDAACzBgAghwMAABMAIAMfAACxBgAggQMAALIGACCHAwAAEwAgAAAABx8AAKwGACAgAACvBgAggQMAAK0GACCCAwAArgYAIIUDAAAPACCGAwAADwAghwMAAJQDACADHwAArAYAIIEDAACtBgAghwMAAJQDACAAAAAAAAAFHwAApwYAICAAAKoGACCBAwAAqAYAIIIDAACpBgAghwMAAAEAIAMfAACnBgAggQMAAKgGACCHAwAAAQAgAAAABR8AAKIGACAgAAClBgAggQMAAKMGACCCAwAApAYAIIcDAAABACADHwAAogYAIIEDAACjBgAghwMAAAEAIAAAAAsfAACDBgAwIAAAiAYAMIEDAACEBgAwggMAAIUGADCDAwAAhgYAIIQDAACHBgAwhQMAAIcGADCGAwAAhwYAMIcDAACHBgAwiAMAAIkGADCJAwAAigYAMAsfAAD3BQAwIAAA_AUAMIEDAAD4BQAwggMAAPkFADCDAwAA-gUAIIQDAAD7BQAwhQMAAPsFADCGAwAA-wUAMIcDAAD7BQAwiAMAAP0FADCJAwAA_gUAMAsfAADuBQAwIAAA8gUAMIEDAADvBQAwggMAAPAFADCDAwAA8QUAIIQDAACGBQAwhQMAAIYFADCGAwAAhgUAMIcDAACGBQAwiAMAAPMFADCJAwAAiQUAMAQKAADVBQAgvwJAAAAAAdMCAQAAAAHgAgAAAOACAgIAAAANACAfAAD2BQAgAwAAAA0AIB8AAPYFACAgAAD1BQAgARgAAKEGADACAAAADQAgGAAA9QUAIAIAAACKBQAgGAAA9AUAIAO_AkAAmQQAIdMCAQCXBAAh4AIAAIwF4AIiBAoAANQFACC_AkAAmQQAIdMCAQCXBAAh4AIAAIwF4AIiBAoAANUFACC_AkAAAAAB0wIBAAAAAeACAAAA4AICDLcCAQAAAAG_AkAAAAABwAJAAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQIAAAAJACAfAACCBgAgAwAAAAkAIB8AAIIGACAgAACBBgAgARgAAKAGADARAwAAjwQAIJsCAACQBAAwnAIAAAcAEJ0CAACQBAAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHeAgEAugMAIesCAQC6AwAh7AIBALoDACHtAgEA9QMAIe4CAQD1AwAh7wIBAPUDACHwAkAAzAMAIfECQADMAwAh8gIBAPUDACHzAgEA9QMAIQIAAAAJACAYAACBBgAgAgAAAP8FACAYAACABgAgEJsCAAD-BQAwnAIAAP8FABCdAgAA_gUAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAId4CAQC6AwAh6wIBALoDACHsAgEAugMAIe0CAQD1AwAh7gIBAPUDACHvAgEA9QMAIfACQADMAwAh8QJAAMwDACHyAgEA9QMAIfMCAQD1AwAhEJsCAAD-BQAwnAIAAP8FABCdAgAA_gUAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAId4CAQC6AwAh6wIBALoDACHsAgEAugMAIe0CAQD1AwAh7gIBAPUDACHvAgEA9QMAIfACQADMAwAh8QJAAMwDACHyAgEA9QMAIfMCAQD1AwAhDLcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIesCAQCXBAAh7AIBAJcEACHtAgEApQQAIe4CAQClBAAh7wIBAKUEACHwAkAA_wQAIfECQAD_BAAh8gIBAKUEACHzAgEApQQAIQy3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHrAgEAlwQAIewCAQCXBAAh7QIBAKUEACHuAgEApQQAIe8CAQClBAAh8AJAAP8EACHxAkAA_wQAIfICAQClBAAh8wIBAKUEACEMtwIBAAAAAb8CQAAAAAHAAkAAAAAB6wIBAAAAAewCAQAAAAHtAgEAAAAB7gIBAAAAAe8CAQAAAAHwAkAAAAAB8QJAAAAAAfICAQAAAAHzAgEAAAABB7cCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAH0AgEAAAAB9QIBAAAAAfYCAQAAAAECAAAABQAgHwAAjgYAIAMAAAAFACAfAACOBgAgIAAAjQYAIAEYAACfBgAwDAMAAI8EACCbAgAAkQQAMJwCAAADABCdAgAAkQQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIfQCAQAAAAH1AgEA9QMAIfYCAQD1AwAhAgAAAAUAIBgAAI0GACACAAAAiwYAIBgAAIwGACALmwIAAIoGADCcAgAAiwYAEJ0CAACKBgAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIfQCAQC6AwAh9QIBAPUDACH2AgEA9QMAIQubAgAAigYAMJwCAACLBgAQnQIAAIoGADC3AgEAugMAIb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAId4CAQC6AwAh9AIBALoDACH1AgEA9QMAIfYCAQD1AwAhB7cCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdsCQACZBAAh9AIBAJcEACH1AgEApQQAIfYCAQClBAAhB7cCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdsCQACZBAAh9AIBAJcEACH1AgEApQQAIfYCAQClBAAhB7cCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAH0AgEAAAAB9QIBAAAAAfYCAQAAAAEEHwAAgwYAMIEDAACEBgAwgwMAAIYGACCHAwAAhwYAMAQfAAD3BQAwgQMAAPgFADCDAwAA-gUAIIcDAAD7BQAwBB8AAO4FADCBAwAA7wUAMIMDAADxBQAghwMAAIYFADAAAAAHCgAAlgYAIA0AAJcGACAPAACYBgAgEAAAmQYAIBEAAJoGACASAACbBgAg2AIAAJcFACAJCAAAnAYAIAkAAJQGACALAACdBgAgDAAAywUAIOICAACXBQAg4wIAAJcFACDkAgAAlwUAIOUCAACXBQAg6AIAAJcFACABDAAAywUAIAAAAAABBgAAlgUAIAAHBAAAkgYAIAUAAJMGACAGAACUBgAg-AIAAJcFACD5AgAAlwUAIPsCAACXBQAg_AIAAJcFACAHtwIBAAAAAb8CQAAAAAHAAkAAAAAB2wJAAAAAAfQCAQAAAAH1AgEAAAAB9gIBAAAAAQy3AgEAAAABvwJAAAAAAcACQAAAAAHrAgEAAAAB7AIBAAAAAe0CAQAAAAHuAgEAAAAB7wIBAAAAAfACQAAAAAHxAkAAAAAB8gIBAAAAAfMCAQAAAAEDvwJAAAAAAdMCAQAAAAHgAgAAAOACAg4FAACQBgAgBgAAkQYAIJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQIAAAABACAfAACiBgAgAwAAADwAIB8AAKIGACAgAACmBgAgEAAAADwAIAUAAOwFACAGAADtBQAgGAAApgYAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4FAADsBQAgBgAA7QUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4EAACPBgAgBgAAkQYAIJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQIAAAABACAfAACnBgAgAwAAADwAIB8AAKcGACAgAACrBgAgEAAAADwAIAQAAOsFACAGAADtBQAgGAAAqwYAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4EAADrBQAgBgAA7QUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQWeAgEAAAABnwIBAAAAAaACEAAAAAGhAoAAAAABogJAAAAAAQIAAACUAwAgHwAArAYAIAMAAAAPACAfAACsBgAgIAAAsAYAIAcAAAAPACAYAACwBgAgngIBAJcEACGfAgEAlwQAIaACEACYBAAhoQKAAAAAAaICQACZBAAhBZ4CAQCXBAAhnwIBAJcEACGgAhAAmAQAIaECgAAAAAGiAkAAmQQAIQ4IAADaBQAgCwAAkwUAIAwAAJQFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAQIAAAATACAfAACxBgAgAwAAABEAIB8AALEGACAgAAC1BgAgEAAAABEAIAgAANkFACALAACoBAAgDAAAqQQAIBgAALUGACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHhAgEAlwQAIeICAQClBAAh4wIBAKUEACHkAgEApQQAIeUCAQClBAAh5gIBAJcEACHnAgEAlwQAIegCAQClBAAhDggAANkFACALAACoBAAgDAAAqQQAILcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAh6AIBAKUEACEOCAAA2gUAIAkAAJIFACAMAACUBQAgtwIBAAAAAb8CQAAAAAHAAkAAAAAB4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAegCAQAAAAECAAAAEwAgHwAAtgYAIAMAAAARACAfAAC2BgAgIAAAugYAIBAAAAARACAIAADZBQAgCQAApwQAIAwAAKkEACAYAAC6BgAgtwIBAJcEACG_AkAAmQQAIcACQACZBAAh4QIBAJcEACHiAgEApQQAIeMCAQClBAAh5AIBAKUEACHlAgEApQQAIeYCAQCXBAAh5wIBAJcEACHoAgEApQQAIQ4IAADZBQAgCQAApwQAIAwAAKkEACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHhAgEAlwQAIeICAQClBAAh4wIBAKUEACHkAgEApQQAIeUCAQClBAAh5gIBAJcEACHnAgEAlwQAIegCAQClBAAhCZ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQ4IAADaBQAgCQAAkgUAIAsAAJMFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAQIAAAATACAfAAC8BgAgAwAAABEAIB8AALwGACAgAADABgAgEAAAABEAIAgAANkFACAJAACnBAAgCwAAqAQAIBgAAMAGACC3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHhAgEAlwQAIeICAQClBAAh4wIBAKUEACHkAgEApQQAIeUCAQClBAAh5gIBAJcEACHnAgEAlwQAIegCAQClBAAhDggAANkFACAJAACnBAAgCwAAqAQAILcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIeECAQCXBAAh4gIBAKUEACHjAgEApQQAIeQCAQClBAAh5QIBAKUEACHmAgEAlwQAIecCAQCXBAAh6AIBAKUEACEPCgAAvAUAIA0AAPAEACAPAADxBAAgEAAA8gQAIBEAAPMEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AAMEGACADAAAAGwAgHwAAwQYAICAAAMUGACARAAAAGwAgCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBEAALoEACAYAADFBgAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACEPCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBEAALoEACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdMCAQCXBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ8KAAC8BQAgDQAA8AQAIBAAAPIEACARAADzBAAgEgAA9AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAECAAAAHQAgHwAAxgYAIAMAAAAbACAfAADGBgAgIAAAygYAIBEAAAAbACAKAAC7BQAgDQAAtwQAIBAAALkEACARAAC6BAAgEgAAuwQAIBgAAMoGACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdMCAQCXBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ8KAAC7BQAgDQAAtwQAIBAAALkEACARAAC6BAAgEgAAuwQAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhDwoAALwFACANAADwBAAgDwAA8QQAIBEAAPMEACASAAD0BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHUAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQIAAAAdACAfAADLBgAgAwAAABsAIB8AAMsGACAgAADPBgAgEQAAABsAIAoAALsFACANAAC3BAAgDwAAuAQAIBEAALoEACASAAC7BAAgGAAAzwYAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0wIBAJcEACHUAgEAlwQAIdUCAgC0BAAh1gIQAJgEACHXAiAAtQQAIdgCAQClBAAhDwoAALsFACANAAC3BAAgDwAAuAQAIBEAALoEACASAAC7BAAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACEPCgAAvAUAIA0AAPAEACAPAADxBAAgEAAA8gQAIBIAAPQEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AANAGACADAAAAGwAgHwAA0AYAICAAANQGACARAAAAGwAgCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBIAALsEACAYAADUBgAgnwIBAJcEACG3AgEAlwQAIb8CQACZBAAhwAJAAJkEACHTAgEAlwQAIdQCAQCXBAAh1QICALQEACHWAhAAmAQAIdcCIAC1BAAh2AIBAKUEACEPCgAAuwUAIA0AALcEACAPAAC4BAAgEAAAuQQAIBIAALsEACCfAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdMCAQCXBAAh1AIBAJcEACHVAgIAtAQAIdYCEACYBAAh1wIgALUEACHYAgEApQQAIQ4EAACPBgAgBQAAkAYAIJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfcCIAAAAAH4AgEAAAAB-QIBAAAAAfoCIAAAAAH7AkAAAAAB_AIBAAAAAQIAAAABACAfAADVBgAgAwAAADwAIB8AANUGACAgAADZBgAgEAAAADwAIAQAAOsFACAFAADsBQAgGAAA2QYAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQ4EAADrBQAgBQAA7AUAIJ8CAQCXBAAhtwIBAJcEACG4AgEAlwQAIb8CQACZBAAhwAJAAJkEACHgAgEAlwQAIfcCIAC1BAAh-AIBAKUEACH5AgEApQQAIfoCIAC1BAAh-wJAAP8EACH8AgEApQQAIQO_AkAAAAAB3gIBAAAAAeACAAAA4AICCLcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHaAgEAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAABBp8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHQAiAAAAAB2QIBAAAAAQIAAADbAQAgHwAA3AYAIAW3AgEAAAABvwJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgIIoAIQAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgPQAiAAAAABC7cCAQAAAAG_AkAAAAABwAJAAAAAAcECAQAAAAHDAkAAAAABxAIBAAAAAcUCAQAAAAHJAgEAAAABygIBAAAAAcsCAQAAAAHNAgAAAMcCAge3AgEAAAABvwJAAAAAAcACQAAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABAwAAAN4BACAfAADcBgAgIAAA5AYAIAgAAADeAQAgGAAA5AYAIJ8CAQCXBAAhtwIBAJcEACG_AkAAmQQAIcACQACZBAAh0AIgALUEACHZAgEAlwQAIQafAgEAlwQAIbcCAQCXBAAhvwJAAJkEACHAAkAAmQQAIdACIAC1BAAh2QIBAJcEACEJnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABCrcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAEEBAYCBQoDBg4EBwASAQMAAQEDAAECAwABCgAFBQcAEQgQBgkWBAsaCAweCQIGFAUHAAcBBhUAAQoABQcHABAKAAUNAAoPJAwQKA0RLA4SMA8CBwALDB8JAQwgAAEOAAkBDgAJAQ4ACQEOAAkEDzEAEDIAETMAEjQAAwk1AAs2AAw3AAMEOAAFOQAGOgAAAAADBwAXJQAYJgAZAAAAAwcAFyUAGCYAGQEDAAEBAwABAwcAHiUAHyYAIAAAAAMHAB4lAB8mACABAwABAQMAAQMHACUlACYmACcAAAADBwAlJQAmJgAnAAAAAwcALSUALiYALwAAAAMHAC0lAC4mAC8BCKEBBgEIpwEGAwcANCUANSYANgAAAAMHADQlADUmADYCAwABCgAFAgMAAQoABQMHADslADwmAD0AAAADBwA7JQA8JgA9AQoABQEKAAUDBwBCJQBDJgBEAAAAAwcAQiUAQyYARAAAAwcASSUASiYASwAAAAMHAEklAEomAEsCCgAFDQAKAgoABQ0ACgUHAFAlAFMmAFSnAQBRqAEAUgAAAAAABQcAUCUAUyYAVKcBAFGoAQBSAQ4ACQEOAAkDBwBZJQBaJgBbAAAAAwcAWSUAWiYAWwEOAAkBDgAJAwcAYCUAYSYAYgAAAAMHAGAlAGEmAGIBDgAJAQ4ACQUHAGclAGomAGunAQBoqAEAaQAAAAAABQcAZyUAaiYAa6cBAGioAQBpAQ4ACQEOAAkDBwBwJQBxJgByAAAAAwcAcCUAcSYAcgAAAAMHAHglAHkmAHoAAAADBwB4JQB5JgB6AAAABQcAgAElAIMBJgCEAacBAIEBqAEAggEAAAAAAAUHAIABJQCDASYAhAGnAQCBAagBAIIBAAAFBwCJASUAjAEmAI0BpwEAigGoAQCLAQAAAAAABQcAiQElAIwBJgCNAacBAIoBqAEAiwETAgEUOwEVPgEWPwEXQAEZQgEaRBMbRRQcRwEdSRMeShUhSwEiTAEjTRMnUBYoURopUgIqUwIrVAIsVQItVgIuWAIvWhMwWxsxXQIyXxMzYBw0YQI1YgI2YxM3Zh04ZyE5aAM6aQM7agM8awM9bAM-bgM_cBNAcSJBcwNCdRNDdiNEdwNFeANGeRNHfCRIfShJfylKgAEpS4MBKUyEASlNhQEpTocBKU-JARNQigEqUYwBKVKOARNTjwErVJABKVWRASlWkgETV5UBLFiWATBZlwEFWpgBBVuZAQVcmgEFXZsBBV6dAQVfnwETYKABMWGjAQVipQETY6YBMmSoAQVlqQEFZqoBE2etATNorgE3aa8BBGqwAQRrsQEEbLIBBG2zAQRutQEEb7cBE3C4AThxugEEcrwBE3O9ATl0vgEEdb8BBHbAARN3wwE6eMQBPnnFAQh6xgEIe8cBCHzIAQh9yQEIfssBCH_NAROAAc4BP4EB0AEIggHSARODAdMBQIQB1AEIhQHVAQiGAdYBE4cB2QFBiAHaAUWJAdwBCooB3QEKiwHgAQqMAeEBCo0B4gEKjgHkAQqPAeYBE5AB5wFGkQHpAQqSAesBE5MB7AFHlAHtAQqVAe4BCpYB7wETlwHyAUiYAfMBTJkB9AEJmgH1AQmbAfYBCZwB9wEJnQH4AQmeAfoBCZ8B_AEToAH9AU2hAf8BCaIBgQITowGCAk6kAYMCCaUBhAIJpgGFAhOpAYgCT6oBiQJVqwGKAg-sAYsCD60BjAIPrgGNAg-vAY4CD7ABkAIPsQGSAhOyAZMCVrMBlQIPtAGXAhO1AZgCV7YBmQIPtwGaAg-4AZsCE7kBngJYugGfAly7AaACDLwBoQIMvQGiAgy-AaMCDL8BpAIMwAGmAgzBAagCE8IBqQJdwwGrAgzEAa0CE8UBrgJexgGvAgzHAbACDMgBsQITyQG0Al_KAbUCY8sBtgINzAG3Ag3NAbgCDc4BuQINzwG6Ag3QAbwCDdEBvgIT0gG_AmTTAcECDdQBwwIT1QHEAmXWAcUCDdcBxgIN2AHHAhPZAcoCZtoBywJs2wHMAg7cAc0CDt0BzgIO3gHPAg7fAdACDuAB0gIO4QHUAhPiAdUCbeMB1wIO5AHZAhPlAdoCbuYB2wIO5wHcAg7oAd0CE-kB4AJv6gHhAnPrAeMCdOwB5AJ07QHnAnTuAegCdO8B6QJ08AHrAnTxAe0CE_IB7gJ18wHwAnT0AfICE_UB8wJ29gH0AnT3AfUCdPgB9gIT-QH5Anf6AfoCe_sB_AJ8_AH9Anz9AYADfP4BgQN8_wGCA3yAAoQDfIEChgMTggKHA32DAokDfIQCiwMThQKMA36GAo0DfIcCjgN8iAKPAxOJApIDf4oCkwOFAYsClQMGjAKWAwaNApgDBo4CmQMGjwKaAwaQApwDBpECngMTkgKfA4YBkwKhAwaUAqMDE5UCpAOHAZYCpQMGlwKmAwaYAqcDE5kCqgOIAZoCqwOOAQ" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"sessions\",\"accounts\",\"complexes\",\"_count\",\"plan\",\"users\",\"complex\",\"invitations\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"maintenances\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"_avg\",\"_sum\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"ComplexInvitation.findUnique\",\"ComplexInvitation.findUniqueOrThrow\",\"ComplexInvitation.findFirst\",\"ComplexInvitation.findFirstOrThrow\",\"ComplexInvitation.findMany\",\"ComplexInvitation.createOne\",\"ComplexInvitation.createMany\",\"ComplexInvitation.createManyAndReturn\",\"ComplexInvitation.updateOne\",\"ComplexInvitation.updateMany\",\"ComplexInvitation.updateManyAndReturn\",\"ComplexInvitation.upsertOne\",\"ComplexInvitation.deleteOne\",\"ComplexInvitation.deleteMany\",\"ComplexInvitation.groupBy\",\"ComplexInvitation.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"Court.groupBy\",\"Court.aggregate\",\"CourtMaintenance.findUnique\",\"CourtMaintenance.findUniqueOrThrow\",\"CourtMaintenance.findFirst\",\"CourtMaintenance.findFirstOrThrow\",\"CourtMaintenance.findMany\",\"CourtMaintenance.createOne\",\"CourtMaintenance.createMany\",\"CourtMaintenance.createManyAndReturn\",\"CourtMaintenance.updateOne\",\"CourtMaintenance.updateMany\",\"CourtMaintenance.updateManyAndReturn\",\"CourtMaintenance.upsertOne\",\"CourtMaintenance.deleteOne\",\"CourtMaintenance.deleteMany\",\"CourtMaintenance.groupBy\",\"CourtMaintenance.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"CourtBookingLog.findUnique\",\"CourtBookingLog.findUniqueOrThrow\",\"CourtBookingLog.findFirst\",\"CourtBookingLog.findFirstOrThrow\",\"CourtBookingLog.findMany\",\"CourtBookingLog.createOne\",\"CourtBookingLog.createMany\",\"CourtBookingLog.createManyAndReturn\",\"CourtBookingLog.updateOne\",\"CourtBookingLog.updateMany\",\"CourtBookingLog.updateManyAndReturn\",\"CourtBookingLog.upsertOne\",\"CourtBookingLog.deleteOne\",\"CourtBookingLog.deleteMany\",\"CourtBookingLog.groupBy\",\"CourtBookingLog.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"AND\",\"OR\",\"NOT\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"id\",\"email\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"createdAt\",\"updatedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"CourtBookingStatus\",\"previousStatus\",\"newStatus\",\"customerName\",\"customerPhone\",\"customerEmail\",\"changedAt\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"startDate\",\"reason\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"isUnderMaintenance\",\"maintenanceReason\",\"slug\",\"tokenHash\",\"expiresAt\",\"acceptedAt\",\"revokedAt\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"identifier\",\"value\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"countryCode\",\"latitude\",\"longitude\",\"emailVerified\",\"image\",\"phone\",\"banned\",\"bannedAt\",\"banReason\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "7QaQAYACEgQAAPkDACAFAAD6AwAgBgAA-wMAIJsCAAD3AwAwnAIAADwAEJ0CAAD3AwAwnwIBALoDACG3AgEAAAABuAIBAAAAAb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfoCIADnAwAh-wIBAPgDACH8AgEA-AMAIf0CIADnAwAh_gJAAMwDACH_AgEA-AMAIQEAAAABACARAwAAkgQAIJsCAACUBAAwnAIAAAMAEJ0CAACUBAAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIeMCAQD4AwAh5QIBAPgDACH0AgEAugMAIfUCAQD4AwAh9gIBAPgDACH3AgEA-AMAIfgCCACVBAAh-QIIAJUEACEIAwAApQYAIOMCAACbBQAg5QIAAJsFACD1AgAAmwUAIPYCAACbBQAg9wIAAJsFACD4AgAAmwUAIPkCAACbBQAgEQMAAJIEACCbAgAAlAQAMJwCAAADABCdAgAAlAQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIeMCAQD4AwAh5QIBAPgDACH0AgEAAAAB9QIBAPgDACH2AgEA-AMAIfcCAQD4AwAh-AIIAJUEACH5AggAlQQAIQMAAAADACABAAAEADACAAAFACARAwAAkgQAIJsCAACTBAAwnAIAAAcAEJ0CAACTBAAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh3gIBALoDACHrAgEAugMAIewCAQC6AwAh7QIBAPgDACHuAgEA-AMAIe8CAQD4AwAh8AJAAMwDACHxAkAAzAMAIfICAQD4AwAh8wIBAPgDACEIAwAApQYAIO0CAACbBQAg7gIAAJsFACDvAgAAmwUAIPACAACbBQAg8QIAAJsFACDyAgAAmwUAIPMCAACbBQAgEQMAAJIEACCbAgAAkwQAMJwCAAAHABCdAgAAkwQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh3gIBALoDACHrAgEAugMAIewCAQC6AwAh7QIBAPgDACHuAgEA-AMAIe8CAQD4AwAh8AJAAMwDACHxAkAAzAMAIfICAQD4AwAh8wIBAPgDACEDAAAABwAgAQAACAAwAgAACQAgCQMAAJIEACAKAACFBAAgmwIAAJAEADCcAgAACwAQnQIAAJAEADC_AkAAvQMAIdMCAQDKAwAh3gIBALoDACHgAgAAkQTgAiICAwAApQYAIAoAAJ0GACAKAwAAkgQAIAoAAIUEACCbAgAAkAQAMJwCAAALABCdAgAAkAQAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACRBOACIoEDAACPBAAgAwAAAAsAIAEAAAwAMAIAAA0AIAkGAAC-AwAgmwIAALkDADCcAgAADwAQnQIAALkDADCeAgEAugMAIZ8CAQC6AwAhoAIQALsDACGhAgAAvAMAIKICQAC9AwAhAQAAAA8AIBIIAACNBAAgCQAA-wMAIAsAAI4EACAMAADoAwAgmwIAAIwEADCcAgAAEQAQnQIAAIwEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHhAgEAugMAIeICAQD4AwAh4wIBAPgDACHkAgEA-AMAIeUCAQD4AwAh5gIBALoDACHnAgEAugMAIegCAQD4AwAhCQgAAKMGACAJAACbBgAgCwAApAYAIAwAAM8FACDiAgAAmwUAIOMCAACbBQAg5AIAAJsFACDlAgAAmwUAIOgCAACbBQAgEggAAI0EACAJAAD7AwAgCwAAjgQAIAwAAOgDACCbAgAAjAQAMJwCAAARABCdAgAAjAQAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA-AMAIeMCAQD4AwAh5AIBAPgDACHlAgEA-AMAIeYCAQAAAAHnAgEAugMAIegCAQD4AwAhAwAAABEAIAEAABIAMAIAABMAIAEAAAARACADAAAACwAgAQAADAAwAgAADQAgDQoAAIUEACCbAgAAiwQAMJwCAAAXABCdAgAAiwQAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIQMKAACdBgAg3AIAAJsFACDdAgAAmwUAIA0KAACFBAAgmwIAAIsEADCcAgAAFwAQnQIAAIsEADC3AgEAAAABuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAAAAB2wJAAL0DACHcAkAAzAMAId0CQADMAwAhAwAAABcAIAEAABgAMAIAABkAIBMKAACFBAAgDQAAhgQAIA8AAIcEACAQAACIBAAgEQAAiQQAIBIAAIoEACCbAgAAhAQAMJwCAAAbABCdAgAAhAQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD4AwAhBwoAAJ0GACANAACeBgAgDwAAnwYAIBAAAKAGACARAAChBgAgEgAAogYAINgCAACbBQAgEwoAAIUEACANAACGBAAgDwAAhwQAIBAAAIgEACARAACJBAAgEgAAigQAIJsCAACEBAAwnAIAABsAEJ0CAACEBAAwnwIBALoDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA-AMAIQMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAQAAABsAIAoOAAD9AwAgmwIAAIIEADCcAgAAIQAQnQIAAIIEADC3AgEAygMAIb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIMEzwIiAQ4AAJwGACAKDgAA_QMAIJsCAACCBAAwnAIAACEAEJ0CAACCBAAwtwIBAAAAAb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIMEzwIiAwAAACEAIAEAACIAMAIAACMAIA0OAAD9AwAgmwIAAIAEADCcAgAAJQAQnQIAAIAEADCgAhAAuwMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPgDACHFAgEA-AMAIc8CAACBBM8CI9ACIADnAwAhBA4AAJwGACDEAgAAmwUAIMUCAACbBQAgzwIAAJsFACANDgAA_QMAIJsCAACABAAwnAIAACUAEJ0CAACABAAwoAIQALsDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPgDACHFAgEA-AMAIc8CAACBBM8CI9ACIADnAwAhAwAAACUAIAEAACYAMAIAACcAIBAOAAD9AwAgmwIAAP8DADCcAgAAKQAQnQIAAP8DADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHBAgEAugMAIcICAQDKAwAhwwJAAL0DACHEAgEAugMAIcUCAQC6AwAhyQIBALoDACHKAgEAugMAIcsCAQC6AwAhzQIAANMDxwIiAQ4AAJwGACARDgAA_QMAIJsCAAD_AwAwnAIAACkAEJ0CAAD_AwAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHBAgEAAAABwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiKAAwAA_gMAIAMAAAApACABAAAqADACAAArACAMDgAA_QMAIJsCAAD8AwAwnAIAAC0AEJ0CAAD8AwAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA-AMAIcUCAQD4AwAh0QJAAL0DACHSAgEA-AMAIQQOAACcBgAgxAIAAJsFACDFAgAAmwUAINICAACbBQAgDA4AAP0DACCbAgAA_AMAMJwCAAAtABCdAgAA_AMAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwgIBAMoDACHEAgEA-AMAIcUCAQD4AwAh0QJAAL0DACHSAgEA-AMAIQMAAAAtACABAAAuADACAAAvACABAAAAIQAgAQAAACUAIAEAAAApACABAAAALQAgAQAAAAsAIAEAAAAXACABAAAAGwAgAQAAAAMAIAEAAAAHACABAAAACwAgAQAAAAEAIBIEAAD5AwAgBQAA-gMAIAYAAPsDACCbAgAA9wMAMJwCAAA8ABCdAgAA9wMAMJ8CAQC6AwAhtwIBALoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfoCIADnAwAh-wIBAPgDACH8AgEA-AMAIf0CIADnAwAh_gJAAMwDACH_AgEA-AMAIQcEAACZBgAgBQAAmgYAIAYAAJsGACD7AgAAmwUAIPwCAACbBQAg_gIAAJsFACD_AgAAmwUAIAMAAAA8ACABAAA9ADACAAABACADAAAAPAAgAQAAPQAwAgAAAQAgAwAAADwAIAEAAD0AMAIAAAEAIA8EAACWBgAgBQAAlwYAIAYAAJgGACCfAgEAAAABtwIBAAAAAbgCAQAAAAG_AkAAAAABwAJAAAAAAeACAQAAAAH6AiAAAAAB-wIBAAAAAfwCAQAAAAH9AiAAAAAB_gJAAAAAAf8CAQAAAAEBGAAAQQAgDJ8CAQAAAAG3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB4AIBAAAAAfoCIAAAAAH7AgEAAAAB_AIBAAAAAf0CIAAAAAH-AkAAAAAB_wIBAAAAAQEYAABDADABGAAAQwAwDwQAAPIFACAFAADzBQAgBgAA9AUAIJ8CAQCbBAAhtwIBAJsEACG4AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHgAgEAmwQAIfoCIAC5BAAh-wIBAKkEACH8AgEAqQQAIf0CIAC5BAAh_gJAAIMFACH_AgEAqQQAIQIAAAABACAYAABGACAMnwIBAJsEACG3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeACAQCbBAAh-gIgALkEACH7AgEAqQQAIfwCAQCpBAAh_QIgALkEACH-AkAAgwUAIf8CAQCpBAAhAgAAADwAIBgAAEgAIAIAAAA8ACAYAABIACADAAAAAQAgHwAAQQAgIAAARgAgAQAAAAEAIAEAAAA8ACAHBwAA7wUAICUAAPEFACAmAADwBQAg-wIAAJsFACD8AgAAmwUAIP4CAACbBQAg_wIAAJsFACAPmwIAAPYDADCcAgAATwAQnQIAAPYDADCfAgEArQMAIbcCAQCtAwAhuAIBAK0DACG_AkAAsAMAIcACQACwAwAh4AIBAK0DACH6AiAA2AMAIfsCAQDXAwAh_AIBANcDACH9AiAA2AMAIf4CQADCAwAh_wIBANcDACEDAAAAPAAgAQAATgAwJAAATwAgAwAAADwAIAEAAD0AMAIAAAEAIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgDgMAAO4FACC3AgEAAAABvwJAAAAAAcACQAAAAAHbAkAAAAAB3gIBAAAAAeMCAQAAAAHlAgEAAAAB9AIBAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCCAAAAAH5AggAAAABARgAAFcAIA23AgEAAAABvwJAAAAAAcACQAAAAAHbAkAAAAAB3gIBAAAAAeMCAQAAAAHlAgEAAAAB9AIBAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCCAAAAAH5AggAAAABARgAAFkAMAEYAABZADAOAwAA7QUAILcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdsCQACdBAAh3gIBAJsEACHjAgEAqQQAIeUCAQCpBAAh9AIBAJsEACH1AgEAqQQAIfYCAQCpBAAh9wIBAKkEACH4AggA7AUAIfkCCADsBQAhAgAAAAUAIBgAAFwAIA23AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHbAkAAnQQAId4CAQCbBAAh4wIBAKkEACHlAgEAqQQAIfQCAQCbBAAh9QIBAKkEACH2AgEAqQQAIfcCAQCpBAAh-AIIAOwFACH5AggA7AUAIQIAAAADACAYAABeACACAAAAAwAgGAAAXgAgAwAAAAUAIB8AAFcAICAAAFwAIAEAAAAFACABAAAAAwAgDAcAAOcFACAlAADqBQAgJgAA6QUAIDcAAOgFACA4AADrBQAg4wIAAJsFACDlAgAAmwUAIPUCAACbBQAg9gIAAJsFACD3AgAAmwUAIPgCAACbBQAg-QIAAJsFACAQmwIAAPIDADCcAgAAZQAQnQIAAPIDADC3AgEArQMAIb8CQACwAwAhwAJAALADACHbAkAAsAMAId4CAQCtAwAh4wIBANcDACHlAgEA1wMAIfQCAQCtAwAh9QIBANcDACH2AgEA1wMAIfcCAQDXAwAh-AIIAPMDACH5AggA8wMAIQMAAAADACABAABkADAkAABlACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAOAwAA5gUAILcCAQAAAAG_AkAAAAABwAJAAAAAAd4CAQAAAAHrAgEAAAAB7AIBAAAAAe0CAQAAAAHuAgEAAAAB7wIBAAAAAfACQAAAAAHxAkAAAAAB8gIBAAAAAfMCAQAAAAEBGAAAbQAgDbcCAQAAAAG_AkAAAAABwAJAAAAAAd4CAQAAAAHrAgEAAAAB7AIBAAAAAe0CAQAAAAHuAgEAAAAB7wIBAAAAAfACQAAAAAHxAkAAAAAB8gIBAAAAAfMCAQAAAAEBGAAAbwAwARgAAG8AMA4DAADlBQAgtwIBAJsEACG_AkAAnQQAIcACQACdBAAh3gIBAJsEACHrAgEAmwQAIewCAQCbBAAh7QIBAKkEACHuAgEAqQQAIe8CAQCpBAAh8AJAAIMFACHxAkAAgwUAIfICAQCpBAAh8wIBAKkEACECAAAACQAgGAAAcgAgDbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAId4CAQCbBAAh6wIBAJsEACHsAgEAmwQAIe0CAQCpBAAh7gIBAKkEACHvAgEAqQQAIfACQACDBQAh8QJAAIMFACHyAgEAqQQAIfMCAQCpBAAhAgAAAAcAIBgAAHQAIAIAAAAHACAYAAB0ACADAAAACQAgHwAAbQAgIAAAcgAgAQAAAAkAIAEAAAAHACAKBwAA4gUAICUAAOQFACAmAADjBQAg7QIAAJsFACDuAgAAmwUAIO8CAACbBQAg8AIAAJsFACDxAgAAmwUAIPICAACbBQAg8wIAAJsFACAQmwIAAPEDADCcAgAAewAQnQIAAPEDADC3AgEArQMAIb8CQACwAwAhwAJAALADACHeAgEArQMAIesCAQCtAwAh7AIBAK0DACHtAgEA1wMAIe4CAQDXAwAh7wIBANcDACHwAkAAwgMAIfECQADCAwAh8gIBANcDACHzAgEA1wMAIQMAAAAHACABAAB6ADAkAAB7ACADAAAABwAgAQAACAAwAgAACQAgCZsCAADwAwAwnAIAAIEBABCdAgAA8AMAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHpAgEAugMAIeoCAQC6AwAhAQAAAH4AIAEAAAB-ACAJmwIAAPADADCcAgAAgQEAEJ0CAADwAwAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHpAgEAugMAIeoCAQC6AwAhAAMAAACBAQAgAQAAggEAMAIAAH4AIAMAAACBAQAgAQAAggEAMAIAAH4AIAMAAACBAQAgAQAAggEAMAIAAH4AIAa3AgEAAAABvwJAAAAAAcACQAAAAAHbAkAAAAAB6QIBAAAAAeoCAQAAAAEBGAAAhgEAIAa3AgEAAAABvwJAAAAAAcACQAAAAAHbAkAAAAAB6QIBAAAAAeoCAQAAAAEBGAAAiAEAMAEYAACIAQAwBrcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdsCQACdBAAh6QIBAJsEACHqAgEAmwQAIQIAAAB-ACAYAACLAQAgBrcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdsCQACdBAAh6QIBAJsEACHqAgEAmwQAIQIAAACBAQAgGAAAjQEAIAIAAACBAQAgGAAAjQEAIAMAAAB-ACAfAACGAQAgIAAAiwEAIAEAAAB-ACABAAAAgQEAIAMHAADfBQAgJQAA4QUAICYAAOAFACAJmwIAAO8DADCcAgAAlAEAEJ0CAADvAwAwtwIBAK0DACG_AkAAsAMAIcACQACwAwAh2wJAALADACHpAgEArQMAIeoCAQCtAwAhAwAAAIEBACABAACTAQAwJAAAlAEAIAMAAACBAQAgAQAAggEAMAIAAH4AIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgDwgAAN4FACAJAACWBQAgCwAAlwUAIAwAAJgFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAQEYAACcAQAgC7cCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAHoAgEAAAABARgAAJ4BADABGAAAngEAMAEAAAAPACAPCAAA3QUAIAkAAKsEACALAACsBAAgDAAArQQAILcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeECAQCbBAAh4gIBAKkEACHjAgEAqQQAIeQCAQCpBAAh5QIBAKkEACHmAgEAmwQAIecCAQCbBAAh6AIBAKkEACECAAAAEwAgGAAAogEAIAu3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHhAgEAmwQAIeICAQCpBAAh4wIBAKkEACHkAgEAqQQAIeUCAQCpBAAh5gIBAJsEACHnAgEAmwQAIegCAQCpBAAhAgAAABEAIBgAAKQBACACAAAAEQAgGAAApAEAIAEAAAAPACADAAAAEwAgHwAAnAEAICAAAKIBACABAAAAEwAgAQAAABEAIAgHAADaBQAgJQAA3AUAICYAANsFACDiAgAAmwUAIOMCAACbBQAg5AIAAJsFACDlAgAAmwUAIOgCAACbBQAgDpsCAADuAwAwnAIAAKwBABCdAgAA7gMAMLcCAQDAAwAhvwJAALADACHAAkAAsAMAIeECAQCtAwAh4gIBANcDACHjAgEA1wMAIeQCAQDXAwAh5QIBANcDACHmAgEArQMAIecCAQCtAwAh6AIBANcDACEDAAAAEQAgAQAAqwEAMCQAAKwBACADAAAAEQAgAQAAEgAwAgAAEwAgAQAAAA0AIAEAAAANACADAAAACwAgAQAADAAwAgAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACAGAwAAlAUAIAoAANkFACC_AkAAAAAB0wIBAAAAAd4CAQAAAAHgAgAAAOACAgEYAAC0AQAgBL8CQAAAAAHTAgEAAAAB3gIBAAAAAeACAAAA4AICARgAALYBADABGAAAtgEAMAYDAACSBQAgCgAA2AUAIL8CQACdBAAh0wIBAJsEACHeAgEAmwQAIeACAACQBeACIgIAAAANACAYAAC5AQAgBL8CQACdBAAh0wIBAJsEACHeAgEAmwQAIeACAACQBeACIgIAAAALACAYAAC7AQAgAgAAAAsAIBgAALsBACADAAAADQAgHwAAtAEAICAAALkBACABAAAADQAgAQAAAAsAIAMHAADVBQAgJQAA1wUAICYAANYFACAHmwIAAOoDADCcAgAAwgEAEJ0CAADqAwAwvwJAALADACHTAgEAwAMAId4CAQCtAwAh4AIAAOsD4AIiAwAAAAsAIAEAAMEBADAkAADCAQAgAwAAAAsAIAEAAAwAMAIAAA0AIAEAAAAZACABAAAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgCgoAANQFACC3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdoCAQAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAEBGAAAygEAIAm3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdoCAQAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAEBGAAAzAEAMAEYAADMAQAwCgoAANMFACC3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh2gIBAJsEACHbAkAAnQQAIdwCQACDBQAh3QJAAIMFACECAAAAGQAgGAAAzwEAIAm3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh2gIBAJsEACHbAkAAnQQAIdwCQACDBQAh3QJAAIMFACECAAAAFwAgGAAA0QEAIAIAAAAXACAYAADRAQAgAwAAABkAIB8AAMoBACAgAADPAQAgAQAAABkAIAEAAAAXACAFBwAA0AUAICUAANIFACAmAADRBQAg3AIAAJsFACDdAgAAmwUAIAybAgAA6QMAMJwCAADYAQAQnQIAAOkDADC3AgEAwAMAIbgCAQCtAwAhvwJAALADACHAAkAAsAMAIdMCAQDAAwAh2gIBAK0DACHbAkAAsAMAIdwCQADCAwAh3QJAAMIDACEDAAAAFwAgAQAA1wEAMCQAANgBACADAAAAFwAgAQAAGAAwAgAAGQAgCgwAAOgDACCbAgAA5gMAMJwCAADeAQAQnQIAAOYDADCfAgEAAAABtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHQAiAA5wMAIdkCAQAAAAEBAAAA2wEAIAEAAADbAQAgCgwAAOgDACCbAgAA5gMAMJwCAADeAQAQnQIAAOYDADCfAgEAugMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIdACIADnAwAh2QIBALoDACEBDAAAzwUAIAMAAADeAQAgAQAA3wEAMAIAANsBACADAAAA3gEAIAEAAN8BADACAADbAQAgAwAAAN4BACABAADfAQAwAgAA2wEAIAcMAADOBQAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdACIAAAAAHZAgEAAAABARgAAOMBACAGnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdACIAAAAAHZAgEAAAABARgAAOUBADABGAAA5QEAMAcMAADEBQAgnwIBAJsEACG3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHQAiAAuQQAIdkCAQCbBAAhAgAAANsBACAYAADoAQAgBp8CAQCbBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAh0AIgALkEACHZAgEAmwQAIQIAAADeAQAgGAAA6gEAIAIAAADeAQAgGAAA6gEAIAMAAADbAQAgHwAA4wEAICAAAOgBACABAAAA2wEAIAEAAADeAQAgAwcAAMEFACAlAADDBQAgJgAAwgUAIAmbAgAA5QMAMJwCAADxAQAQnQIAAOUDADCfAgEArQMAIbcCAQDAAwAhvwJAALADACHAAkAAsAMAIdACIADYAwAh2QIBAK0DACEDAAAA3gEAIAEAAPABADAkAADxAQAgAwAAAN4BACABAADfAQAwAgAA2wEAIAEAAAAdACABAAAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgEAoAAMAFACANAAD0BAAgDwAA9QQAIBAAAPYEACARAAD3BAAgEgAA-AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAEBGAAA-QEAIAqfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABARgAAPsBADABGAAA-wEAMBAKAAC_BQAgDQAAuwQAIA8AALwEACAQAAC9BAAgEQAAvgQAIBIAAL8EACCfAgEAmwQAIbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh1AIBAJsEACHVAgIAuAQAIdYCEACcBAAh1wIgALkEACHYAgEAqQQAIQIAAAAdACAYAAD-AQAgCp8CAQCbBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAh0wIBAJsEACHUAgEAmwQAIdUCAgC4BAAh1gIQAJwEACHXAiAAuQQAIdgCAQCpBAAhAgAAABsAIBgAAIACACACAAAAGwAgGAAAgAIAIAMAAAAdACAfAAD5AQAgIAAA_gEAIAEAAAAdACABAAAAGwAgBgcAALoFACAlAAC9BQAgJgAAvAUAIDcAALsFACA4AAC-BQAg2AIAAJsFACANmwIAAOQDADCcAgAAhwIAEJ0CAADkAwAwnwIBAK0DACG3AgEAwAMAIb8CQACwAwAhwAJAALADACHTAgEAwAMAIdQCAQDAAwAh1QICAMEDACHWAhAArgMAIdcCIADYAwAh2AIBANcDACEDAAAAGwAgAQAAhgIAMCQAAIcCACADAAAAGwAgAQAAHAAwAgAAHQAgAQAAAC8AIAEAAAAvACADAAAALQAgAQAALgAwAgAALwAgAwAAAC0AIAEAAC4AMAIAAC8AIAMAAAAtACABAAAuADACAAAvACAJDgAAuQUAILcCAQAAAAG_AkAAAAABwAJAAAAAAcICAQAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABARgAAI8CACAItwIBAAAAAb8CQAAAAAHAAkAAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAAB0QJAAAAAAdICAQAAAAEBGAAAkQIAMAEYAACRAgAwCQ4AALgFACC3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHCAgEAmwQAIcQCAQCpBAAhxQIBAKkEACHRAkAAnQQAIdICAQCpBAAhAgAAAC8AIBgAAJQCACAItwIBAJsEACG_AkAAnQQAIcACQACdBAAhwgIBAJsEACHEAgEAqQQAIcUCAQCpBAAh0QJAAJ0EACHSAgEAqQQAIQIAAAAtACAYAACWAgAgAgAAAC0AIBgAAJYCACADAAAALwAgHwAAjwIAICAAAJQCACABAAAALwAgAQAAAC0AIAYHAAC1BQAgJQAAtwUAICYAALYFACDEAgAAmwUAIMUCAACbBQAg0gIAAJsFACALmwIAAOMDADCcAgAAnQIAEJ0CAADjAwAwtwIBAMADACG_AkAAsAMAIcACQACwAwAhwgIBAMADACHEAgEA1wMAIcUCAQDXAwAh0QJAALADACHSAgEA1wMAIQMAAAAtACABAACcAgAwJAAAnQIAIAMAAAAtACABAAAuADACAAAvACABAAAAIwAgAQAAACMAIAMAAAAhACABAAAiADACAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAcOAAC0BQAgtwIBAAAAAb8CQAAAAAHCAgEAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CAgEYAAClAgAgBrcCAQAAAAG_AkAAAAABwgIBAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgIBGAAApwIAMAEYAACnAgAwBw4AALMFACC3AgEAmwQAIb8CQACdBAAhwgIBAJsEACHEAgEAmwQAIcUCAQCbBAAhzwIAAPAEzwIiAgAAACMAIBgAAKoCACAGtwIBAJsEACG_AkAAnQQAIcICAQCbBAAhxAIBAJsEACHFAgEAmwQAIc8CAADwBM8CIgIAAAAhACAYAACsAgAgAgAAACEAIBgAAKwCACADAAAAIwAgHwAApQIAICAAAKoCACABAAAAIwAgAQAAACEAIAMHAACwBQAgJQAAsgUAICYAALEFACAJmwIAAN8DADCcAgAAswIAEJ0CAADfAwAwtwIBAMADACG_AkAAsAMAIcICAQDAAwAhxAIBAK0DACHFAgEArQMAIc8CAADgA88CIgMAAAAhACABAACyAgAwJAAAswIAIAMAAAAhACABAAAiADACAAAjACABAAAAJwAgAQAAACcAIAMAAAAlACABAAAmADACAAAnACADAAAAJQAgAQAAJgAwAgAAJwAgAwAAACUAIAEAACYAMAIAACcAIAoOAACvBQAgoAIQAAAAAbcCAQAAAAG_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_AkAAvQMAIcACQAC9AwAhAQAAAPsCACABAAAA-wIAIA2bAgAAyQMAMJwCAAD-AgAQnQIAAMkDADC3AgEAygMAIbgCAQC6AwAhuQIBALoDACG6AkAAvQMAIbsCAgDLAwAhvAJAAL0DACG9AgIAywMAIb4CQADMAwAhvwJAAL0DACHAAkAAvQMAIQG-AgAAmwUAIAMAAAD-AgAgAQAA_wIAMAIAAPsCACADAAAA_gIAIAEAAP8CADACAAD7AgAgAwAAAP4CACABAAD_AgAwAgAA-wIAIAq3AgEAAAABuAIBAAAAAbkCAQAAAAG6AkAAAAABuwICAAAAAbwCQAAAAAG9AgIAAAABvgJAAAAAAb8CQAAAAAHAAkAAAAABARgAAIMDACAKtwIBAAAAAbgCAQAAAAG5AgEAAAABugJAAAAAAbsCAgAAAAG8AkAAAAABvQICAAAAAb4CQAAAAAG_AkAAAAABwAJAAAAAAQEYAACFAwAwARgAAIUDADAKtwIBAJsEACG4AgEAmwQAIbkCAQCbBAAhugJAAJ0EACG7AgIAuAQAIbwCQACdBAAhvQICALgEACG-AkAAgwUAIb8CQACdBAAhwAJAAJ0EACECAAAA-wIAIBgAAIgDACAKtwIBAJsEACG4AgEAmwQAIbkCAQCbBAAhugJAAJ0EACG7AgIAuAQAIbwCQACdBAAhvQICALgEACG-AkAAgwUAIb8CQACdBAAhwAJAAJ0EACECAAAA_gIAIBgAAIoDACACAAAA_gIAIBgAAIoDACADAAAA-wIAIB8AAIMDACAgAACIAwAgAQAAAPsCACABAAAA_gIAIAYHAACcBQAgJQAAnwUAICYAAJ4FACA3AACdBQAgOAAAoAUAIL4CAACbBQAgDZsCAAC_AwAwnAIAAJEDABCdAgAAvwMAMLcCAQDAAwAhuAIBAK0DACG5AgEArQMAIboCQACwAwAhuwICAMEDACG8AkAAsAMAIb0CAgDBAwAhvgJAAMIDACG_AkAAsAMAIcACQACwAwAhAwAAAP4CACABAACQAwAwJAAAkQMAIAMAAAD-AgAgAQAA_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_AwAwnAIAAJEDABCdAgAAvwMAMLcCAQDAAwAhuAIBAK0DACG5AgEArQMAIboCQACwAwAhuwICAMEDACG8AkAAsAMAIb0CAgDBAwAhvgJAAMIDACG_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_AkAAsAMAIcACQACwAwAh2wJAALADACHpAgEArQMAIeoCAQCtAwAhCZsCAADwAwAwnAIAAIEBABCdAgAA8AMAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAIdsCQAC9AwAh6QIBALoDACHqAgEAugMAIRCbAgAA8QMAMJwCAAB7ABCdAgAA8QMAMLcCAQCtAwAhvwJAALADACHAAkAAsAMAId4CAQCtAwAh6wIBAK0DACHsAgEArQMAIe0CAQDXAwAh7gIBANcDACHvAgEA1wMAIfACQADCAwAh8QJAAMIDACHyAgEA1wMAIfMCAQDXAwAhEJsCAADyAwAwnAIAAGUAEJ0CAADyAwAwtwIBAK0DACG_AkAAsAMAIcACQACwAwAh2wJAALADACHeAgEArQMAIeMCAQDXAwAh5QIBANcDACH0AgEArQMAIfUCAQDXAwAh9gIBANcDACH3AgEA1wMAIfgCCADzAwAh-QIIAPMDACENBwAAxAMAICUAAPUDACAmAAD1AwAgNwAA9QMAIDgAAPUDACCjAggAAAABpAIIAAAABaUCCAAAAAWmAggAAAABpwIIAAAAAagCCAAAAAGpAggAAAABqgIIAPQDACENBwAAxAMAICUAAPUDACAmAAD1AwAgNwAA9QMAIDgAAPUDACCjAggAAAABpAIIAAAABaUCCAAAAAWmAggAAAABpwIIAAAAAagCCAAAAAGpAggAAAABqgIIAPQDACEIowIIAAAAAaQCCAAAAAWlAggAAAAFpgIIAAAAAacCCAAAAAGoAggAAAABqQIIAAAAAaoCCAD1AwAhD5sCAAD2AwAwnAIAAE8AEJ0CAAD2AwAwnwIBAK0DACG3AgEArQMAIbgCAQCtAwAhvwJAALADACHAAkAAsAMAIeACAQCtAwAh-gIgANgDACH7AgEA1wMAIfwCAQDXAwAh_QIgANgDACH-AkAAwgMAIf8CAQDXAwAhEgQAAPkDACAFAAD6AwAgBgAA-wMAIJsCAAD3AwAwnAIAADwAEJ0CAAD3AwAwnwIBALoDACG3AgEAugMAIbgCAQC6AwAhvwJAAL0DACHAAkAAvQMAIeACAQC6AwAh-gIgAOcDACH7AgEA-AMAIfwCAQD4AwAh_QIgAOcDACH-AkAAzAMAIf8CAQD4AwAhC6MCAQAAAAGkAgEAAAAFpQIBAAAABaYCAQAAAAGnAgEAAAABqAIBAAAAAakCAQAAAAGqAgEA3AMAIbECAQAAAAGyAgEAAAABswIBAAAAAQO0AgAAAwAgtQIAAAMAILYCAAADACADtAIAAAcAILUCAAAHACC2AgAABwAgA7QCAAALACC1AgAACwAgtgIAAAsAIAwOAAD9AwAgmwIAAPwDADCcAgAALQAQnQIAAPwDADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHCAgEAygMAIcQCAQD4AwAhxQIBAPgDACHRAkAAvQMAIdICAQD4AwAhFQoAAIUEACANAACGBAAgDwAAhwQAIBAAAIgEACARAACJBAAgEgAAigQAIJsCAACEBAAwnAIAABsAEJ0CAACEBAAwnwIBALoDACG3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHTAgEAygMAIdQCAQDKAwAh1QICAMsDACHWAhAAuwMAIdcCIADnAwAh2AIBAPgDACGCAwAAGwAggwMAABsAIAPCAgEAAAABwwJAAAAAAcQCAQAAAAEQDgAA_QMAIJsCAAD_AwAwnAIAACkAEJ0CAAD_AwAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAhwQIBALoDACHCAgEAygMAIcMCQAC9AwAhxAIBALoDACHFAgEAugMAIckCAQC6AwAhygIBALoDACHLAgEAugMAIc0CAADTA8cCIg0OAAD9AwAgmwIAAIAEADCcAgAAJQAQnQIAAIAEADCgAhAAuwMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPgDACHFAgEA-AMAIc8CAACBBM8CI9ACIADnAwAhBKMCAAAAzwIDpAIAAADPAgmlAgAAAM8CCaoCAADeA88CIwoOAAD9AwAgmwIAAIIEADCcAgAAIQAQnQIAAIIEADC3AgEAygMAIb8CQAC9AwAhwgIBAMoDACHEAgEAugMAIcUCAQC6AwAhzwIAAIMEzwIiBKMCAAAAzwICpAIAAADPAgilAgAAAM8CCKoCAADiA88CIhMKAACFBAAgDQAAhgQAIA8AAIcEACAQAACIBAAgEQAAiQQAIBIAAIoEACCbAgAAhAQAMJwCAAAbABCdAgAAhAQAMJ8CAQC6AwAhtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHUAgEAygMAIdUCAgDLAwAh1gIQALsDACHXAiAA5wMAIdgCAQD4AwAhFAgAAI0EACAJAAD7AwAgCwAAjgQAIAwAAOgDACCbAgAAjAQAMJwCAAARABCdAgAAjAQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIeECAQC6AwAh4gIBAPgDACHjAgEA-AMAIeQCAQD4AwAh5QIBAPgDACHmAgEAugMAIecCAQC6AwAh6AIBAPgDACGCAwAAEQAggwMAABEAIAwMAADoAwAgmwIAAOYDADCcAgAA3gEAEJ0CAADmAwAwnwIBALoDACG3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHQAiAA5wMAIdkCAQC6AwAhggMAAN4BACCDAwAA3gEAIAO0AgAAIQAgtQIAACEAILYCAAAhACADtAIAACUAILUCAAAlACC2AgAAJQAgA7QCAAApACC1AgAAKQAgtgIAACkAIAO0AgAALQAgtQIAAC0AILYCAAAtACANCgAAhQQAIJsCAACLBAAwnAIAABcAEJ0CAACLBAAwtwIBAMoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHTAgEAygMAIdoCAQC6AwAh2wJAAL0DACHcAkAAzAMAId0CQADMAwAhEggAAI0EACAJAAD7AwAgCwAAjgQAIAwAAOgDACCbAgAAjAQAMJwCAAARABCdAgAAjAQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIeECAQC6AwAh4gIBAPgDACHjAgEA-AMAIeQCAQD4AwAh5QIBAPgDACHmAgEAugMAIecCAQC6AwAh6AIBAPgDACELBgAAvgMAIJsCAAC5AwAwnAIAAA8AEJ0CAAC5AwAwngIBALoDACGfAgEAugMAIaACEAC7AwAhoQIAALwDACCiAkAAvQMAIYIDAAAPACCDAwAADwAgA7QCAAAXACC1AgAAFwAgtgIAABcAIALTAgEAAAAB3gIBAAAAAQkDAACSBAAgCgAAhQQAIJsCAACQBAAwnAIAAAsAEJ0CAACQBAAwvwJAAL0DACHTAgEAygMAId4CAQC6AwAh4AIAAJEE4AIiBKMCAAAA4AICpAIAAADgAgilAgAAAOACCKoCAADtA-ACIhQEAAD5AwAgBQAA-gMAIAYAAPsDACCbAgAA9wMAMJwCAAA8ABCdAgAA9wMAMJ8CAQC6AwAhtwIBALoDACG4AgEAugMAIb8CQAC9AwAhwAJAAL0DACHgAgEAugMAIfoCIADnAwAh-wIBAPgDACH8AgEA-AMAIf0CIADnAwAh_gJAAMwDACH_AgEA-AMAIYIDAAA8ACCDAwAAPAAgEQMAAJIEACCbAgAAkwQAMJwCAAAHABCdAgAAkwQAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAId4CAQC6AwAh6wIBALoDACHsAgEAugMAIe0CAQD4AwAh7gIBAPgDACHvAgEA-AMAIfACQADMAwAh8QJAAMwDACHyAgEA-AMAIfMCAQD4AwAhEQMAAJIEACCbAgAAlAQAMJwCAAADABCdAgAAlAQAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAIdsCQAC9AwAh3gIBALoDACHjAgEA-AMAIeUCAQD4AwAh9AIBALoDACH1AgEA-AMAIfYCAQD4AwAh9wIBAPgDACH4AggAlQQAIfkCCACVBAAhCKMCCAAAAAGkAggAAAAFpQIIAAAABaYCCAAAAAGnAggAAAABqAIIAAAAAakCCAAAAAGqAggA9QMAIQAAAAAAAYcDAQAAAAEFhwMQAAAAAY0DEAAAAAGOAxAAAAABjwMQAAAAAZADEAAAAAEBhwNAAAAAAQsfAACfBAAwIAAApAQAMIQDAACgBAAwhQMAAKEEADCGAwAAogQAIIcDAACjBAAwiAMAAKMEADCJAwAAowQAMIoDAACjBAAwiwMAAKUEADCMAwAApgQAMA0JAACWBQAgCwAAlwUAIAwAAJgFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAABAgAAABMAIB8AAJUFACADAAAAEwAgHwAAlQUAICAAAKoEACABGAAA7QYAMBIIAACNBAAgCQAA-wMAIAsAAI4EACAMAADoAwAgmwIAAIwEADCcAgAAEQAQnQIAAIwEADC3AgEAAAABvwJAAL0DACHAAkAAvQMAIeECAQC6AwAh4gIBAPgDACHjAgEA-AMAIeQCAQD4AwAh5QIBAPgDACHmAgEAAAAB5wIBALoDACHoAgEA-AMAIQIAAAATACAYAACqBAAgAgAAAKcEACAYAACoBAAgDpsCAACmBAAwnAIAAKcEABCdAgAApgQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIeECAQC6AwAh4gIBAPgDACHjAgEA-AMAIeQCAQD4AwAh5QIBAPgDACHmAgEAugMAIecCAQC6AwAh6AIBAPgDACEOmwIAAKYEADCcAgAApwQAEJ0CAACmBAAwtwIBAMoDACG_AkAAvQMAIcACQAC9AwAh4QIBALoDACHiAgEA-AMAIeMCAQD4AwAh5AIBAPgDACHlAgEA-AMAIeYCAQC6AwAh5wIBALoDACHoAgEA-AMAIQq3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHhAgEAmwQAIeICAQCpBAAh4wIBAKkEACHkAgEAqQQAIeUCAQCpBAAh5gIBAJsEACHnAgEAmwQAIQGHAwEAAAABDQkAAKsEACALAACsBAAgDAAArQQAILcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeECAQCbBAAh4gIBAKkEACHjAgEAqQQAIeQCAQCpBAAh5QIBAKkEACHmAgEAmwQAIecCAQCbBAAhCx8AAIYFADAgAACLBQAwhAMAAIcFADCFAwAAiAUAMIYDAACJBQAghwMAAIoFADCIAwAAigUAMIkDAACKBQAwigMAAIoFADCLAwAAjAUAMIwDAACNBQAwCx8AAPkEADAgAAD-BAAwhAMAAPoEADCFAwAA-wQAMIYDAAD8BAAghwMAAP0EADCIAwAA_QQAMIkDAAD9BAAwigMAAP0EADCLAwAA_wQAMIwDAACABQAwCx8AAK4EADAgAACzBAAwhAMAAK8EADCFAwAAsAQAMIYDAACxBAAghwMAALIEADCIAwAAsgQAMIkDAACyBAAwigMAALIEADCLAwAAtAQAMIwDAAC1BAAwDg0AAPQEACAPAAD1BAAgEAAA9gQAIBEAAPcEACASAAD4BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AAPMEACADAAAAHQAgHwAA8wQAICAAALoEACABGAAA7AYAMBMKAACFBAAgDQAAhgQAIA8AAIcEACAQAACIBAAgEQAAiQQAIBIAAIoEACCbAgAAhAQAMJwCAAAbABCdAgAAhAQAMJ8CAQC6AwAhtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHTAgEAygMAIdQCAQDKAwAh1QICAMsDACHWAhAAuwMAIdcCIADnAwAh2AIBAPgDACECAAAAHQAgGAAAugQAIAIAAAC2BAAgGAAAtwQAIA2bAgAAtQQAMJwCAAC2BAAQnQIAALUEADCfAgEAugMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA-AMAIQ2bAgAAtQQAMJwCAAC2BAAQnQIAALUEADCfAgEAugMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh1AIBAMoDACHVAgIAywMAIdYCEAC7AwAh1wIgAOcDACHYAgEA-AMAIQmfAgEAmwQAIbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdQCAQCbBAAh1QICALgEACHWAhAAnAQAIdcCIAC5BAAh2AIBAKkEACEFhwMCAAAAAY0DAgAAAAGOAwIAAAABjwMCAAAAAZADAgAAAAEBhwMgAAAAAQ4NAAC7BAAgDwAAvAQAIBAAAL0EACARAAC-BAAgEgAAvwQAIJ8CAQCbBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAh1AIBAJsEACHVAgIAuAQAIdYCEACcBAAh1wIgALkEACHYAgEAqQQAIQUfAADjBgAgIAAA6gYAIIQDAADkBgAghQMAAOkGACCKAwAA2wEAIAsfAADmBAAwIAAA6wQAMIQDAADnBAAwhQMAAOgEADCGAwAA6QQAIIcDAADqBAAwiAMAAOoEADCJAwAA6gQAMIoDAADqBAAwiwMAAOwEADCMAwAA7QQAMAsfAADZBAAwIAAA3gQAMIQDAADaBAAwhQMAANsEADCGAwAA3AQAIIcDAADdBAAwiAMAAN0EADCJAwAA3QQAMIoDAADdBAAwiwMAAN8EADCMAwAA4AQAMAsfAADMBAAwIAAA0QQAMIQDAADNBAAwhQMAAM4EADCGAwAAzwQAIIcDAADQBAAwiAMAANAEADCJAwAA0AQAMIoDAADQBAAwiwMAANIEADCMAwAA0wQAMAsfAADABAAwIAAAxQQAMIQDAADBBAAwhQMAAMIEADCGAwAAwwQAIIcDAADEBAAwiAMAAMQEADCJAwAAxAQAMIoDAADEBAAwiwMAAMYEADCMAwAAxwQAMAe3AgEAAAABvwJAAAAAAcACQAAAAAHEAgEAAAABxQIBAAAAAdECQAAAAAHSAgEAAAABAgAAAC8AIB8AAMsEACADAAAALwAgHwAAywQAICAAAMoEACABGAAA6AYAMAwOAAD9AwAgmwIAAPwDADCcAgAALQAQnQIAAPwDADC3AgEAAAABvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPgDACHFAgEA-AMAIdECQAC9AwAh0gIBAPgDACECAAAALwAgGAAAygQAIAIAAADIBAAgGAAAyQQAIAubAgAAxwQAMJwCAADIBAAQnQIAAMcEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHCAgEAygMAIcQCAQD4AwAhxQIBAPgDACHRAkAAvQMAIdICAQD4AwAhC5sCAADHBAAwnAIAAMgEABCdAgAAxwQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPgDACHFAgEA-AMAIdECQAC9AwAh0gIBAPgDACEHtwIBAJsEACG_AkAAnQQAIcACQACdBAAhxAIBAKkEACHFAgEAqQQAIdECQACdBAAh0gIBAKkEACEHtwIBAJsEACG_AkAAnQQAIcACQACdBAAhxAIBAKkEACHFAgEAqQQAIdECQACdBAAh0gIBAKkEACEHtwIBAAAAAb8CQAAAAAHAAkAAAAABxAIBAAAAAcUCAQAAAAHRAkAAAAAB0gIBAAAAAQu3AgEAAAABvwJAAAAAAcACQAAAAAHBAgEAAAABwwJAAAAAAcQCAQAAAAHFAgEAAAAByQIBAAAAAcoCAQAAAAHLAgEAAAABzQIAAADHAgICAAAAKwAgHwAA2AQAIAMAAAArACAfAADYBAAgIAAA1wQAIAEYAADnBgAwEQ4AAP0DACCbAgAA_wMAMJwCAAApABCdAgAA_wMAMLcCAQAAAAG_AkAAvQMAIcACQAC9AwAhwQIBAAAAAcICAQDKAwAhwwJAAL0DACHEAgEAugMAIcUCAQC6AwAhyQIBALoDACHKAgEAugMAIcsCAQC6AwAhzQIAANMDxwIigAMAAP4DACACAAAAKwAgGAAA1wQAIAIAAADUBAAgGAAA1QQAIA-bAgAA0wQAMJwCAADUBAAQnQIAANMEADC3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHBAgEAugMAIcICAQDKAwAhwwJAAL0DACHEAgEAugMAIcUCAQC6AwAhyQIBALoDACHKAgEAugMAIcsCAQC6AwAhzQIAANMDxwIiD5sCAADTBAAwnAIAANQEABCdAgAA0wQAMLcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcECAQC6AwAhwgIBAMoDACHDAkAAvQMAIcQCAQC6AwAhxQIBALoDACHJAgEAugMAIcoCAQC6AwAhywIBALoDACHNAgAA0wPHAiILtwIBAJsEACG_AkAAnQQAIcACQACdBAAhwQIBAJsEACHDAkAAnQQAIcQCAQCbBAAhxQIBAJsEACHJAgEAmwQAIcoCAQCbBAAhywIBAJsEACHNAgAA1gTHAiIBhwMAAADHAgILtwIBAJsEACG_AkAAnQQAIcACQACdBAAhwQIBAJsEACHDAkAAnQQAIcQCAQCbBAAhxQIBAJsEACHJAgEAmwQAIcoCAQCbBAAhywIBAJsEACHNAgAA1gTHAiILtwIBAAAAAb8CQAAAAAHAAkAAAAABwQIBAAAAAcMCQAAAAAHEAgEAAAABxQIBAAAAAckCAQAAAAHKAgEAAAABywIBAAAAAc0CAAAAxwICCKACEAAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHEAgEAAAABxQIBAAAAAc8CAAAAzwID0AIgAAAAAQIAAAAnACAfAADlBAAgAwAAACcAIB8AAOUEACAgAADkBAAgARgAAOYGADANDgAA_QMAIJsCAACABAAwnAIAACUAEJ0CAACABAAwoAIQALsDACG3AgEAAAABvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPgDACHFAgEA-AMAIc8CAACBBM8CI9ACIADnAwAhAgAAACcAIBgAAOQEACACAAAA4QQAIBgAAOIEACAMmwIAAOAEADCcAgAA4QQAEJ0CAADgBAAwoAIQALsDACG3AgEAygMAIb8CQAC9AwAhwAJAAL0DACHCAgEAygMAIcQCAQD4AwAhxQIBAPgDACHPAgAAgQTPAiPQAiAA5wMAIQybAgAA4AQAMJwCAADhBAAQnQIAAOAEADCgAhAAuwMAIbcCAQDKAwAhvwJAAL0DACHAAkAAvQMAIcICAQDKAwAhxAIBAPgDACHFAgEA-AMAIc8CAACBBM8CI9ACIADnAwAhCKACEACcBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAhxAIBAKkEACHFAgEAqQQAIc8CAADjBM8CI9ACIAC5BAAhAYcDAAAAzwIDCKACEACcBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAhxAIBAKkEACHFAgEAqQQAIc8CAADjBM8CI9ACIAC5BAAhCKACEAAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHEAgEAAAABxQIBAAAAAc8CAAAAzwID0AIgAAAAAQW3AgEAAAABvwJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgICAAAAIwAgHwAA8gQAIAMAAAAjACAfAADyBAAgIAAA8QQAIAEYAADlBgAwCg4AAP0DACCbAgAAggQAMJwCAAAhABCdAgAAggQAMLcCAQAAAAG_AkAAvQMAIcICAQDKAwAhxAIBALoDACHFAgEAugMAIc8CAACDBM8CIgIAAAAjACAYAADxBAAgAgAAAO4EACAYAADvBAAgCZsCAADtBAAwnAIAAO4EABCdAgAA7QQAMLcCAQDKAwAhvwJAAL0DACHCAgEAygMAIcQCAQC6AwAhxQIBALoDACHPAgAAgwTPAiIJmwIAAO0EADCcAgAA7gQAEJ0CAADtBAAwtwIBAMoDACG_AkAAvQMAIcICAQDKAwAhxAIBALoDACHFAgEAugMAIc8CAACDBM8CIgW3AgEAmwQAIb8CQACdBAAhxAIBAJsEACHFAgEAmwQAIc8CAADwBM8CIgGHAwAAAM8CAgW3AgEAmwQAIb8CQACdBAAhxAIBAJsEACHFAgEAmwQAIc8CAADwBM8CIgW3AgEAAAABvwJAAAAAAcQCAQAAAAHFAgEAAAABzwIAAADPAgIODQAA9AQAIA8AAPUEACAQAAD2BAAgEQAA9wQAIBIAAPgEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAEDHwAA4wYAIIQDAADkBgAgigMAANsBACAEHwAA5gQAMIQDAADnBAAwhgMAAOkEACCKAwAA6gQAMAQfAADZBAAwhAMAANoEADCGAwAA3AQAIIoDAADdBAAwBB8AAMwEADCEAwAAzQQAMIYDAADPBAAgigMAANAEADAEHwAAwAQAMIQDAADBBAAwhgMAAMMEACCKAwAAxAQAMAi3AgEAAAABuAIBAAAAAb8CQAAAAAHAAkAAAAAB2gIBAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAQIAAAAZACAfAACFBQAgAwAAABkAIB8AAIUFACAgAACEBQAgARgAAOIGADANCgAAhQQAIJsCAACLBAAwnAIAABcAEJ0CAACLBAAwtwIBAAAAAbgCAQC6AwAhvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh2gIBAAAAAdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIQIAAAAZACAYAACEBQAgAgAAAIEFACAYAACCBQAgDJsCAACABQAwnAIAAIEFABCdAgAAgAUAMLcCAQDKAwAhuAIBALoDACG_AkAAvQMAIcACQAC9AwAh0wIBAMoDACHaAgEAugMAIdsCQAC9AwAh3AJAAMwDACHdAkAAzAMAIQybAgAAgAUAMJwCAACBBQAQnQIAAIAFADC3AgEAygMAIbgCAQC6AwAhvwJAAL0DACHAAkAAvQMAIdMCAQDKAwAh2gIBALoDACHbAkAAvQMAIdwCQADMAwAh3QJAAMwDACEItwIBAJsEACG4AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHaAgEAmwQAIdsCQACdBAAh3AJAAIMFACHdAkAAgwUAIQGHA0AAAAABCLcCAQCbBAAhuAIBAJsEACG_AkAAnQQAIcACQACdBAAh2gIBAJsEACHbAkAAnQQAIdwCQACDBQAh3QJAAIMFACEItwIBAAAAAbgCAQAAAAG_AkAAAAABwAJAAAAAAdoCAQAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAEEAwAAlAUAIL8CQAAAAAHeAgEAAAAB4AIAAADgAgICAAAADQAgHwAAkwUAIAMAAAANACAfAACTBQAgIAAAkQUAIAEYAADhBgAwCgMAAJIEACAKAACFBAAgmwIAAJAEADCcAgAACwAQnQIAAJAEADC_AkAAvQMAIdMCAQDKAwAh3gIBALoDACHgAgAAkQTgAiKBAwAAjwQAIAIAAAANACAYAACRBQAgAgAAAI4FACAYAACPBQAgB5sCAACNBQAwnAIAAI4FABCdAgAAjQUAML8CQAC9AwAh0wIBAMoDACHeAgEAugMAIeACAACRBOACIgebAgAAjQUAMJwCAACOBQAQnQIAAI0FADC_AkAAvQMAIdMCAQDKAwAh3gIBALoDACHgAgAAkQTgAiIDvwJAAJ0EACHeAgEAmwQAIeACAACQBeACIgGHAwAAAOACAgQDAACSBQAgvwJAAJ0EACHeAgEAmwQAIeACAACQBeACIgUfAADcBgAgIAAA3wYAIIQDAADdBgAghQMAAN4GACCKAwAAAQAgBAMAAJQFACC_AkAAAAAB3gIBAAAAAeACAAAA4AICAx8AANwGACCEAwAA3QYAIIoDAAABACANCQAAlgUAIAsAAJcFACAMAACYBQAgtwIBAAAAAb8CQAAAAAHAAkAAAAAB4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAQQfAACGBQAwhAMAAIcFADCGAwAAiQUAIIoDAACKBQAwBB8AAPkEADCEAwAA-gQAMIYDAAD8BAAgigMAAP0EADAEHwAArgQAMIQDAACvBAAwhgMAALEEACCKAwAAsgQAMAQfAACfBAAwhAMAAKAEADCGAwAAogQAIIoDAACjBAAwAAAAAAAAAAAAAAAAAAUfAADXBgAgIAAA2gYAIIQDAADYBgAghQMAANkGACCKAwAAHQAgAx8AANcGACCEAwAA2AYAIIoDAAAdACAAAAAAAAUfAADSBgAgIAAA1QYAIIQDAADTBgAghQMAANQGACCKAwAAHQAgAx8AANIGACCEAwAA0wYAIIoDAAAdACAAAAAFHwAAzQYAICAAANAGACCEAwAAzgYAIIUDAADPBgAgigMAAB0AIAMfAADNBgAghAMAAM4GACCKAwAAHQAgAAAABR8AAMgGACAgAADLBgAghAMAAMkGACCFAwAAygYAIIoDAAAdACADHwAAyAYAIIQDAADJBgAgigMAAB0AIAAAAAAABR8AAMMGACAgAADGBgAghAMAAMQGACCFAwAAxQYAIIoDAAATACADHwAAwwYAIIQDAADEBgAgigMAABMAIAAAAAsfAADFBQAwIAAAyQUAMIQDAADGBQAwhQMAAMcFADCGAwAAyAUAIIcDAACyBAAwiAMAALIEADCJAwAAsgQAMIoDAACyBAAwiwMAAMoFADCMAwAAtQQAMA4KAADABQAgDwAA9QQAIBAAAPYEACARAAD3BAAgEgAA-AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQIAAAAdACAfAADNBQAgAwAAAB0AIB8AAM0FACAgAADMBQAgARgAAMIGADACAAAAHQAgGAAAzAUAIAIAAAC2BAAgGAAAywUAIAmfAgEAmwQAIbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh1QICALgEACHWAhAAnAQAIdcCIAC5BAAh2AIBAKkEACEOCgAAvwUAIA8AALwEACAQAAC9BAAgEQAAvgQAIBIAAL8EACCfAgEAmwQAIbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh1QICALgEACHWAhAAnAQAIdcCIAC5BAAh2AIBAKkEACEOCgAAwAUAIA8AAPUEACAQAAD2BAAgEQAA9wQAIBIAAPgEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAEEHwAAxQUAMIQDAADGBQAwhgMAAMgFACCKAwAAsgQAMAAAAAAFHwAAvQYAICAAAMAGACCEAwAAvgYAIIUDAAC_BgAgigMAABMAIAMfAAC9BgAghAMAAL4GACCKAwAAEwAgAAAABR8AALgGACAgAAC7BgAghAMAALkGACCFAwAAugYAIIoDAAATACADHwAAuAYAIIQDAAC5BgAgigMAABMAIAAAAAcfAACzBgAgIAAAtgYAIIQDAAC0BgAghQMAALUGACCIAwAADwAgiQMAAA8AIIoDAACUAwAgAx8AALMGACCEAwAAtAYAIIoDAACUAwAgAAAAAAAABR8AAK4GACAgAACxBgAghAMAAK8GACCFAwAAsAYAIIoDAAABACADHwAArgYAIIQDAACvBgAgigMAAAEAIAAAAAAABYcDCAAAAAGNAwgAAAABjgMIAAAAAY8DCAAAAAGQAwgAAAABBR8AAKkGACAgAACsBgAghAMAAKoGACCFAwAAqwYAIIoDAAABACADHwAAqQYAIIQDAACqBgAgigMAAAEAIAAAAAsfAACKBgAwIAAAjwYAMIQDAACLBgAwhQMAAIwGADCGAwAAjQYAIIcDAACOBgAwiAMAAI4GADCJAwAAjgYAMIoDAACOBgAwiwMAAJAGADCMAwAAkQYAMAsfAAD-BQAwIAAAgwYAMIQDAAD_BQAwhQMAAIAGADCGAwAAgQYAIIcDAACCBgAwiAMAAIIGADCJAwAAggYAMIoDAACCBgAwiwMAAIQGADCMAwAAhQYAMAsfAAD1BQAwIAAA-QUAMIQDAAD2BQAwhQMAAPcFADCGAwAA-AUAIIcDAACKBQAwiAMAAIoFADCJAwAAigUAMIoDAACKBQAwiwMAAPoFADCMAwAAjQUAMAQKAADZBQAgvwJAAAAAAdMCAQAAAAHgAgAAAOACAgIAAAANACAfAAD9BQAgAwAAAA0AIB8AAP0FACAgAAD8BQAgARgAAKgGADACAAAADQAgGAAA_AUAIAIAAACOBQAgGAAA-wUAIAO_AkAAnQQAIdMCAQCbBAAh4AIAAJAF4AIiBAoAANgFACC_AkAAnQQAIdMCAQCbBAAh4AIAAJAF4AIiBAoAANkFACC_AkAAAAAB0wIBAAAAAeACAAAA4AICDLcCAQAAAAG_AkAAAAABwAJAAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQIAAAAJACAfAACJBgAgAwAAAAkAIB8AAIkGACAgAACIBgAgARgAAKcGADARAwAAkgQAIJsCAACTBAAwnAIAAAcAEJ0CAACTBAAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHeAgEAugMAIesCAQC6AwAh7AIBALoDACHtAgEA-AMAIe4CAQD4AwAh7wIBAPgDACHwAkAAzAMAIfECQADMAwAh8gIBAPgDACHzAgEA-AMAIQIAAAAJACAYAACIBgAgAgAAAIYGACAYAACHBgAgEJsCAACFBgAwnAIAAIYGABCdAgAAhQYAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAId4CAQC6AwAh6wIBALoDACHsAgEAugMAIe0CAQD4AwAh7gIBAPgDACHvAgEA-AMAIfACQADMAwAh8QJAAMwDACHyAgEA-AMAIfMCAQD4AwAhEJsCAACFBgAwnAIAAIYGABCdAgAAhQYAMLcCAQC6AwAhvwJAAL0DACHAAkAAvQMAId4CAQC6AwAh6wIBALoDACHsAgEAugMAIe0CAQD4AwAh7gIBAPgDACHvAgEA-AMAIfACQADMAwAh8QJAAMwDACHyAgEA-AMAIfMCAQD4AwAhDLcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIesCAQCbBAAh7AIBAJsEACHtAgEAqQQAIe4CAQCpBAAh7wIBAKkEACHwAkAAgwUAIfECQACDBQAh8gIBAKkEACHzAgEAqQQAIQy3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHrAgEAmwQAIewCAQCbBAAh7QIBAKkEACHuAgEAqQQAIe8CAQCpBAAh8AJAAIMFACHxAkAAgwUAIfICAQCpBAAh8wIBAKkEACEMtwIBAAAAAb8CQAAAAAHAAkAAAAAB6wIBAAAAAewCAQAAAAHtAgEAAAAB7gIBAAAAAe8CAQAAAAHwAkAAAAAB8QJAAAAAAfICAQAAAAHzAgEAAAABDLcCAQAAAAG_AkAAAAABwAJAAAAAAdsCQAAAAAHjAgEAAAAB5QIBAAAAAfQCAQAAAAH1AgEAAAAB9gIBAAAAAfcCAQAAAAH4AggAAAAB-QIIAAAAAQIAAAAFACAfAACVBgAgAwAAAAUAIB8AAJUGACAgAACUBgAgARgAAKYGADARAwAAkgQAIJsCAACUBAAwnAIAAAMAEJ0CAACUBAAwtwIBAAAAAb8CQAC9AwAhwAJAAL0DACHbAkAAvQMAId4CAQC6AwAh4wIBAPgDACHlAgEA-AMAIfQCAQAAAAH1AgEA-AMAIfYCAQD4AwAh9wIBAPgDACH4AggAlQQAIfkCCACVBAAhAgAAAAUAIBgAAJQGACACAAAAkgYAIBgAAJMGACAQmwIAAJEGADCcAgAAkgYAEJ0CAACRBgAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIeMCAQD4AwAh5QIBAPgDACH0AgEAugMAIfUCAQD4AwAh9gIBAPgDACH3AgEA-AMAIfgCCACVBAAh-QIIAJUEACEQmwIAAJEGADCcAgAAkgYAEJ0CAACRBgAwtwIBALoDACG_AkAAvQMAIcACQAC9AwAh2wJAAL0DACHeAgEAugMAIeMCAQD4AwAh5QIBAPgDACH0AgEAugMAIfUCAQD4AwAh9gIBAPgDACH3AgEA-AMAIfgCCACVBAAh-QIIAJUEACEMtwIBAJsEACG_AkAAnQQAIcACQACdBAAh2wJAAJ0EACHjAgEAqQQAIeUCAQCpBAAh9AIBAJsEACH1AgEAqQQAIfYCAQCpBAAh9wIBAKkEACH4AggA7AUAIfkCCADsBQAhDLcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdsCQACdBAAh4wIBAKkEACHlAgEAqQQAIfQCAQCbBAAh9QIBAKkEACH2AgEAqQQAIfcCAQCpBAAh-AIIAOwFACH5AggA7AUAIQy3AgEAAAABvwJAAAAAAcACQAAAAAHbAkAAAAAB4wIBAAAAAeUCAQAAAAH0AgEAAAAB9QIBAAAAAfYCAQAAAAH3AgEAAAAB-AIIAAAAAfkCCAAAAAEEHwAAigYAMIQDAACLBgAwhgMAAI0GACCKAwAAjgYAMAQfAAD-BQAwhAMAAP8FADCGAwAAgQYAIIoDAACCBgAwBB8AAPUFADCEAwAA9gUAMIYDAAD4BQAgigMAAIoFADAAAAAHCgAAnQYAIA0AAJ4GACAPAACfBgAgEAAAoAYAIBEAAKEGACASAACiBgAg2AIAAJsFACAJCAAAowYAIAkAAJsGACALAACkBgAgDAAAzwUAIOICAACbBQAg4wIAAJsFACDkAgAAmwUAIOUCAACbBQAg6AIAAJsFACABDAAAzwUAIAAAAAABBgAAmgUAIAAHBAAAmQYAIAUAAJoGACAGAACbBgAg-wIAAJsFACD8AgAAmwUAIP4CAACbBQAg_wIAAJsFACAMtwIBAAAAAb8CQAAAAAHAAkAAAAAB2wJAAAAAAeMCAQAAAAHlAgEAAAAB9AIBAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCCAAAAAH5AggAAAABDLcCAQAAAAG_AkAAAAABwAJAAAAAAesCAQAAAAHsAgEAAAAB7QIBAAAAAe4CAQAAAAHvAgEAAAAB8AJAAAAAAfECQAAAAAHyAgEAAAAB8wIBAAAAAQO_AkAAAAAB0wIBAAAAAeACAAAA4AICDgUAAJcGACAGAACYBgAgnwIBAAAAAbcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHgAgEAAAAB-gIgAAAAAfsCAQAAAAH8AgEAAAAB_QIgAAAAAf4CQAAAAAH_AgEAAAABAgAAAAEAIB8AAKkGACADAAAAPAAgHwAAqQYAICAAAK0GACAQAAAAPAAgBQAA8wUAIAYAAPQFACAYAACtBgAgnwIBAJsEACG3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeACAQCbBAAh-gIgALkEACH7AgEAqQQAIfwCAQCpBAAh_QIgALkEACH-AkAAgwUAIf8CAQCpBAAhDgUAAPMFACAGAAD0BQAgnwIBAJsEACG3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeACAQCbBAAh-gIgALkEACH7AgEAqQQAIfwCAQCpBAAh_QIgALkEACH-AkAAgwUAIf8CAQCpBAAhDgQAAJYGACAGAACYBgAgnwIBAAAAAbcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHgAgEAAAAB-gIgAAAAAfsCAQAAAAH8AgEAAAAB_QIgAAAAAf4CQAAAAAH_AgEAAAABAgAAAAEAIB8AAK4GACADAAAAPAAgHwAArgYAICAAALIGACAQAAAAPAAgBAAA8gUAIAYAAPQFACAYAACyBgAgnwIBAJsEACG3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeACAQCbBAAh-gIgALkEACH7AgEAqQQAIfwCAQCpBAAh_QIgALkEACH-AkAAgwUAIf8CAQCpBAAhDgQAAPIFACAGAAD0BQAgnwIBAJsEACG3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeACAQCbBAAh-gIgALkEACH7AgEAqQQAIfwCAQCpBAAh_QIgALkEACH-AkAAgwUAIf8CAQCpBAAhBZ4CAQAAAAGfAgEAAAABoAIQAAAAAaECgAAAAAGiAkAAAAABAgAAAJQDACAfAACzBgAgAwAAAA8AIB8AALMGACAgAAC3BgAgBwAAAA8AIBgAALcGACCeAgEAmwQAIZ8CAQCbBAAhoAIQAJwEACGhAoAAAAABogJAAJ0EACEFngIBAJsEACGfAgEAmwQAIaACEACcBAAhoQKAAAAAAaICQACdBAAhDggAAN4FACALAACXBQAgDAAAmAUAILcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAHoAgEAAAABAgAAABMAIB8AALgGACADAAAAEQAgHwAAuAYAICAAALwGACAQAAAAEQAgCAAA3QUAIAsAAKwEACAMAACtBAAgGAAAvAYAILcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeECAQCbBAAh4gIBAKkEACHjAgEAqQQAIeQCAQCpBAAh5QIBAKkEACHmAgEAmwQAIecCAQCbBAAh6AIBAKkEACEOCAAA3QUAIAsAAKwEACAMAACtBAAgtwIBAJsEACG_AkAAnQQAIcACQACdBAAh4QIBAJsEACHiAgEAqQQAIeMCAQCpBAAh5AIBAKkEACHlAgEAqQQAIeYCAQCbBAAh5wIBAJsEACHoAgEAqQQAIQ4IAADeBQAgCQAAlgUAIAwAAJgFACC3AgEAAAABvwJAAAAAAcACQAAAAAHhAgEAAAAB4gIBAAAAAeMCAQAAAAHkAgEAAAAB5QIBAAAAAeYCAQAAAAHnAgEAAAAB6AIBAAAAAQIAAAATACAfAAC9BgAgAwAAABEAIB8AAL0GACAgAADBBgAgEAAAABEAIAgAAN0FACAJAACrBAAgDAAArQQAIBgAAMEGACC3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHhAgEAmwQAIeICAQCpBAAh4wIBAKkEACHkAgEAqQQAIeUCAQCpBAAh5gIBAJsEACHnAgEAmwQAIegCAQCpBAAhDggAAN0FACAJAACrBAAgDAAArQQAILcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeECAQCbBAAh4gIBAKkEACHjAgEAqQQAIeQCAQCpBAAh5QIBAKkEACHmAgEAmwQAIecCAQCbBAAh6AIBAKkEACEJnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABDggAAN4FACAJAACWBQAgCwAAlwUAILcCAQAAAAG_AkAAAAABwAJAAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCAQAAAAHlAgEAAAAB5gIBAAAAAecCAQAAAAHoAgEAAAABAgAAABMAIB8AAMMGACADAAAAEQAgHwAAwwYAICAAAMcGACAQAAAAEQAgCAAA3QUAIAkAAKsEACALAACsBAAgGAAAxwYAILcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeECAQCbBAAh4gIBAKkEACHjAgEAqQQAIeQCAQCpBAAh5QIBAKkEACHmAgEAmwQAIecCAQCbBAAh6AIBAKkEACEOCAAA3QUAIAkAAKsEACALAACsBAAgtwIBAJsEACG_AkAAnQQAIcACQACdBAAh4QIBAJsEACHiAgEAqQQAIeMCAQCpBAAh5AIBAKkEACHlAgEAqQQAIeYCAQCbBAAh5wIBAJsEACHoAgEAqQQAIQ8KAADABQAgDQAA9AQAIA8AAPUEACAQAAD2BAAgEQAA9wQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAECAAAAHQAgHwAAyAYAIAMAAAAbACAfAADIBgAgIAAAzAYAIBEAAAAbACAKAAC_BQAgDQAAuwQAIA8AALwEACAQAAC9BAAgEQAAvgQAIBgAAMwGACCfAgEAmwQAIbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh1AIBAJsEACHVAgIAuAQAIdYCEACcBAAh1wIgALkEACHYAgEAqQQAIQ8KAAC_BQAgDQAAuwQAIA8AALwEACAQAAC9BAAgEQAAvgQAIJ8CAQCbBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAh0wIBAJsEACHUAgEAmwQAIdUCAgC4BAAh1gIQAJwEACHXAiAAuQQAIdgCAQCpBAAhDwoAAMAFACANAAD0BAAgEAAA9gQAIBEAAPcEACASAAD4BAAgnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdMCAQAAAAHUAgEAAAAB1QICAAAAAdYCEAAAAAHXAiAAAAAB2AIBAAAAAQIAAAAdACAfAADNBgAgAwAAABsAIB8AAM0GACAgAADRBgAgEQAAABsAIAoAAL8FACANAAC7BAAgEAAAvQQAIBEAAL4EACASAAC_BAAgGAAA0QYAIJ8CAQCbBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAh0wIBAJsEACHUAgEAmwQAIdUCAgC4BAAh1gIQAJwEACHXAiAAuQQAIdgCAQCpBAAhDwoAAL8FACANAAC7BAAgEAAAvQQAIBEAAL4EACASAAC_BAAgnwIBAJsEACG3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHTAgEAmwQAIdQCAQCbBAAh1QICALgEACHWAhAAnAQAIdcCIAC5BAAh2AIBAKkEACEPCgAAwAUAIA0AAPQEACAPAAD1BAAgEQAA9wQAIBIAAPgEACCfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB0wIBAAAAAdQCAQAAAAHVAgIAAAAB1gIQAAAAAdcCIAAAAAHYAgEAAAABAgAAAB0AIB8AANIGACADAAAAGwAgHwAA0gYAICAAANYGACARAAAAGwAgCgAAvwUAIA0AALsEACAPAAC8BAAgEQAAvgQAIBIAAL8EACAYAADWBgAgnwIBAJsEACG3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHTAgEAmwQAIdQCAQCbBAAh1QICALgEACHWAhAAnAQAIdcCIAC5BAAh2AIBAKkEACEPCgAAvwUAIA0AALsEACAPAAC8BAAgEQAAvgQAIBIAAL8EACCfAgEAmwQAIbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh1AIBAJsEACHVAgIAuAQAIdYCEACcBAAh1wIgALkEACHYAgEAqQQAIQ8KAADABQAgDQAA9AQAIA8AAPUEACAQAAD2BAAgEgAA-AQAIJ8CAQAAAAG3AgEAAAABvwJAAAAAAcACQAAAAAHTAgEAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAECAAAAHQAgHwAA1wYAIAMAAAAbACAfAADXBgAgIAAA2wYAIBEAAAAbACAKAAC_BQAgDQAAuwQAIA8AALwEACAQAAC9BAAgEgAAvwQAIBgAANsGACCfAgEAmwQAIbcCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIdMCAQCbBAAh1AIBAJsEACHVAgIAuAQAIdYCEACcBAAh1wIgALkEACHYAgEAqQQAIQ8KAAC_BQAgDQAAuwQAIA8AALwEACAQAAC9BAAgEgAAvwQAIJ8CAQCbBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAh0wIBAJsEACHUAgEAmwQAIdUCAgC4BAAh1gIQAJwEACHXAiAAuQQAIdgCAQCpBAAhDgQAAJYGACAFAACXBgAgnwIBAAAAAbcCAQAAAAG4AgEAAAABvwJAAAAAAcACQAAAAAHgAgEAAAAB-gIgAAAAAfsCAQAAAAH8AgEAAAAB_QIgAAAAAf4CQAAAAAH_AgEAAAABAgAAAAEAIB8AANwGACADAAAAPAAgHwAA3AYAICAAAOAGACAQAAAAPAAgBAAA8gUAIAUAAPMFACAYAADgBgAgnwIBAJsEACG3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeACAQCbBAAh-gIgALkEACH7AgEAqQQAIfwCAQCpBAAh_QIgALkEACH-AkAAgwUAIf8CAQCpBAAhDgQAAPIFACAFAADzBQAgnwIBAJsEACG3AgEAmwQAIbgCAQCbBAAhvwJAAJ0EACHAAkAAnQQAIeACAQCbBAAh-gIgALkEACH7AgEAqQQAIfwCAQCpBAAh_QIgALkEACH-AkAAgwUAIf8CAQCpBAAhA78CQAAAAAHeAgEAAAAB4AIAAADgAgIItwIBAAAAAbgCAQAAAAG_AkAAAAABwAJAAAAAAdoCAQAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAEGnwIBAAAAAbcCAQAAAAG_AkAAAAABwAJAAAAAAdACIAAAAAHZAgEAAAABAgAAANsBACAfAADjBgAgBbcCAQAAAAG_AkAAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CAgigAhAAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAABxAIBAAAAAcUCAQAAAAHPAgAAAM8CA9ACIAAAAAELtwIBAAAAAb8CQAAAAAHAAkAAAAABwQIBAAAAAcMCQAAAAAHEAgEAAAABxQIBAAAAAckCAQAAAAHKAgEAAAABywIBAAAAAc0CAAAAxwICB7cCAQAAAAG_AkAAAAABwAJAAAAAAcQCAQAAAAHFAgEAAAAB0QJAAAAAAdICAQAAAAEDAAAA3gEAIB8AAOMGACAgAADrBgAgCAAAAN4BACAYAADrBgAgnwIBAJsEACG3AgEAmwQAIb8CQACdBAAhwAJAAJ0EACHQAiAAuQQAIdkCAQCbBAAhBp8CAQCbBAAhtwIBAJsEACG_AkAAnQQAIcACQACdBAAh0AIgALkEACHZAgEAmwQAIQmfAgEAAAABtwIBAAAAAb8CQAAAAAHAAkAAAAAB1AIBAAAAAdUCAgAAAAHWAhAAAAAB1wIgAAAAAdgCAQAAAAEKtwIBAAAAAb8CQAAAAAHAAkAAAAAB4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIBAAAAAeUCAQAAAAHmAgEAAAAB5wIBAAAAAQQEBgIFCgMGDgQHABIBAwABAQMAAQIDAAEKAAUFBwARCBAGCRYECxoIDB4JAgYUBQcABwEGFQABCgAFBwcAEAoABQ0ACg8kDBAoDREsDhIwDwIHAAsMHwkBDCAAAQ4ACQEOAAkBDgAJAQ4ACQQPMQAQMgARMwASNAADCTUACzYADDcAAwQ4AAU5AAY6AAAAAAMHABclABgmABkAAAADBwAXJQAYJgAZAQMAAQEDAAEFBwAeJQAhJgAiNwAfOAAgAAAAAAAFBwAeJQAhJgAiNwAfOAAgAQMAAQEDAAEDBwAnJQAoJgApAAAAAwcAJyUAKCYAKQAAAAMHAC8lADAmADEAAAADBwAvJQAwJgAxAQihAQYBCKcBBgMHADYlADcmADgAAAADBwA2JQA3JgA4AgMAAQoABQIDAAEKAAUDBwA9JQA-JgA_AAAAAwcAPSUAPiYAPwEKAAUBCgAFAwcARCUARSYARgAAAAMHAEQlAEUmAEYAAAMHAEslAEwmAE0AAAADBwBLJQBMJgBNAgoABQ0ACgIKAAUNAAoFBwBSJQBVJgBWNwBTOABUAAAAAAAFBwBSJQBVJgBWNwBTOABUAQ4ACQEOAAkDBwBbJQBcJgBdAAAAAwcAWyUAXCYAXQEOAAkBDgAJAwcAYiUAYyYAZAAAAAMHAGIlAGMmAGQBDgAJAQ4ACQUHAGklAGwmAG03AGo4AGsAAAAAAAUHAGklAGwmAG03AGo4AGsBDgAJAQ4ACQMHAHIlAHMmAHQAAAADBwByJQBzJgB0AAAAAwcAeiUAeyYAfAAAAAMHAHolAHsmAHwAAAAFBwCCASUAhQEmAIYBNwCDATgAhAEAAAAAAAUHAIIBJQCFASYAhgE3AIMBOACEAQAABQcAiwElAI4BJgCPATcAjAE4AI0BAAAAAAAFBwCLASUAjgEmAI8BNwCMATgAjQETAgEUOwEVPgEWPwEXQAEZQgEaRBMbRRQcRwEdSRMeShUhSwEiTAEjTRMnUBYoURopUgIqUwIrVAIsVQItVgIuWAIvWhMwWxsxXQIyXxMzYBw0YQI1YgI2YxM5Zh06ZyM7aAM8aQM9agM-awM_bANAbgNBcBNCcSRDcwNEdRNFdiVGdwNHeANIeRNJfCZKfSpLfytMgAErTYMBK06EAStPhQErUIcBK1GJARNSigEsU4wBK1SOARNVjwEtVpABK1eRAStYkgETWZUBLlqWATJblwEFXJgBBV2ZAQVemgEFX5sBBWCdAQVhnwETYqABM2OjAQVkpQETZaYBNGaoAQVnqQEFaKoBE2mtATVqrgE5a68BBGywAQRtsQEEbrIBBG-zAQRwtQEEcbcBE3K4ATpzugEEdLwBE3W9ATt2vgEEd78BBHjAARN5wwE8esQBQHvFAQh8xgEIfccBCH7IAQh_yQEIgAHLAQiBAc0BE4IBzgFBgwHQAQiEAdIBE4UB0wFChgHUAQiHAdUBCIgB1gETiQHZAUOKAdoBR4sB3AEKjAHdAQqNAeABCo4B4QEKjwHiAQqQAeQBCpEB5gETkgHnAUiTAekBCpQB6wETlQHsAUmWAe0BCpcB7gEKmAHvAROZAfIBSpoB8wFOmwH0AQmcAfUBCZ0B9gEJngH3AQmfAfgBCaAB-gEJoQH8AROiAf0BT6MB_wEJpAGBAhOlAYICUKYBgwIJpwGEAgmoAYUCE6kBiAJRqgGJAlerAYoCD6wBiwIPrQGMAg-uAY0CD68BjgIPsAGQAg-xAZICE7IBkwJYswGVAg-0AZcCE7UBmAJZtgGZAg-3AZoCD7gBmwITuQGeAlq6AZ8CXrsBoAIMvAGhAgy9AaICDL4BowIMvwGkAgzAAaYCDMEBqAITwgGpAl_DAasCDMQBrQITxQGuAmDGAa8CDMcBsAIMyAGxAhPJAbQCYcoBtQJlywG2Ag3MAbcCDc0BuAINzgG5Ag3PAboCDdABvAIN0QG-AhPSAb8CZtMBwQIN1AHDAhPVAcQCZ9YBxQIN1wHGAg3YAccCE9kBygJo2gHLAm7bAcwCDtwBzQIO3QHOAg7eAc8CDt8B0AIO4AHSAg7hAdQCE-IB1QJv4wHXAg7kAdkCE-UB2gJw5gHbAg7nAdwCDugB3QIT6QHgAnHqAeECdesB4wJ27AHkAnbtAecCdu4B6AJ27wHpAnbwAesCdvEB7QIT8gHuAnfzAfACdvQB8gIT9QHzAnj2AfQCdvcB9QJ2-AH2AhP5AfkCefoB-gJ9-wH8An78Af0Cfv0BgAN-_gGBA37_AYIDfoAChAN-gQKGAxOCAocDf4MCiQN-hAKLAxOFAowDgAGGAo0DfocCjgN-iAKPAxOJApIDgQGKApMDhwGLApUDBowClgMGjQKYAwaOApkDBo8CmgMGkAKcAwaRAp4DE5ICnwOIAZMCoQMGlAKjAxOVAqQDiQGWAqUDBpcCpgMGmAKnAxOZAqoDigGaAqsDkAE" } async function decodeBase64AsWasm(wasmBase64: string): Promise { diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts index dc47dc3..86ae405 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts @@ -1668,6 +1668,11 @@ export const SessionScalarFieldEnum = { updatedAt: 'updatedAt', ipAddress: 'ipAddress', userAgent: 'userAgent', + country: 'country', + city: 'city', + countryCode: 'countryCode', + latitude: 'latitude', + longitude: 'longitude', userId: 'userId' } as const @@ -1960,6 +1965,20 @@ export type ListDateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaM +/** + * Reference to a field of type 'Float' + */ +export type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'> + + + +/** + * Reference to a field of type 'Float[]' + */ +export type ListFloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float[]'> + + + /** * Reference to a field of type 'ComplexUserRole' */ @@ -2043,20 +2062,6 @@ export type JsonFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'J export type EnumQueryModeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'QueryMode'> - -/** - * Reference to a field of type 'Float' - */ -export type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'> - - - -/** - * Reference to a field of type 'Float[]' - */ -export type ListFloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float[]'> - - /** * Batch Payload for updateMany & deleteMany & createMany */ diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts index 3cee369..e2e7a79 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -111,6 +111,11 @@ export const SessionScalarFieldEnum = { updatedAt: 'updatedAt', ipAddress: 'ipAddress', userAgent: 'userAgent', + country: 'country', + city: 'city', + countryCode: 'countryCode', + latitude: 'latitude', + longitude: 'longitude', userId: 'userId' } as const diff --git a/apps/backend/src/lib/geoip.ts b/apps/backend/src/lib/geoip.ts index 6f82440..fc9ebfb 100644 --- a/apps/backend/src/lib/geoip.ts +++ b/apps/backend/src/lib/geoip.ts @@ -3,6 +3,8 @@ type IpGeoInfo = { city: string; country: string; countryCode: string; + lat: number | null; + lon: number | null; }; const cache = new Map(); @@ -24,7 +26,14 @@ function setCache(ip: string, info: IpGeoInfo): void { async function fetchGeoInfo(ip: string): Promise { if (ip === '127.0.0.1' || ip === '::1' || ip.startsWith('192.168.') || ip.startsWith('10.')) { - return { ip, city: 'Red local', country: 'Red local', countryCode: 'LOCAL' }; + return { + ip, + city: 'Red local', + country: 'Red local', + countryCode: 'LOCAL', + lat: null, + lon: null, + }; } const cached = getCached(ip); @@ -32,7 +41,7 @@ async function fetchGeoInfo(ip: string): Promise { try { const response = await fetch( - `http://ip-api.com/json/${ip}?fields=status,country,countryCode,city,query` + `http://ip-api.com/json/${ip}?fields=status,country,countryCode,city,lat,lon,query` ); if (!response.ok) return null; @@ -44,6 +53,8 @@ async function fetchGeoInfo(ip: string): Promise { city: data.city || 'Desconocida', country: data.country || 'Desconocido', countryCode: data.countryCode || '', + lat: data.lat ?? null, + lon: data.lon ?? null, }; setCache(ip, info); diff --git a/apps/backend/src/middlewares/require-auth.middleware.ts b/apps/backend/src/middlewares/require-auth.middleware.ts index 561cf54..2012ccc 100644 --- a/apps/backend/src/middlewares/require-auth.middleware.ts +++ b/apps/backend/src/middlewares/require-auth.middleware.ts @@ -1,7 +1,20 @@ import { auth } from '@/lib/auth'; +import { fetchGeoInfo } from '@/lib/geoip'; +import { db } from '@/lib/prisma'; import type { AppEnv } from '@/types/hono'; import { createMiddleware } from 'hono/factory'; +type SessionWithGeo = { + id: string; + ipAddress: string | null; + userAgent: string | null; + country: string | null; + city: string | null; + countryCode: string | null; + latitude: number | null; + longitude: number | null; +}; + export const requireAuth = createMiddleware(async (c, next) => { const session = await auth.api.getSession({ headers: c.req.raw.headers, @@ -23,8 +36,33 @@ export const requireAuth = createMiddleware(async (c, next) => { ); } + const s = session.session as unknown as SessionWithGeo; + c.set('user', session.user); c.set('session', session.session); + if (s.ipAddress && !s.country) { + resolveSessionGeo(s.id, s.ipAddress); + } + await next(); }); + +async function resolveSessionGeo(sessionId: string, ipAddress: string) { + try { + const geo = await fetchGeoInfo(ipAddress); + if (!geo) return; + await db.session.update({ + where: { id: sessionId }, + data: { + country: geo.country, + city: geo.city, + countryCode: geo.countryCode, + latitude: geo.lat, + longitude: geo.lon, + }, + }); + } catch { + // Silently fail — geo enrichment is best-effort + } +} diff --git a/apps/backend/src/modules/admin/admin.routes.ts b/apps/backend/src/modules/admin/admin.routes.ts index 9148f1c..569dd8d 100644 --- a/apps/backend/src/modules/admin/admin.routes.ts +++ b/apps/backend/src/modules/admin/admin.routes.ts @@ -4,6 +4,7 @@ import { requireSuperAdmin } from '@/middlewares/require-super-admin.middleware' import { blockUserHandler } from '@/modules/admin/handlers/block-user.handler'; import { createPlanHandler } from '@/modules/admin/handlers/create-plan.handler'; import { deletePlanHandler } from '@/modules/admin/handlers/delete-plan.handler'; +import { getGeoStatsHandler } from '@/modules/admin/handlers/get-geo-stats.handler'; import { getUserSessionsHandler } from '@/modules/admin/handlers/get-user-sessions.handler'; import { listComplexesHandler } from '@/modules/admin/handlers/list-complexes.handler'; import { listPlansAdminHandler } from '@/modules/admin/handlers/list-plans-admin.handler'; @@ -40,6 +41,8 @@ adminRoutes.delete( deletePlanHandler ); +adminRoutes.get('/geo-stats', getGeoStatsHandler); + adminRoutes.get('/users', listUsersHandler); adminRoutes.post( '/users/:id/block', diff --git a/apps/backend/src/modules/admin/handlers/get-geo-stats.handler.ts b/apps/backend/src/modules/admin/handlers/get-geo-stats.handler.ts new file mode 100644 index 0000000..5a240d6 --- /dev/null +++ b/apps/backend/src/modules/admin/handlers/get-geo-stats.handler.ts @@ -0,0 +1,8 @@ +import { getGeoStats } from '@/modules/admin/services/admin-geo.service'; +import type { AppEnv } from '@/types/hono'; +import type { Handler } from 'hono'; + +export const getGeoStatsHandler: Handler = async (c) => { + const stats = await getGeoStats(); + return c.json(stats); +}; diff --git a/apps/backend/src/modules/admin/services/admin-geo.service.ts b/apps/backend/src/modules/admin/services/admin-geo.service.ts new file mode 100644 index 0000000..6742ec1 --- /dev/null +++ b/apps/backend/src/modules/admin/services/admin-geo.service.ts @@ -0,0 +1,67 @@ +import { db } from '@/lib/prisma'; + +type GeoStatsCountry = { + country: string; + countryCode: string; + totalUsers: number; + cities: { city: string; userCount: number }[]; +}; + +export async function getGeoStats(): Promise<{ + countries: GeoStatsCountry[]; + totalUniqueCountries: number; +}> { + const sessions = await db.session.findMany({ + where: { + country: { not: null }, + expiresAt: { gt: new Date() }, + }, + select: { + country: true, + countryCode: true, + city: true, + userId: true, + }, + }); + + const countryMap = new Map< + string, + { country: string; countryCode: string; users: Set; cities: Map> } + >(); + + for (const s of sessions) { + const code = s.countryCode || 'XX'; + let entry = countryMap.get(code); + if (!entry) { + entry = { + country: s.country || 'Desconocido', + countryCode: code, + users: new Set(), + cities: new Map(), + }; + countryMap.set(code, entry); + } + entry.users.add(s.userId); + + const cityName = s.city || 'Desconocida'; + let cityUsers = entry.cities.get(cityName); + if (!cityUsers) { + cityUsers = new Set(); + entry.cities.set(cityName, cityUsers); + } + cityUsers.add(s.userId); + } + + const countries = Array.from(countryMap.values()) + .map((entry) => ({ + country: entry.country, + countryCode: entry.countryCode, + totalUsers: entry.users.size, + cities: Array.from(entry.cities.entries()) + .map(([city, users]) => ({ city, userCount: users.size })) + .sort((a, b) => b.userCount - a.userCount), + })) + .sort((a, b) => b.totalUsers - a.totalUsers); + + return { countries, totalUniqueCountries: countries.length }; +} diff --git a/apps/frontend/src/features/admin/admin-page.tsx b/apps/frontend/src/features/admin/admin-page.tsx index 48aafa6..fceedf5 100644 --- a/apps/frontend/src/features/admin/admin-page.tsx +++ b/apps/frontend/src/features/admin/admin-page.tsx @@ -1,11 +1,30 @@ import { apiClient } from '@/lib/api-client'; import { useQuery } from '@tanstack/react-query'; import { Link, useLocation } from '@tanstack/react-router'; -import { Building2, CalendarDays, Crosshair, Users } from 'lucide-react'; +import { + Building2, + CalendarDays, + ChevronDown, + ChevronRight, + Crosshair, + Globe, + Users, +} from 'lucide-react'; +import { Fragment, useState } from 'react'; import { AdminLayout } from './admin-layout'; +function countryFlag(countryCode: string): string { + if (countryCode === 'LOCAL' || countryCode === 'XX') return ''; + const codePoints = countryCode + .toUpperCase() + .split('') + .map((c) => 0x1f1e6 + c.charCodeAt(0) - 65); + return String.fromCodePoint(...codePoints); +} + export function AdminPage() { const location = useLocation(); + const [expandedCountry, setExpandedCountry] = useState(null); const complexesQuery = useQuery({ queryKey: ['admin-complexes'], @@ -17,6 +36,11 @@ export function AdminPage() { queryFn: () => apiClient.admin.listUsers(), }); + const geoQuery = useQuery({ + queryKey: ['admin-geo-stats'], + queryFn: () => apiClient.admin.getGeoStats(), + }); + const stats = { totalComplexes: complexesQuery.data?.length ?? 0, totalUsers: usersQuery.data?.length ?? 0, @@ -125,6 +149,106 @@ export function AdminPage() {
+ +
+

Usuarios por país / ciudad

+ + {geoQuery.isLoading &&

Cargando...

} + + {geoQuery.data && geoQuery.data.countries.length === 0 && ( +
+ +

+ Aún no hay datos de geolocalización. Aparecerán a medida que los usuarios inicien + sesión. +

+
+ )} + + {geoQuery.data && geoQuery.data.countries.length > 0 && ( +
+ + + + + + + + + {geoQuery.data.countries.map((country) => { + const isExpanded = expandedCountry === country.countryCode; + const flag = countryFlag(country.countryCode); + + return ( + + setExpandedCountry(isExpanded ? null : country.countryCode)} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + setExpandedCountry(isExpanded ? null : country.countryCode); + } + }} + tabIndex={0} + role="button" + > + + + + + {isExpanded && ( + + + + )} + + ); + })} + +
+ País + Usuarios +
+ {country.cities.length > 1 || + country.cities[0]?.city !== country.country ? ( + + ) : ( + + )} + + {flag} + {country.country} + {country.totalUsers}
+ + + {country.cities.map((city) => ( + + + + + ))} + +
+ {city.city} + {city.userCount} +
+
+ +
+ {geoQuery.data.totalUniqueCountries}{' '} + {geoQuery.data.totalUniqueCountries === 1 ? 'país' : 'países'} · solo sesiones activas + con geolocalización resuelta +
+
+ )} +
); } diff --git a/apps/frontend/src/lib/api/resources/admin.ts b/apps/frontend/src/lib/api/resources/admin.ts index 39cb380..7c5590c 100644 --- a/apps/frontend/src/lib/api/resources/admin.ts +++ b/apps/frontend/src/lib/api/resources/admin.ts @@ -2,6 +2,7 @@ import type { AdminBlockUserInput, AdminComplexListItem, AdminCreatePlanInput, + AdminGeoStats, AdminGlobalStats, AdminUpdatePlanInput, AdminUser, @@ -77,6 +78,11 @@ export async function getGlobalStats() { return response.data; } +export async function getGeoStats() { + const response = await http.get('/api/admin/geo-stats'); + return response.data; +} + export async function getUserSessions(userId: string) { const response = await http.get(`/api/admin/users/${userId}/sessions`); return response.data; diff --git a/packages/api-contract/src/admin.ts b/packages/api-contract/src/admin.ts index de5ebcd..73969cd 100644 --- a/packages/api-contract/src/admin.ts +++ b/packages/api-contract/src/admin.ts @@ -93,3 +93,24 @@ export type AdminBlockUserInput = z.infer export type AdminGlobalStats = z.infer export type AdminPaymentStatus = z.infer export type AdminUserSession = z.infer + +export const adminGeoCitySchema = z.object({ + city: z.string(), + userCount: z.number().int().nonnegative(), +}) + +export const adminGeoCountrySchema = z.object({ + country: z.string(), + countryCode: z.string(), + totalUsers: z.number().int().nonnegative(), + cities: z.array(adminGeoCitySchema), +}) + +export const adminGeoStatsSchema = z.object({ + countries: z.array(adminGeoCountrySchema), + totalUniqueCountries: z.number().int().nonnegative(), +}) + +export type AdminGeoCity = z.infer +export type AdminGeoCountry = z.infer +export type AdminGeoStats = z.infer diff --git a/packages/api-contract/src/index.ts b/packages/api-contract/src/index.ts index 264766b..06b7698 100644 --- a/packages/api-contract/src/index.ts +++ b/packages/api-contract/src/index.ts @@ -139,6 +139,9 @@ export { adminGlobalStatsSchema, adminPaymentStatusSchema, adminUserSessionSchema, + adminGeoCitySchema, + adminGeoCountrySchema, + adminGeoStatsSchema, } from './admin' export type { AdminComplexListItem, @@ -150,4 +153,7 @@ export type { AdminGlobalStats, AdminPaymentStatus, AdminUserSession, + AdminGeoCity, + AdminGeoCountry, + AdminGeoStats, } from './admin' -- 2.49.1 From ef926c63a2ffde56a74b10f471b5a089332cd36a Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Wed, 10 Jun 2026 11:22:57 -0300 Subject: [PATCH 5/6] feat(admin): implement pricing overrides for plans and update pricing logic --- apps/backend/.gitignore | 5 +- apps/backend/prisma/plans.seed-data.ts | 21 +- .../plan/handlers/list-plans.handler.ts | 17 +- .../plan/services/plan-pricing.service.ts | 25 ++ .../test/plan/plan-pricing.service.test.ts | 87 +++++++ .../src/features/admin/plans-page.tsx | 245 +++++++++++++++--- .../components/steps/plan-select-step.tsx | 6 +- .../onboard/components/steps/review-step.tsx | 9 +- bunfig.toml | 1 + packages/api-contract/src/plan.ts | 21 +- 10 files changed, 389 insertions(+), 48 deletions(-) create mode 100644 apps/backend/src/modules/plan/services/plan-pricing.service.ts create mode 100644 apps/backend/test/plan/plan-pricing.service.test.ts diff --git a/apps/backend/.gitignore b/apps/backend/.gitignore index 5697a92..ff1d15a 100644 --- a/apps/backend/.gitignore +++ b/apps/backend/.gitignore @@ -1,3 +1,6 @@ # deps node_modules/ -prisma.config.prod.ts \ No newline at end of file +prisma.config.prod.ts + +# build output +dist/ \ No newline at end of file diff --git a/apps/backend/prisma/plans.seed-data.ts b/apps/backend/prisma/plans.seed-data.ts index 5660c11..242bf38 100644 --- a/apps/backend/prisma/plans.seed-data.ts +++ b/apps/backend/prisma/plans.seed-data.ts @@ -4,7 +4,7 @@ export const planSeeds = [ name: 'Basic', price: '49.00', rules: { - version: 'v1', + version: 'v2', limits: { maxCourts: 2, maxBookingsPerDay: 80, @@ -22,6 +22,11 @@ export const planSeeds = [ advancedReports: false, whatsappReminders: false, }, + pricing: { + overrides: { + AR: { amount: 14999, currency: 'ARS' }, + }, + }, }, }, { @@ -29,7 +34,7 @@ export const planSeeds = [ name: 'Advanced', price: '99.00', rules: { - version: 'v1', + version: 'v2', limits: { maxCourts: 5, maxBookingsPerDay: 220, @@ -47,6 +52,11 @@ export const planSeeds = [ advancedReports: true, whatsappReminders: true, }, + pricing: { + overrides: { + AR: { amount: 29999, currency: 'ARS' }, + }, + }, }, }, { @@ -54,7 +64,7 @@ export const planSeeds = [ name: 'Enterprise', price: '199.00', rules: { - version: 'v1', + version: 'v2', limits: { maxCourts: 20, maxBookingsPerDay: 2000, @@ -72,6 +82,11 @@ export const planSeeds = [ advancedReports: true, whatsappReminders: true, }, + pricing: { + overrides: { + AR: { amount: 59999, currency: 'ARS' }, + }, + }, }, }, ] as const; diff --git a/apps/backend/src/modules/plan/handlers/list-plans.handler.ts b/apps/backend/src/modules/plan/handlers/list-plans.handler.ts index de5d328..fe2738b 100644 --- a/apps/backend/src/modules/plan/handlers/list-plans.handler.ts +++ b/apps/backend/src/modules/plan/handlers/list-plans.handler.ts @@ -1,4 +1,6 @@ +import { fetchGeoInfo } from '@/lib/geoip'; import { db } from '@/lib/prisma'; +import { resolvePlanPrice } from '@/modules/plan/services/plan-pricing.service'; import { parsePlanRules } from '@/modules/plan/services/plan-rules.service'; import type { AppContext } from '@/types/hono'; @@ -9,13 +11,26 @@ export async function listPlansHandler(c: AppContext) { }, }); + const countryParam = c.req.query('country'); + let countryCode: string | undefined; + + if (countryParam) { + countryCode = countryParam; + } else { + const ip = c.req.header('x-forwarded-for')?.split(',')[0]?.trim() || '127.0.0.1'; + const geo = await fetchGeoInfo(ip); + countryCode = geo?.countryCode || undefined; + } + return c.json( plans.map((plan) => { const rules = parsePlanRules(plan.rules); + const resolved = resolvePlanPrice(Number(plan.price), rules, countryCode); return { code: plan.code, name: plan.name, - price: Number(plan.price), + price: resolved.amount, + currency: resolved.currency, features: rules.features, limits: rules.limits, }; diff --git a/apps/backend/src/modules/plan/services/plan-pricing.service.ts b/apps/backend/src/modules/plan/services/plan-pricing.service.ts new file mode 100644 index 0000000..965a109 --- /dev/null +++ b/apps/backend/src/modules/plan/services/plan-pricing.service.ts @@ -0,0 +1,25 @@ +import type { PlanRules } from '@repo/api-contract'; + +export type PlanPrice = { + amount: number; + currency: string; +}; + +export function resolvePlanPrice( + defaultPrice: number, + rules: PlanRules, + countryCode?: string +): PlanPrice { + if (!countryCode) { + return { amount: defaultPrice, currency: 'USD' }; + } + + if (rules.version === 'v2' && rules.pricing?.overrides) { + const override = rules.pricing.overrides[countryCode]; + if (override) { + return { amount: override.amount, currency: override.currency }; + } + } + + return { amount: defaultPrice, currency: 'USD' }; +} diff --git a/apps/backend/test/plan/plan-pricing.service.test.ts b/apps/backend/test/plan/plan-pricing.service.test.ts new file mode 100644 index 0000000..8f44fb6 --- /dev/null +++ b/apps/backend/test/plan/plan-pricing.service.test.ts @@ -0,0 +1,87 @@ +import { expect, test } from 'bun:test'; + +import type { PlanRules } from '@repo/api-contract'; + +const DEFAULT_PRICE = 29.99; + +function makeV1Rules(): PlanRules { + return { + version: 'v1', + limits: { maxCourts: 3, maxBookingsPerDay: 50 }, + policies: { allowOverbooking: false }, + features: { + onlinePayments: false, + publicBookingPage: false, + advancedReports: false, + whatsappReminders: false, + }, + }; +} + +function makeV2Rules(overrides?: Record): PlanRules { + return { + version: 'v2', + limits: { maxCourts: 5, maxBookingsPerDay: 100 }, + policies: { allowOverbooking: false }, + features: { + onlinePayments: true, + publicBookingPage: true, + advancedReports: true, + whatsappReminders: true, + }, + ...(overrides ? { pricing: { overrides } } : {}), + }; +} + +const { resolvePlanPrice } = await import('@/modules/plan/services/plan-pricing.service'); + +test('returns default price in USD when no country code is provided', () => { + const result = resolvePlanPrice( + DEFAULT_PRICE, + makeV2Rules({ AR: { amount: 14999, currency: 'ARS' } }) + ); + expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' }); +}); + +test('returns overridden price for matching country code', () => { + const rules = makeV2Rules({ AR: { amount: 14999, currency: 'ARS' } }); + const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'AR'); + expect(result).toEqual({ amount: 14999, currency: 'ARS' }); +}); + +test('returns default price for country without override', () => { + const rules = makeV2Rules({ AR: { amount: 14999, currency: 'ARS' } }); + const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'CL'); + expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' }); +}); + +test('returns default price for v1 rules (no pricing config)', () => { + const result = resolvePlanPrice(DEFAULT_PRICE, makeV1Rules(), 'AR'); + expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' }); +}); + +test('returns default price for v2 rules with empty overrides', () => { + const rules = makeV2Rules({}); + const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'AR'); + expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' }); +}); + +test('returns default price when v2 rules has no pricing section', () => { + const rules = makeV2Rules(); + const result = resolvePlanPrice(DEFAULT_PRICE, rules, 'AR'); + expect(result).toEqual({ amount: DEFAULT_PRICE, currency: 'USD' }); +}); + +test('selects correct override among multiple countries', () => { + const rules = makeV2Rules({ + AR: { amount: 24999, currency: 'ARS' }, + BR: { amount: 59.99, currency: 'USD' }, + }); + + expect(resolvePlanPrice(DEFAULT_PRICE, rules, 'AR')).toEqual({ amount: 24999, currency: 'ARS' }); + expect(resolvePlanPrice(DEFAULT_PRICE, rules, 'BR')).toEqual({ amount: 59.99, currency: 'USD' }); + expect(resolvePlanPrice(DEFAULT_PRICE, rules, 'US')).toEqual({ + amount: DEFAULT_PRICE, + currency: 'USD', + }); +}); diff --git a/apps/frontend/src/features/admin/plans-page.tsx b/apps/frontend/src/features/admin/plans-page.tsx index fa6b9ef..4715950 100644 --- a/apps/frontend/src/features/admin/plans-page.tsx +++ b/apps/frontend/src/features/admin/plans-page.tsx @@ -9,11 +9,18 @@ import { } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; import { AdminLayout } from '@/features/admin/admin-layout'; import { ApiClientError, apiClient } from '@/lib/api-client'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useLocation } from '@tanstack/react-router'; -import { BarChart3, Pencil, Plus, RefreshCw, Trash2 } from 'lucide-react'; +import { BarChart3, Pencil, Plus, RefreshCw, Trash2, X } from 'lucide-react'; import { useState } from 'react'; type Plan = { @@ -25,6 +32,61 @@ type Plan = { complexCount: number; }; +type PriceOverride = { + country: string; + amount: string; + currency: string; +}; + +function initOverrides(rules: unknown): PriceOverride[] { + const r = rules as Record | null | undefined; + const pricing = r?.pricing as Record | undefined; + const overrides = pricing?.overrides as + | Record + | undefined; + if (!overrides) return []; + return Object.entries(overrides).map(([country, data]) => ({ + country, + amount: String(data.amount), + currency: data.currency, + })); +} + +function buildRulesData( + mode: 'create' | 'edit', + existingRules: unknown, + priceOverrides: PriceOverride[] +): unknown { + const base = + mode === 'edit' && typeof existingRules === 'object' && existingRules !== null + ? { ...(existingRules as Record) } + : {}; + + const validOverrides = priceOverrides.filter((o) => o.country.trim()); + + if (validOverrides.length > 0) { + const overrides: Record = {}; + for (const o of validOverrides) { + overrides[o.country.trim().toUpperCase()] = { + amount: Number.parseFloat(o.amount), + currency: o.currency, + }; + } + return { + ...base, + version: 'v2', + pricing: { overrides }, + }; + } + + if (mode === 'edit') { + const { pricing: _, ...clean } = base; + return Object.keys(clean).length > 0 ? clean : {}; + } + + return {}; +} + function PlanFormDialog({ mode, plan, @@ -38,6 +100,9 @@ function PlanFormDialog({ const [code, setCode] = useState(plan?.code ?? ''); const [name, setName] = useState(plan?.name ?? ''); const [price, setPrice] = useState(String(plan?.price ?? '')); + const [priceOverrides, setPriceOverrides] = useState(() => + mode === 'edit' && plan ? initOverrides(plan.rules) : [] + ); const createMutation = useMutation({ mutationFn: (data: { code: string; name: string; price: number; rules: object }) => @@ -49,7 +114,7 @@ function PlanFormDialog({ }); const updateMutation = useMutation({ - mutationFn: (data: { name?: string; price?: number }) => + mutationFn: (data: { name?: string; price?: number; rules?: unknown }) => apiClient.admin.updatePlan(plan!.code, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-plans'] }); @@ -62,22 +127,36 @@ function PlanFormDialog({ const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); + const rules = buildRulesData(mode, plan?.rules, priceOverrides); if (mode === 'create') { createMutation.mutate({ code, name, price: Number.parseFloat(price), - rules: {}, + rules: rules as object, }); } else { updateMutation.mutate({ name, price: Number.parseFloat(price), + rules, }); } }; + const addOverride = () => { + setPriceOverrides((prev) => [...prev, { country: '', amount: '', currency: 'ARS' }]); + }; + + const removeOverride = (index: number) => { + setPriceOverrides((prev) => prev.filter((_, i) => i !== index)); + }; + + const updateOverride = (index: number, field: keyof PriceOverride, value: string) => { + setPriceOverrides((prev) => prev.map((o, i) => (i === index ? { ...o, [field]: value } : o))); + }; + return ( !open && onClose()}> @@ -118,7 +197,9 @@ function PlanFormDialog({
- +
+
+
+ + +
+ + {priceOverrides.map((override, index) => ( +
+
+ + updateOverride(index, 'country', e.target.value)} + placeholder="AR" + maxLength={2} + className="uppercase" + /> +
+
+ + updateOverride(index, 'amount', e.target.value)} + placeholder="14999" + /> +
+
+ + +
+ +
+ ))} +
+ {error && (

{error instanceof ApiClientError @@ -292,42 +439,60 @@ export function PlansPage() { - {data?.map((plan) => ( - - - - {plan.code} - - - {plan.name} - - ${Number(plan.price).toFixed(2)} - - - {plan.complexCount} - - -

- - -
- - - ))} + {data?.map((plan) => { + const rules = plan.rules as Record | null; + const pricing = rules?.pricing as Record | undefined; + const overrides = pricing?.overrides as Record | undefined; + const overrideCountries = overrides ? Object.keys(overrides) : []; + + return ( + + + + {plan.code} + + + {plan.name} + +
+ ${Number(plan.price).toFixed(2)} USD + {overrideCountries.length > 0 && ( +
+ {overrideCountries.map((country) => ( + + {country} + + ))} +
+ )} +
+ + + {plan.complexCount} + + +
+ + +
+ + + ); + })} diff --git a/apps/frontend/src/features/onboard/components/steps/plan-select-step.tsx b/apps/frontend/src/features/onboard/components/steps/plan-select-step.tsx index 433d5fe..8947d69 100644 --- a/apps/frontend/src/features/onboard/components/steps/plan-select-step.tsx +++ b/apps/frontend/src/features/onboard/components/steps/plan-select-step.tsx @@ -58,7 +58,11 @@ export function PlanSelectStep({ form, plans }: PlanSelectStepProps) {

{plan.name}

- ${plan.price} + + {plan.currency === 'ARS' + ? `AR$${plan.price.toLocaleString('es-AR')}` + : `$${plan.price.toFixed(2)}`} + /mes
diff --git a/apps/frontend/src/features/onboard/components/steps/review-step.tsx b/apps/frontend/src/features/onboard/components/steps/review-step.tsx index fb5f636..004fd21 100644 --- a/apps/frontend/src/features/onboard/components/steps/review-step.tsx +++ b/apps/frontend/src/features/onboard/components/steps/review-step.tsx @@ -50,7 +50,14 @@ export function ReviewStep({ data, selectedPlan }: ReviewStepProps) {
{selectedPlan ? ( <> - +
{[ ['publicBookingPage', 'Página de booking pública'], diff --git a/bunfig.toml b/bunfig.toml index 1ef362d..9d07ee7 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,2 +1,3 @@ [test] +exclude = ["**/dist/**", "**/node_modules/**"] preload = ["./apps/backend/test/support/prisma.mock.ts"] diff --git a/packages/api-contract/src/plan.ts b/packages/api-contract/src/plan.ts index 27104ed..c2799df 100644 --- a/packages/api-contract/src/plan.ts +++ b/packages/api-contract/src/plan.ts @@ -33,7 +33,24 @@ export const planRulesV1Schema = z.object({ }), }) -export const planRulesSchema = z.discriminatedUnion('version', [planRulesV1Schema]) +export const planPriceOverrideSchema = z.object({ + amount: z.number().nonnegative(), + currency: z.string().length(3), +}) + +export const planRulesV2Schema = planRulesV1Schema.extend({ + version: z.literal('v2'), + pricing: z + .object({ + overrides: z.record(z.string(), planPriceOverrideSchema), + }) + .optional(), +}) + +export const planRulesSchema = z.discriminatedUnion('version', [ + planRulesV1Schema, + planRulesV2Schema, +]) export const planSchema = z.object({ code: z.string().trim().min(1).max(10), @@ -60,12 +77,14 @@ export const planWithFeaturesSchema = z.object({ code: z.string().trim().min(1).max(10), name: z.string().trim().min(1).max(30), price: z.number().nonnegative(), + currency: z.string().length(3), features: planFeatureFlagsSchema, limits: planLimitsSchema, }) export type PlanFeatureFlags = z.infer export type PlanRulesV1 = z.infer +export type PlanRulesV2 = z.infer export type PlanRules = z.infer export type Plan = z.infer export type PlanSummary = z.infer -- 2.49.1 From c3e26f8f0eb2d084b8aa49846d016779e0718d05 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Wed, 10 Jun 2026 13:07:56 -0300 Subject: [PATCH 6/6] feat(admin): add maxSports field to plan rules and limits schemas --- .../src/features/admin/plans-page.tsx | 528 ++++++++++++++---- packages/api-contract/src/plan.ts | 2 + 2 files changed, 418 insertions(+), 112 deletions(-) diff --git a/apps/frontend/src/features/admin/plans-page.tsx b/apps/frontend/src/features/admin/plans-page.tsx index 4715950..28f42e3 100644 --- a/apps/frontend/src/features/admin/plans-page.tsx +++ b/apps/frontend/src/features/admin/plans-page.tsx @@ -38,6 +38,26 @@ type PriceOverride = { currency: string; }; +type PlanFormRules = { + limits: { + maxCourts: number; + maxBookingsPerDay: number; + maxActiveUsers: number | ''; + maxSports: number | ''; + }; + features: { + onlinePayments: boolean; + publicBookingPage: boolean; + advancedReports: boolean; + whatsappReminders: boolean; + }; + policies: { + maxAdvanceBookingDays: number | ''; + minCancellationNoticeHours: number | ''; + allowOverbooking: boolean; + }; +}; + function initOverrides(rules: unknown): PriceOverride[] { const r = rules as Record | null | undefined; const pricing = r?.pricing as Record | undefined; @@ -52,17 +72,80 @@ function initOverrides(rules: unknown): PriceOverride[] { })); } -function buildRulesData( - mode: 'create' | 'edit', - existingRules: unknown, - priceOverrides: PriceOverride[] -): unknown { - const base = - mode === 'edit' && typeof existingRules === 'object' && existingRules !== null - ? { ...(existingRules as Record) } - : {}; +function getDefaultRules(): PlanFormRules { + return { + limits: { + maxCourts: 10, + maxBookingsPerDay: 100, + maxActiveUsers: '', + maxSports: '', + }, + features: { + onlinePayments: false, + publicBookingPage: false, + advancedReports: false, + whatsappReminders: false, + }, + policies: { + maxAdvanceBookingDays: '', + minCancellationNoticeHours: '', + allowOverbooking: false, + }, + }; +} +function initRules(plan?: Plan): PlanFormRules { + if (!plan) return getDefaultRules(); + const r = plan.rules as Record | null | undefined; + const limits = r?.limits as Record | undefined; + const features = r?.features as Record | undefined; + const policies = r?.policies as Record | undefined; + + return { + limits: { + maxCourts: (limits?.maxCourts as number) ?? 10, + maxBookingsPerDay: (limits?.maxBookingsPerDay as number) ?? 100, + maxActiveUsers: (limits?.maxActiveUsers as number | undefined) ?? '', + maxSports: (limits?.maxSports as number | undefined) ?? '', + }, + features: { + onlinePayments: (features?.onlinePayments as boolean) ?? false, + publicBookingPage: (features?.publicBookingPage as boolean) ?? false, + advancedReports: (features?.advancedReports as boolean) ?? false, + whatsappReminders: (features?.whatsappReminders as boolean) ?? false, + }, + policies: { + maxAdvanceBookingDays: (policies?.maxAdvanceBookingDays as number | undefined) ?? '', + minCancellationNoticeHours: + (policies?.minCancellationNoticeHours as number | undefined) ?? '', + allowOverbooking: (policies?.allowOverbooking as boolean) ?? false, + }, + }; +} + +function buildRulesData(formRules: PlanFormRules, priceOverrides: PriceOverride[]): unknown { const validOverrides = priceOverrides.filter((o) => o.country.trim()); + const { limits, features, policies } = formRules; + + const rules: Record = { + version: validOverrides.length > 0 ? 'v2' : 'v1', + limits: { + maxCourts: limits.maxCourts, + maxBookingsPerDay: limits.maxBookingsPerDay, + ...(limits.maxActiveUsers !== '' && { maxActiveUsers: limits.maxActiveUsers }), + ...(limits.maxSports !== '' && { maxSports: limits.maxSports }), + }, + features, + policies: { + ...(policies.maxAdvanceBookingDays !== '' && { + maxAdvanceBookingDays: policies.maxAdvanceBookingDays, + }), + ...(policies.minCancellationNoticeHours !== '' && { + minCancellationNoticeHours: policies.minCancellationNoticeHours, + }), + allowOverbooking: policies.allowOverbooking, + }, + }; if (validOverrides.length > 0) { const overrides: Record = {}; @@ -72,19 +155,47 @@ function buildRulesData( currency: o.currency, }; } - return { - ...base, - version: 'v2', - pricing: { overrides }, - }; + rules.pricing = { overrides }; } - if (mode === 'edit') { - const { pricing: _, ...clean } = base; - return Object.keys(clean).length > 0 ? clean : {}; - } + return rules; +} - return {}; +const TABS = [ + { id: 'basico', label: 'Básico' }, + { id: 'limites', label: 'Límites' }, + { id: 'features', label: 'Funcionalidades' }, + { id: 'policies', label: 'Políticas' }, + { id: 'pricing', label: 'Precios x país' }, +] as const; + +function Toggle({ + checked, + onChange, + label, +}: { + checked: boolean; + onChange: (v: boolean) => void; + label: string; +}) { + return ( + + ); } function PlanFormDialog({ @@ -97,9 +208,11 @@ function PlanFormDialog({ onClose: () => void; }) { const queryClient = useQueryClient(); + const [activeTab, setActiveTab] = useState('basico'); const [code, setCode] = useState(plan?.code ?? ''); const [name, setName] = useState(plan?.name ?? ''); const [price, setPrice] = useState(String(plan?.price ?? '')); + const [formRules, setFormRules] = useState(() => initRules(plan)); const [priceOverrides, setPriceOverrides] = useState(() => mode === 'edit' && plan ? initOverrides(plan.rules) : [] ); @@ -125,9 +238,20 @@ function PlanFormDialog({ const isPending = createMutation.isPending || updateMutation.isPending; const error = createMutation.error ?? updateMutation.error; + function updateRule( + section: S, + field: keyof PlanFormRules[S], + value: PlanFormRules[S][keyof PlanFormRules[S]] + ) { + setFormRules((prev) => ({ + ...prev, + [section]: { ...prev[section], [field]: value }, + })); + } + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - const rules = buildRulesData(mode, plan?.rules, priceOverrides); + const rules = buildRulesData(formRules, priceOverrides); if (mode === 'create') { createMutation.mutate({ @@ -159,9 +283,9 @@ function PlanFormDialog({ return ( !open && onClose()}> - + - {mode === 'create' ? 'Crear plan' : 'Editar plan'} + {mode === 'create' ? 'Crear plan' : `Editar: ${plan!.name}`} {mode === 'create' ? 'Agregá un nuevo plan de suscripción.' @@ -169,114 +293,294 @@ function PlanFormDialog({ -
- {mode === 'create' && ( -
- - setCode(e.target.value)} - placeholder="pro" - maxLength={10} - required - /> -
- )} - -
- - setName(e.target.value)} - placeholder="Pro" - maxLength={30} - required - /> -
- -
- - setPrice(e.target.value)} - placeholder="29.99" - required - /> -
- -
-
- - -
+ {tab.label} + + ))} +
- {priceOverrides.map((override, index) => ( -
-
- + {activeTab === 'basico' && ( +
+ {mode === 'create' && ( +
+ updateOverride(index, 'country', e.target.value)} - placeholder="AR" - maxLength={2} - className="uppercase" + id="code" + value={code} + onChange={(e) => setCode(e.target.value)} + placeholder="pro" + maxLength={10} + required />
-
- + )} +
+
+ setName(e.target.value)} + placeholder="Pro" + maxLength={30} + required + /> +
+
+ + updateOverride(index, 'amount', e.target.value)} - placeholder="14999" + value={price} + onChange={(e) => setPrice(e.target.value)} + placeholder="29.99" + required />
-
- - +
+
+ )} + + {activeTab === 'limites' && ( +
+
+
+ + updateRule('limits', 'maxCourts', Number(e.target.value))} + required + />
+
+ + + updateRule('limits', 'maxBookingsPerDay', Number(e.target.value)) + } + required + /> +
+
+ + + updateRule( + 'limits', + 'maxActiveUsers', + e.target.value === '' ? '' : Number(e.target.value) + ) + } + placeholder="Ilimitado" + /> +
+
+ + + updateRule( + 'limits', + 'maxSports', + e.target.value === '' ? '' : Number(e.target.value) + ) + } + placeholder="Ilimitado" + /> +
+
+
+ )} + + {activeTab === 'features' && ( +
+ {( + [ + ['onlinePayments', 'Pagos online'], + ['publicBookingPage', 'Página de reservas pública'], + ['advancedReports', 'Reportes avanzados'], + ['whatsappReminders', 'Recordatorios por WhatsApp'], + ] as const + ).map(([key, label]) => ( +
+ + updateRule('features', key, v)} + label={label} + /> +
+ ))} +
+ )} + + {activeTab === 'policies' && ( +
+
+
+ + + updateRule( + 'policies', + 'maxAdvanceBookingDays', + e.target.value === '' ? '' : Number(e.target.value) + ) + } + placeholder="Sin límite" + /> +
+
+ + + updateRule( + 'policies', + 'minCancellationNoticeHours', + e.target.value === '' ? '' : Number(e.target.value) + ) + } + placeholder="Sin restricción" + /> +
+
+
+ + updateRule('policies', 'allowOverbooking', v)} + label="Permitir sobreventa" + /> +
+
+ )} + + {activeTab === 'pricing' && ( +
+
+
- ))} -
+ + {priceOverrides.length === 0 && ( +

+ Sin precios personalizados. Se usa el precio global USD. +

+ )} + + {priceOverrides.map((override, index) => ( +
+
+ + updateOverride(index, 'country', e.target.value)} + placeholder="AR" + maxLength={2} + className="uppercase" + /> +
+
+ + updateOverride(index, 'amount', e.target.value)} + placeholder="14999" + /> +
+
+ + +
+ +
+ ))} +
+ )} {error && (

diff --git a/packages/api-contract/src/plan.ts b/packages/api-contract/src/plan.ts index c2799df..496de9e 100644 --- a/packages/api-contract/src/plan.ts +++ b/packages/api-contract/src/plan.ts @@ -17,6 +17,7 @@ export const planRulesV1Schema = z.object({ maxBookingsPerDay: positiveInt, maxActiveUsers: positiveInt.optional(), maxConcurrentBookingsPerSlot: positiveInt.optional(), + maxSports: positiveInt.optional(), }), policies: z .object({ @@ -71,6 +72,7 @@ export const planLimitsSchema = z.object({ maxBookingsPerDay: positiveInt, maxActiveUsers: positiveInt.optional(), maxConcurrentBookingsPerSlot: positiveInt.optional(), + maxSports: positiveInt.optional(), }) export const planWithFeaturesSchema = z.object({ -- 2.49.1