@igstack/app-catalog-backend-core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["config: runtime.GetPrismaClientConfig","Buffer","join","path","$Class.getPrismaClientClass","name","init","close","debug","transform","array","transform","parseDate","extend","raw","parse","arrayParser","parseDate","parseBool","parseBigIntegerArray","parseBigInteger","init","t","bits","value","parseArray","dim","elementType","parse","array","i","getTypeParser","val","val","defaults","util","val","config","escapeIdentifier","escapeLiteral","nodeCrypto","md5","postgresMd5PasswordHash","password","user","sha256","hashByName","hmacSha256","deriveKey","password","user","signatureAlgorithmHashFromCertificate","crypto","password","types","TypeOverrides","parse","config","fs","defaults","parse","config","ConnectionParameters","types","Result","Result","utils","Query","EventEmitter","config","DatabaseError","name","password","parse","name","query","types","config","flushBuffer","syncBuffer","endBuffer","serialize","messages_1","name","parse","getStream","getSecureStream","EventEmitter","Connection","config","password","query","val","split","matcher","util","val","stat","EventEmitter","utils","nodeUtils","TypeOverrides","ConnectionParameters","Query","defaults","Connection","queryQueueLengthDeprecationNotice","Client","config","val","query","EventEmitter","Promise","Pool","Client","response","err","EventEmitter","util","utils","NativeQuery","config","TypeOverrides","Client","config","err","query","Client","defaults","Connection","Result","Pool","TypeOverrides","clientConstructor","DatabaseError","escapeIdentifier","escapeLiteral","pg","types","transform","parseArray","part","pg","z","pg2","query","sql","prismaClient: PrismaClient | null","pool: pg.Pool | null","pg","PrismaPg","config","duplicateKeys: Array<string>","results: Array<MakeTFromPrismaModel<TPrismaModelName>>","assetIds: Array<string>","error: unknown","updateData: {\n screenshotIds?: Array<string>\n iconName?: string | null\n }","user","group","config","Prisma.JsonNull","router","t","publicProcedure","providers: Array<string>","config","name","data: Record<string, unknown>","staticControllerContract: EhStaticControllerContract","config","sql","t","upload","config","name","results: Array<Awaited<ReturnType<typeof upsertIcon>>>","config","name","outBuffer: Uint8Array","buf: Buffer","config","content: Uint8Array | Buffer","config","width: number | null","height: number | null","lastError: string | undefined","error: unknown","checks: Array<Omit<LinkCheck, 'status' | 'error'>>","results: Array<LinkCheck>","linkCheck: LinkCheck","config","password","pg","PrismaPg","name","FEATURES: Array<FeatureRegistration>","router","upload","user","userGroups: Array<string>","router","middlewareContext: MiddlewareContext"],"sources":["../src/generated/prisma/internal/class.ts","../src/generated/prisma/internal/prismaNamespace.ts","../src/generated/prisma/client.ts","../../../node_modules/.pnpm/@prisma+debug@7.4.2/node_modules/@prisma/debug/dist/index.mjs","../../../node_modules/.pnpm/@prisma+driver-adapter-utils@7.4.2/node_modules/@prisma/driver-adapter-utils/dist/index.mjs","../../../node_modules/.pnpm/postgres-array@2.0.0/node_modules/postgres-array/index.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/arrayParser.js","../../../node_modules/.pnpm/postgres-date@1.0.7/node_modules/postgres-date/index.js","../../../node_modules/.pnpm/xtend@4.0.2/node_modules/xtend/mutable.js","../../../node_modules/.pnpm/postgres-interval@1.2.0/node_modules/postgres-interval/index.js","../../../node_modules/.pnpm/postgres-bytea@1.0.1/node_modules/postgres-bytea/index.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/textParsers.js","../../../node_modules/.pnpm/pg-int8@1.0.1/node_modules/pg-int8/index.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/binaryParsers.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/builtins.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/defaults.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/utils.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-legacy.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-webcrypto.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/cert-signatures.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/sasl.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/type-overrides.js","../../../node_modules/.pnpm/pg-connection-string@2.12.0/node_modules/pg-connection-string/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection-parameters.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/result.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/query.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/messages.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-writer.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/serializer.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-reader.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/parser.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/index.js","../../../node_modules/.pnpm/pg-cloudflare@1.3.0/node_modules/pg-cloudflare/dist/empty.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/stream.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection.js","../../../node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js","../../../node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/helper.js","../../../node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/client.js","../../../node_modules/.pnpm/pg-pool@3.13.0_pg@8.20.0/node_modules/pg-pool/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/query.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/client.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/esm/index.mjs","../../../node_modules/.pnpm/postgres-array@3.0.4/node_modules/postgres-array/index.js","../../../node_modules/.pnpm/@prisma+adapter-pg@7.4.2/node_modules/@prisma/adapter-pg/dist/index.mjs","../src/db/client.ts","../src/modules/appCatalog/service.ts","../src/db/tableSyncPrismaAdapter.ts","../src/db/tableSyncMagazine.ts","../src/modules/assets/assetUtils.ts","../src/modules/assets/upsertAsset.ts","../src/db/syncAppCatalog.ts","../src/modules/auth/authorizationUtils.ts","../src/server/trpcSetup.ts","../src/modules/appCatalogAdmin/appCatalogAdminRouter.ts","../src/modules/approvalMethod/slugUtils.ts","../src/modules/approvalMethod/approvalMethodRouter.ts","../src/modules/assets/screenshotRouter.ts","../src/modules/auth/authRouter.ts","../src/modules/icons/iconUtils.ts","../src/modules/icons/iconRouter.ts","../src/server/controller.ts","../src/server/ehTrpcContext.ts","../src/server/ehStaticControllerContract.ts","../src/modules/auth/auth.ts","../src/modules/auth/registerAuthRoutes.ts","../src/modules/admin/chat/createAdminChatHandler.ts","../src/modules/admin/chat/createDatabaseTools.ts","../src/modules/icons/iconRestController.ts","../src/modules/icons/iconService.ts","../src/modules/assets/assetRestController.ts","../src/modules/assets/screenshotRestController.ts","../src/modules/assets/syncAssets.ts","../src/modules/appCatalog/checkLinks.ts","../src/modules/approvalMethod/syncApprovalMethods.ts","../src/middleware/database.ts","../src/middleware/backendResolver.ts","../src/modules/appCatalogAdmin/catalogBackupController.ts","../src/modules/auth/devMockUserUtils.ts","../src/middleware/featureRegistry.ts","../src/middleware/createEhMiddleware.ts","../src/middleware/htmlInjection.ts"],"sourcesContent":["\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.4.2\",\n \"engineVersion\": \"94a226be1cf2967af2541cca5529f0f7ba866919\",\n \"activeProvider\": \"postgresql\",\n \"inlineSchema\": \"// Prisma schema for backend-core library\\n// Uses AC_CORE_DATABASE_URL environment variable\\n\\ndatasource db {\\n provider = \\\"postgresql\\\"\\n}\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n output = \\\"../src/generated/prisma\\\"\\n}\\n\\ngenerator json {\\n provider = \\\"prisma-json-types-generator\\\"\\n}\\n\\n// ========== Better Auth Models ==========\\nmodel user {\\n id String @id\\n name String?\\n email String? @unique\\n emailVerified Boolean @default(false)\\n image String?\\n role String @default(\\\"user\\\") // 'user' | 'admin'\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n accounts account[]\\n sessions session[]\\n}\\n\\nmodel session {\\n id String @id\\n token String @unique\\n userId String\\n user user @relation(fields: [userId], references: [id], onDelete: Cascade)\\n expiresAt DateTime\\n ipAddress String?\\n userAgent String?\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n}\\n\\nmodel account {\\n id String @id\\n userId String\\n user user @relation(fields: [userId], references: [id], onDelete: Cascade)\\n accountId String\\n providerId String\\n refreshToken String?\\n accessToken String?\\n accessTokenExpiresAt DateTime?\\n refreshTokenExpiresAt DateTime?\\n idToken String?\\n scope String?\\n password String?\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@unique([providerId, accountId])\\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 @@unique([identifier, value])\\n}\\n\\n// ========== EnvHopper Models ==========\\n\\nenum ApprovalMethodType {\\n service\\n personTeam\\n custom\\n}\\n\\nmodel DbApprovalMethod {\\n slug String @id\\n type ApprovalMethodType\\n displayName String\\n /// [ApprovalMethodConfig] - Type-specific configuration\\n config Json?\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@unique([type, displayName])\\n}\\n\\nmodel DbAppForCatalog {\\n id String @id @default(cuid())\\n slug String @unique // URL-friendly identifier for navigation\\n displayName String\\n description String\\n /// [AccessMethod]\\n access Json?\\n teams String[] @default([])\\n /// [AppAccessRequest] - Per-app approval configuration linking to ApprovalMethod\\n accessRequest Json?\\n notes String?\\n tags String[] @default([])\\n appUrl String?\\n /// [AppLink[]]\\n links Json? // Array of {displayName?: string, url: string}\\n iconName String? // Optional icon identifier matching DbAsset.name\\n screenshotIds String[] @default([]) // Ordered array of DbAsset IDs\\n /// [AppDeprecation] - Deprecation info with optional replacement slug\\n deprecated Json?\\n sources String[] @default([]) // Array of source URLs (Confluence pages, docs, etc.)\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@index([displayName])\\n @@index([slug])\\n @@index([tags])\\n}\\n\\nmodel DbAppTagDefinition {\\n id String @id @default(cuid())\\n prefix String @unique\\n displayName String\\n description String\\n /// [GroupingTagValue[]]\\n values Json\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n}\\n\\nenum AssetType {\\n icon\\n screenshot\\n}\\n\\nmodel DbAsset {\\n id String @id @default(cuid())\\n name String @unique // Name with extension (e.g., \\\"jira.svg\\\", \\\"github.png\\\")\\n assetType AssetType @default(icon)\\n content Bytes // Binary storage for all asset types (SVG, PNG, etc)\\n checksum String // SHA-256 of content for deduplication\\n mimeType String // e.g., \\\"image/svg+xml\\\", \\\"image/png\\\", \\\"image/jpeg\\\"\\n fileSize Int // Size in bytes\\n width Int? // Image width in pixels\\n height Int? // Image height in pixels\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@index([name])\\n @@index([assetType])\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n },\n \"parameterizationSchema\": {\n \"strings\": [],\n \"graph\": \"\"\n }\n}\n\nconfig.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\\\":\\\"role\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"accounts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"account\\\",\\\"relationName\\\":\\\"accountTouser\\\"},{\\\"name\\\":\\\"sessions\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"session\\\",\\\"relationName\\\":\\\"sessionTouser\\\"}],\\\"dbName\\\":null},\\\"session\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"token\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"user\\\",\\\"relationName\\\":\\\"sessionTouser\\\"},{\\\"name\\\":\\\"expiresAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"ipAddress\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userAgent\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"account\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"user\\\",\\\"relationName\\\":\\\"accountTouser\\\"},{\\\"name\\\":\\\"accountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"providerId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"refreshToken\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"accessToken\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"accessTokenExpiresAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"refreshTokenExpiresAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"idToken\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"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\\\":null},\\\"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\\\":null},\\\"DbApprovalMethod\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"slug\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"type\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"ApprovalMethodType\\\"},{\\\"name\\\":\\\"displayName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"config\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"DbAppForCatalog\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"slug\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"displayName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"access\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"teams\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"accessRequest\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"notes\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"tags\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"appUrl\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"links\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"iconName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"screenshotIds\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"deprecated\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"sources\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"DbAppTagDefinition\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"prefix\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"displayName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"values\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"DbAsset\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"assetType\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"AssetType\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Bytes\\\"},{\\\"name\\\":\\\"checksum\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"mimeType\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"fileSize\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"width\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"height\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\nconfig.parameterizationSchema = {\n strings: JSON.parse(\"[\\\"where\\\",\\\"orderBy\\\",\\\"cursor\\\",\\\"user\\\",\\\"accounts\\\",\\\"sessions\\\",\\\"_count\\\",\\\"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\\\",\\\"DbApprovalMethod.findUnique\\\",\\\"DbApprovalMethod.findUniqueOrThrow\\\",\\\"DbApprovalMethod.findFirst\\\",\\\"DbApprovalMethod.findFirstOrThrow\\\",\\\"DbApprovalMethod.findMany\\\",\\\"DbApprovalMethod.createOne\\\",\\\"DbApprovalMethod.createMany\\\",\\\"DbApprovalMethod.createManyAndReturn\\\",\\\"DbApprovalMethod.updateOne\\\",\\\"DbApprovalMethod.updateMany\\\",\\\"DbApprovalMethod.updateManyAndReturn\\\",\\\"DbApprovalMethod.upsertOne\\\",\\\"DbApprovalMethod.deleteOne\\\",\\\"DbApprovalMethod.deleteMany\\\",\\\"DbApprovalMethod.groupBy\\\",\\\"DbApprovalMethod.aggregate\\\",\\\"DbAppForCatalog.findUnique\\\",\\\"DbAppForCatalog.findUniqueOrThrow\\\",\\\"DbAppForCatalog.findFirst\\\",\\\"DbAppForCatalog.findFirstOrThrow\\\",\\\"DbAppForCatalog.findMany\\\",\\\"DbAppForCatalog.createOne\\\",\\\"DbAppForCatalog.createMany\\\",\\\"DbAppForCatalog.createManyAndReturn\\\",\\\"DbAppForCatalog.updateOne\\\",\\\"DbAppForCatalog.updateMany\\\",\\\"DbAppForCatalog.updateManyAndReturn\\\",\\\"DbAppForCatalog.upsertOne\\\",\\\"DbAppForCatalog.deleteOne\\\",\\\"DbAppForCatalog.deleteMany\\\",\\\"DbAppForCatalog.groupBy\\\",\\\"DbAppForCatalog.aggregate\\\",\\\"DbAppTagDefinition.findUnique\\\",\\\"DbAppTagDefinition.findUniqueOrThrow\\\",\\\"DbAppTagDefinition.findFirst\\\",\\\"DbAppTagDefinition.findFirstOrThrow\\\",\\\"DbAppTagDefinition.findMany\\\",\\\"DbAppTagDefinition.createOne\\\",\\\"DbAppTagDefinition.createMany\\\",\\\"DbAppTagDefinition.createManyAndReturn\\\",\\\"DbAppTagDefinition.updateOne\\\",\\\"DbAppTagDefinition.updateMany\\\",\\\"DbAppTagDefinition.updateManyAndReturn\\\",\\\"DbAppTagDefinition.upsertOne\\\",\\\"DbAppTagDefinition.deleteOne\\\",\\\"DbAppTagDefinition.deleteMany\\\",\\\"DbAppTagDefinition.groupBy\\\",\\\"DbAppTagDefinition.aggregate\\\",\\\"DbAsset.findUnique\\\",\\\"DbAsset.findUniqueOrThrow\\\",\\\"DbAsset.findFirst\\\",\\\"DbAsset.findFirstOrThrow\\\",\\\"DbAsset.findMany\\\",\\\"DbAsset.createOne\\\",\\\"DbAsset.createMany\\\",\\\"DbAsset.createManyAndReturn\\\",\\\"DbAsset.updateOne\\\",\\\"DbAsset.updateMany\\\",\\\"DbAsset.updateManyAndReturn\\\",\\\"DbAsset.upsertOne\\\",\\\"DbAsset.deleteOne\\\",\\\"DbAsset.deleteMany\\\",\\\"_avg\\\",\\\"_sum\\\",\\\"DbAsset.groupBy\\\",\\\"DbAsset.aggregate\\\",\\\"AND\\\",\\\"OR\\\",\\\"NOT\\\",\\\"id\\\",\\\"name\\\",\\\"AssetType\\\",\\\"assetType\\\",\\\"content\\\",\\\"checksum\\\",\\\"mimeType\\\",\\\"fileSize\\\",\\\"width\\\",\\\"height\\\",\\\"createdAt\\\",\\\"updatedAt\\\",\\\"equals\\\",\\\"in\\\",\\\"notIn\\\",\\\"lt\\\",\\\"lte\\\",\\\"gt\\\",\\\"gte\\\",\\\"not\\\",\\\"contains\\\",\\\"startsWith\\\",\\\"endsWith\\\",\\\"prefix\\\",\\\"displayName\\\",\\\"description\\\",\\\"values\\\",\\\"string_contains\\\",\\\"string_starts_with\\\",\\\"string_ends_with\\\",\\\"array_starts_with\\\",\\\"array_ends_with\\\",\\\"array_contains\\\",\\\"slug\\\",\\\"access\\\",\\\"teams\\\",\\\"accessRequest\\\",\\\"notes\\\",\\\"tags\\\",\\\"appUrl\\\",\\\"links\\\",\\\"iconName\\\",\\\"screenshotIds\\\",\\\"deprecated\\\",\\\"sources\\\",\\\"has\\\",\\\"hasEvery\\\",\\\"hasSome\\\",\\\"ApprovalMethodType\\\",\\\"type\\\",\\\"config\\\",\\\"type_displayName\\\",\\\"identifier\\\",\\\"value\\\",\\\"expiresAt\\\",\\\"identifier_value\\\",\\\"userId\\\",\\\"accountId\\\",\\\"providerId\\\",\\\"refreshToken\\\",\\\"accessToken\\\",\\\"accessTokenExpiresAt\\\",\\\"refreshTokenExpiresAt\\\",\\\"idToken\\\",\\\"scope\\\",\\\"password\\\",\\\"token\\\",\\\"ipAddress\\\",\\\"userAgent\\\",\\\"email\\\",\\\"emailVerified\\\",\\\"image\\\",\\\"role\\\",\\\"every\\\",\\\"some\\\",\\\"none\\\",\\\"providerId_accountId\\\",\\\"is\\\",\\\"isNot\\\",\\\"connectOrCreate\\\",\\\"upsert\\\",\\\"createMany\\\",\\\"set\\\",\\\"disconnect\\\",\\\"delete\\\",\\\"connect\\\",\\\"updateMany\\\",\\\"deleteMany\\\",\\\"push\\\",\\\"increment\\\",\\\"decrement\\\",\\\"multiply\\\",\\\"divide\\\"]\"),\n graph: \"7wJEgAENBAAAjQIAIAUAAI4CACCPAQAAiwIAMJABAAAOABCRAQAAiwIAMJIBAQAAAAGTAQEA9wEAIZwBQADoAQAhnQFAAOgBACHXAQEAAAAB2AEgAIwCACHZAQEA9wEAIdoBAQDjAQAhAQAAAAEAIBEDAACQAgAgjwEAAJICADCQAQAAAwAQkQEAAJICADCSAQEA4wEAIZwBQADoAQAhnQFAAOgBACHKAQEA4wEAIcsBAQDjAQAhzAEBAOMBACHNAQEA9wEAIc4BAQD3AQAhzwFAAJMCACHQAUAAkwIAIdEBAQD3AQAh0gEBAPcBACHTAQEA9wEAIQgDAADjAgAgzQEAAJQCACDOAQAAlAIAIM8BAACUAgAg0AEAAJQCACDRAQAAlAIAINIBAACUAgAg0wEAAJQCACASAwAAkAIAII8BAACSAgAwkAEAAAMAEJEBAACSAgAwkgEBAAAAAZwBQADoAQAhnQFAAOgBACHKAQEA4wEAIcsBAQDjAQAhzAEBAOMBACHNAQEA9wEAIc4BAQD3AQAhzwFAAJMCACHQAUAAkwIAIdEBAQD3AQAh0gEBAPcBACHTAQEA9wEAId4BAACRAgAgAwAAAAMAIAEAAAQAMAIAAAUAIAwDAACQAgAgjwEAAI8CADCQAQAABwAQkQEAAI8CADCSAQEA4wEAIZwBQADoAQAhnQFAAOgBACHIAUAA6AEAIcoBAQDjAQAh1AEBAOMBACHVAQEA9wEAIdYBAQD3AQAhAwMAAOMCACDVAQAAlAIAINYBAACUAgAgDAMAAJACACCPAQAAjwIAMJABAAAHABCRAQAAjwIAMJIBAQAAAAGcAUAA6AEAIZ0BQADoAQAhyAFAAOgBACHKAQEA4wEAIdQBAQAAAAHVAQEA9wEAIdYBAQD3AQAhAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAADACABAAAABwAgAQAAAAEAIA0EAACNAgAgBQAAjgIAII8BAACLAgAwkAEAAA4AEJEBAACLAgAwkgEBAOMBACGTAQEA9wEAIZwBQADoAQAhnQFAAOgBACHXAQEA9wEAIdgBIACMAgAh2QEBAPcBACHaAQEA4wEAIQUEAADhAgAgBQAA4gIAIJMBAACUAgAg1wEAAJQCACDZAQAAlAIAIAMAAAAOACABAAAPADACAAABACADAAAADgAgAQAADwAwAgAAAQAgAwAAAA4AIAEAAA8AMAIAAAEAIAoEAADfAgAgBQAA4AIAIJIBAQAAAAGTAQEAAAABnAFAAAAAAZ0BQAAAAAHXAQEAAAAB2AEgAAAAAdkBAQAAAAHaAQEAAAABAQwAABMAIAiSAQEAAAABkwEBAAAAAZwBQAAAAAGdAUAAAAAB1wEBAAAAAdgBIAAAAAHZAQEAAAAB2gEBAAAAAQEMAAAVADABDAAAFQAwCgQAAMUCACAFAADGAgAgkgEBAJoCACGTAQEApwIAIZwBQACfAgAhnQFAAJ8CACHXAQEApwIAIdgBIADEAgAh2QEBAKcCACHaAQEAmgIAIQIAAAABACAMAAAYACAIkgEBAJoCACGTAQEApwIAIZwBQACfAgAhnQFAAJ8CACHXAQEApwIAIdgBIADEAgAh2QEBAKcCACHaAQEAmgIAIQIAAAAOACAMAAAaACACAAAADgAgDAAAGgAgAwAAAAEAIBMAABMAIBQAABgAIAEAAAABACABAAAADgAgBgYAAMECACAZAADDAgAgGgAAwgIAIJMBAACUAgAg1wEAAJQCACDZAQAAlAIAIAuPAQAAhwIAMJABAAAhABCRAQAAhwIAMJIBAQDOAQAhkwEBAPEBACGcAUAA0wEAIZ0BQADTAQAh1wEBAPEBACHYASAAiAIAIdkBAQDxAQAh2gEBAM4BACEDAAAADgAgAQAAIAAwGAAAIQAgAwAAAA4AIAEAAA8AMAIAAAEAIAEAAAAJACABAAAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgCQMAAMACACCSAQEAAAABnAFAAAAAAZ0BQAAAAAHIAUAAAAABygEBAAAAAdQBAQAAAAHVAQEAAAAB1gEBAAAAAQEMAAApACAIkgEBAAAAAZwBQAAAAAGdAUAAAAAByAFAAAAAAcoBAQAAAAHUAQEAAAAB1QEBAAAAAdYBAQAAAAEBDAAAKwAwAQwAACsAMAkDAAC_AgAgkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhyAFAAJ8CACHKAQEAmgIAIdQBAQCaAgAh1QEBAKcCACHWAQEApwIAIQIAAAAJACAMAAAuACAIkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhyAFAAJ8CACHKAQEAmgIAIdQBAQCaAgAh1QEBAKcCACHWAQEApwIAIQIAAAAHACAMAAAwACACAAAABwAgDAAAMAAgAwAAAAkAIBMAACkAIBQAAC4AIAEAAAAJACABAAAABwAgBQYAALwCACAZAAC-AgAgGgAAvQIAINUBAACUAgAg1gEAAJQCACALjwEAAIYCADCQAQAANwAQkQEAAIYCADCSAQEAzgEAIZwBQADTAQAhnQFAANMBACHIAUAA0wEAIcoBAQDOAQAh1AEBAM4BACHVAQEA8QEAIdYBAQDxAQAhAwAAAAcAIAEAADYAMBgAADcAIAMAAAAHACABAAAIADACAAAJACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAAC7AgAgkgEBAAAAAZwBQAAAAAGdAUAAAAABygEBAAAAAcsBAQAAAAHMAQEAAAABzQEBAAAAAc4BAQAAAAHPAUAAAAAB0AFAAAAAAdEBAQAAAAHSAQEAAAAB0wEBAAAAAQEMAAA_ACANkgEBAAAAAZwBQAAAAAGdAUAAAAABygEBAAAAAcsBAQAAAAHMAQEAAAABzQEBAAAAAc4BAQAAAAHPAUAAAAAB0AFAAAAAAdEBAQAAAAHSAQEAAAAB0wEBAAAAAQEMAABBADABDAAAQQAwDgMAALoCACCSAQEAmgIAIZwBQACfAgAhnQFAAJ8CACHKAQEAmgIAIcsBAQCaAgAhzAEBAJoCACHNAQEApwIAIc4BAQCnAgAhzwFAALkCACHQAUAAuQIAIdEBAQCnAgAh0gEBAKcCACHTAQEApwIAIQIAAAAFACAMAABEACANkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhygEBAJoCACHLAQEAmgIAIcwBAQCaAgAhzQEBAKcCACHOAQEApwIAIc8BQAC5AgAh0AFAALkCACHRAQEApwIAIdIBAQCnAgAh0wEBAKcCACECAAAAAwAgDAAARgAgAgAAAAMAIAwAAEYAIAMAAAAFACATAAA_ACAUAABEACABAAAABQAgAQAAAAMAIAoGAAC2AgAgGQAAuAIAIBoAALcCACDNAQAAlAIAIM4BAACUAgAgzwEAAJQCACDQAQAAlAIAINEBAACUAgAg0gEAAJQCACDTAQAAlAIAIBCPAQAAggIAMJABAABNABCRAQAAggIAMJIBAQDOAQAhnAFAANMBACGdAUAA0wEAIcoBAQDOAQAhywEBAM4BACHMAQEAzgEAIc0BAQDxAQAhzgEBAPEBACHPAUAAgwIAIdABQACDAgAh0QEBAPEBACHSAQEA8QEAIdMBAQDxAQAhAwAAAAMAIAEAAEwAMBgAAE0AIAMAAAADACABAAAEADACAAAFACAKjwEAAIACADCQAQAAUwAQkQEAAIACADCSAQEAAAABnAFAAOgBACGdAUAA6AEAIcYBAQDjAQAhxwEBAOMBACHIAUAA6AEAIckBAACBAgAgAQAAAFAAIAEAAABQACAJjwEAAIACADCQAQAAUwAQkQEAAIACADCSAQEA4wEAIZwBQADoAQAhnQFAAOgBACHGAQEA4wEAIccBAQDjAQAhyAFAAOgBACEAAwAAAFMAIAEAAFQAMAIAAFAAIAMAAABTACABAABUADACAABQACADAAAAUwAgAQAAVAAwAgAAUAAgBpIBAQAAAAGcAUAAAAABnQFAAAAAAcYBAQAAAAHHAQEAAAAByAFAAAAAAQEMAABYACAGkgEBAAAAAZwBQAAAAAGdAUAAAAABxgEBAAAAAccBAQAAAAHIAUAAAAABAQwAAFoAMAEMAABaADAGkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhxgEBAJoCACHHAQEAmgIAIcgBQACfAgAhAgAAAFAAIAwAAF0AIAaSAQEAmgIAIZwBQACfAgAhnQFAAJ8CACHGAQEAmgIAIccBAQCaAgAhyAFAAJ8CACECAAAAUwAgDAAAXwAgAgAAAFMAIAwAAF8AIAMAAABQACATAABYACAUAABdACABAAAAUAAgAQAAAFMAIAMGAACzAgAgGQAAtQIAIBoAALQCACAJjwEAAP8BADCQAQAAZgAQkQEAAP8BADCSAQEAzgEAIZwBQADTAQAhnQFAANMBACHGAQEAzgEAIccBAQDOAQAhyAFAANMBACEDAAAAUwAgAQAAZQAwGAAAZgAgAwAAAFMAIAEAAFQAMAIAAFAAIAqPAQAA_AEAMJABAABsABCRAQAA_AEAMJwBQADoAQAhnQFAAOgBACGqAQEA4wEAIbMBAQAAAAHDAQAA_QHDASLEAQAA9gEAIMUBAAD-AQAgAQAAAGkAIAEAAABpACAJjwEAAPwBADCQAQAAbAAQkQEAAPwBADCcAUAA6AEAIZ0BQADoAQAhqgEBAOMBACGzAQEA4wEAIcMBAAD9AcMBIsQBAAD2AQAgAcQBAACUAgAgAwAAAGwAIAEAAG0AMAIAAGkAIAMAAABsACABAABtADACAABpACADAAAAbAAgAQAAbQAwAgAAaQAgBpwBQAAAAAGdAUAAAAABqgEBAAAAAbMBAQAAAAHDAQAAAMMBAsQBgAAAAAEBDAAAcQAgBpwBQAAAAAGdAUAAAAABqgEBAAAAAbMBAQAAAAHDAQAAAMMBAsQBgAAAAAEBDAAAcwAwAQwAAHMAMAacAUAAnwIAIZ0BQACfAgAhqgEBAJoCACGzAQEAmgIAIcMBAACyAsMBIsQBgAAAAAECAAAAaQAgDAAAdgAgBpwBQACfAgAhnQFAAJ8CACGqAQEAmgIAIbMBAQCaAgAhwwEAALICwwEixAGAAAAAAQIAAABsACAMAAB4ACACAAAAbAAgDAAAeAAgAwAAAGkAIBMAAHEAIBQAAHYAIAEAAABpACABAAAAbAAgBAYAAK8CACAZAACxAgAgGgAAsAIAIMQBAACUAgAgCY8BAAD4AQAwkAEAAH8AEJEBAAD4AQAwnAFAANMBACGdAUAA0wEAIaoBAQDOAQAhswEBAM4BACHDAQAA-QHDASLEAQAA7wEAIAMAAABsACABAAB-ADAYAAB_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-QHDASLEAQAA7wEAIAcGAADVAQAgGQAA-wEAIBoAAPsBACCeAQAAAMMBAp8BAAAAwwEIoAEAAADDAQilAQAA-gHDASIHBgAA1QEAIBkAAPsBACAaAAD7AQAgngEAAADDAQKfAQAAAMMBCKABAAAAwwEIpQEAAPoBwwEiBJ4BAAAAwwECnwEAAADDAQigAQAAAMMBCKUBAAD7AcMBIgmPAQAA_AEAMJABAABsABCRAQAA_AEAMJwBQADoAQAhnQFAAOgBACGqAQEA4wEAIbMBAQDjAQAhwwEAAP0BwwEixAEAAPYBACAEngEAAADDAQKfAQAAAMMBCKABAAAAwwEIpQEAAPsBwwEiAqoBAQAAAAHDAQAAAMMBAgmPAQAA_wEAMJABAABmABCRAQAA_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_GQBCGgBDiwEAQIwBAEEHAgEIDQEJEAEKEQELEgENFAEOFgUPFwYQGQERGwUSHAcVHQEWHgEXHwUbIggcIwwdJAMeJQMfJgMgJwMhKAMiKgMjLAUkLQ0lLwMmMQUnMg4oMwMpNAMqNQUrOA8sORMtOgIuOwIvPAIwPQIxPgIyQAIzQgU0QxQ1RQI2RwU3SBU4SQI5SgI6SwU7ThY8Txo9URs-Uhs_VRtAVhtBVxtCWRtDWwVEXBxFXhtGYAVHYR1IYhtJYxtKZAVLZx5MaCJNaiNOayNPbiNQbyNRcCNSciNTdAVUdSRVdyNWeQVXeiVYeyNZfCNafQVbgAEmXIEBKl2DAStehAErX4cBK2CIASthiQErYosBK2ONAQVkjgEsZZABK2aSAQVnkwEtaJQBK2mVAStqlgEFa5kBLmyaATJtnAEzbp0BM2-gATNwoQEzcaIBM3KkATNzpgEFdKcBNHWpATN2qwEFd6wBNXitATN5rgEzeq8BBXuyATZ8swE6fbUBO362ATt_uQE7gAG6ATuBAbsBO4IBvQE7gwG_AQWEAcABPIUBwgE7hgHEAQWHAcUBPYgBxgE7iQHHATuKAcgBBY0BywE-jgHMAUQ\"\n}\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/orm/prisma-client/queries/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.user`: Exposes CRUD operations for the **user** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n */\n get user(): Prisma.userDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.session`: Exposes CRUD operations for the **session** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Sessions\n * const sessions = await prisma.session.findMany()\n * ```\n */\n get session(): Prisma.sessionDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.account`: Exposes CRUD operations for the **account** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Accounts\n * const accounts = await prisma.account.findMany()\n * ```\n */\n get account(): Prisma.accountDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.verification`: Exposes CRUD operations for the **verification** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Verifications\n * const verifications = await prisma.verification.findMany()\n * ```\n */\n get verification(): Prisma.verificationDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbApprovalMethod`: Exposes CRUD operations for the **DbApprovalMethod** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbApprovalMethods\n * const dbApprovalMethods = await prisma.dbApprovalMethod.findMany()\n * ```\n */\n get dbApprovalMethod(): Prisma.DbApprovalMethodDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbAppForCatalog`: Exposes CRUD operations for the **DbAppForCatalog** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbAppForCatalogs\n * const dbAppForCatalogs = await prisma.dbAppForCatalog.findMany()\n * ```\n */\n get dbAppForCatalog(): Prisma.DbAppForCatalogDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbAppTagDefinition`: Exposes CRUD operations for the **DbAppTagDefinition** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbAppTagDefinitions\n * const dbAppTagDefinitions = await prisma.dbAppTagDefinition.findMany()\n * ```\n */\n get dbAppTagDefinition(): Prisma.DbAppTagDefinitionDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbAsset`: Exposes CRUD operations for the **DbAsset** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbAssets\n * const dbAssets = await prisma.dbAsset.findMany()\n * ```\n */\n get dbAsset(): Prisma.DbAssetDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models\"\nimport { type PrismaClient } from \"./class\"\n\nexport type * from '../models'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n client: string\n engine: string\n}\n\n/**\n * Prisma Client JS version: 7.4.2\n * Query Engine version: 94a226be1cf2967af2541cca5529f0f7ba866919\n */\nexport const prismaVersion: PrismaVersion = {\n client: \"7.4.2\",\n engine: \"94a226be1cf2967af2541cca5529f0f7ba866919\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n select: any\n include: any\n}\n\ntype SelectAndOmit = {\n select: any\n omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n (T extends SelectAndInclude\n ? 'Please either choose `select` or `include`.'\n : T extends SelectAndOmit\n ? 'Please either choose `select` or `omit`.'\n : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n T extends object ?\n U extends object ?\n (Without<T, U> & U) | (Without<U, T> & T)\n : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n {\n // Merge all but K\n [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n O extends object,\n K extends Key,\n strict extends Boolean\n> = {\n 1: EitherStrict<O, K>\n 0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n O extends object,\n K extends Key,\n strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n 1: AtStrict<O, K>;\n 0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n O extends unknown\n ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n 0: 1\n 1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n ? 0 // anything `never` is false\n : A1 extends A2\n ? 1\n : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n 0: {\n 0: 0\n 1: 1\n }\n 1: {\n 0: 1\n 1: 1\n }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n [P in keyof T]: P extends keyof O\n ? O[P]\n : never\n} : never\n\ntype FieldPaths<\n T,\n U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n [K in keyof T]: Or<\n Or<Extends<'OR', K>, Extends<'AND', K>>,\n Extends<'NOT', K>\n > extends True\n ? // infer is only needed to not hit TS limit\n // based on the brilliant idea of Pierre-Antoine Mills\n // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n T[K] extends infer TK\n ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n : never\n : {} extends FieldPaths<T[K]>\n ? never\n : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n user: 'user',\n session: 'session',\n account: 'account',\n verification: 'verification',\n DbApprovalMethod: 'DbApprovalMethod',\n DbAppForCatalog: 'DbAppForCatalog',\n DbAppTagDefinition: 'DbAppTagDefinition',\n DbAsset: 'DbAsset'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n globalOmitOptions: {\n omit: GlobalOmitOptions\n }\n meta: {\n modelProps: \"user\" | \"session\" | \"account\" | \"verification\" | \"dbApprovalMethod\" | \"dbAppForCatalog\" | \"dbAppTagDefinition\" | \"dbAsset\"\n txIsolationLevel: TransactionIsolationLevel\n }\n model: {\n user: {\n payload: Prisma.$userPayload<ExtArgs>\n fields: Prisma.userFieldRefs\n operations: {\n findUnique: {\n args: Prisma.userFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.userFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>\n }\n findFirst: {\n args: Prisma.userFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.userFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>\n }\n findMany: {\n args: Prisma.userFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>[]\n }\n create: {\n args: Prisma.userCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>\n }\n createMany: {\n args: Prisma.userCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.userCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>[]\n }\n delete: {\n args: Prisma.userDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>\n }\n update: {\n args: Prisma.userUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>\n }\n deleteMany: {\n args: Prisma.userDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.userUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.userUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>[]\n }\n upsert: {\n args: Prisma.userUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$userPayload>\n }\n aggregate: {\n args: Prisma.UserAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUser>\n }\n groupBy: {\n args: Prisma.userGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserGroupByOutputType>[]\n }\n count: {\n args: Prisma.userCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserCountAggregateOutputType> | number\n }\n }\n }\n session: {\n payload: Prisma.$sessionPayload<ExtArgs>\n fields: Prisma.sessionFieldRefs\n operations: {\n findUnique: {\n args: Prisma.sessionFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.sessionFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>\n }\n findFirst: {\n args: Prisma.sessionFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.sessionFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>\n }\n findMany: {\n args: Prisma.sessionFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>[]\n }\n create: {\n args: Prisma.sessionCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>\n }\n createMany: {\n args: Prisma.sessionCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.sessionCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>[]\n }\n delete: {\n args: Prisma.sessionDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>\n }\n update: {\n args: Prisma.sessionUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>\n }\n deleteMany: {\n args: Prisma.sessionDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.sessionUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.sessionUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>[]\n }\n upsert: {\n args: Prisma.sessionUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$sessionPayload>\n }\n aggregate: {\n args: Prisma.SessionAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateSession>\n }\n groupBy: {\n args: Prisma.sessionGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.SessionGroupByOutputType>[]\n }\n count: {\n args: Prisma.sessionCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.SessionCountAggregateOutputType> | number\n }\n }\n }\n account: {\n payload: Prisma.$accountPayload<ExtArgs>\n fields: Prisma.accountFieldRefs\n operations: {\n findUnique: {\n args: Prisma.accountFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.accountFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>\n }\n findFirst: {\n args: Prisma.accountFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.accountFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>\n }\n findMany: {\n args: Prisma.accountFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>[]\n }\n create: {\n args: Prisma.accountCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>\n }\n createMany: {\n args: Prisma.accountCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.accountCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>[]\n }\n delete: {\n args: Prisma.accountDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>\n }\n update: {\n args: Prisma.accountUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>\n }\n deleteMany: {\n args: Prisma.accountDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.accountUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.accountUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>[]\n }\n upsert: {\n args: Prisma.accountUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$accountPayload>\n }\n aggregate: {\n args: Prisma.AccountAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateAccount>\n }\n groupBy: {\n args: Prisma.accountGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AccountGroupByOutputType>[]\n }\n count: {\n args: Prisma.accountCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AccountCountAggregateOutputType> | number\n }\n }\n }\n verification: {\n payload: Prisma.$verificationPayload<ExtArgs>\n fields: Prisma.verificationFieldRefs\n operations: {\n findUnique: {\n args: Prisma.verificationFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.verificationFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>\n }\n findFirst: {\n args: Prisma.verificationFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.verificationFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>\n }\n findMany: {\n args: Prisma.verificationFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>[]\n }\n create: {\n args: Prisma.verificationCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>\n }\n createMany: {\n args: Prisma.verificationCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.verificationCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>[]\n }\n delete: {\n args: Prisma.verificationDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>\n }\n update: {\n args: Prisma.verificationUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>\n }\n deleteMany: {\n args: Prisma.verificationDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.verificationUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.verificationUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>[]\n }\n upsert: {\n args: Prisma.verificationUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$verificationPayload>\n }\n aggregate: {\n args: Prisma.VerificationAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateVerification>\n }\n groupBy: {\n args: Prisma.verificationGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.VerificationGroupByOutputType>[]\n }\n count: {\n args: Prisma.verificationCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.VerificationCountAggregateOutputType> | number\n }\n }\n }\n DbApprovalMethod: {\n payload: Prisma.$DbApprovalMethodPayload<ExtArgs>\n fields: Prisma.DbApprovalMethodFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DbApprovalMethodFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DbApprovalMethodFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>\n }\n findFirst: {\n args: Prisma.DbApprovalMethodFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DbApprovalMethodFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>\n }\n findMany: {\n args: Prisma.DbApprovalMethodFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>[]\n }\n create: {\n args: Prisma.DbApprovalMethodCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>\n }\n createMany: {\n args: Prisma.DbApprovalMethodCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DbApprovalMethodCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>[]\n }\n delete: {\n args: Prisma.DbApprovalMethodDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>\n }\n update: {\n args: Prisma.DbApprovalMethodUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>\n }\n deleteMany: {\n args: Prisma.DbApprovalMethodDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DbApprovalMethodUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DbApprovalMethodUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>[]\n }\n upsert: {\n args: Prisma.DbApprovalMethodUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbApprovalMethodPayload>\n }\n aggregate: {\n args: Prisma.DbApprovalMethodAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDbApprovalMethod>\n }\n groupBy: {\n args: Prisma.DbApprovalMethodGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbApprovalMethodGroupByOutputType>[]\n }\n count: {\n args: Prisma.DbApprovalMethodCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbApprovalMethodCountAggregateOutputType> | number\n }\n }\n }\n DbAppForCatalog: {\n payload: Prisma.$DbAppForCatalogPayload<ExtArgs>\n fields: Prisma.DbAppForCatalogFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DbAppForCatalogFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DbAppForCatalogFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>\n }\n findFirst: {\n args: Prisma.DbAppForCatalogFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DbAppForCatalogFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>\n }\n findMany: {\n args: Prisma.DbAppForCatalogFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>[]\n }\n create: {\n args: Prisma.DbAppForCatalogCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>\n }\n createMany: {\n args: Prisma.DbAppForCatalogCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DbAppForCatalogCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>[]\n }\n delete: {\n args: Prisma.DbAppForCatalogDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>\n }\n update: {\n args: Prisma.DbAppForCatalogUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>\n }\n deleteMany: {\n args: Prisma.DbAppForCatalogDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DbAppForCatalogUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DbAppForCatalogUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>[]\n }\n upsert: {\n args: Prisma.DbAppForCatalogUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppForCatalogPayload>\n }\n aggregate: {\n args: Prisma.DbAppForCatalogAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDbAppForCatalog>\n }\n groupBy: {\n args: Prisma.DbAppForCatalogGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbAppForCatalogGroupByOutputType>[]\n }\n count: {\n args: Prisma.DbAppForCatalogCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbAppForCatalogCountAggregateOutputType> | number\n }\n }\n }\n DbAppTagDefinition: {\n payload: Prisma.$DbAppTagDefinitionPayload<ExtArgs>\n fields: Prisma.DbAppTagDefinitionFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DbAppTagDefinitionFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DbAppTagDefinitionFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>\n }\n findFirst: {\n args: Prisma.DbAppTagDefinitionFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DbAppTagDefinitionFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>\n }\n findMany: {\n args: Prisma.DbAppTagDefinitionFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>[]\n }\n create: {\n args: Prisma.DbAppTagDefinitionCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>\n }\n createMany: {\n args: Prisma.DbAppTagDefinitionCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DbAppTagDefinitionCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>[]\n }\n delete: {\n args: Prisma.DbAppTagDefinitionDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>\n }\n update: {\n args: Prisma.DbAppTagDefinitionUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>\n }\n deleteMany: {\n args: Prisma.DbAppTagDefinitionDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DbAppTagDefinitionUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DbAppTagDefinitionUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>[]\n }\n upsert: {\n args: Prisma.DbAppTagDefinitionUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAppTagDefinitionPayload>\n }\n aggregate: {\n args: Prisma.DbAppTagDefinitionAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDbAppTagDefinition>\n }\n groupBy: {\n args: Prisma.DbAppTagDefinitionGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbAppTagDefinitionGroupByOutputType>[]\n }\n count: {\n args: Prisma.DbAppTagDefinitionCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbAppTagDefinitionCountAggregateOutputType> | number\n }\n }\n }\n DbAsset: {\n payload: Prisma.$DbAssetPayload<ExtArgs>\n fields: Prisma.DbAssetFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DbAssetFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DbAssetFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>\n }\n findFirst: {\n args: Prisma.DbAssetFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DbAssetFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>\n }\n findMany: {\n args: Prisma.DbAssetFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>[]\n }\n create: {\n args: Prisma.DbAssetCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>\n }\n createMany: {\n args: Prisma.DbAssetCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DbAssetCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>[]\n }\n delete: {\n args: Prisma.DbAssetDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>\n }\n update: {\n args: Prisma.DbAssetUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>\n }\n deleteMany: {\n args: Prisma.DbAssetDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DbAssetUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DbAssetUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>[]\n }\n upsert: {\n args: Prisma.DbAssetUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DbAssetPayload>\n }\n aggregate: {\n args: Prisma.DbAssetAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDbAsset>\n }\n groupBy: {\n args: Prisma.DbAssetGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbAssetGroupByOutputType>[]\n }\n count: {\n args: Prisma.DbAssetCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DbAssetCountAggregateOutputType> | number\n }\n }\n }\n }\n} & {\n other: {\n payload: any\n operations: {\n $executeRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $executeRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n $queryRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $queryRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n }\n }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n ReadUncommitted: 'ReadUncommitted',\n ReadCommitted: 'ReadCommitted',\n RepeatableRead: 'RepeatableRead',\n Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const UserScalarFieldEnum = {\n id: 'id',\n name: 'name',\n email: 'email',\n emailVerified: 'emailVerified',\n image: 'image',\n role: 'role',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]\n\n\nexport const SessionScalarFieldEnum = {\n id: 'id',\n token: 'token',\n userId: 'userId',\n expiresAt: 'expiresAt',\n ipAddress: 'ipAddress',\n userAgent: 'userAgent',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type SessionScalarFieldEnum = (typeof SessionScalarFieldEnum)[keyof typeof SessionScalarFieldEnum]\n\n\nexport const AccountScalarFieldEnum = {\n id: 'id',\n userId: 'userId',\n accountId: 'accountId',\n providerId: 'providerId',\n refreshToken: 'refreshToken',\n accessToken: 'accessToken',\n accessTokenExpiresAt: 'accessTokenExpiresAt',\n refreshTokenExpiresAt: 'refreshTokenExpiresAt',\n idToken: 'idToken',\n scope: 'scope',\n password: 'password',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type AccountScalarFieldEnum = (typeof AccountScalarFieldEnum)[keyof typeof AccountScalarFieldEnum]\n\n\nexport const VerificationScalarFieldEnum = {\n id: 'id',\n identifier: 'identifier',\n value: 'value',\n expiresAt: 'expiresAt',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type VerificationScalarFieldEnum = (typeof VerificationScalarFieldEnum)[keyof typeof VerificationScalarFieldEnum]\n\n\nexport const DbApprovalMethodScalarFieldEnum = {\n slug: 'slug',\n type: 'type',\n displayName: 'displayName',\n config: 'config',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type DbApprovalMethodScalarFieldEnum = (typeof DbApprovalMethodScalarFieldEnum)[keyof typeof DbApprovalMethodScalarFieldEnum]\n\n\nexport const DbAppForCatalogScalarFieldEnum = {\n id: 'id',\n slug: 'slug',\n displayName: 'displayName',\n description: 'description',\n access: 'access',\n teams: 'teams',\n accessRequest: 'accessRequest',\n notes: 'notes',\n tags: 'tags',\n appUrl: 'appUrl',\n links: 'links',\n iconName: 'iconName',\n screenshotIds: 'screenshotIds',\n deprecated: 'deprecated',\n sources: 'sources',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type DbAppForCatalogScalarFieldEnum = (typeof DbAppForCatalogScalarFieldEnum)[keyof typeof DbAppForCatalogScalarFieldEnum]\n\n\nexport const DbAppTagDefinitionScalarFieldEnum = {\n id: 'id',\n prefix: 'prefix',\n displayName: 'displayName',\n description: 'description',\n values: 'values',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type DbAppTagDefinitionScalarFieldEnum = (typeof DbAppTagDefinitionScalarFieldEnum)[keyof typeof DbAppTagDefinitionScalarFieldEnum]\n\n\nexport const DbAssetScalarFieldEnum = {\n id: 'id',\n name: 'name',\n assetType: 'assetType',\n content: 'content',\n checksum: 'checksum',\n mimeType: 'mimeType',\n fileSize: 'fileSize',\n width: 'width',\n height: 'height',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt'\n} as const\n\nexport type DbAssetScalarFieldEnum = (typeof DbAssetScalarFieldEnum)[keyof typeof DbAssetScalarFieldEnum]\n\n\nexport const SortOrder = {\n asc: 'asc',\n desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const NullableJsonNullValueInput = {\n DbNull: DbNull,\n JsonNull: JsonNull\n} as const\n\nexport type NullableJsonNullValueInput = (typeof NullableJsonNullValueInput)[keyof typeof NullableJsonNullValueInput]\n\n\nexport const JsonNullValueInput = {\n JsonNull: JsonNull\n} as const\n\nexport type JsonNullValueInput = (typeof JsonNullValueInput)[keyof typeof JsonNullValueInput]\n\n\nexport const QueryMode = {\n default: 'default',\n insensitive: 'insensitive'\n} as const\n\nexport type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]\n\n\nexport const NullsOrder = {\n first: 'first',\n last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\nexport const JsonNullValueFilter = {\n DbNull: DbNull,\n JsonNull: JsonNull,\n AnyNull: AnyNull\n} as const\n\nexport type JsonNullValueFilter = (typeof JsonNullValueFilter)[keyof typeof JsonNullValueFilter]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n \n\n\n/**\n * Reference to a field of type 'String[]'\n */\nexport type ListStringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String[]'>\n \n\n\n/**\n * Reference to a field of type 'Boolean'\n */\nexport type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'>\n \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n \n\n\n/**\n * Reference to a field of type 'DateTime[]'\n */\nexport type ListDateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime[]'>\n \n\n\n/**\n * Reference to a field of type 'ApprovalMethodType'\n */\nexport type EnumApprovalMethodTypeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'ApprovalMethodType'>\n \n\n\n/**\n * Reference to a field of type 'ApprovalMethodType[]'\n */\nexport type ListEnumApprovalMethodTypeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'ApprovalMethodType[]'>\n \n\n\n/**\n * Reference to a field of type 'Json'\n */\nexport type JsonFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Json'>\n \n\n\n/**\n * Reference to a field of type 'QueryMode'\n */\nexport type EnumQueryModeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'QueryMode'>\n \n\n\n/**\n * Reference to a field of type 'AssetType'\n */\nexport type EnumAssetTypeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'AssetType'>\n \n\n\n/**\n * Reference to a field of type 'AssetType[]'\n */\nexport type ListEnumAssetTypeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'AssetType[]'>\n \n\n\n/**\n * Reference to a field of type 'Bytes'\n */\nexport type BytesFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Bytes'>\n \n\n\n/**\n * Reference to a field of type 'Bytes[]'\n */\nexport type ListBytesFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Bytes[]'>\n \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n \n\n\n/**\n * Reference to a field of type 'Int[]'\n */\nexport type ListIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int[]'>\n \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n \n\n\n/**\n * Reference to a field of type 'Float[]'\n */\nexport type ListFloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float[]'>\n \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\nexport type PrismaClientOptions = ({\n /**\n * Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.\n */\n adapter: runtime.SqlDriverAdapterFactory\n accelerateUrl?: never\n} | {\n /**\n * Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.\n */\n accelerateUrl: string\n adapter?: never\n}) & {\n /**\n * @default \"colorless\"\n */\n errorFormat?: ErrorFormat\n /**\n * @example\n * ```\n * // Shorthand for `emit: 'stdout'`\n * log: ['query', 'info', 'warn', 'error']\n * \n * // Emit as events only\n * log: [\n * { emit: 'event', level: 'query' },\n * { emit: 'event', level: 'info' },\n * { emit: 'event', level: 'warn' }\n * { emit: 'event', level: 'error' }\n * ]\n * \n * / Emit as events and log to stdout\n * og: [\n * { emit: 'stdout', level: 'query' },\n * { emit: 'stdout', level: 'info' },\n * { emit: 'stdout', level: 'warn' }\n * { emit: 'stdout', level: 'error' }\n * \n * ```\n * Read more in our [docs](https://pris.ly/d/logging).\n */\n log?: (LogLevel | LogDefinition)[]\n /**\n * The default values for transactionOptions\n * maxWait ?= 2000\n * timeout ?= 5000\n */\n transactionOptions?: {\n maxWait?: number\n timeout?: number\n isolationLevel?: TransactionIsolationLevel\n }\n /**\n * Global configuration for omitting model fields by default.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * omit: {\n * user: {\n * password: true\n * }\n * }\n * })\n * ```\n */\n omit?: GlobalOmitConfig\n /**\n * SQL commenter plugins that add metadata to SQL queries as comments.\n * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * comments: [\n * traceContext(),\n * queryInsights(),\n * ],\n * })\n * ```\n */\n comments?: runtime.SqlCommenterPlugin[]\n}\nexport type GlobalOmitConfig = {\n user?: Prisma.userOmit\n session?: Prisma.sessionOmit\n account?: Prisma.accountOmit\n verification?: Prisma.verificationOmit\n dbApprovalMethod?: Prisma.DbApprovalMethodOmit\n dbAppForCatalog?: Prisma.DbAppForCatalogOmit\n dbAppTagDefinition?: Prisma.DbAppTagDefinitionOmit\n dbAsset?: Prisma.DbAssetOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n level: LogLevel\n emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n ? GetLogType<T[number]>\n : never;\n\nexport type QueryEvent = {\n timestamp: Date\n query: string\n params: string\n duration: number\n target: string\n}\n\nexport type LogEvent = {\n timestamp: Date\n message: string\n target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n | 'findUnique'\n | 'findUniqueOrThrow'\n | 'findMany'\n | 'findFirst'\n | 'findFirstOrThrow'\n | 'create'\n | 'createMany'\n | 'createManyAndReturn'\n | 'update'\n | 'updateMany'\n | 'updateManyAndReturn'\n | 'upsert'\n | 'delete'\n | 'deleteMany'\n | 'executeRaw'\n | 'queryRaw'\n | 'aggregate'\n | 'count'\n | 'runCommandRaw'\n | 'findRaw'\n | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums\"\nimport * as $Class from \"./internal/class\"\nimport * as Prisma from \"./internal/prismaNamespace\"\n\nexport * as $Enums from './enums'\nexport * from \"./enums\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model user\n * \n */\nexport type user = Prisma.userModel\n/**\n * Model session\n * \n */\nexport type session = Prisma.sessionModel\n/**\n * Model account\n * \n */\nexport type account = Prisma.accountModel\n/**\n * Model verification\n * \n */\nexport type verification = Prisma.verificationModel\n/**\n * Model DbApprovalMethod\n * \n */\nexport type DbApprovalMethod = Prisma.DbApprovalMethodModel\n/**\n * Model DbAppForCatalog\n * \n */\nexport type DbAppForCatalog = Prisma.DbAppForCatalogModel\n/**\n * Model DbAppTagDefinition\n * \n */\nexport type DbAppTagDefinition = Prisma.DbAppTagDefinitionModel\n/**\n * Model DbAsset\n * \n */\nexport type DbAsset = Prisma.DbAssetModel\n","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// ../../node_modules/.pnpm/kleur@4.1.5/node_modules/kleur/colors.mjs\nvar colors_exports = {};\n__export(colors_exports, {\n $: () => $,\n bgBlack: () => bgBlack,\n bgBlue: () => bgBlue,\n bgCyan: () => bgCyan,\n bgGreen: () => bgGreen,\n bgMagenta: () => bgMagenta,\n bgRed: () => bgRed,\n bgWhite: () => bgWhite,\n bgYellow: () => bgYellow,\n black: () => black,\n blue: () => blue,\n bold: () => bold,\n cyan: () => cyan,\n dim: () => dim,\n gray: () => gray,\n green: () => green,\n grey: () => grey,\n hidden: () => hidden,\n inverse: () => inverse,\n italic: () => italic,\n magenta: () => magenta,\n red: () => red,\n reset: () => reset,\n strikethrough: () => strikethrough,\n underline: () => underline,\n white: () => white,\n yellow: () => yellow\n});\nvar FORCE_COLOR;\nvar NODE_DISABLE_COLORS;\nvar NO_COLOR;\nvar TERM;\nvar isTTY = true;\nif (typeof process !== \"undefined\") {\n ({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {});\n isTTY = process.stdout && process.stdout.isTTY;\n}\nvar $ = {\n enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== \"dumb\" && (FORCE_COLOR != null && FORCE_COLOR !== \"0\" || isTTY)\n};\nfunction init(x, y) {\n let rgx = new RegExp(`\\\\x1b\\\\[${y}m`, \"g\");\n let open = `\\x1B[${x}m`, close = `\\x1B[${y}m`;\n return function(txt) {\n if (!$.enabled || txt == null) return txt;\n return open + (!!~(\"\" + txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) + close;\n };\n}\nvar reset = init(0, 0);\nvar bold = init(1, 22);\nvar dim = init(2, 22);\nvar italic = init(3, 23);\nvar underline = init(4, 24);\nvar inverse = init(7, 27);\nvar hidden = init(8, 28);\nvar strikethrough = init(9, 29);\nvar black = init(30, 39);\nvar red = init(31, 39);\nvar green = init(32, 39);\nvar yellow = init(33, 39);\nvar blue = init(34, 39);\nvar magenta = init(35, 39);\nvar cyan = init(36, 39);\nvar white = init(37, 39);\nvar gray = init(90, 39);\nvar grey = init(90, 39);\nvar bgBlack = init(40, 49);\nvar bgRed = init(41, 49);\nvar bgGreen = init(42, 49);\nvar bgYellow = init(43, 49);\nvar bgBlue = init(44, 49);\nvar bgMagenta = init(45, 49);\nvar bgCyan = init(46, 49);\nvar bgWhite = init(47, 49);\n\n// src/index.ts\nvar MAX_ARGS_HISTORY = 100;\nvar COLORS = [\"green\", \"yellow\", \"blue\", \"magenta\", \"cyan\", \"red\"];\nvar argsHistory = [];\nvar lastTimestamp = Date.now();\nvar lastColor = 0;\nvar processEnv = typeof process !== \"undefined\" ? process.env : {};\nglobalThis.DEBUG ??= processEnv.DEBUG ?? \"\";\nglobalThis.DEBUG_COLORS ??= processEnv.DEBUG_COLORS ? processEnv.DEBUG_COLORS === \"true\" : true;\nvar topProps = {\n enable(namespace) {\n if (typeof namespace === \"string\") {\n globalThis.DEBUG = namespace;\n }\n },\n disable() {\n const prev = globalThis.DEBUG;\n globalThis.DEBUG = \"\";\n return prev;\n },\n // this is the core logic to check if logging should happen or not\n enabled(namespace) {\n const listenedNamespaces = globalThis.DEBUG.split(\",\").map((s) => {\n return s.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n });\n const isListened = listenedNamespaces.some((listenedNamespace) => {\n if (listenedNamespace === \"\" || listenedNamespace[0] === \"-\") return false;\n return namespace.match(RegExp(listenedNamespace.split(\"*\").join(\".*\") + \"$\"));\n });\n const isExcluded = listenedNamespaces.some((listenedNamespace) => {\n if (listenedNamespace === \"\" || listenedNamespace[0] !== \"-\") return false;\n return namespace.match(RegExp(listenedNamespace.slice(1).split(\"*\").join(\".*\") + \"$\"));\n });\n return isListened && !isExcluded;\n },\n log: (...args) => {\n const [namespace, format, ...rest] = args;\n const logWithFormatting = console.warn ?? console.log;\n logWithFormatting(`${namespace} ${format}`, ...rest);\n },\n formatters: {}\n // not implemented\n};\nfunction debugCreate(namespace) {\n const instanceProps = {\n color: COLORS[lastColor++ % COLORS.length],\n enabled: topProps.enabled(namespace),\n namespace,\n log: topProps.log,\n extend: () => {\n }\n // not implemented\n };\n const debugCall = (...args) => {\n const { enabled, namespace: namespace2, color, log } = instanceProps;\n if (args.length !== 0) {\n argsHistory.push([namespace2, ...args]);\n }\n if (argsHistory.length > MAX_ARGS_HISTORY) {\n argsHistory.shift();\n }\n if (topProps.enabled(namespace2) || enabled) {\n const stringArgs = args.map((arg) => {\n if (typeof arg === \"string\") {\n return arg;\n }\n return safeStringify(arg);\n });\n const ms = `+${Date.now() - lastTimestamp}ms`;\n lastTimestamp = Date.now();\n if (globalThis.DEBUG_COLORS) {\n log(colors_exports[color](bold(namespace2)), ...stringArgs, colors_exports[color](ms));\n } else {\n log(namespace2, ...stringArgs, ms);\n }\n }\n };\n return new Proxy(debugCall, {\n get: (_, prop) => instanceProps[prop],\n set: (_, prop, value) => instanceProps[prop] = value\n });\n}\nvar Debug = new Proxy(debugCreate, {\n get: (_, prop) => topProps[prop],\n set: (_, prop, value) => topProps[prop] = value\n});\nfunction safeStringify(value, indent = 2) {\n const cache = /* @__PURE__ */ new Set();\n return JSON.stringify(\n value,\n (key, value2) => {\n if (typeof value2 === \"object\" && value2 !== null) {\n if (cache.has(value2)) {\n return `[Circular *]`;\n }\n cache.add(value2);\n } else if (typeof value2 === \"bigint\") {\n return value2.toString();\n }\n return value2;\n },\n indent\n );\n}\nfunction getLogs(numChars = 7500) {\n const logs = argsHistory.map(([namespace, ...args]) => {\n return `${namespace} ${args.map((arg) => {\n if (typeof arg === \"string\") {\n return arg;\n } else {\n return JSON.stringify(arg);\n }\n }).join(\" \")}`;\n }).join(\"\\n\");\n if (logs.length < numChars) {\n return logs;\n }\n return logs.slice(-numChars);\n}\nfunction clearLogs() {\n argsHistory.length = 0;\n}\nvar index_default = Debug;\nexport {\n Debug,\n clearLogs,\n index_default as default,\n getLogs\n};\n","// src/debug.ts\nimport { Debug } from \"@prisma/debug\";\n\n// src/error.ts\nvar DriverAdapterError = class extends Error {\n name = \"DriverAdapterError\";\n cause;\n constructor(payload) {\n super(typeof payload[\"message\"] === \"string\" ? payload[\"message\"] : payload.kind);\n this.cause = payload;\n }\n};\nfunction isDriverAdapterError(error) {\n return error[\"name\"] === \"DriverAdapterError\" && typeof error[\"cause\"] === \"object\";\n}\n\n// src/result.ts\nfunction ok(value) {\n return {\n ok: true,\n value,\n map(fn) {\n return ok(fn(value));\n },\n flatMap(fn) {\n return fn(value);\n }\n };\n}\nfunction err(error) {\n return {\n ok: false,\n error,\n map() {\n return err(error);\n },\n flatMap() {\n return err(error);\n }\n };\n}\n\n// src/binder.ts\nvar debug = Debug(\"driver-adapter-utils\");\nvar ErrorRegistryInternal = class {\n registeredErrors = [];\n consumeError(id) {\n return this.registeredErrors[id];\n }\n registerNewError(error) {\n let i = 0;\n while (this.registeredErrors[i] !== void 0) {\n i++;\n }\n this.registeredErrors[i] = { error };\n return i;\n }\n};\nfunction copySymbolsFromSource(source, target) {\n const symbols = Object.getOwnPropertySymbols(source);\n const symbolObject = Object.fromEntries(symbols.map((symbol) => [symbol, true]));\n Object.assign(target, symbolObject);\n}\nvar bindMigrationAwareSqlAdapterFactory = (adapterFactory) => {\n const errorRegistry = new ErrorRegistryInternal();\n const boundFactory = {\n adapterName: adapterFactory.adapterName,\n provider: adapterFactory.provider,\n errorRegistry,\n connect: async (...args) => {\n const ctx = await wrapAsync(errorRegistry, adapterFactory.connect.bind(adapterFactory))(...args);\n return ctx.map((ctx2) => bindAdapter(ctx2, errorRegistry));\n },\n connectToShadowDb: async (...args) => {\n const ctx = await wrapAsync(errorRegistry, adapterFactory.connectToShadowDb.bind(adapterFactory))(...args);\n return ctx.map((ctx2) => bindAdapter(ctx2, errorRegistry));\n }\n };\n copySymbolsFromSource(adapterFactory, boundFactory);\n return boundFactory;\n};\nvar bindSqlAdapterFactory = (adapterFactory) => {\n const errorRegistry = new ErrorRegistryInternal();\n const boundFactory = {\n adapterName: adapterFactory.adapterName,\n provider: adapterFactory.provider,\n errorRegistry,\n connect: async (...args) => {\n const ctx = await wrapAsync(errorRegistry, adapterFactory.connect.bind(adapterFactory))(...args);\n return ctx.map((ctx2) => bindAdapter(ctx2, errorRegistry));\n }\n };\n copySymbolsFromSource(adapterFactory, boundFactory);\n return boundFactory;\n};\nvar bindAdapter = (adapter, errorRegistry = new ErrorRegistryInternal()) => {\n const boundAdapter = {\n adapterName: adapter.adapterName,\n errorRegistry,\n queryRaw: wrapAsync(errorRegistry, adapter.queryRaw.bind(adapter)),\n executeRaw: wrapAsync(errorRegistry, adapter.executeRaw.bind(adapter)),\n executeScript: wrapAsync(errorRegistry, adapter.executeScript.bind(adapter)),\n dispose: wrapAsync(errorRegistry, adapter.dispose.bind(adapter)),\n provider: adapter.provider,\n startTransaction: async (...args) => {\n const ctx = await wrapAsync(errorRegistry, adapter.startTransaction.bind(adapter))(...args);\n return ctx.map((ctx2) => bindTransaction(errorRegistry, ctx2));\n }\n };\n if (adapter.getConnectionInfo) {\n boundAdapter.getConnectionInfo = wrapSync(errorRegistry, adapter.getConnectionInfo.bind(adapter));\n }\n return boundAdapter;\n};\nvar bindTransaction = (errorRegistry, transaction) => {\n return {\n adapterName: transaction.adapterName,\n provider: transaction.provider,\n options: transaction.options,\n queryRaw: wrapAsync(errorRegistry, transaction.queryRaw.bind(transaction)),\n executeRaw: wrapAsync(errorRegistry, transaction.executeRaw.bind(transaction)),\n commit: wrapAsync(errorRegistry, transaction.commit.bind(transaction)),\n rollback: wrapAsync(errorRegistry, transaction.rollback.bind(transaction))\n };\n};\nfunction wrapAsync(registry, fn) {\n return async (...args) => {\n try {\n return ok(await fn(...args));\n } catch (error) {\n debug(\"[error@wrapAsync]\", error);\n if (isDriverAdapterError(error)) {\n return err(error.cause);\n }\n const id = registry.registerNewError(error);\n return err({ kind: \"GenericJs\", id });\n }\n };\n}\nfunction wrapSync(registry, fn) {\n return (...args) => {\n try {\n return ok(fn(...args));\n } catch (error) {\n debug(\"[error@wrapSync]\", error);\n if (isDriverAdapterError(error)) {\n return err(error.cause);\n }\n const id = registry.registerNewError(error);\n return err({ kind: \"GenericJs\", id });\n }\n };\n}\n\n// src/const.ts\nvar ColumnTypeEnum = {\n // Scalars\n Int32: 0,\n Int64: 1,\n Float: 2,\n Double: 3,\n Numeric: 4,\n Boolean: 5,\n Character: 6,\n Text: 7,\n Date: 8,\n Time: 9,\n DateTime: 10,\n Json: 11,\n Enum: 12,\n Bytes: 13,\n Set: 14,\n Uuid: 15,\n // Arrays\n Int32Array: 64,\n Int64Array: 65,\n FloatArray: 66,\n DoubleArray: 67,\n NumericArray: 68,\n BooleanArray: 69,\n CharacterArray: 70,\n TextArray: 71,\n DateArray: 72,\n TimeArray: 73,\n DateTimeArray: 74,\n JsonArray: 75,\n EnumArray: 76,\n BytesArray: 77,\n UuidArray: 78,\n // Custom\n UnknownNumber: 128\n};\n\n// src/mock.ts\nvar mockAdapterErrors = {\n queryRaw: new Error(\"Not implemented: queryRaw\"),\n executeRaw: new Error(\"Not implemented: executeRaw\"),\n startTransaction: new Error(\"Not implemented: startTransaction\"),\n executeScript: new Error(\"Not implemented: executeScript\"),\n dispose: new Error(\"Not implemented: dispose\")\n};\nfunction mockAdapter(provider) {\n return {\n provider,\n adapterName: \"@prisma/adapter-mock\",\n queryRaw: () => Promise.reject(mockAdapterErrors.queryRaw),\n executeRaw: () => Promise.reject(mockAdapterErrors.executeRaw),\n startTransaction: () => Promise.reject(mockAdapterErrors.startTransaction),\n executeScript: () => Promise.reject(mockAdapterErrors.executeScript),\n dispose: () => Promise.reject(mockAdapterErrors.dispose),\n [Symbol.for(\"adapter.mockAdapter\")]: true\n };\n}\nfunction mockAdapterFactory(provider) {\n return {\n provider,\n adapterName: \"@prisma/adapter-mock\",\n connect: () => Promise.resolve(mockAdapter(provider)),\n [Symbol.for(\"adapter.mockAdapterFactory\")]: true\n };\n}\nfunction mockMigrationAwareAdapterFactory(provider) {\n return {\n provider,\n adapterName: \"@prisma/adapter-mock\",\n connect: () => Promise.resolve(mockAdapter(provider)),\n connectToShadowDb: () => Promise.resolve(mockAdapter(provider)),\n [Symbol.for(\"adapter.mockMigrationAwareAdapterFactory\")]: true\n };\n}\nexport {\n ColumnTypeEnum,\n Debug,\n DriverAdapterError,\n bindAdapter,\n bindMigrationAwareSqlAdapterFactory,\n bindSqlAdapterFactory,\n err,\n isDriverAdapterError,\n mockAdapter,\n mockAdapterErrors,\n mockAdapterFactory,\n mockMigrationAwareAdapterFactory,\n ok\n};\n","'use strict'\n\nexports.parse = function (source, transform) {\n return new ArrayParser(source, transform).parse()\n}\n\nclass ArrayParser {\n constructor (source, transform) {\n this.source = source\n this.transform = transform || identity\n this.position = 0\n this.entries = []\n this.recorded = []\n this.dimension = 0\n }\n\n isEof () {\n return this.position >= this.source.length\n }\n\n nextCharacter () {\n var character = this.source[this.position++]\n if (character === '\\\\') {\n return {\n value: this.source[this.position++],\n escaped: true\n }\n }\n return {\n value: character,\n escaped: false\n }\n }\n\n record (character) {\n this.recorded.push(character)\n }\n\n newEntry (includeEmpty) {\n var entry\n if (this.recorded.length > 0 || includeEmpty) {\n entry = this.recorded.join('')\n if (entry === 'NULL' && !includeEmpty) {\n entry = null\n }\n if (entry !== null) entry = this.transform(entry)\n this.entries.push(entry)\n this.recorded = []\n }\n }\n\n consumeDimensions () {\n if (this.source[0] === '[') {\n while (!this.isEof()) {\n var char = this.nextCharacter()\n if (char.value === '=') break\n }\n }\n }\n\n parse (nested) {\n var character, parser, quote\n this.consumeDimensions()\n while (!this.isEof()) {\n character = this.nextCharacter()\n if (character.value === '{' && !quote) {\n this.dimension++\n if (this.dimension > 1) {\n parser = new ArrayParser(this.source.substr(this.position - 1), this.transform)\n this.entries.push(parser.parse(true))\n this.position += parser.position - 2\n }\n } else if (character.value === '}' && !quote) {\n this.dimension--\n if (!this.dimension) {\n this.newEntry()\n if (nested) return this.entries\n }\n } else if (character.value === '\"' && !character.escaped) {\n if (quote) this.newEntry(true)\n quote = !quote\n } else if (character.value === ',' && !quote) {\n this.newEntry()\n } else {\n this.record(character.value)\n }\n }\n if (this.dimension !== 0) {\n throw new Error('array dimension not balanced')\n }\n return this.entries\n }\n}\n\nfunction identity (value) {\n return value\n}\n","var array = require('postgres-array');\n\nmodule.exports = {\n create: function (source, transform) {\n return {\n parse: function() {\n return array.parse(source, transform);\n }\n };\n }\n};\n","'use strict'\n\nvar DATE_TIME = /(\\d{1,})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})(\\.\\d{1,})?.*?( BC)?$/\nvar DATE = /^(\\d{1,})-(\\d{2})-(\\d{2})( BC)?$/\nvar TIME_ZONE = /([Z+-])(\\d{2})?:?(\\d{2})?:?(\\d{2})?/\nvar INFINITY = /^-?infinity$/\n\nmodule.exports = function parseDate (isoDate) {\n if (INFINITY.test(isoDate)) {\n // Capitalize to Infinity before passing to Number\n return Number(isoDate.replace('i', 'I'))\n }\n var matches = DATE_TIME.exec(isoDate)\n\n if (!matches) {\n // Force YYYY-MM-DD dates to be parsed as local time\n return getDate(isoDate) || null\n }\n\n var isBC = !!matches[8]\n var year = parseInt(matches[1], 10)\n if (isBC) {\n year = bcYearToNegativeYear(year)\n }\n\n var month = parseInt(matches[2], 10) - 1\n var day = matches[3]\n var hour = parseInt(matches[4], 10)\n var minute = parseInt(matches[5], 10)\n var second = parseInt(matches[6], 10)\n\n var ms = matches[7]\n ms = ms ? 1000 * parseFloat(ms) : 0\n\n var date\n var offset = timeZoneOffset(isoDate)\n if (offset != null) {\n date = new Date(Date.UTC(year, month, day, hour, minute, second, ms))\n\n // Account for years from 0 to 99 being interpreted as 1900-1999\n // by Date.UTC / the multi-argument form of the Date constructor\n if (is0To99(year)) {\n date.setUTCFullYear(year)\n }\n\n if (offset !== 0) {\n date.setTime(date.getTime() - offset)\n }\n } else {\n date = new Date(year, month, day, hour, minute, second, ms)\n\n if (is0To99(year)) {\n date.setFullYear(year)\n }\n }\n\n return date\n}\n\nfunction getDate (isoDate) {\n var matches = DATE.exec(isoDate)\n if (!matches) {\n return\n }\n\n var year = parseInt(matches[1], 10)\n var isBC = !!matches[4]\n if (isBC) {\n year = bcYearToNegativeYear(year)\n }\n\n var month = parseInt(matches[2], 10) - 1\n var day = matches[3]\n // YYYY-MM-DD will be parsed as local time\n var date = new Date(year, month, day)\n\n if (is0To99(year)) {\n date.setFullYear(year)\n }\n\n return date\n}\n\n// match timezones:\n// Z (UTC)\n// -05\n// +06:30\nfunction timeZoneOffset (isoDate) {\n if (isoDate.endsWith('+00')) {\n return 0\n }\n\n var zone = TIME_ZONE.exec(isoDate.split(' ')[1])\n if (!zone) return\n var type = zone[1]\n\n if (type === 'Z') {\n return 0\n }\n var sign = type === '-' ? -1 : 1\n var offset = parseInt(zone[2], 10) * 3600 +\n parseInt(zone[3] || 0, 10) * 60 +\n parseInt(zone[4] || 0, 10)\n\n return offset * sign * 1000\n}\n\nfunction bcYearToNegativeYear (year) {\n // Account for numerical difference between representations of BC years\n // See: https://github.com/bendrucker/postgres-date/issues/5\n return -(year - 1)\n}\n\nfunction is0To99 (num) {\n return num >= 0 && num < 100\n}\n","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n","'use strict'\n\nvar extend = require('xtend/mutable')\n\nmodule.exports = PostgresInterval\n\nfunction PostgresInterval (raw) {\n if (!(this instanceof PostgresInterval)) {\n return new PostgresInterval(raw)\n }\n extend(this, parse(raw))\n}\nvar properties = ['seconds', 'minutes', 'hours', 'days', 'months', 'years']\nPostgresInterval.prototype.toPostgres = function () {\n var filtered = properties.filter(this.hasOwnProperty, this)\n\n // In addition to `properties`, we need to account for fractions of seconds.\n if (this.milliseconds && filtered.indexOf('seconds') < 0) {\n filtered.push('seconds')\n }\n\n if (filtered.length === 0) return '0'\n return filtered\n .map(function (property) {\n var value = this[property] || 0\n\n // Account for fractional part of seconds,\n // remove trailing zeroes.\n if (property === 'seconds' && this.milliseconds) {\n value = (value + this.milliseconds / 1000).toFixed(6).replace(/\\.?0+$/, '')\n }\n\n return value + ' ' + property\n }, this)\n .join(' ')\n}\n\nvar propertiesISOEquivalent = {\n years: 'Y',\n months: 'M',\n days: 'D',\n hours: 'H',\n minutes: 'M',\n seconds: 'S'\n}\nvar dateProperties = ['years', 'months', 'days']\nvar timeProperties = ['hours', 'minutes', 'seconds']\n// according to ISO 8601\nPostgresInterval.prototype.toISOString = PostgresInterval.prototype.toISO = function () {\n var datePart = dateProperties\n .map(buildProperty, this)\n .join('')\n\n var timePart = timeProperties\n .map(buildProperty, this)\n .join('')\n\n return 'P' + datePart + 'T' + timePart\n\n function buildProperty (property) {\n var value = this[property] || 0\n\n // Account for fractional part of seconds,\n // remove trailing zeroes.\n if (property === 'seconds' && this.milliseconds) {\n value = (value + this.milliseconds / 1000).toFixed(6).replace(/0+$/, '')\n }\n\n return value + propertiesISOEquivalent[property]\n }\n}\n\nvar NUMBER = '([+-]?\\\\d+)'\nvar YEAR = NUMBER + '\\\\s+years?'\nvar MONTH = NUMBER + '\\\\s+mons?'\nvar DAY = NUMBER + '\\\\s+days?'\nvar TIME = '([+-])?([\\\\d]*):(\\\\d\\\\d):(\\\\d\\\\d)\\\\.?(\\\\d{1,6})?'\nvar INTERVAL = new RegExp([YEAR, MONTH, DAY, TIME].map(function (regexString) {\n return '(' + regexString + ')?'\n})\n .join('\\\\s*'))\n\n// Positions of values in regex match\nvar positions = {\n years: 2,\n months: 4,\n days: 6,\n hours: 9,\n minutes: 10,\n seconds: 11,\n milliseconds: 12\n}\n// We can use negative time\nvar negatives = ['hours', 'minutes', 'seconds', 'milliseconds']\n\nfunction parseMilliseconds (fraction) {\n // add omitted zeroes\n var microseconds = fraction + '000000'.slice(fraction.length)\n return parseInt(microseconds, 10) / 1000\n}\n\nfunction parse (interval) {\n if (!interval) return {}\n var matches = INTERVAL.exec(interval)\n var isNegative = matches[8] === '-'\n return Object.keys(positions)\n .reduce(function (parsed, property) {\n var position = positions[property]\n var value = matches[position]\n // no empty string\n if (!value) return parsed\n // milliseconds are actually microseconds (up to 6 digits)\n // with omitted trailing zeroes.\n value = property === 'milliseconds'\n ? parseMilliseconds(value)\n : parseInt(value, 10)\n // no zeros\n if (!value) return parsed\n if (isNegative && ~negatives.indexOf(property)) {\n value *= -1\n }\n parsed[property] = value\n return parsed\n }, {})\n}\n","'use strict'\n\nvar bufferFrom = Buffer.from || Buffer\n\nmodule.exports = function parseBytea (input) {\n if (/^\\\\x/.test(input)) {\n // new 'hex' style response (pg >9.0)\n return bufferFrom(input.substr(2), 'hex')\n }\n var output = ''\n var i = 0\n while (i < input.length) {\n if (input[i] !== '\\\\') {\n output += input[i]\n ++i\n } else {\n if (/[0-7]{3}/.test(input.substr(i + 1, 3))) {\n output += String.fromCharCode(parseInt(input.substr(i + 1, 3), 8))\n i += 4\n } else {\n var backslashes = 1\n while (i + backslashes < input.length && input[i + backslashes] === '\\\\') {\n backslashes++\n }\n for (var k = 0; k < Math.floor(backslashes / 2); ++k) {\n output += '\\\\'\n }\n i += Math.floor(backslashes / 2) * 2\n }\n }\n }\n return bufferFrom(output, 'binary')\n}\n","var array = require('postgres-array')\nvar arrayParser = require('./arrayParser');\nvar parseDate = require('postgres-date');\nvar parseInterval = require('postgres-interval');\nvar parseByteA = require('postgres-bytea');\n\nfunction allowNull (fn) {\n return function nullAllowed (value) {\n if (value === null) return value\n return fn(value)\n }\n}\n\nfunction parseBool (value) {\n if (value === null) return value\n return value === 'TRUE' ||\n value === 't' ||\n value === 'true' ||\n value === 'y' ||\n value === 'yes' ||\n value === 'on' ||\n value === '1';\n}\n\nfunction parseBoolArray (value) {\n if (!value) return null\n return array.parse(value, parseBool)\n}\n\nfunction parseBaseTenInt (string) {\n return parseInt(string, 10)\n}\n\nfunction parseIntegerArray (value) {\n if (!value) return null\n return array.parse(value, allowNull(parseBaseTenInt))\n}\n\nfunction parseBigIntegerArray (value) {\n if (!value) return null\n return array.parse(value, allowNull(function (entry) {\n return parseBigInteger(entry).trim()\n }))\n}\n\nvar parsePointArray = function(value) {\n if(!value) { return null; }\n var p = arrayParser.create(value, function(entry) {\n if(entry !== null) {\n entry = parsePoint(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseFloatArray = function(value) {\n if(!value) { return null; }\n var p = arrayParser.create(value, function(entry) {\n if(entry !== null) {\n entry = parseFloat(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseStringArray = function(value) {\n if(!value) { return null; }\n\n var p = arrayParser.create(value);\n return p.parse();\n};\n\nvar parseDateArray = function(value) {\n if (!value) { return null; }\n\n var p = arrayParser.create(value, function(entry) {\n if (entry !== null) {\n entry = parseDate(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseIntervalArray = function(value) {\n if (!value) { return null; }\n\n var p = arrayParser.create(value, function(entry) {\n if (entry !== null) {\n entry = parseInterval(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseByteAArray = function(value) {\n if (!value) { return null; }\n\n return array.parse(value, allowNull(parseByteA));\n};\n\nvar parseInteger = function(value) {\n return parseInt(value, 10);\n};\n\nvar parseBigInteger = function(value) {\n var valStr = String(value);\n if (/^\\d+$/.test(valStr)) { return valStr; }\n return value;\n};\n\nvar parseJsonArray = function(value) {\n if (!value) { return null; }\n\n return array.parse(value, allowNull(JSON.parse));\n};\n\nvar parsePoint = function(value) {\n if (value[0] !== '(') { return null; }\n\n value = value.substring( 1, value.length - 1 ).split(',');\n\n return {\n x: parseFloat(value[0])\n , y: parseFloat(value[1])\n };\n};\n\nvar parseCircle = function(value) {\n if (value[0] !== '<' && value[1] !== '(') { return null; }\n\n var point = '(';\n var radius = '';\n var pointParsed = false;\n for (var i = 2; i < value.length - 1; i++){\n if (!pointParsed) {\n point += value[i];\n }\n\n if (value[i] === ')') {\n pointParsed = true;\n continue;\n } else if (!pointParsed) {\n continue;\n }\n\n if (value[i] === ','){\n continue;\n }\n\n radius += value[i];\n }\n var result = parsePoint(point);\n result.radius = parseFloat(radius);\n\n return result;\n};\n\nvar init = function(register) {\n register(20, parseBigInteger); // int8\n register(21, parseInteger); // int2\n register(23, parseInteger); // int4\n register(26, parseInteger); // oid\n register(700, parseFloat); // float4/real\n register(701, parseFloat); // float8/double\n register(16, parseBool);\n register(1082, parseDate); // date\n register(1114, parseDate); // timestamp without timezone\n register(1184, parseDate); // timestamp\n register(600, parsePoint); // point\n register(651, parseStringArray); // cidr[]\n register(718, parseCircle); // circle\n register(1000, parseBoolArray);\n register(1001, parseByteAArray);\n register(1005, parseIntegerArray); // _int2\n register(1007, parseIntegerArray); // _int4\n register(1028, parseIntegerArray); // oid[]\n register(1016, parseBigIntegerArray); // _int8\n register(1017, parsePointArray); // point[]\n register(1021, parseFloatArray); // _float4\n register(1022, parseFloatArray); // _float8\n register(1231, parseFloatArray); // _numeric\n register(1014, parseStringArray); //char\n register(1015, parseStringArray); //varchar\n register(1008, parseStringArray);\n register(1009, parseStringArray);\n register(1040, parseStringArray); // macaddr[]\n register(1041, parseStringArray); // inet[]\n register(1115, parseDateArray); // timestamp without time zone[]\n register(1182, parseDateArray); // _date\n register(1185, parseDateArray); // timestamp with time zone[]\n register(1186, parseInterval);\n register(1187, parseIntervalArray);\n register(17, parseByteA);\n register(114, JSON.parse.bind(JSON)); // json\n register(3802, JSON.parse.bind(JSON)); // jsonb\n register(199, parseJsonArray); // json[]\n register(3807, parseJsonArray); // jsonb[]\n register(3907, parseStringArray); // numrange[]\n register(2951, parseStringArray); // uuid[]\n register(791, parseStringArray); // money[]\n register(1183, parseStringArray); // time[]\n register(1270, parseStringArray); // timetz[]\n};\n\nmodule.exports = {\n init: init\n};\n","'use strict';\n\n// selected so (BASE - 1) * 0x100000000 + 0xffffffff is a safe integer\nvar BASE = 1000000;\n\nfunction readInt8(buffer) {\n\tvar high = buffer.readInt32BE(0);\n\tvar low = buffer.readUInt32BE(4);\n\tvar sign = '';\n\n\tif (high < 0) {\n\t\thigh = ~high + (low === 0);\n\t\tlow = (~low + 1) >>> 0;\n\t\tsign = '-';\n\t}\n\n\tvar result = '';\n\tvar carry;\n\tvar t;\n\tvar digits;\n\tvar pad;\n\tvar l;\n\tvar i;\n\n\t{\n\t\tcarry = high % BASE;\n\t\thigh = high / BASE >>> 0;\n\n\t\tt = 0x100000000 * carry + low;\n\t\tlow = t / BASE >>> 0;\n\t\tdigits = '' + (t - BASE * low);\n\n\t\tif (low === 0 && high === 0) {\n\t\t\treturn sign + digits + result;\n\t\t}\n\n\t\tpad = '';\n\t\tl = 6 - digits.length;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tpad += '0';\n\t\t}\n\n\t\tresult = pad + digits + result;\n\t}\n\n\t{\n\t\tcarry = high % BASE;\n\t\thigh = high / BASE >>> 0;\n\n\t\tt = 0x100000000 * carry + low;\n\t\tlow = t / BASE >>> 0;\n\t\tdigits = '' + (t - BASE * low);\n\n\t\tif (low === 0 && high === 0) {\n\t\t\treturn sign + digits + result;\n\t\t}\n\n\t\tpad = '';\n\t\tl = 6 - digits.length;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tpad += '0';\n\t\t}\n\n\t\tresult = pad + digits + result;\n\t}\n\n\t{\n\t\tcarry = high % BASE;\n\t\thigh = high / BASE >>> 0;\n\n\t\tt = 0x100000000 * carry + low;\n\t\tlow = t / BASE >>> 0;\n\t\tdigits = '' + (t - BASE * low);\n\n\t\tif (low === 0 && high === 0) {\n\t\t\treturn sign + digits + result;\n\t\t}\n\n\t\tpad = '';\n\t\tl = 6 - digits.length;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tpad += '0';\n\t\t}\n\n\t\tresult = pad + digits + result;\n\t}\n\n\t{\n\t\tcarry = high % BASE;\n\t\tt = 0x100000000 * carry + low;\n\t\tdigits = '' + t % BASE;\n\n\t\treturn sign + digits + result;\n\t}\n}\n\nmodule.exports = readInt8;\n","var parseInt64 = require('pg-int8');\n\nvar parseBits = function(data, bits, offset, invert, callback) {\n offset = offset || 0;\n invert = invert || false;\n callback = callback || function(lastValue, newValue, bits) { return (lastValue * Math.pow(2, bits)) + newValue; };\n var offsetBytes = offset >> 3;\n\n var inv = function(value) {\n if (invert) {\n return ~value & 0xff;\n }\n\n return value;\n };\n\n // read first (maybe partial) byte\n var mask = 0xff;\n var firstBits = 8 - (offset % 8);\n if (bits < firstBits) {\n mask = (0xff << (8 - bits)) & 0xff;\n firstBits = bits;\n }\n\n if (offset) {\n mask = mask >> (offset % 8);\n }\n\n var result = 0;\n if ((offset % 8) + bits >= 8) {\n result = callback(0, inv(data[offsetBytes]) & mask, firstBits);\n }\n\n // read bytes\n var bytes = (bits + offset) >> 3;\n for (var i = offsetBytes + 1; i < bytes; i++) {\n result = callback(result, inv(data[i]), 8);\n }\n\n // bits to read, that are not a complete byte\n var lastBits = (bits + offset) % 8;\n if (lastBits > 0) {\n result = callback(result, inv(data[bytes]) >> (8 - lastBits), lastBits);\n }\n\n return result;\n};\n\nvar parseFloatFromBits = function(data, precisionBits, exponentBits) {\n var bias = Math.pow(2, exponentBits - 1) - 1;\n var sign = parseBits(data, 1);\n var exponent = parseBits(data, exponentBits, 1);\n\n if (exponent === 0) {\n return 0;\n }\n\n // parse mantissa\n var precisionBitsCounter = 1;\n var parsePrecisionBits = function(lastValue, newValue, bits) {\n if (lastValue === 0) {\n lastValue = 1;\n }\n\n for (var i = 1; i <= bits; i++) {\n precisionBitsCounter /= 2;\n if ((newValue & (0x1 << (bits - i))) > 0) {\n lastValue += precisionBitsCounter;\n }\n }\n\n return lastValue;\n };\n\n var mantissa = parseBits(data, precisionBits, exponentBits + 1, false, parsePrecisionBits);\n\n // special cases\n if (exponent == (Math.pow(2, exponentBits + 1) - 1)) {\n if (mantissa === 0) {\n return (sign === 0) ? Infinity : -Infinity;\n }\n\n return NaN;\n }\n\n // normale number\n return ((sign === 0) ? 1 : -1) * Math.pow(2, exponent - bias) * mantissa;\n};\n\nvar parseInt16 = function(value) {\n if (parseBits(value, 1) == 1) {\n return -1 * (parseBits(value, 15, 1, true) + 1);\n }\n\n return parseBits(value, 15, 1);\n};\n\nvar parseInt32 = function(value) {\n if (parseBits(value, 1) == 1) {\n return -1 * (parseBits(value, 31, 1, true) + 1);\n }\n\n return parseBits(value, 31, 1);\n};\n\nvar parseFloat32 = function(value) {\n return parseFloatFromBits(value, 23, 8);\n};\n\nvar parseFloat64 = function(value) {\n return parseFloatFromBits(value, 52, 11);\n};\n\nvar parseNumeric = function(value) {\n var sign = parseBits(value, 16, 32);\n if (sign == 0xc000) {\n return NaN;\n }\n\n var weight = Math.pow(10000, parseBits(value, 16, 16));\n var result = 0;\n\n var digits = [];\n var ndigits = parseBits(value, 16);\n for (var i = 0; i < ndigits; i++) {\n result += parseBits(value, 16, 64 + (16 * i)) * weight;\n weight /= 10000;\n }\n\n var scale = Math.pow(10, parseBits(value, 16, 48));\n return ((sign === 0) ? 1 : -1) * Math.round(result * scale) / scale;\n};\n\nvar parseDate = function(isUTC, value) {\n var sign = parseBits(value, 1);\n var rawValue = parseBits(value, 63, 1);\n\n // discard usecs and shift from 2000 to 1970\n var result = new Date((((sign === 0) ? 1 : -1) * rawValue / 1000) + 946684800000);\n\n if (!isUTC) {\n result.setTime(result.getTime() + result.getTimezoneOffset() * 60000);\n }\n\n // add microseconds to the date\n result.usec = rawValue % 1000;\n result.getMicroSeconds = function() {\n return this.usec;\n };\n result.setMicroSeconds = function(value) {\n this.usec = value;\n };\n result.getUTCMicroSeconds = function() {\n return this.usec;\n };\n\n return result;\n};\n\nvar parseArray = function(value) {\n var dim = parseBits(value, 32);\n\n var flags = parseBits(value, 32, 32);\n var elementType = parseBits(value, 32, 64);\n\n var offset = 96;\n var dims = [];\n for (var i = 0; i < dim; i++) {\n // parse dimension\n dims[i] = parseBits(value, 32, offset);\n offset += 32;\n\n // ignore lower bounds\n offset += 32;\n }\n\n var parseElement = function(elementType) {\n // parse content length\n var length = parseBits(value, 32, offset);\n offset += 32;\n\n // parse null values\n if (length == 0xffffffff) {\n return null;\n }\n\n var result;\n if ((elementType == 0x17) || (elementType == 0x14)) {\n // int/bigint\n result = parseBits(value, length * 8, offset);\n offset += length * 8;\n return result;\n }\n else if (elementType == 0x19) {\n // string\n result = value.toString(this.encoding, offset >> 3, (offset += (length << 3)) >> 3);\n return result;\n }\n else {\n console.log(\"ERROR: ElementType not implemented: \" + elementType);\n }\n };\n\n var parse = function(dimension, elementType) {\n var array = [];\n var i;\n\n if (dimension.length > 1) {\n var count = dimension.shift();\n for (i = 0; i < count; i++) {\n array[i] = parse(dimension, elementType);\n }\n dimension.unshift(count);\n }\n else {\n for (i = 0; i < dimension[0]; i++) {\n array[i] = parseElement(elementType);\n }\n }\n\n return array;\n };\n\n return parse(dims, elementType);\n};\n\nvar parseText = function(value) {\n return value.toString('utf8');\n};\n\nvar parseBool = function(value) {\n if(value === null) return null;\n return (parseBits(value, 8) > 0);\n};\n\nvar init = function(register) {\n register(20, parseInt64);\n register(21, parseInt16);\n register(23, parseInt32);\n register(26, parseInt32);\n register(1700, parseNumeric);\n register(700, parseFloat32);\n register(701, parseFloat64);\n register(16, parseBool);\n register(1114, parseDate.bind(null, false));\n register(1184, parseDate.bind(null, true));\n register(1000, parseArray);\n register(1007, parseArray);\n register(1016, parseArray);\n register(1008, parseArray);\n register(1009, parseArray);\n register(25, parseText);\n};\n\nmodule.exports = {\n init: init\n};\n","/**\n * Following query was used to generate this file:\n\n SELECT json_object_agg(UPPER(PT.typname), PT.oid::int4 ORDER BY pt.oid)\n FROM pg_type PT\n WHERE typnamespace = (SELECT pgn.oid FROM pg_namespace pgn WHERE nspname = 'pg_catalog') -- Take only builting Postgres types with stable OID (extension types are not guaranted to be stable)\n AND typtype = 'b' -- Only basic types\n AND typelem = 0 -- Ignore aliases\n AND typisdefined -- Ignore undefined types\n */\n\nmodule.exports = {\n BOOL: 16,\n BYTEA: 17,\n CHAR: 18,\n INT8: 20,\n INT2: 21,\n INT4: 23,\n REGPROC: 24,\n TEXT: 25,\n OID: 26,\n TID: 27,\n XID: 28,\n CID: 29,\n JSON: 114,\n XML: 142,\n PG_NODE_TREE: 194,\n SMGR: 210,\n PATH: 602,\n POLYGON: 604,\n CIDR: 650,\n FLOAT4: 700,\n FLOAT8: 701,\n ABSTIME: 702,\n RELTIME: 703,\n TINTERVAL: 704,\n CIRCLE: 718,\n MACADDR8: 774,\n MONEY: 790,\n MACADDR: 829,\n INET: 869,\n ACLITEM: 1033,\n BPCHAR: 1042,\n VARCHAR: 1043,\n DATE: 1082,\n TIME: 1083,\n TIMESTAMP: 1114,\n TIMESTAMPTZ: 1184,\n INTERVAL: 1186,\n TIMETZ: 1266,\n BIT: 1560,\n VARBIT: 1562,\n NUMERIC: 1700,\n REFCURSOR: 1790,\n REGPROCEDURE: 2202,\n REGOPER: 2203,\n REGOPERATOR: 2204,\n REGCLASS: 2205,\n REGTYPE: 2206,\n UUID: 2950,\n TXID_SNAPSHOT: 2970,\n PG_LSN: 3220,\n PG_NDISTINCT: 3361,\n PG_DEPENDENCIES: 3402,\n TSVECTOR: 3614,\n TSQUERY: 3615,\n GTSVECTOR: 3642,\n REGCONFIG: 3734,\n REGDICTIONARY: 3769,\n JSONB: 3802,\n REGNAMESPACE: 4089,\n REGROLE: 4096\n};\n","var textParsers = require('./lib/textParsers');\nvar binaryParsers = require('./lib/binaryParsers');\nvar arrayParser = require('./lib/arrayParser');\nvar builtinTypes = require('./lib/builtins');\n\nexports.getTypeParser = getTypeParser;\nexports.setTypeParser = setTypeParser;\nexports.arrayParser = arrayParser;\nexports.builtins = builtinTypes;\n\nvar typeParsers = {\n text: {},\n binary: {}\n};\n\n//the empty parse function\nfunction noParse (val) {\n return String(val);\n};\n\n//returns a function used to convert a specific type (specified by\n//oid) into a result javascript type\n//note: the oid can be obtained via the following sql query:\n//SELECT oid FROM pg_type WHERE typname = 'TYPE_NAME_HERE';\nfunction getTypeParser (oid, format) {\n format = format || 'text';\n if (!typeParsers[format]) {\n return noParse;\n }\n return typeParsers[format][oid] || noParse;\n};\n\nfunction setTypeParser (oid, format, parseFn) {\n if(typeof format == 'function') {\n parseFn = format;\n format = 'text';\n }\n typeParsers[format][oid] = parseFn;\n};\n\ntextParsers.init(function(oid, converter) {\n typeParsers.text[oid] = converter;\n});\n\nbinaryParsers.init(function(oid, converter) {\n typeParsers.binary[oid] = converter;\n});\n","'use strict'\n\nlet user\ntry {\n user = process.platform === 'win32' ? process.env.USERNAME : process.env.USER\n} catch {\n // ignore, e.g., Deno without --allow-env\n}\n\nmodule.exports = {\n // database host. defaults to localhost\n host: 'localhost',\n\n // database user's name\n user,\n\n // name of database to connect\n database: undefined,\n\n // database user's password\n password: null,\n\n // a Postgres connection string to be used instead of setting individual connection items\n // NOTE: Setting this value will cause it to override any other value (such as database or user) defined\n // in the defaults object.\n connectionString: undefined,\n\n // database port\n port: 5432,\n\n // number of rows to return at a time from a prepared statement's\n // portal. 0 will return all rows at once\n rows: 0,\n\n // binary result mode\n binary: false,\n\n // Connection pool options - see https://github.com/brianc/node-pg-pool\n\n // number of connections to use in connection pool\n // 0 will disable connection pooling\n max: 10,\n\n // max milliseconds a client can go unused before it is removed\n // from the pool and destroyed\n idleTimeoutMillis: 30000,\n\n client_encoding: '',\n\n ssl: false,\n\n application_name: undefined,\n\n fallback_application_name: undefined,\n\n options: undefined,\n\n parseInputDatesAsUTC: false,\n\n // max milliseconds any query using this connection will execute for before timing out in error.\n // false=unlimited\n statement_timeout: false,\n\n // Abort any statement that waits longer than the specified duration in milliseconds while attempting to acquire a lock.\n // false=unlimited\n lock_timeout: false,\n\n // Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds\n // false=unlimited\n idle_in_transaction_session_timeout: false,\n\n // max milliseconds to wait for query to complete (client side)\n query_timeout: false,\n\n connect_timeout: 0,\n\n keepalives: 1,\n\n keepalives_idle: 0,\n}\n\nconst pgTypes = require('pg-types')\n// save default parsers\nconst parseBigInteger = pgTypes.getTypeParser(20, 'text')\nconst parseBigIntegerArray = pgTypes.getTypeParser(1016, 'text')\n\n// parse int8 so you can get your count values as actual numbers\nmodule.exports.__defineSetter__('parseInt8', function (val) {\n pgTypes.setTypeParser(20, 'text', val ? pgTypes.getTypeParser(23, 'text') : parseBigInteger)\n pgTypes.setTypeParser(1016, 'text', val ? pgTypes.getTypeParser(1007, 'text') : parseBigIntegerArray)\n})\n","'use strict'\n\nconst defaults = require('./defaults')\n\nconst util = require('util')\nconst { isDate } = util.types || util // Node 8 doesn't have `util.types`\n\nfunction escapeElement(elementRepresentation) {\n const escaped = elementRepresentation.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n\n return '\"' + escaped + '\"'\n}\n\n// convert a JS array to a postgres array literal\n// uses comma separator so won't work for types like box that use\n// a different array separator.\nfunction arrayString(val) {\n let result = '{'\n for (let i = 0; i < val.length; i++) {\n if (i > 0) {\n result = result + ','\n }\n if (val[i] === null || typeof val[i] === 'undefined') {\n result = result + 'NULL'\n } else if (Array.isArray(val[i])) {\n result = result + arrayString(val[i])\n } else if (ArrayBuffer.isView(val[i])) {\n let item = val[i]\n if (!(item instanceof Buffer)) {\n const buf = Buffer.from(item.buffer, item.byteOffset, item.byteLength)\n if (buf.length === item.byteLength) {\n item = buf\n } else {\n item = buf.slice(item.byteOffset, item.byteOffset + item.byteLength)\n }\n }\n result += '\\\\\\\\x' + item.toString('hex')\n } else {\n result += escapeElement(prepareValue(val[i]))\n }\n }\n result = result + '}'\n return result\n}\n\n// converts values from javascript types\n// to their 'raw' counterparts for use as a postgres parameter\n// note: you can override this function to provide your own conversion mechanism\n// for complex types, etc...\nconst prepareValue = function (val, seen) {\n // null and undefined are both null for postgres\n if (val == null) {\n return null\n }\n if (typeof val === 'object') {\n if (val instanceof Buffer) {\n return val\n }\n if (ArrayBuffer.isView(val)) {\n const buf = Buffer.from(val.buffer, val.byteOffset, val.byteLength)\n if (buf.length === val.byteLength) {\n return buf\n }\n return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params\n }\n if (isDate(val)) {\n if (defaults.parseInputDatesAsUTC) {\n return dateToStringUTC(val)\n } else {\n return dateToString(val)\n }\n }\n if (Array.isArray(val)) {\n return arrayString(val)\n }\n\n return prepareObject(val, seen)\n }\n return val.toString()\n}\n\nfunction prepareObject(val, seen) {\n if (val && typeof val.toPostgres === 'function') {\n seen = seen || []\n if (seen.indexOf(val) !== -1) {\n throw new Error('circular reference detected while preparing \"' + val + '\" for query')\n }\n seen.push(val)\n\n return prepareValue(val.toPostgres(prepareValue), seen)\n }\n return JSON.stringify(val)\n}\n\nfunction dateToString(date) {\n let offset = -date.getTimezoneOffset()\n\n let year = date.getFullYear()\n const isBCYear = year < 1\n if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation\n\n let ret =\n String(year).padStart(4, '0') +\n '-' +\n String(date.getMonth() + 1).padStart(2, '0') +\n '-' +\n String(date.getDate()).padStart(2, '0') +\n 'T' +\n String(date.getHours()).padStart(2, '0') +\n ':' +\n String(date.getMinutes()).padStart(2, '0') +\n ':' +\n String(date.getSeconds()).padStart(2, '0') +\n '.' +\n String(date.getMilliseconds()).padStart(3, '0')\n\n if (offset < 0) {\n ret += '-'\n offset *= -1\n } else {\n ret += '+'\n }\n\n ret += String(Math.floor(offset / 60)).padStart(2, '0') + ':' + String(offset % 60).padStart(2, '0')\n if (isBCYear) ret += ' BC'\n return ret\n}\n\nfunction dateToStringUTC(date) {\n let year = date.getUTCFullYear()\n const isBCYear = year < 1\n if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation\n\n let ret =\n String(year).padStart(4, '0') +\n '-' +\n String(date.getUTCMonth() + 1).padStart(2, '0') +\n '-' +\n String(date.getUTCDate()).padStart(2, '0') +\n 'T' +\n String(date.getUTCHours()).padStart(2, '0') +\n ':' +\n String(date.getUTCMinutes()).padStart(2, '0') +\n ':' +\n String(date.getUTCSeconds()).padStart(2, '0') +\n '.' +\n String(date.getUTCMilliseconds()).padStart(3, '0')\n\n ret += '+00:00'\n if (isBCYear) ret += ' BC'\n return ret\n}\n\nfunction normalizeQueryConfig(config, values, callback) {\n // can take in strings or config objects\n config = typeof config === 'string' ? { text: config } : config\n if (values) {\n if (typeof values === 'function') {\n config.callback = values\n } else {\n config.values = values\n }\n }\n if (callback) {\n config.callback = callback\n }\n return config\n}\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst escapeIdentifier = function (str) {\n return '\"' + str.replace(/\"/g, '\"\"') + '\"'\n}\n\nconst escapeLiteral = function (str) {\n let hasBackslash = false\n let escaped = \"'\"\n\n if (str == null) {\n return \"''\"\n }\n\n if (typeof str !== 'string') {\n return \"''\"\n }\n\n for (let i = 0; i < str.length; i++) {\n const c = str[i]\n if (c === \"'\") {\n escaped += c + c\n } else if (c === '\\\\') {\n escaped += c + c\n hasBackslash = true\n } else {\n escaped += c\n }\n }\n\n escaped += \"'\"\n\n if (hasBackslash === true) {\n escaped = ' E' + escaped\n }\n\n return escaped\n}\n\nmodule.exports = {\n prepareValue: function prepareValueWrapper(value) {\n // this ensures that extra arguments do not get passed into prepareValue\n // by accident, eg: from calling values.map(utils.prepareValue)\n return prepareValue(value)\n },\n normalizeQueryConfig,\n escapeIdentifier,\n escapeLiteral,\n}\n","'use strict'\n// This file contains crypto utility functions for versions of Node.js < 15.0.0,\n// which does not support the WebCrypto.subtle API.\n\nconst nodeCrypto = require('crypto')\n\nfunction md5(string) {\n return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')\n}\n\n// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html\nfunction postgresMd5PasswordHash(user, password, salt) {\n const inner = md5(password + user)\n const outer = md5(Buffer.concat([Buffer.from(inner), salt]))\n return 'md5' + outer\n}\n\nfunction sha256(text) {\n return nodeCrypto.createHash('sha256').update(text).digest()\n}\n\nfunction hashByName(hashName, text) {\n hashName = hashName.replace(/(\\D)-/, '$1') // e.g. SHA-256 -> SHA256\n return nodeCrypto.createHash(hashName).update(text).digest()\n}\n\nfunction hmacSha256(key, msg) {\n return nodeCrypto.createHmac('sha256', key).update(msg).digest()\n}\n\nasync function deriveKey(password, salt, iterations) {\n return nodeCrypto.pbkdf2Sync(password, salt, iterations, 32, 'sha256')\n}\n\nmodule.exports = {\n postgresMd5PasswordHash,\n randomBytes: nodeCrypto.randomBytes,\n deriveKey,\n sha256,\n hashByName,\n hmacSha256,\n md5,\n}\n","const nodeCrypto = require('crypto')\n\nmodule.exports = {\n postgresMd5PasswordHash,\n randomBytes,\n deriveKey,\n sha256,\n hashByName,\n hmacSha256,\n md5,\n}\n\n/**\n * The Web Crypto API - grabbed from the Node.js library or the global\n * @type Crypto\n */\n// eslint-disable-next-line no-undef\nconst webCrypto = nodeCrypto.webcrypto || globalThis.crypto\n/**\n * The SubtleCrypto API for low level crypto operations.\n * @type SubtleCrypto\n */\nconst subtleCrypto = webCrypto.subtle\nconst textEncoder = new TextEncoder()\n\n/**\n *\n * @param {*} length\n * @returns\n */\nfunction randomBytes(length) {\n return webCrypto.getRandomValues(Buffer.alloc(length))\n}\n\nasync function md5(string) {\n try {\n return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')\n } catch (e) {\n // `createHash()` failed so we are probably not in Node.js, use the WebCrypto API instead.\n // Note that the MD5 algorithm on WebCrypto is not available in Node.js.\n // This is why we cannot just use WebCrypto in all environments.\n const data = typeof string === 'string' ? textEncoder.encode(string) : string\n const hash = await subtleCrypto.digest('MD5', data)\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n}\n\n// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html\nasync function postgresMd5PasswordHash(user, password, salt) {\n const inner = await md5(password + user)\n const outer = await md5(Buffer.concat([Buffer.from(inner), salt]))\n return 'md5' + outer\n}\n\n/**\n * Create a SHA-256 digest of the given data\n * @param {Buffer} data\n */\nasync function sha256(text) {\n return await subtleCrypto.digest('SHA-256', text)\n}\n\nasync function hashByName(hashName, text) {\n return await subtleCrypto.digest(hashName, text)\n}\n\n/**\n * Sign the message with the given key\n * @param {ArrayBuffer} keyBuffer\n * @param {string} msg\n */\nasync function hmacSha256(keyBuffer, msg) {\n const key = await subtleCrypto.importKey('raw', keyBuffer, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])\n return await subtleCrypto.sign('HMAC', key, textEncoder.encode(msg))\n}\n\n/**\n * Derive a key from the password and salt\n * @param {string} password\n * @param {Uint8Array} salt\n * @param {number} iterations\n */\nasync function deriveKey(password, salt, iterations) {\n const key = await subtleCrypto.importKey('raw', textEncoder.encode(password), 'PBKDF2', false, ['deriveBits'])\n const params = { name: 'PBKDF2', hash: 'SHA-256', salt: salt, iterations: iterations }\n return await subtleCrypto.deriveBits(params, key, 32 * 8, ['deriveBits'])\n}\n","'use strict'\n\nconst useLegacyCrypto = parseInt(process.versions && process.versions.node && process.versions.node.split('.')[0]) < 15\nif (useLegacyCrypto) {\n // We are on an old version of Node.js that requires legacy crypto utilities.\n module.exports = require('./utils-legacy')\n} else {\n module.exports = require('./utils-webcrypto')\n}\n","function x509Error(msg, cert) {\n return new Error('SASL channel binding: ' + msg + ' when parsing public certificate ' + cert.toString('base64'))\n}\n\nfunction readASN1Length(data, index) {\n let length = data[index++]\n if (length < 0x80) return { length, index }\n\n const lengthBytes = length & 0x7f\n if (lengthBytes > 4) throw x509Error('bad length', data)\n\n length = 0\n for (let i = 0; i < lengthBytes; i++) {\n length = (length << 8) | data[index++]\n }\n\n return { length, index }\n}\n\nfunction readASN1OID(data, index) {\n if (data[index++] !== 0x6) throw x509Error('non-OID data', data) // 6 = OID\n\n const { length: OIDLength, index: indexAfterOIDLength } = readASN1Length(data, index)\n index = indexAfterOIDLength\n const lastIndex = index + OIDLength\n\n const byte1 = data[index++]\n let oid = ((byte1 / 40) >> 0) + '.' + (byte1 % 40)\n\n while (index < lastIndex) {\n // loop over numbers in OID\n let value = 0\n while (index < lastIndex) {\n // loop over bytes in number\n const nextByte = data[index++]\n value = (value << 7) | (nextByte & 0x7f)\n if (nextByte < 0x80) break\n }\n oid += '.' + value\n }\n\n return { oid, index }\n}\n\nfunction expectASN1Seq(data, index) {\n if (data[index++] !== 0x30) throw x509Error('non-sequence data', data) // 30 = Sequence\n return readASN1Length(data, index)\n}\n\nfunction signatureAlgorithmHashFromCertificate(data, index) {\n // read this thread: https://www.postgresql.org/message-id/17760-b6c61e752ec07060%40postgresql.org\n if (index === undefined) index = 0\n index = expectASN1Seq(data, index).index\n const { length: certInfoLength, index: indexAfterCertInfoLength } = expectASN1Seq(data, index)\n index = indexAfterCertInfoLength + certInfoLength // skip over certificate info\n index = expectASN1Seq(data, index).index // skip over signature length field\n const { oid, index: indexAfterOID } = readASN1OID(data, index)\n switch (oid) {\n // RSA\n case '1.2.840.113549.1.1.4':\n return 'MD5'\n case '1.2.840.113549.1.1.5':\n return 'SHA-1'\n case '1.2.840.113549.1.1.11':\n return 'SHA-256'\n case '1.2.840.113549.1.1.12':\n return 'SHA-384'\n case '1.2.840.113549.1.1.13':\n return 'SHA-512'\n case '1.2.840.113549.1.1.14':\n return 'SHA-224'\n case '1.2.840.113549.1.1.15':\n return 'SHA512-224'\n case '1.2.840.113549.1.1.16':\n return 'SHA512-256'\n // ECDSA\n case '1.2.840.10045.4.1':\n return 'SHA-1'\n case '1.2.840.10045.4.3.1':\n return 'SHA-224'\n case '1.2.840.10045.4.3.2':\n return 'SHA-256'\n case '1.2.840.10045.4.3.3':\n return 'SHA-384'\n case '1.2.840.10045.4.3.4':\n return 'SHA-512'\n // RSASSA-PSS: hash is indicated separately\n case '1.2.840.113549.1.1.10': {\n index = indexAfterOID\n index = expectASN1Seq(data, index).index\n if (data[index++] !== 0xa0) throw x509Error('non-tag data', data) // a0 = constructed tag 0\n index = readASN1Length(data, index).index // skip over tag length field\n index = expectASN1Seq(data, index).index // skip over sequence length field\n const { oid: hashOID } = readASN1OID(data, index)\n switch (hashOID) {\n // standalone hash OIDs\n case '1.2.840.113549.2.5':\n return 'MD5'\n case '1.3.14.3.2.26':\n return 'SHA-1'\n case '2.16.840.1.101.3.4.2.1':\n return 'SHA-256'\n case '2.16.840.1.101.3.4.2.2':\n return 'SHA-384'\n case '2.16.840.1.101.3.4.2.3':\n return 'SHA-512'\n }\n throw x509Error('unknown hash OID ' + hashOID, data)\n }\n // Ed25519 -- see https: return//github.com/openssl/openssl/issues/15477\n case '1.3.101.110':\n case '1.3.101.112': // ph\n return 'SHA-512'\n // Ed448 -- still not in pg 17.2 (if supported, digest would be SHAKE256 x 64 bytes)\n case '1.3.101.111':\n case '1.3.101.113': // ph\n throw x509Error('Ed448 certificate channel binding is not currently supported by Postgres')\n }\n throw x509Error('unknown OID ' + oid, data)\n}\n\nmodule.exports = { signatureAlgorithmHashFromCertificate }\n","'use strict'\nconst crypto = require('./utils')\nconst { signatureAlgorithmHashFromCertificate } = require('./cert-signatures')\n\nfunction startSession(mechanisms, stream) {\n const candidates = ['SCRAM-SHA-256']\n if (stream) candidates.unshift('SCRAM-SHA-256-PLUS') // higher-priority, so placed first\n\n const mechanism = candidates.find((candidate) => mechanisms.includes(candidate))\n\n if (!mechanism) {\n throw new Error('SASL: Only mechanism(s) ' + candidates.join(' and ') + ' are supported')\n }\n\n if (mechanism === 'SCRAM-SHA-256-PLUS' && typeof stream.getPeerCertificate !== 'function') {\n // this should never happen if we are really talking to a Postgres server\n throw new Error('SASL: Mechanism SCRAM-SHA-256-PLUS requires a certificate')\n }\n\n const clientNonce = crypto.randomBytes(18).toString('base64')\n const gs2Header = mechanism === 'SCRAM-SHA-256-PLUS' ? 'p=tls-server-end-point' : stream ? 'y' : 'n'\n\n return {\n mechanism,\n clientNonce,\n response: gs2Header + ',,n=*,r=' + clientNonce,\n message: 'SASLInitialResponse',\n }\n}\n\nasync function continueSession(session, password, serverData, stream) {\n if (session.message !== 'SASLInitialResponse') {\n throw new Error('SASL: Last message was not SASLInitialResponse')\n }\n if (typeof password !== 'string') {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')\n }\n if (password === '') {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a non-empty string')\n }\n if (typeof serverData !== 'string') {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: serverData must be a string')\n }\n\n const sv = parseServerFirstMessage(serverData)\n\n if (!sv.nonce.startsWith(session.clientNonce)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce does not start with client nonce')\n } else if (sv.nonce.length === session.clientNonce.length) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce is too short')\n }\n\n const clientFirstMessageBare = 'n=*,r=' + session.clientNonce\n const serverFirstMessage = 'r=' + sv.nonce + ',s=' + sv.salt + ',i=' + sv.iteration\n\n // without channel binding:\n let channelBinding = stream ? 'eSws' : 'biws' // 'y,,' or 'n,,', base64-encoded\n\n // override if channel binding is in use:\n if (session.mechanism === 'SCRAM-SHA-256-PLUS') {\n const peerCert = stream.getPeerCertificate().raw\n let hashName = signatureAlgorithmHashFromCertificate(peerCert)\n if (hashName === 'MD5' || hashName === 'SHA-1') hashName = 'SHA-256'\n const certHash = await crypto.hashByName(hashName, peerCert)\n const bindingData = Buffer.concat([Buffer.from('p=tls-server-end-point,,'), Buffer.from(certHash)])\n channelBinding = bindingData.toString('base64')\n }\n\n const clientFinalMessageWithoutProof = 'c=' + channelBinding + ',r=' + sv.nonce\n const authMessage = clientFirstMessageBare + ',' + serverFirstMessage + ',' + clientFinalMessageWithoutProof\n\n const saltBytes = Buffer.from(sv.salt, 'base64')\n const saltedPassword = await crypto.deriveKey(password, saltBytes, sv.iteration)\n const clientKey = await crypto.hmacSha256(saltedPassword, 'Client Key')\n const storedKey = await crypto.sha256(clientKey)\n const clientSignature = await crypto.hmacSha256(storedKey, authMessage)\n const clientProof = xorBuffers(Buffer.from(clientKey), Buffer.from(clientSignature)).toString('base64')\n const serverKey = await crypto.hmacSha256(saltedPassword, 'Server Key')\n const serverSignatureBytes = await crypto.hmacSha256(serverKey, authMessage)\n\n session.message = 'SASLResponse'\n session.serverSignature = Buffer.from(serverSignatureBytes).toString('base64')\n session.response = clientFinalMessageWithoutProof + ',p=' + clientProof\n}\n\nfunction finalizeSession(session, serverData) {\n if (session.message !== 'SASLResponse') {\n throw new Error('SASL: Last message was not SASLResponse')\n }\n if (typeof serverData !== 'string') {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: serverData must be a string')\n }\n\n const { serverSignature } = parseServerFinalMessage(serverData)\n\n if (serverSignature !== session.serverSignature) {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature does not match')\n }\n}\n\n/**\n * printable = %x21-2B / %x2D-7E\n * ;; Printable ASCII except \",\".\n * ;; Note that any \"printable\" is also\n * ;; a valid \"value\".\n */\nfunction isPrintableChars(text) {\n if (typeof text !== 'string') {\n throw new TypeError('SASL: text must be a string')\n }\n return text\n .split('')\n .map((_, i) => text.charCodeAt(i))\n .every((c) => (c >= 0x21 && c <= 0x2b) || (c >= 0x2d && c <= 0x7e))\n}\n\n/**\n * base64-char = ALPHA / DIGIT / \"/\" / \"+\"\n *\n * base64-4 = 4base64-char\n *\n * base64-3 = 3base64-char \"=\"\n *\n * base64-2 = 2base64-char \"==\"\n *\n * base64 = *base64-4 [base64-3 / base64-2]\n */\nfunction isBase64(text) {\n return /^(?:[a-zA-Z0-9+/]{4})*(?:[a-zA-Z0-9+/]{2}==|[a-zA-Z0-9+/]{3}=)?$/.test(text)\n}\n\nfunction parseAttributePairs(text) {\n if (typeof text !== 'string') {\n throw new TypeError('SASL: attribute pairs text must be a string')\n }\n\n return new Map(\n text.split(',').map((attrValue) => {\n if (!/^.=/.test(attrValue)) {\n throw new Error('SASL: Invalid attribute pair entry')\n }\n const name = attrValue[0]\n const value = attrValue.substring(2)\n return [name, value]\n })\n )\n}\n\nfunction parseServerFirstMessage(data) {\n const attrPairs = parseAttributePairs(data)\n\n const nonce = attrPairs.get('r')\n if (!nonce) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce missing')\n } else if (!isPrintableChars(nonce)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce must only contain printable characters')\n }\n const salt = attrPairs.get('s')\n if (!salt) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt missing')\n } else if (!isBase64(salt)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt must be base64')\n }\n const iterationText = attrPairs.get('i')\n if (!iterationText) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: iteration missing')\n } else if (!/^[1-9][0-9]*$/.test(iterationText)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: invalid iteration count')\n }\n const iteration = parseInt(iterationText, 10)\n\n return {\n nonce,\n salt,\n iteration,\n }\n}\n\nfunction parseServerFinalMessage(serverData) {\n const attrPairs = parseAttributePairs(serverData)\n const serverSignature = attrPairs.get('v')\n if (!serverSignature) {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature is missing')\n } else if (!isBase64(serverSignature)) {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature must be base64')\n }\n return {\n serverSignature,\n }\n}\n\nfunction xorBuffers(a, b) {\n if (!Buffer.isBuffer(a)) {\n throw new TypeError('first argument must be a Buffer')\n }\n if (!Buffer.isBuffer(b)) {\n throw new TypeError('second argument must be a Buffer')\n }\n if (a.length !== b.length) {\n throw new Error('Buffer lengths must match')\n }\n if (a.length === 0) {\n throw new Error('Buffers cannot be empty')\n }\n return Buffer.from(a.map((_, i) => a[i] ^ b[i]))\n}\n\nmodule.exports = {\n startSession,\n continueSession,\n finalizeSession,\n}\n","'use strict'\n\nconst types = require('pg-types')\n\nfunction TypeOverrides(userTypes) {\n this._types = userTypes || types\n this.text = {}\n this.binary = {}\n}\n\nTypeOverrides.prototype.getOverrides = function (format) {\n switch (format) {\n case 'text':\n return this.text\n case 'binary':\n return this.binary\n default:\n return {}\n }\n}\n\nTypeOverrides.prototype.setTypeParser = function (oid, format, parseFn) {\n if (typeof format === 'function') {\n parseFn = format\n format = 'text'\n }\n this.getOverrides(format)[oid] = parseFn\n}\n\nTypeOverrides.prototype.getTypeParser = function (oid, format) {\n format = format || 'text'\n return this.getOverrides(format)[oid] || this._types.getTypeParser(oid, format)\n}\n\nmodule.exports = TypeOverrides\n","'use strict'\n\n//Parse method copied from https://github.com/brianc/node-postgres\n//Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)\n//MIT License\n\n//parses a connection string\nfunction parse(str, options = {}) {\n //unix socket\n if (str.charAt(0) === '/') {\n const config = str.split(' ')\n return { host: config[0], database: config[1] }\n }\n\n // Check for empty host in URL\n\n const config = {}\n let result\n let dummyHost = false\n if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {\n // Ensure spaces are encoded as %20\n str = encodeURI(str).replace(/%25(\\d\\d)/g, '%$1')\n }\n\n try {\n try {\n result = new URL(str, 'postgres://base')\n } catch (e) {\n // The URL is invalid so try again with a dummy host\n result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base')\n dummyHost = true\n }\n } catch (err) {\n // Remove the input from the error message to avoid leaking sensitive information\n err.input && (err.input = '*****REDACTED*****')\n throw err\n }\n\n // We'd like to use Object.fromEntries() here but Node.js 10 does not support it\n for (const entry of result.searchParams.entries()) {\n config[entry[0]] = entry[1]\n }\n\n config.user = config.user || decodeURIComponent(result.username)\n config.password = config.password || decodeURIComponent(result.password)\n\n if (result.protocol == 'socket:') {\n config.host = decodeURI(result.pathname)\n config.database = result.searchParams.get('db')\n config.client_encoding = result.searchParams.get('encoding')\n return config\n }\n const hostname = dummyHost ? '' : result.hostname\n if (!config.host) {\n // Only set the host if there is no equivalent query param.\n config.host = decodeURIComponent(hostname)\n } else if (hostname && /^%2f/i.test(hostname)) {\n // Only prepend the hostname to the pathname if it is not a URL encoded Unix socket host.\n result.pathname = hostname + result.pathname\n }\n if (!config.port) {\n // Only set the port if there is no equivalent query param.\n config.port = result.port\n }\n\n const pathname = result.pathname.slice(1) || null\n config.database = pathname ? decodeURI(pathname) : null\n\n if (config.ssl === 'true' || config.ssl === '1') {\n config.ssl = true\n }\n\n if (config.ssl === '0') {\n config.ssl = false\n }\n\n if (config.sslcert || config.sslkey || config.sslrootcert || config.sslmode) {\n config.ssl = {}\n }\n\n // Only try to load fs if we expect to read from the disk\n const fs = config.sslcert || config.sslkey || config.sslrootcert ? require('fs') : null\n\n if (config.sslcert) {\n config.ssl.cert = fs.readFileSync(config.sslcert).toString()\n }\n\n if (config.sslkey) {\n config.ssl.key = fs.readFileSync(config.sslkey).toString()\n }\n\n if (config.sslrootcert) {\n config.ssl.ca = fs.readFileSync(config.sslrootcert).toString()\n }\n\n if (options.useLibpqCompat && config.uselibpqcompat) {\n throw new Error('Both useLibpqCompat and uselibpqcompat are set. Please use only one of them.')\n }\n\n if (config.uselibpqcompat === 'true' || options.useLibpqCompat) {\n switch (config.sslmode) {\n case 'disable': {\n config.ssl = false\n break\n }\n case 'prefer': {\n config.ssl.rejectUnauthorized = false\n break\n }\n case 'require': {\n if (config.sslrootcert) {\n // If a root CA is specified, behavior of `sslmode=require` will be the same as that of `verify-ca`\n config.ssl.checkServerIdentity = function () {}\n } else {\n config.ssl.rejectUnauthorized = false\n }\n break\n }\n case 'verify-ca': {\n if (!config.ssl.ca) {\n throw new Error(\n 'SECURITY WARNING: Using sslmode=verify-ca requires specifying a CA with sslrootcert. If a public CA is used, verify-ca allows connections to a server that somebody else may have registered with the CA, making you vulnerable to Man-in-the-Middle attacks. Either specify a custom CA certificate with sslrootcert parameter or use sslmode=verify-full for proper security.'\n )\n }\n config.ssl.checkServerIdentity = function () {}\n break\n }\n case 'verify-full': {\n break\n }\n }\n } else {\n switch (config.sslmode) {\n case 'disable': {\n config.ssl = false\n break\n }\n case 'prefer':\n case 'require':\n case 'verify-ca':\n case 'verify-full': {\n if (config.sslmode !== 'verify-full') {\n deprecatedSslModeWarning(config.sslmode)\n }\n break\n }\n case 'no-verify': {\n config.ssl.rejectUnauthorized = false\n break\n }\n }\n }\n\n return config\n}\n\n// convert pg-connection-string ssl config to a ClientConfig.ConnectionOptions\nfunction toConnectionOptions(sslConfig) {\n const connectionOptions = Object.entries(sslConfig).reduce((c, [key, value]) => {\n // we explicitly check for undefined and null instead of `if (value)` because some\n // options accept falsy values. Example: `ssl.rejectUnauthorized = false`\n if (value !== undefined && value !== null) {\n c[key] = value\n }\n\n return c\n }, {})\n\n return connectionOptions\n}\n\n// convert pg-connection-string config to a ClientConfig\nfunction toClientConfig(config) {\n const poolConfig = Object.entries(config).reduce((c, [key, value]) => {\n if (key === 'ssl') {\n const sslConfig = value\n\n if (typeof sslConfig === 'boolean') {\n c[key] = sslConfig\n }\n\n if (typeof sslConfig === 'object') {\n c[key] = toConnectionOptions(sslConfig)\n }\n } else if (value !== undefined && value !== null) {\n if (key === 'port') {\n // when port is not specified, it is converted into an empty string\n // we want to avoid NaN or empty string as a values in ClientConfig\n if (value !== '') {\n const v = parseInt(value, 10)\n if (isNaN(v)) {\n throw new Error(`Invalid ${key}: ${value}`)\n }\n\n c[key] = v\n }\n } else {\n c[key] = value\n }\n }\n\n return c\n }, {})\n\n return poolConfig\n}\n\n// parses a connection string into ClientConfig\nfunction parseIntoClientConfig(str) {\n return toClientConfig(parse(str))\n}\n\nfunction deprecatedSslModeWarning(sslmode) {\n if (!deprecatedSslModeWarning.warned && typeof process !== 'undefined' && process.emitWarning) {\n deprecatedSslModeWarning.warned = true\n process.emitWarning(`SECURITY WARNING: The SSL modes 'prefer', 'require', and 'verify-ca' are treated as aliases for 'verify-full'.\nIn the next major version (pg-connection-string v3.0.0 and pg v9.0.0), these modes will adopt standard libpq semantics, which have weaker security guarantees.\n\nTo prepare for this change:\n- If you want the current behavior, explicitly use 'sslmode=verify-full'\n- If you want libpq compatibility now, use 'uselibpqcompat=true&sslmode=${sslmode}'\n\nSee https://www.postgresql.org/docs/current/libpq-ssl.html for libpq SSL mode definitions.`)\n }\n}\n\nmodule.exports = parse\n\nparse.parse = parse\nparse.toClientConfig = toClientConfig\nparse.parseIntoClientConfig = parseIntoClientConfig\n","'use strict'\n\nconst dns = require('dns')\n\nconst defaults = require('./defaults')\n\nconst parse = require('pg-connection-string').parse // parses a connection string\n\nconst val = function (key, config, envVar) {\n if (config[key]) {\n return config[key]\n }\n\n if (envVar === undefined) {\n envVar = process.env['PG' + key.toUpperCase()]\n } else if (envVar === false) {\n // do nothing ... use false\n } else {\n envVar = process.env[envVar]\n }\n\n return envVar || defaults[key]\n}\n\nconst readSSLConfigFromEnvironment = function () {\n switch (process.env.PGSSLMODE) {\n case 'disable':\n return false\n case 'prefer':\n case 'require':\n case 'verify-ca':\n case 'verify-full':\n return true\n case 'no-verify':\n return { rejectUnauthorized: false }\n }\n return defaults.ssl\n}\n\n// Convert arg to a string, surround in single quotes, and escape single quotes and backslashes\nconst quoteParamValue = function (value) {\n return \"'\" + ('' + value).replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\") + \"'\"\n}\n\nconst add = function (params, config, paramName) {\n const value = config[paramName]\n if (value !== undefined && value !== null) {\n params.push(paramName + '=' + quoteParamValue(value))\n }\n}\n\nclass ConnectionParameters {\n constructor(config) {\n // if a string is passed, it is a raw connection string so we parse it into a config\n config = typeof config === 'string' ? parse(config) : config || {}\n\n // if the config has a connectionString defined, parse IT into the config we use\n // this will override other default values with what is stored in connectionString\n if (config.connectionString) {\n config = Object.assign({}, config, parse(config.connectionString))\n }\n\n this.user = val('user', config)\n this.database = val('database', config)\n\n if (this.database === undefined) {\n this.database = this.user\n }\n\n this.port = parseInt(val('port', config), 10)\n this.host = val('host', config)\n\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val('password', config),\n })\n\n this.binary = val('binary', config)\n this.options = val('options', config)\n\n this.ssl = typeof config.ssl === 'undefined' ? readSSLConfigFromEnvironment() : config.ssl\n\n if (typeof this.ssl === 'string') {\n if (this.ssl === 'true') {\n this.ssl = true\n }\n }\n // support passing in ssl=no-verify via connection string\n if (this.ssl === 'no-verify') {\n this.ssl = { rejectUnauthorized: false }\n }\n if (this.ssl && this.ssl.key) {\n Object.defineProperty(this.ssl, 'key', {\n enumerable: false,\n })\n }\n\n this.client_encoding = val('client_encoding', config)\n this.replication = val('replication', config)\n // a domain socket begins with '/'\n this.isDomainSocket = !(this.host || '').indexOf('/')\n\n this.application_name = val('application_name', config, 'PGAPPNAME')\n this.fallback_application_name = val('fallback_application_name', config, false)\n this.statement_timeout = val('statement_timeout', config, false)\n this.lock_timeout = val('lock_timeout', config, false)\n this.idle_in_transaction_session_timeout = val('idle_in_transaction_session_timeout', config, false)\n this.query_timeout = val('query_timeout', config, false)\n\n if (config.connectionTimeoutMillis === undefined) {\n this.connect_timeout = process.env.PGCONNECT_TIMEOUT || 0\n } else {\n this.connect_timeout = Math.floor(config.connectionTimeoutMillis / 1000)\n }\n\n if (config.keepAlive === false) {\n this.keepalives = 0\n } else if (config.keepAlive === true) {\n this.keepalives = 1\n }\n\n if (typeof config.keepAliveInitialDelayMillis === 'number') {\n this.keepalives_idle = Math.floor(config.keepAliveInitialDelayMillis / 1000)\n }\n }\n\n getLibpqConnectionString(cb) {\n const params = []\n add(params, this, 'user')\n add(params, this, 'password')\n add(params, this, 'port')\n add(params, this, 'application_name')\n add(params, this, 'fallback_application_name')\n add(params, this, 'connect_timeout')\n add(params, this, 'options')\n\n const ssl = typeof this.ssl === 'object' ? this.ssl : this.ssl ? { sslmode: this.ssl } : {}\n add(params, ssl, 'sslmode')\n add(params, ssl, 'sslca')\n add(params, ssl, 'sslkey')\n add(params, ssl, 'sslcert')\n add(params, ssl, 'sslrootcert')\n\n if (this.database) {\n params.push('dbname=' + quoteParamValue(this.database))\n }\n if (this.replication) {\n params.push('replication=' + quoteParamValue(this.replication))\n }\n if (this.host) {\n params.push('host=' + quoteParamValue(this.host))\n }\n if (this.isDomainSocket) {\n return cb(null, params.join(' '))\n }\n if (this.client_encoding) {\n params.push('client_encoding=' + quoteParamValue(this.client_encoding))\n }\n dns.lookup(this.host, function (err, address) {\n if (err) return cb(err, null)\n params.push('hostaddr=' + quoteParamValue(address))\n return cb(null, params.join(' '))\n })\n }\n}\n\nmodule.exports = ConnectionParameters\n","'use strict'\n\nconst types = require('pg-types')\n\nconst matchRegexp = /^([A-Za-z]+)(?: (\\d+))?(?: (\\d+))?/\n\n// result object returned from query\n// in the 'end' event and also\n// passed as second argument to provided callback\nclass Result {\n constructor(rowMode, types) {\n this.command = null\n this.rowCount = null\n this.oid = null\n this.rows = []\n this.fields = []\n this._parsers = undefined\n this._types = types\n this.RowCtor = null\n this.rowAsArray = rowMode === 'array'\n if (this.rowAsArray) {\n this.parseRow = this._parseRowAsArray\n }\n this._prebuiltEmptyResultObject = null\n }\n\n // adds a command complete message\n addCommandComplete(msg) {\n let match\n if (msg.text) {\n // pure javascript\n match = matchRegexp.exec(msg.text)\n } else {\n // native bindings\n match = matchRegexp.exec(msg.command)\n }\n if (match) {\n this.command = match[1]\n if (match[3]) {\n // COMMAND OID ROWS\n this.oid = parseInt(match[2], 10)\n this.rowCount = parseInt(match[3], 10)\n } else if (match[2]) {\n // COMMAND ROWS\n this.rowCount = parseInt(match[2], 10)\n }\n }\n }\n\n _parseRowAsArray(rowData) {\n const row = new Array(rowData.length)\n for (let i = 0, len = rowData.length; i < len; i++) {\n const rawValue = rowData[i]\n if (rawValue !== null) {\n row[i] = this._parsers[i](rawValue)\n } else {\n row[i] = null\n }\n }\n return row\n }\n\n parseRow(rowData) {\n const row = { ...this._prebuiltEmptyResultObject }\n for (let i = 0, len = rowData.length; i < len; i++) {\n const rawValue = rowData[i]\n const field = this.fields[i].name\n if (rawValue !== null) {\n const v = this.fields[i].format === 'binary' ? Buffer.from(rawValue) : rawValue\n row[field] = this._parsers[i](v)\n } else {\n row[field] = null\n }\n }\n return row\n }\n\n addRow(row) {\n this.rows.push(row)\n }\n\n addFields(fieldDescriptions) {\n // clears field definitions\n // multiple query statements in 1 action can result in multiple sets\n // of rowDescriptions...eg: 'select NOW(); select 1::int;'\n // you need to reset the fields\n this.fields = fieldDescriptions\n if (this.fields.length) {\n this._parsers = new Array(fieldDescriptions.length)\n }\n\n const row = {}\n\n for (let i = 0; i < fieldDescriptions.length; i++) {\n const desc = fieldDescriptions[i]\n row[desc.name] = null\n\n if (this._types) {\n this._parsers[i] = this._types.getTypeParser(desc.dataTypeID, desc.format || 'text')\n } else {\n this._parsers[i] = types.getTypeParser(desc.dataTypeID, desc.format || 'text')\n }\n }\n\n this._prebuiltEmptyResultObject = { ...row }\n }\n}\n\nmodule.exports = Result\n","'use strict'\n\nconst { EventEmitter } = require('events')\n\nconst Result = require('./result')\nconst utils = require('./utils')\n\nclass Query extends EventEmitter {\n constructor(config, values, callback) {\n super()\n\n config = utils.normalizeQueryConfig(config, values, callback)\n\n this.text = config.text\n this.values = config.values\n this.rows = config.rows\n this.types = config.types\n this.name = config.name\n this.queryMode = config.queryMode\n this.binary = config.binary\n // use unique portal name each time\n this.portal = config.portal || ''\n this.callback = config.callback\n this._rowMode = config.rowMode\n if (process.domain && config.callback) {\n this.callback = process.domain.bind(config.callback)\n }\n this._result = new Result(this._rowMode, this.types)\n\n // potential for multiple results\n this._results = this._result\n this._canceledDueToError = false\n }\n\n requiresPreparation() {\n if (this.queryMode === 'extended') {\n return true\n }\n\n // named queries must always be prepared\n if (this.name) {\n return true\n }\n // always prepare if there are max number of rows expected per\n // portal execution\n if (this.rows) {\n return true\n }\n // don't prepare empty text queries\n if (!this.text) {\n return false\n }\n // prepare if there are values\n if (!this.values) {\n return false\n }\n return this.values.length > 0\n }\n\n _checkForMultirow() {\n // if we already have a result with a command property\n // then we've already executed one query in a multi-statement simple query\n // turn our results into an array of results\n if (this._result.command) {\n if (!Array.isArray(this._results)) {\n this._results = [this._result]\n }\n this._result = new Result(this._rowMode, this._result._types)\n this._results.push(this._result)\n }\n }\n\n // associates row metadata from the supplied\n // message with this query object\n // metadata used when parsing row results\n handleRowDescription(msg) {\n this._checkForMultirow()\n this._result.addFields(msg.fields)\n this._accumulateRows = this.callback || !this.listeners('row').length\n }\n\n handleDataRow(msg) {\n let row\n\n if (this._canceledDueToError) {\n return\n }\n\n try {\n row = this._result.parseRow(msg.fields)\n } catch (err) {\n this._canceledDueToError = err\n return\n }\n\n this.emit('row', row, this._result)\n if (this._accumulateRows) {\n this._result.addRow(row)\n }\n }\n\n handleCommandComplete(msg, connection) {\n this._checkForMultirow()\n this._result.addCommandComplete(msg)\n // need to sync after each command complete of a prepared statement\n // if we were using a row count which results in multiple calls to _getRows\n if (this.rows) {\n connection.sync()\n }\n }\n\n // if a named prepared statement is created with empty query text\n // the backend will send an emptyQuery message but *not* a command complete message\n // since we pipeline sync immediately after execute we don't need to do anything here\n // unless we have rows specified, in which case we did not pipeline the initial sync call\n handleEmptyQuery(connection) {\n if (this.rows) {\n connection.sync()\n }\n }\n\n handleError(err, connection) {\n // need to sync after error during a prepared statement\n if (this._canceledDueToError) {\n err = this._canceledDueToError\n this._canceledDueToError = false\n }\n // if callback supplied do not emit error event as uncaught error\n // events will bubble up to node process\n if (this.callback) {\n return this.callback(err)\n }\n this.emit('error', err)\n }\n\n handleReadyForQuery(con) {\n if (this._canceledDueToError) {\n return this.handleError(this._canceledDueToError, con)\n }\n if (this.callback) {\n try {\n this.callback(null, this._results)\n } catch (err) {\n process.nextTick(() => {\n throw err\n })\n }\n }\n this.emit('end', this._results)\n }\n\n submit(connection) {\n if (typeof this.text !== 'string' && typeof this.name !== 'string') {\n return new Error('A query must have either text or a name. Supplying neither is unsupported.')\n }\n const previous = connection.parsedStatements[this.name]\n if (this.text && previous && this.text !== previous) {\n return new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)\n }\n if (this.values && !Array.isArray(this.values)) {\n return new Error('Query values must be an array')\n }\n if (this.requiresPreparation()) {\n // If we're using the extended query protocol we fire off several separate commands\n // to the backend. On some versions of node & some operating system versions\n // the network stack writes each message separately instead of buffering them together\n // causing the client & network to send more slowly. Corking & uncorking the stream\n // allows node to buffer up the messages internally before sending them all off at once.\n // note: we're checking for existence of cork/uncork because some versions of streams\n // might not have this (cloudflare?)\n connection.stream.cork && connection.stream.cork()\n try {\n this.prepare(connection)\n } finally {\n // while unlikely for this.prepare to throw, if it does & we don't uncork this stream\n // this client becomes unresponsive, so put in finally block \"just in case\"\n connection.stream.uncork && connection.stream.uncork()\n }\n } else {\n connection.query(this.text)\n }\n return null\n }\n\n hasBeenParsed(connection) {\n return this.name && connection.parsedStatements[this.name]\n }\n\n handlePortalSuspended(connection) {\n this._getRows(connection, this.rows)\n }\n\n _getRows(connection, rows) {\n connection.execute({\n portal: this.portal,\n rows: rows,\n })\n // if we're not reading pages of rows send the sync command\n // to indicate the pipeline is finished\n if (!rows) {\n connection.sync()\n } else {\n // otherwise flush the call out to read more rows\n connection.flush()\n }\n }\n\n // http://developer.postgresql.org/pgdocs/postgres/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY\n prepare(connection) {\n // TODO refactor this poor encapsulation\n if (!this.hasBeenParsed(connection)) {\n connection.parse({\n text: this.text,\n name: this.name,\n types: this.types,\n })\n }\n\n // because we're mapping user supplied values to\n // postgres wire protocol compatible values it could\n // throw an exception, so try/catch this section\n try {\n connection.bind({\n portal: this.portal,\n statement: this.name,\n values: this.values,\n binary: this.binary,\n valueMapper: utils.prepareValue,\n })\n } catch (err) {\n this.handleError(err, connection)\n return\n }\n\n connection.describe({\n type: 'P',\n name: this.portal || '',\n })\n\n this._getRows(connection, this.rows)\n }\n\n handleCopyInResponse(connection) {\n connection.sendCopyFail('No source stream defined')\n }\n\n handleCopyData(msg, connection) {\n // noop\n }\n}\n\nmodule.exports = Query\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoticeMessage = exports.DataRowMessage = exports.CommandCompleteMessage = exports.ReadyForQueryMessage = exports.NotificationResponseMessage = exports.BackendKeyDataMessage = exports.AuthenticationMD5Password = exports.ParameterStatusMessage = exports.ParameterDescriptionMessage = exports.RowDescriptionMessage = exports.Field = exports.CopyResponse = exports.CopyDataMessage = exports.DatabaseError = exports.copyDone = exports.emptyQuery = exports.replicationStart = exports.portalSuspended = exports.noData = exports.closeComplete = exports.bindComplete = exports.parseComplete = void 0;\nexports.parseComplete = {\n name: 'parseComplete',\n length: 5,\n};\nexports.bindComplete = {\n name: 'bindComplete',\n length: 5,\n};\nexports.closeComplete = {\n name: 'closeComplete',\n length: 5,\n};\nexports.noData = {\n name: 'noData',\n length: 5,\n};\nexports.portalSuspended = {\n name: 'portalSuspended',\n length: 5,\n};\nexports.replicationStart = {\n name: 'replicationStart',\n length: 4,\n};\nexports.emptyQuery = {\n name: 'emptyQuery',\n length: 4,\n};\nexports.copyDone = {\n name: 'copyDone',\n length: 4,\n};\nclass DatabaseError extends Error {\n constructor(message, length, name) {\n super(message);\n this.length = length;\n this.name = name;\n }\n}\nexports.DatabaseError = DatabaseError;\nclass CopyDataMessage {\n constructor(length, chunk) {\n this.length = length;\n this.chunk = chunk;\n this.name = 'copyData';\n }\n}\nexports.CopyDataMessage = CopyDataMessage;\nclass CopyResponse {\n constructor(length, name, binary, columnCount) {\n this.length = length;\n this.name = name;\n this.binary = binary;\n this.columnTypes = new Array(columnCount);\n }\n}\nexports.CopyResponse = CopyResponse;\nclass Field {\n constructor(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, format) {\n this.name = name;\n this.tableID = tableID;\n this.columnID = columnID;\n this.dataTypeID = dataTypeID;\n this.dataTypeSize = dataTypeSize;\n this.dataTypeModifier = dataTypeModifier;\n this.format = format;\n }\n}\nexports.Field = Field;\nclass RowDescriptionMessage {\n constructor(length, fieldCount) {\n this.length = length;\n this.fieldCount = fieldCount;\n this.name = 'rowDescription';\n this.fields = new Array(this.fieldCount);\n }\n}\nexports.RowDescriptionMessage = RowDescriptionMessage;\nclass ParameterDescriptionMessage {\n constructor(length, parameterCount) {\n this.length = length;\n this.parameterCount = parameterCount;\n this.name = 'parameterDescription';\n this.dataTypeIDs = new Array(this.parameterCount);\n }\n}\nexports.ParameterDescriptionMessage = ParameterDescriptionMessage;\nclass ParameterStatusMessage {\n constructor(length, parameterName, parameterValue) {\n this.length = length;\n this.parameterName = parameterName;\n this.parameterValue = parameterValue;\n this.name = 'parameterStatus';\n }\n}\nexports.ParameterStatusMessage = ParameterStatusMessage;\nclass AuthenticationMD5Password {\n constructor(length, salt) {\n this.length = length;\n this.salt = salt;\n this.name = 'authenticationMD5Password';\n }\n}\nexports.AuthenticationMD5Password = AuthenticationMD5Password;\nclass BackendKeyDataMessage {\n constructor(length, processID, secretKey) {\n this.length = length;\n this.processID = processID;\n this.secretKey = secretKey;\n this.name = 'backendKeyData';\n }\n}\nexports.BackendKeyDataMessage = BackendKeyDataMessage;\nclass NotificationResponseMessage {\n constructor(length, processId, channel, payload) {\n this.length = length;\n this.processId = processId;\n this.channel = channel;\n this.payload = payload;\n this.name = 'notification';\n }\n}\nexports.NotificationResponseMessage = NotificationResponseMessage;\nclass ReadyForQueryMessage {\n constructor(length, status) {\n this.length = length;\n this.status = status;\n this.name = 'readyForQuery';\n }\n}\nexports.ReadyForQueryMessage = ReadyForQueryMessage;\nclass CommandCompleteMessage {\n constructor(length, text) {\n this.length = length;\n this.text = text;\n this.name = 'commandComplete';\n }\n}\nexports.CommandCompleteMessage = CommandCompleteMessage;\nclass DataRowMessage {\n constructor(length, fields) {\n this.length = length;\n this.fields = fields;\n this.name = 'dataRow';\n this.fieldCount = fields.length;\n }\n}\nexports.DataRowMessage = DataRowMessage;\nclass NoticeMessage {\n constructor(length, message) {\n this.length = length;\n this.message = message;\n this.name = 'notice';\n }\n}\nexports.NoticeMessage = NoticeMessage;\n//# sourceMappingURL=messages.js.map","\"use strict\";\n//binary data writer tuned for encoding binary specific to the postgres binary protocol\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Writer = void 0;\nclass Writer {\n constructor(size = 256) {\n this.size = size;\n this.offset = 5;\n this.headerPosition = 0;\n this.buffer = Buffer.allocUnsafe(size);\n }\n ensure(size) {\n const remaining = this.buffer.length - this.offset;\n if (remaining < size) {\n const oldBuffer = this.buffer;\n // exponential growth factor of around ~ 1.5\n // https://stackoverflow.com/questions/2269063/buffer-growth-strategy\n const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size;\n this.buffer = Buffer.allocUnsafe(newSize);\n oldBuffer.copy(this.buffer);\n }\n }\n addInt32(num) {\n this.ensure(4);\n this.buffer[this.offset++] = (num >>> 24) & 0xff;\n this.buffer[this.offset++] = (num >>> 16) & 0xff;\n this.buffer[this.offset++] = (num >>> 8) & 0xff;\n this.buffer[this.offset++] = (num >>> 0) & 0xff;\n return this;\n }\n addInt16(num) {\n this.ensure(2);\n this.buffer[this.offset++] = (num >>> 8) & 0xff;\n this.buffer[this.offset++] = (num >>> 0) & 0xff;\n return this;\n }\n addCString(string) {\n if (!string) {\n this.ensure(1);\n }\n else {\n const len = Buffer.byteLength(string);\n this.ensure(len + 1); // +1 for null terminator\n this.buffer.write(string, this.offset, 'utf-8');\n this.offset += len;\n }\n this.buffer[this.offset++] = 0; // null terminator\n return this;\n }\n addString(string = '') {\n const len = Buffer.byteLength(string);\n this.ensure(len);\n this.buffer.write(string, this.offset);\n this.offset += len;\n return this;\n }\n add(otherBuffer) {\n this.ensure(otherBuffer.length);\n otherBuffer.copy(this.buffer, this.offset);\n this.offset += otherBuffer.length;\n return this;\n }\n join(code) {\n if (code) {\n this.buffer[this.headerPosition] = code;\n //length is everything in this packet minus the code\n const length = this.offset - (this.headerPosition + 1);\n this.buffer.writeInt32BE(length, this.headerPosition + 1);\n }\n return this.buffer.slice(code ? 0 : 5, this.offset);\n }\n flush(code) {\n const result = this.join(code);\n this.offset = 5;\n this.headerPosition = 0;\n this.buffer = Buffer.allocUnsafe(this.size);\n return result;\n }\n}\nexports.Writer = Writer;\n//# sourceMappingURL=buffer-writer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serialize = void 0;\nconst buffer_writer_1 = require(\"./buffer-writer\");\nconst writer = new buffer_writer_1.Writer();\nconst startup = (opts) => {\n // protocol version\n writer.addInt16(3).addInt16(0);\n for (const key of Object.keys(opts)) {\n writer.addCString(key).addCString(opts[key]);\n }\n writer.addCString('client_encoding').addCString('UTF8');\n const bodyBuffer = writer.addCString('').flush();\n // this message is sent without a code\n const length = bodyBuffer.length + 4;\n return new buffer_writer_1.Writer().addInt32(length).add(bodyBuffer).flush();\n};\nconst requestSsl = () => {\n const response = Buffer.allocUnsafe(8);\n response.writeInt32BE(8, 0);\n response.writeInt32BE(80877103, 4);\n return response;\n};\nconst password = (password) => {\n return writer.addCString(password).flush(112 /* code.startup */);\n};\nconst sendSASLInitialResponseMessage = function (mechanism, initialResponse) {\n // 0x70 = 'p'\n writer.addCString(mechanism).addInt32(Buffer.byteLength(initialResponse)).addString(initialResponse);\n return writer.flush(112 /* code.startup */);\n};\nconst sendSCRAMClientFinalMessage = function (additionalData) {\n return writer.addString(additionalData).flush(112 /* code.startup */);\n};\nconst query = (text) => {\n return writer.addCString(text).flush(81 /* code.query */);\n};\nconst emptyArray = [];\nconst parse = (query) => {\n // expect something like this:\n // { name: 'queryName',\n // text: 'select * from blah',\n // types: ['int8', 'bool'] }\n // normalize missing query names to allow for null\n const name = query.name || '';\n if (name.length > 63) {\n console.error('Warning! Postgres only supports 63 characters for query names.');\n console.error('You supplied %s (%s)', name, name.length);\n console.error('This can cause conflicts and silent errors executing queries');\n }\n const types = query.types || emptyArray;\n const len = types.length;\n const buffer = writer\n .addCString(name) // name of query\n .addCString(query.text) // actual query text\n .addInt16(len);\n for (let i = 0; i < len; i++) {\n buffer.addInt32(types[i]);\n }\n return writer.flush(80 /* code.parse */);\n};\nconst paramWriter = new buffer_writer_1.Writer();\nconst writeValues = function (values, valueMapper) {\n for (let i = 0; i < values.length; i++) {\n const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i];\n if (mappedVal == null) {\n // add the param type (string) to the writer\n writer.addInt16(0 /* ParamType.STRING */);\n // write -1 to the param writer to indicate null\n paramWriter.addInt32(-1);\n }\n else if (mappedVal instanceof Buffer) {\n // add the param type (binary) to the writer\n writer.addInt16(1 /* ParamType.BINARY */);\n // add the buffer to the param writer\n paramWriter.addInt32(mappedVal.length);\n paramWriter.add(mappedVal);\n }\n else {\n // add the param type (string) to the writer\n writer.addInt16(0 /* ParamType.STRING */);\n paramWriter.addInt32(Buffer.byteLength(mappedVal));\n paramWriter.addString(mappedVal);\n }\n }\n};\nconst bind = (config = {}) => {\n // normalize config\n const portal = config.portal || '';\n const statement = config.statement || '';\n const binary = config.binary || false;\n const values = config.values || emptyArray;\n const len = values.length;\n writer.addCString(portal).addCString(statement);\n writer.addInt16(len);\n writeValues(values, config.valueMapper);\n writer.addInt16(len);\n writer.add(paramWriter.flush());\n // all results use the same format code\n writer.addInt16(1);\n // format code\n writer.addInt16(binary ? 1 /* ParamType.BINARY */ : 0 /* ParamType.STRING */);\n return writer.flush(66 /* code.bind */);\n};\nconst emptyExecute = Buffer.from([69 /* code.execute */, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]);\nconst execute = (config) => {\n // this is the happy path for most queries\n if (!config || (!config.portal && !config.rows)) {\n return emptyExecute;\n }\n const portal = config.portal || '';\n const rows = config.rows || 0;\n const portalLength = Buffer.byteLength(portal);\n const len = 4 + portalLength + 1 + 4;\n // one extra bit for code\n const buff = Buffer.allocUnsafe(1 + len);\n buff[0] = 69 /* code.execute */;\n buff.writeInt32BE(len, 1);\n buff.write(portal, 5, 'utf-8');\n buff[portalLength + 5] = 0; // null terminate portal cString\n buff.writeUInt32BE(rows, buff.length - 4);\n return buff;\n};\nconst cancel = (processID, secretKey) => {\n const buffer = Buffer.allocUnsafe(16);\n buffer.writeInt32BE(16, 0);\n buffer.writeInt16BE(1234, 4);\n buffer.writeInt16BE(5678, 6);\n buffer.writeInt32BE(processID, 8);\n buffer.writeInt32BE(secretKey, 12);\n return buffer;\n};\nconst cstringMessage = (code, string) => {\n const stringLen = Buffer.byteLength(string);\n const len = 4 + stringLen + 1;\n // one extra bit for code\n const buffer = Buffer.allocUnsafe(1 + len);\n buffer[0] = code;\n buffer.writeInt32BE(len, 1);\n buffer.write(string, 5, 'utf-8');\n buffer[len] = 0; // null terminate cString\n return buffer;\n};\nconst emptyDescribePortal = writer.addCString('P').flush(68 /* code.describe */);\nconst emptyDescribeStatement = writer.addCString('S').flush(68 /* code.describe */);\nconst describe = (msg) => {\n return msg.name\n ? cstringMessage(68 /* code.describe */, `${msg.type}${msg.name || ''}`)\n : msg.type === 'P'\n ? emptyDescribePortal\n : emptyDescribeStatement;\n};\nconst close = (msg) => {\n const text = `${msg.type}${msg.name || ''}`;\n return cstringMessage(67 /* code.close */, text);\n};\nconst copyData = (chunk) => {\n return writer.add(chunk).flush(100 /* code.copyFromChunk */);\n};\nconst copyFail = (message) => {\n return cstringMessage(102 /* code.copyFail */, message);\n};\nconst codeOnlyBuffer = (code) => Buffer.from([code, 0x00, 0x00, 0x00, 0x04]);\nconst flushBuffer = codeOnlyBuffer(72 /* code.flush */);\nconst syncBuffer = codeOnlyBuffer(83 /* code.sync */);\nconst endBuffer = codeOnlyBuffer(88 /* code.end */);\nconst copyDoneBuffer = codeOnlyBuffer(99 /* code.copyDone */);\nconst serialize = {\n startup,\n password,\n requestSsl,\n sendSASLInitialResponseMessage,\n sendSCRAMClientFinalMessage,\n query,\n parse,\n bind,\n execute,\n describe,\n close,\n flush: () => flushBuffer,\n sync: () => syncBuffer,\n end: () => endBuffer,\n copyData,\n copyDone: () => copyDoneBuffer,\n copyFail,\n cancel,\n};\nexports.serialize = serialize;\n//# sourceMappingURL=serializer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BufferReader = void 0;\nclass BufferReader {\n constructor(offset = 0) {\n this.offset = offset;\n this.buffer = Buffer.allocUnsafe(0);\n // TODO(bmc): support non-utf8 encoding?\n this.encoding = 'utf-8';\n }\n setBuffer(offset, buffer) {\n this.offset = offset;\n this.buffer = buffer;\n }\n int16() {\n const result = this.buffer.readInt16BE(this.offset);\n this.offset += 2;\n return result;\n }\n byte() {\n const result = this.buffer[this.offset];\n this.offset++;\n return result;\n }\n int32() {\n const result = this.buffer.readInt32BE(this.offset);\n this.offset += 4;\n return result;\n }\n uint32() {\n const result = this.buffer.readUInt32BE(this.offset);\n this.offset += 4;\n return result;\n }\n string(length) {\n const result = this.buffer.toString(this.encoding, this.offset, this.offset + length);\n this.offset += length;\n return result;\n }\n cstring() {\n const start = this.offset;\n let end = start;\n // eslint-disable-next-line no-empty\n while (this.buffer[end++] !== 0) { }\n this.offset = end;\n return this.buffer.toString(this.encoding, start, end - 1);\n }\n bytes(length) {\n const result = this.buffer.slice(this.offset, this.offset + length);\n this.offset += length;\n return result;\n }\n}\nexports.BufferReader = BufferReader;\n//# sourceMappingURL=buffer-reader.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Parser = void 0;\nconst messages_1 = require(\"./messages\");\nconst buffer_reader_1 = require(\"./buffer-reader\");\n// every message is prefixed with a single bye\nconst CODE_LENGTH = 1;\n// every message has an int32 length which includes itself but does\n// NOT include the code in the length\nconst LEN_LENGTH = 4;\nconst HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH;\n// A placeholder for a `BackendMessage`’s length value that will be set after construction.\nconst LATEINIT_LENGTH = -1;\nconst emptyBuffer = Buffer.allocUnsafe(0);\nclass Parser {\n constructor(opts) {\n this.buffer = emptyBuffer;\n this.bufferLength = 0;\n this.bufferOffset = 0;\n this.reader = new buffer_reader_1.BufferReader();\n if ((opts === null || opts === void 0 ? void 0 : opts.mode) === 'binary') {\n throw new Error('Binary mode not supported yet');\n }\n this.mode = (opts === null || opts === void 0 ? void 0 : opts.mode) || 'text';\n }\n parse(buffer, callback) {\n this.mergeBuffer(buffer);\n const bufferFullLength = this.bufferOffset + this.bufferLength;\n let offset = this.bufferOffset;\n while (offset + HEADER_LENGTH <= bufferFullLength) {\n // code is 1 byte long - it identifies the message type\n const code = this.buffer[offset];\n // length is 1 Uint32BE - it is the length of the message EXCLUDING the code\n const length = this.buffer.readUInt32BE(offset + CODE_LENGTH);\n const fullMessageLength = CODE_LENGTH + length;\n if (fullMessageLength + offset <= bufferFullLength) {\n const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer);\n callback(message);\n offset += fullMessageLength;\n }\n else {\n break;\n }\n }\n if (offset === bufferFullLength) {\n // No more use for the buffer\n this.buffer = emptyBuffer;\n this.bufferLength = 0;\n this.bufferOffset = 0;\n }\n else {\n // Adjust the cursors of remainingBuffer\n this.bufferLength = bufferFullLength - offset;\n this.bufferOffset = offset;\n }\n }\n mergeBuffer(buffer) {\n if (this.bufferLength > 0) {\n const newLength = this.bufferLength + buffer.byteLength;\n const newFullLength = newLength + this.bufferOffset;\n if (newFullLength > this.buffer.byteLength) {\n // We can't concat the new buffer with the remaining one\n let newBuffer;\n if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {\n // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer\n newBuffer = this.buffer;\n }\n else {\n // Allocate a new larger buffer\n let newBufferLength = this.buffer.byteLength * 2;\n while (newLength >= newBufferLength) {\n newBufferLength *= 2;\n }\n newBuffer = Buffer.allocUnsafe(newBufferLength);\n }\n // Move the remaining buffer to the new one\n this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength);\n this.buffer = newBuffer;\n this.bufferOffset = 0;\n }\n // Concat the new buffer with the remaining one\n buffer.copy(this.buffer, this.bufferOffset + this.bufferLength);\n this.bufferLength = newLength;\n }\n else {\n this.buffer = buffer;\n this.bufferOffset = 0;\n this.bufferLength = buffer.byteLength;\n }\n }\n handlePacket(offset, code, length, bytes) {\n const { reader } = this;\n // NOTE: This undesirably retains the buffer in `this.reader` if the `parse*Message` calls below throw. However, those should only throw in the case of a protocol error, which normally results in the reader being discarded.\n reader.setBuffer(offset, bytes);\n let message;\n switch (code) {\n case 50 /* MessageCodes.BindComplete */:\n message = messages_1.bindComplete;\n break;\n case 49 /* MessageCodes.ParseComplete */:\n message = messages_1.parseComplete;\n break;\n case 51 /* MessageCodes.CloseComplete */:\n message = messages_1.closeComplete;\n break;\n case 110 /* MessageCodes.NoData */:\n message = messages_1.noData;\n break;\n case 115 /* MessageCodes.PortalSuspended */:\n message = messages_1.portalSuspended;\n break;\n case 99 /* MessageCodes.CopyDone */:\n message = messages_1.copyDone;\n break;\n case 87 /* MessageCodes.ReplicationStart */:\n message = messages_1.replicationStart;\n break;\n case 73 /* MessageCodes.EmptyQuery */:\n message = messages_1.emptyQuery;\n break;\n case 68 /* MessageCodes.DataRow */:\n message = parseDataRowMessage(reader);\n break;\n case 67 /* MessageCodes.CommandComplete */:\n message = parseCommandCompleteMessage(reader);\n break;\n case 90 /* MessageCodes.ReadyForQuery */:\n message = parseReadyForQueryMessage(reader);\n break;\n case 65 /* MessageCodes.NotificationResponse */:\n message = parseNotificationMessage(reader);\n break;\n case 82 /* MessageCodes.AuthenticationResponse */:\n message = parseAuthenticationResponse(reader, length);\n break;\n case 83 /* MessageCodes.ParameterStatus */:\n message = parseParameterStatusMessage(reader);\n break;\n case 75 /* MessageCodes.BackendKeyData */:\n message = parseBackendKeyData(reader);\n break;\n case 69 /* MessageCodes.ErrorMessage */:\n message = parseErrorMessage(reader, 'error');\n break;\n case 78 /* MessageCodes.NoticeMessage */:\n message = parseErrorMessage(reader, 'notice');\n break;\n case 84 /* MessageCodes.RowDescriptionMessage */:\n message = parseRowDescriptionMessage(reader);\n break;\n case 116 /* MessageCodes.ParameterDescriptionMessage */:\n message = parseParameterDescriptionMessage(reader);\n break;\n case 71 /* MessageCodes.CopyIn */:\n message = parseCopyInMessage(reader);\n break;\n case 72 /* MessageCodes.CopyOut */:\n message = parseCopyOutMessage(reader);\n break;\n case 100 /* MessageCodes.CopyData */:\n message = parseCopyData(reader, length);\n break;\n default:\n return new messages_1.DatabaseError('received invalid response: ' + code.toString(16), length, 'error');\n }\n reader.setBuffer(0, emptyBuffer);\n message.length = length;\n return message;\n }\n}\nexports.Parser = Parser;\nconst parseReadyForQueryMessage = (reader) => {\n const status = reader.string(1);\n return new messages_1.ReadyForQueryMessage(LATEINIT_LENGTH, status);\n};\nconst parseCommandCompleteMessage = (reader) => {\n const text = reader.cstring();\n return new messages_1.CommandCompleteMessage(LATEINIT_LENGTH, text);\n};\nconst parseCopyData = (reader, length) => {\n const chunk = reader.bytes(length - 4);\n return new messages_1.CopyDataMessage(LATEINIT_LENGTH, chunk);\n};\nconst parseCopyInMessage = (reader) => parseCopyMessage(reader, 'copyInResponse');\nconst parseCopyOutMessage = (reader) => parseCopyMessage(reader, 'copyOutResponse');\nconst parseCopyMessage = (reader, messageName) => {\n const isBinary = reader.byte() !== 0;\n const columnCount = reader.int16();\n const message = new messages_1.CopyResponse(LATEINIT_LENGTH, messageName, isBinary, columnCount);\n for (let i = 0; i < columnCount; i++) {\n message.columnTypes[i] = reader.int16();\n }\n return message;\n};\nconst parseNotificationMessage = (reader) => {\n const processId = reader.int32();\n const channel = reader.cstring();\n const payload = reader.cstring();\n return new messages_1.NotificationResponseMessage(LATEINIT_LENGTH, processId, channel, payload);\n};\nconst parseRowDescriptionMessage = (reader) => {\n const fieldCount = reader.int16();\n const message = new messages_1.RowDescriptionMessage(LATEINIT_LENGTH, fieldCount);\n for (let i = 0; i < fieldCount; i++) {\n message.fields[i] = parseField(reader);\n }\n return message;\n};\nconst parseField = (reader) => {\n const name = reader.cstring();\n const tableID = reader.uint32();\n const columnID = reader.int16();\n const dataTypeID = reader.uint32();\n const dataTypeSize = reader.int16();\n const dataTypeModifier = reader.int32();\n const mode = reader.int16() === 0 ? 'text' : 'binary';\n return new messages_1.Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode);\n};\nconst parseParameterDescriptionMessage = (reader) => {\n const parameterCount = reader.int16();\n const message = new messages_1.ParameterDescriptionMessage(LATEINIT_LENGTH, parameterCount);\n for (let i = 0; i < parameterCount; i++) {\n message.dataTypeIDs[i] = reader.int32();\n }\n return message;\n};\nconst parseDataRowMessage = (reader) => {\n const fieldCount = reader.int16();\n const fields = new Array(fieldCount);\n for (let i = 0; i < fieldCount; i++) {\n const len = reader.int32();\n // a -1 for length means the value of the field is null\n fields[i] = len === -1 ? null : reader.string(len);\n }\n return new messages_1.DataRowMessage(LATEINIT_LENGTH, fields);\n};\nconst parseParameterStatusMessage = (reader) => {\n const name = reader.cstring();\n const value = reader.cstring();\n return new messages_1.ParameterStatusMessage(LATEINIT_LENGTH, name, value);\n};\nconst parseBackendKeyData = (reader) => {\n const processID = reader.int32();\n const secretKey = reader.int32();\n return new messages_1.BackendKeyDataMessage(LATEINIT_LENGTH, processID, secretKey);\n};\nconst parseAuthenticationResponse = (reader, length) => {\n const code = reader.int32();\n // TODO(bmc): maybe better types here\n const message = {\n name: 'authenticationOk',\n length,\n };\n switch (code) {\n case 0: // AuthenticationOk\n break;\n case 3: // AuthenticationCleartextPassword\n if (message.length === 8) {\n message.name = 'authenticationCleartextPassword';\n }\n break;\n case 5: // AuthenticationMD5Password\n if (message.length === 12) {\n message.name = 'authenticationMD5Password';\n const salt = reader.bytes(4);\n return new messages_1.AuthenticationMD5Password(LATEINIT_LENGTH, salt);\n }\n break;\n case 10: // AuthenticationSASL\n {\n message.name = 'authenticationSASL';\n message.mechanisms = [];\n let mechanism;\n do {\n mechanism = reader.cstring();\n if (mechanism) {\n message.mechanisms.push(mechanism);\n }\n } while (mechanism);\n }\n break;\n case 11: // AuthenticationSASLContinue\n message.name = 'authenticationSASLContinue';\n message.data = reader.string(length - 8);\n break;\n case 12: // AuthenticationSASLFinal\n message.name = 'authenticationSASLFinal';\n message.data = reader.string(length - 8);\n break;\n default:\n throw new Error('Unknown authenticationOk message type ' + code);\n }\n return message;\n};\nconst parseErrorMessage = (reader, name) => {\n const fields = {};\n let fieldType = reader.string(1);\n while (fieldType !== '\\0') {\n fields[fieldType] = reader.cstring();\n fieldType = reader.string(1);\n }\n const messageValue = fields.M;\n const message = name === 'notice'\n ? new messages_1.NoticeMessage(LATEINIT_LENGTH, messageValue)\n : new messages_1.DatabaseError(messageValue, LATEINIT_LENGTH, name);\n message.severity = fields.S;\n message.code = fields.C;\n message.detail = fields.D;\n message.hint = fields.H;\n message.position = fields.P;\n message.internalPosition = fields.p;\n message.internalQuery = fields.q;\n message.where = fields.W;\n message.schema = fields.s;\n message.table = fields.t;\n message.column = fields.c;\n message.dataType = fields.d;\n message.constraint = fields.n;\n message.file = fields.F;\n message.line = fields.L;\n message.routine = fields.R;\n return message;\n};\n//# sourceMappingURL=parser.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DatabaseError = exports.serialize = exports.parse = void 0;\nconst messages_1 = require(\"./messages\");\nObject.defineProperty(exports, \"DatabaseError\", { enumerable: true, get: function () { return messages_1.DatabaseError; } });\nconst serializer_1 = require(\"./serializer\");\nObject.defineProperty(exports, \"serialize\", { enumerable: true, get: function () { return serializer_1.serialize; } });\nconst parser_1 = require(\"./parser\");\nfunction parse(stream, callback) {\n const parser = new parser_1.Parser();\n stream.on('data', (buffer) => parser.parse(buffer, callback));\n return new Promise((resolve) => stream.on('end', () => resolve()));\n}\nexports.parse = parse;\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// This is an empty module that is served up when outside of a workerd environment\n// See the `exports` field in package.json\nexports.default = {};\n//# sourceMappingURL=empty.js.map","const { getStream, getSecureStream } = getStreamFuncs()\n\nmodule.exports = {\n /**\n * Get a socket stream compatible with the current runtime environment.\n * @returns {Duplex}\n */\n getStream,\n /**\n * Get a TLS secured socket, compatible with the current environment,\n * using the socket and other settings given in `options`.\n * @returns {Duplex}\n */\n getSecureStream,\n}\n\n/**\n * The stream functions that work in Node.js\n */\nfunction getNodejsStreamFuncs() {\n function getStream(ssl) {\n const net = require('net')\n return new net.Socket()\n }\n\n function getSecureStream(options) {\n const tls = require('tls')\n return tls.connect(options)\n }\n return {\n getStream,\n getSecureStream,\n }\n}\n\n/**\n * The stream functions that work in Cloudflare Workers\n */\nfunction getCloudflareStreamFuncs() {\n function getStream(ssl) {\n const { CloudflareSocket } = require('pg-cloudflare')\n return new CloudflareSocket(ssl)\n }\n\n function getSecureStream(options) {\n options.socket.startTls(options)\n return options.socket\n }\n return {\n getStream,\n getSecureStream,\n }\n}\n\n/**\n * Are we running in a Cloudflare Worker?\n *\n * @returns true if the code is currently running inside a Cloudflare Worker.\n */\nfunction isCloudflareRuntime() {\n // Since 2022-03-21 the `global_navigator` compatibility flag is on for Cloudflare Workers\n // which means that `navigator.userAgent` will be defined.\n // eslint-disable-next-line no-undef\n if (typeof navigator === 'object' && navigator !== null && typeof navigator.userAgent === 'string') {\n // eslint-disable-next-line no-undef\n return navigator.userAgent === 'Cloudflare-Workers'\n }\n // In case `navigator` or `navigator.userAgent` is not defined then try a more sneaky approach\n if (typeof Response === 'function') {\n const resp = new Response(null, { cf: { thing: true } })\n if (typeof resp.cf === 'object' && resp.cf !== null && resp.cf.thing) {\n return true\n }\n }\n return false\n}\n\nfunction getStreamFuncs() {\n if (isCloudflareRuntime()) {\n return getCloudflareStreamFuncs()\n }\n return getNodejsStreamFuncs()\n}\n","'use strict'\n\nconst EventEmitter = require('events').EventEmitter\n\nconst { parse, serialize } = require('pg-protocol')\nconst { getStream, getSecureStream } = require('./stream')\n\nconst flushBuffer = serialize.flush()\nconst syncBuffer = serialize.sync()\nconst endBuffer = serialize.end()\n\n// TODO(bmc) support binary mode at some point\nclass Connection extends EventEmitter {\n constructor(config) {\n super()\n config = config || {}\n\n this.stream = config.stream || getStream(config.ssl)\n if (typeof this.stream === 'function') {\n this.stream = this.stream(config)\n }\n\n this._keepAlive = config.keepAlive\n this._keepAliveInitialDelayMillis = config.keepAliveInitialDelayMillis\n this.parsedStatements = {}\n this.ssl = config.ssl || false\n this._ending = false\n this._emitMessage = false\n const self = this\n this.on('newListener', function (eventName) {\n if (eventName === 'message') {\n self._emitMessage = true\n }\n })\n }\n\n connect(port, host) {\n const self = this\n\n this._connecting = true\n this.stream.setNoDelay(true)\n this.stream.connect(port, host)\n\n this.stream.once('connect', function () {\n if (self._keepAlive) {\n self.stream.setKeepAlive(true, self._keepAliveInitialDelayMillis)\n }\n self.emit('connect')\n })\n\n const reportStreamError = function (error) {\n // errors about disconnections should be ignored during disconnect\n if (self._ending && (error.code === 'ECONNRESET' || error.code === 'EPIPE')) {\n return\n }\n self.emit('error', error)\n }\n this.stream.on('error', reportStreamError)\n\n this.stream.on('close', function () {\n self.emit('end')\n })\n\n if (!this.ssl) {\n return this.attachListeners(this.stream)\n }\n\n this.stream.once('data', function (buffer) {\n const responseCode = buffer.toString('utf8')\n switch (responseCode) {\n case 'S': // Server supports SSL connections, continue with a secure connection\n break\n case 'N': // Server does not support SSL connections\n self.stream.end()\n return self.emit('error', new Error('The server does not support SSL connections'))\n default:\n // Any other response byte, including 'E' (ErrorResponse) indicating a server error\n self.stream.end()\n return self.emit('error', new Error('There was an error establishing an SSL connection'))\n }\n const options = {\n socket: self.stream,\n }\n\n if (self.ssl !== true) {\n Object.assign(options, self.ssl)\n\n if ('key' in self.ssl) {\n options.key = self.ssl.key\n }\n }\n\n const net = require('net')\n if (net.isIP && net.isIP(host) === 0) {\n options.servername = host\n }\n try {\n self.stream = getSecureStream(options)\n } catch (err) {\n return self.emit('error', err)\n }\n self.attachListeners(self.stream)\n self.stream.on('error', reportStreamError)\n\n self.emit('sslconnect')\n })\n }\n\n attachListeners(stream) {\n parse(stream, (msg) => {\n const eventName = msg.name === 'error' ? 'errorMessage' : msg.name\n if (this._emitMessage) {\n this.emit('message', msg)\n }\n this.emit(eventName, msg)\n })\n }\n\n requestSsl() {\n this.stream.write(serialize.requestSsl())\n }\n\n startup(config) {\n this.stream.write(serialize.startup(config))\n }\n\n cancel(processID, secretKey) {\n this._send(serialize.cancel(processID, secretKey))\n }\n\n password(password) {\n this._send(serialize.password(password))\n }\n\n sendSASLInitialResponseMessage(mechanism, initialResponse) {\n this._send(serialize.sendSASLInitialResponseMessage(mechanism, initialResponse))\n }\n\n sendSCRAMClientFinalMessage(additionalData) {\n this._send(serialize.sendSCRAMClientFinalMessage(additionalData))\n }\n\n _send(buffer) {\n if (!this.stream.writable) {\n return false\n }\n return this.stream.write(buffer)\n }\n\n query(text) {\n this._send(serialize.query(text))\n }\n\n // send parse message\n parse(query) {\n this._send(serialize.parse(query))\n }\n\n // send bind message\n bind(config) {\n this._send(serialize.bind(config))\n }\n\n // send execute message\n execute(config) {\n this._send(serialize.execute(config))\n }\n\n flush() {\n if (this.stream.writable) {\n this.stream.write(flushBuffer)\n }\n }\n\n sync() {\n this._ending = true\n this._send(syncBuffer)\n }\n\n ref() {\n this.stream.ref()\n }\n\n unref() {\n this.stream.unref()\n }\n\n end() {\n // 0x58 = 'X'\n this._ending = true\n if (!this._connecting || !this.stream.writable) {\n this.stream.end()\n return\n }\n return this.stream.write(endBuffer, () => {\n this.stream.end()\n })\n }\n\n close(msg) {\n this._send(serialize.close(msg))\n }\n\n describe(msg) {\n this._send(serialize.describe(msg))\n }\n\n sendCopyFromChunk(chunk) {\n this._send(serialize.copyData(chunk))\n }\n\n endCopyFrom() {\n this._send(serialize.copyDone())\n }\n\n sendCopyFail(msg) {\n this._send(serialize.copyFail(msg))\n }\n}\n\nmodule.exports = Connection\n","/*\nCopyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n*/\n\n'use strict'\n\nconst { Transform } = require('stream')\nconst { StringDecoder } = require('string_decoder')\nconst kLast = Symbol('last')\nconst kDecoder = Symbol('decoder')\n\nfunction transform (chunk, enc, cb) {\n let list\n if (this.overflow) { // Line buffer is full. Skip to start of next line.\n const buf = this[kDecoder].write(chunk)\n list = buf.split(this.matcher)\n\n if (list.length === 1) return cb() // Line ending not found. Discard entire chunk.\n\n // Line ending found. Discard trailing fragment of previous line and reset overflow state.\n list.shift()\n this.overflow = false\n } else {\n this[kLast] += this[kDecoder].write(chunk)\n list = this[kLast].split(this.matcher)\n }\n\n this[kLast] = list.pop()\n\n for (let i = 0; i < list.length; i++) {\n try {\n push(this, this.mapper(list[i]))\n } catch (error) {\n return cb(error)\n }\n }\n\n this.overflow = this[kLast].length > this.maxLength\n if (this.overflow && !this.skipOverflow) {\n cb(new Error('maximum buffer reached'))\n return\n }\n\n cb()\n}\n\nfunction flush (cb) {\n // forward any gibberish left in there\n this[kLast] += this[kDecoder].end()\n\n if (this[kLast]) {\n try {\n push(this, this.mapper(this[kLast]))\n } catch (error) {\n return cb(error)\n }\n }\n\n cb()\n}\n\nfunction push (self, val) {\n if (val !== undefined) {\n self.push(val)\n }\n}\n\nfunction noop (incoming) {\n return incoming\n}\n\nfunction split (matcher, mapper, options) {\n // Set defaults for any arguments not supplied.\n matcher = matcher || /\\r?\\n/\n mapper = mapper || noop\n options = options || {}\n\n // Test arguments explicitly.\n switch (arguments.length) {\n case 1:\n // If mapper is only argument.\n if (typeof matcher === 'function') {\n mapper = matcher\n matcher = /\\r?\\n/\n // If options is only argument.\n } else if (typeof matcher === 'object' && !(matcher instanceof RegExp) && !matcher[Symbol.split]) {\n options = matcher\n matcher = /\\r?\\n/\n }\n break\n\n case 2:\n // If mapper and options are arguments.\n if (typeof matcher === 'function') {\n options = mapper\n mapper = matcher\n matcher = /\\r?\\n/\n // If matcher and options are arguments.\n } else if (typeof mapper === 'object') {\n options = mapper\n mapper = noop\n }\n }\n\n options = Object.assign({}, options)\n options.autoDestroy = true\n options.transform = transform\n options.flush = flush\n options.readableObjectMode = true\n\n const stream = new Transform(options)\n\n stream[kLast] = ''\n stream[kDecoder] = new StringDecoder('utf8')\n stream.matcher = matcher\n stream.mapper = mapper\n stream.maxLength = options.maxLength\n stream.skipOverflow = options.skipOverflow || false\n stream.overflow = false\n stream._destroy = function (err, cb) {\n // Weird Node v12 bug that we need to work around\n this._writableState.errorEmitted = false\n cb(err)\n }\n\n return stream\n}\n\nmodule.exports = split\n","'use strict';\n\nvar path = require('path')\n , Stream = require('stream').Stream\n , split = require('split2')\n , util = require('util')\n , defaultPort = 5432\n , isWin = (process.platform === 'win32')\n , warnStream = process.stderr\n;\n\n\nvar S_IRWXG = 56 // 00070(8)\n , S_IRWXO = 7 // 00007(8)\n , S_IFMT = 61440 // 00170000(8)\n , S_IFREG = 32768 // 0100000(8)\n;\nfunction isRegFile(mode) {\n return ((mode & S_IFMT) == S_IFREG);\n}\n\nvar fieldNames = [ 'host', 'port', 'database', 'user', 'password' ];\nvar nrOfFields = fieldNames.length;\nvar passKey = fieldNames[ nrOfFields -1 ];\n\n\nfunction warn() {\n var isWritable = (\n warnStream instanceof Stream &&\n true === warnStream.writable\n );\n\n if (isWritable) {\n var args = Array.prototype.slice.call(arguments).concat(\"\\n\");\n warnStream.write( util.format.apply(util, args) );\n }\n}\n\n\nObject.defineProperty(module.exports, 'isWin', {\n get : function() {\n return isWin;\n } ,\n set : function(val) {\n isWin = val;\n }\n});\n\n\nmodule.exports.warnTo = function(stream) {\n var old = warnStream;\n warnStream = stream;\n return old;\n};\n\nmodule.exports.getFileName = function(rawEnv){\n var env = rawEnv || process.env;\n var file = env.PGPASSFILE || (\n isWin ?\n path.join( env.APPDATA || './' , 'postgresql', 'pgpass.conf' ) :\n path.join( env.HOME || './', '.pgpass' )\n );\n return file;\n};\n\nmodule.exports.usePgPass = function(stats, fname) {\n if (Object.prototype.hasOwnProperty.call(process.env, 'PGPASSWORD')) {\n return false;\n }\n\n if (isWin) {\n return true;\n }\n\n fname = fname || '<unkn>';\n\n if (! isRegFile(stats.mode)) {\n warn('WARNING: password file \"%s\" is not a plain file', fname);\n return false;\n }\n\n if (stats.mode & (S_IRWXG | S_IRWXO)) {\n /* If password file is insecure, alert the user and ignore it. */\n warn('WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less', fname);\n return false;\n }\n\n return true;\n};\n\n\nvar matcher = module.exports.match = function(connInfo, entry) {\n return fieldNames.slice(0, -1).reduce(function(prev, field, idx){\n if (idx == 1) {\n // the port\n if ( Number( connInfo[field] || defaultPort ) === Number( entry[field] ) ) {\n return prev && true;\n }\n }\n return prev && (\n entry[field] === '*' ||\n entry[field] === connInfo[field]\n );\n }, true);\n};\n\n\nmodule.exports.getPassword = function(connInfo, stream, cb) {\n var pass;\n var lineStream = stream.pipe(split());\n\n function onLine(line) {\n var entry = parseLine(line);\n if (entry && isValidEntry(entry) && matcher(connInfo, entry)) {\n pass = entry[passKey];\n lineStream.end(); // -> calls onEnd(), but pass is set now\n }\n }\n\n var onEnd = function() {\n stream.destroy();\n cb(pass);\n };\n\n var onErr = function(err) {\n stream.destroy();\n warn('WARNING: error on reading file: %s', err);\n cb(undefined);\n };\n\n stream.on('error', onErr);\n lineStream\n .on('data', onLine)\n .on('end', onEnd)\n .on('error', onErr)\n ;\n\n};\n\n\nvar parseLine = module.exports.parseLine = function(line) {\n if (line.length < 11 || line.match(/^\\s+#/)) {\n return null;\n }\n\n var curChar = '';\n var prevChar = '';\n var fieldIdx = 0;\n var startIdx = 0;\n var endIdx = 0;\n var obj = {};\n var isLastField = false;\n var addToObj = function(idx, i0, i1) {\n var field = line.substring(i0, i1);\n\n if (! Object.hasOwnProperty.call(process.env, 'PGPASS_NO_DEESCAPE')) {\n field = field.replace(/\\\\([:\\\\])/g, '$1');\n }\n\n obj[ fieldNames[idx] ] = field;\n };\n\n for (var i = 0 ; i < line.length-1 ; i += 1) {\n curChar = line.charAt(i+1);\n prevChar = line.charAt(i);\n\n isLastField = (fieldIdx == nrOfFields-1);\n\n if (isLastField) {\n addToObj(fieldIdx, startIdx);\n break;\n }\n\n if (i >= 0 && curChar == ':' && prevChar !== '\\\\') {\n addToObj(fieldIdx, startIdx, i+1);\n\n startIdx = i+2;\n fieldIdx += 1;\n }\n }\n\n obj = ( Object.keys(obj).length === nrOfFields ) ? obj : null;\n\n return obj;\n};\n\n\nvar isValidEntry = module.exports.isValidEntry = function(entry){\n var rules = {\n // host\n 0 : function(x){\n return x.length > 0;\n } ,\n // port\n 1 : function(x){\n if (x === '*') {\n return true;\n }\n x = Number(x);\n return (\n isFinite(x) &&\n x > 0 &&\n x < 9007199254740992 &&\n Math.floor(x) === x\n );\n } ,\n // database\n 2 : function(x){\n return x.length > 0;\n } ,\n // username\n 3 : function(x){\n return x.length > 0;\n } ,\n // password\n 4 : function(x){\n return x.length > 0;\n }\n };\n\n for (var idx = 0 ; idx < fieldNames.length ; idx += 1) {\n var rule = rules[idx];\n var value = entry[ fieldNames[idx] ] || '';\n\n var res = rule(value);\n if (!res) {\n return false;\n }\n }\n\n return true;\n};\n\n","'use strict';\n\nvar path = require('path')\n , fs = require('fs')\n , helper = require('./helper.js')\n;\n\n\nmodule.exports = function(connInfo, cb) {\n var file = helper.getFileName();\n \n fs.stat(file, function(err, stat){\n if (err || !helper.usePgPass(stat, file)) {\n return cb(undefined);\n }\n\n var st = fs.createReadStream(file);\n\n helper.getPassword(connInfo, st, cb);\n });\n};\n\nmodule.exports.warnTo = helper.warnTo;\n","const EventEmitter = require('events').EventEmitter\nconst utils = require('./utils')\nconst nodeUtils = require('util')\nconst sasl = require('./crypto/sasl')\nconst TypeOverrides = require('./type-overrides')\n\nconst ConnectionParameters = require('./connection-parameters')\nconst Query = require('./query')\nconst defaults = require('./defaults')\nconst Connection = require('./connection')\nconst crypto = require('./crypto/utils')\n\nconst activeQueryDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Client.activeQuery is deprecated and will be removed in pg@9.0'\n)\n\nconst queryQueueDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Client.queryQueue is deprecated and will be removed in pg@9.0.'\n)\n\nconst pgPassDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'pgpass support is deprecated and will be removed in pg@9.0. ' +\n 'You can provide an async function as the password property to the Client/Pool constructor that returns a password instead. Within this function you can call the pgpass module in your own code.'\n)\n\nconst byoPromiseDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Passing a custom Promise implementation to the Client/Pool constructor is deprecated and will be removed in pg@9.0.'\n)\n\nconst queryQueueLengthDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Calling client.query() when the client is already executing a query is deprecated and will be removed in pg@9.0. Use async/await or an external async flow control mechanism instead.'\n)\n\nclass Client extends EventEmitter {\n constructor(config) {\n super()\n\n this.connectionParameters = new ConnectionParameters(config)\n this.user = this.connectionParameters.user\n this.database = this.connectionParameters.database\n this.port = this.connectionParameters.port\n this.host = this.connectionParameters.host\n\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: this.connectionParameters.password,\n })\n\n this.replication = this.connectionParameters.replication\n\n const c = config || {}\n\n if (c.Promise) {\n byoPromiseDeprecationNotice()\n }\n this._Promise = c.Promise || global.Promise\n this._types = new TypeOverrides(c.types)\n this._ending = false\n this._ended = false\n this._connecting = false\n this._connected = false\n this._connectionError = false\n this._queryable = true\n this._activeQuery = null\n\n this.enableChannelBinding = Boolean(c.enableChannelBinding) // set true to use SCRAM-SHA-256-PLUS when offered\n this.connection =\n c.connection ||\n new Connection({\n stream: c.stream,\n ssl: this.connectionParameters.ssl,\n keepAlive: c.keepAlive || false,\n keepAliveInitialDelayMillis: c.keepAliveInitialDelayMillis || 0,\n encoding: this.connectionParameters.client_encoding || 'utf8',\n })\n this._queryQueue = []\n this.binary = c.binary || defaults.binary\n this.processID = null\n this.secretKey = null\n this.ssl = this.connectionParameters.ssl || false\n // As with Password, make SSL->Key (the private key) non-enumerable.\n // It won't show up in stack traces\n // or if the client is console.logged\n if (this.ssl && this.ssl.key) {\n Object.defineProperty(this.ssl, 'key', {\n enumerable: false,\n })\n }\n\n this._connectionTimeoutMillis = c.connectionTimeoutMillis || 0\n }\n\n get activeQuery() {\n activeQueryDeprecationNotice()\n return this._activeQuery\n }\n\n set activeQuery(val) {\n activeQueryDeprecationNotice()\n this._activeQuery = val\n }\n\n _getActiveQuery() {\n return this._activeQuery\n }\n\n _errorAllQueries(err) {\n const enqueueError = (query) => {\n process.nextTick(() => {\n query.handleError(err, this.connection)\n })\n }\n\n const activeQuery = this._getActiveQuery()\n if (activeQuery) {\n enqueueError(activeQuery)\n this._activeQuery = null\n }\n\n this._queryQueue.forEach(enqueueError)\n this._queryQueue.length = 0\n }\n\n _connect(callback) {\n const self = this\n const con = this.connection\n this._connectionCallback = callback\n\n if (this._connecting || this._connected) {\n const err = new Error('Client has already been connected. You cannot reuse a client.')\n process.nextTick(() => {\n callback(err)\n })\n return\n }\n this._connecting = true\n\n if (this._connectionTimeoutMillis > 0) {\n this.connectionTimeoutHandle = setTimeout(() => {\n con._ending = true\n con.stream.destroy(new Error('timeout expired'))\n }, this._connectionTimeoutMillis)\n\n if (this.connectionTimeoutHandle.unref) {\n this.connectionTimeoutHandle.unref()\n }\n }\n\n if (this.host && this.host.indexOf('/') === 0) {\n con.connect(this.host + '/.s.PGSQL.' + this.port)\n } else {\n con.connect(this.port, this.host)\n }\n\n // once connection is established send startup message\n con.on('connect', function () {\n if (self.ssl) {\n con.requestSsl()\n } else {\n con.startup(self.getStartupConf())\n }\n })\n\n con.on('sslconnect', function () {\n con.startup(self.getStartupConf())\n })\n\n this._attachListeners(con)\n\n con.once('end', () => {\n const error = this._ending ? new Error('Connection terminated') : new Error('Connection terminated unexpectedly')\n\n clearTimeout(this.connectionTimeoutHandle)\n this._errorAllQueries(error)\n this._ended = true\n\n if (!this._ending) {\n // if the connection is ended without us calling .end()\n // on this client then we have an unexpected disconnection\n // treat this as an error unless we've already emitted an error\n // during connection.\n if (this._connecting && !this._connectionError) {\n if (this._connectionCallback) {\n this._connectionCallback(error)\n } else {\n this._handleErrorEvent(error)\n }\n } else if (!this._connectionError) {\n this._handleErrorEvent(error)\n }\n }\n\n process.nextTick(() => {\n this.emit('end')\n })\n })\n }\n\n connect(callback) {\n if (callback) {\n this._connect(callback)\n return\n }\n\n return new this._Promise((resolve, reject) => {\n this._connect((error) => {\n if (error) {\n reject(error)\n } else {\n resolve(this)\n }\n })\n })\n }\n\n _attachListeners(con) {\n // password request handling\n con.on('authenticationCleartextPassword', this._handleAuthCleartextPassword.bind(this))\n // password request handling\n con.on('authenticationMD5Password', this._handleAuthMD5Password.bind(this))\n // password request handling (SASL)\n con.on('authenticationSASL', this._handleAuthSASL.bind(this))\n con.on('authenticationSASLContinue', this._handleAuthSASLContinue.bind(this))\n con.on('authenticationSASLFinal', this._handleAuthSASLFinal.bind(this))\n con.on('backendKeyData', this._handleBackendKeyData.bind(this))\n con.on('error', this._handleErrorEvent.bind(this))\n con.on('errorMessage', this._handleErrorMessage.bind(this))\n con.on('readyForQuery', this._handleReadyForQuery.bind(this))\n con.on('notice', this._handleNotice.bind(this))\n con.on('rowDescription', this._handleRowDescription.bind(this))\n con.on('dataRow', this._handleDataRow.bind(this))\n con.on('portalSuspended', this._handlePortalSuspended.bind(this))\n con.on('emptyQuery', this._handleEmptyQuery.bind(this))\n con.on('commandComplete', this._handleCommandComplete.bind(this))\n con.on('parseComplete', this._handleParseComplete.bind(this))\n con.on('copyInResponse', this._handleCopyInResponse.bind(this))\n con.on('copyData', this._handleCopyData.bind(this))\n con.on('notification', this._handleNotification.bind(this))\n }\n\n _getPassword(cb) {\n const con = this.connection\n if (typeof this.password === 'function') {\n this._Promise\n .resolve()\n .then(() => this.password(this.connectionParameters))\n .then((pass) => {\n if (pass !== undefined) {\n if (typeof pass !== 'string') {\n con.emit('error', new TypeError('Password must be a string'))\n return\n }\n this.connectionParameters.password = this.password = pass\n } else {\n this.connectionParameters.password = this.password = null\n }\n cb()\n })\n .catch((err) => {\n con.emit('error', err)\n })\n } else if (this.password !== null) {\n cb()\n } else {\n try {\n const pgPass = require('pgpass')\n pgPass(this.connectionParameters, (pass) => {\n if (undefined !== pass) {\n pgPassDeprecationNotice()\n this.connectionParameters.password = this.password = pass\n }\n cb()\n })\n } catch (e) {\n this.emit('error', e)\n }\n }\n }\n\n _handleAuthCleartextPassword(msg) {\n this._getPassword(() => {\n this.connection.password(this.password)\n })\n }\n\n _handleAuthMD5Password(msg) {\n this._getPassword(async () => {\n try {\n const hashedPassword = await crypto.postgresMd5PasswordHash(this.user, this.password, msg.salt)\n this.connection.password(hashedPassword)\n } catch (e) {\n this.emit('error', e)\n }\n })\n }\n\n _handleAuthSASL(msg) {\n this._getPassword(() => {\n try {\n this.saslSession = sasl.startSession(msg.mechanisms, this.enableChannelBinding && this.connection.stream)\n this.connection.sendSASLInitialResponseMessage(this.saslSession.mechanism, this.saslSession.response)\n } catch (err) {\n this.connection.emit('error', err)\n }\n })\n }\n\n async _handleAuthSASLContinue(msg) {\n try {\n await sasl.continueSession(\n this.saslSession,\n this.password,\n msg.data,\n this.enableChannelBinding && this.connection.stream\n )\n this.connection.sendSCRAMClientFinalMessage(this.saslSession.response)\n } catch (err) {\n this.connection.emit('error', err)\n }\n }\n\n _handleAuthSASLFinal(msg) {\n try {\n sasl.finalizeSession(this.saslSession, msg.data)\n this.saslSession = null\n } catch (err) {\n this.connection.emit('error', err)\n }\n }\n\n _handleBackendKeyData(msg) {\n this.processID = msg.processID\n this.secretKey = msg.secretKey\n }\n\n _handleReadyForQuery(msg) {\n if (this._connecting) {\n this._connecting = false\n this._connected = true\n clearTimeout(this.connectionTimeoutHandle)\n\n // process possible callback argument to Client#connect\n if (this._connectionCallback) {\n this._connectionCallback(null, this)\n // remove callback for proper error handling\n // after the connect event\n this._connectionCallback = null\n }\n this.emit('connect')\n }\n const activeQuery = this._getActiveQuery()\n this._activeQuery = null\n this.readyForQuery = true\n if (activeQuery) {\n activeQuery.handleReadyForQuery(this.connection)\n }\n this._pulseQueryQueue()\n }\n\n // if we receive an error event or error message\n // during the connection process we handle it here\n _handleErrorWhileConnecting(err) {\n if (this._connectionError) {\n // TODO(bmc): this is swallowing errors - we shouldn't do this\n return\n }\n this._connectionError = true\n clearTimeout(this.connectionTimeoutHandle)\n if (this._connectionCallback) {\n return this._connectionCallback(err)\n }\n this.emit('error', err)\n }\n\n // if we're connected and we receive an error event from the connection\n // this means the socket is dead - do a hard abort of all queries and emit\n // the socket error on the client as well\n _handleErrorEvent(err) {\n if (this._connecting) {\n return this._handleErrorWhileConnecting(err)\n }\n this._queryable = false\n this._errorAllQueries(err)\n this.emit('error', err)\n }\n\n // handle error messages from the postgres backend\n _handleErrorMessage(msg) {\n if (this._connecting) {\n return this._handleErrorWhileConnecting(msg)\n }\n const activeQuery = this._getActiveQuery()\n\n if (!activeQuery) {\n this._handleErrorEvent(msg)\n return\n }\n\n this._activeQuery = null\n activeQuery.handleError(msg, this.connection)\n }\n\n _handleRowDescription(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected rowDescription message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate rowDescription to active query\n activeQuery.handleRowDescription(msg)\n }\n\n _handleDataRow(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected dataRow message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate dataRow to active query\n activeQuery.handleDataRow(msg)\n }\n\n _handlePortalSuspended(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected portalSuspended message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate portalSuspended to active query\n activeQuery.handlePortalSuspended(this.connection)\n }\n\n _handleEmptyQuery(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected emptyQuery message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate emptyQuery to active query\n activeQuery.handleEmptyQuery(this.connection)\n }\n\n _handleCommandComplete(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected commandComplete message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate commandComplete to active query\n activeQuery.handleCommandComplete(msg, this.connection)\n }\n\n _handleParseComplete() {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected parseComplete message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // if a prepared statement has a name and properly parses\n // we track that its already been executed so we don't parse\n // it again on the same client\n if (activeQuery.name) {\n this.connection.parsedStatements[activeQuery.name] = activeQuery.text\n }\n }\n\n _handleCopyInResponse(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected copyInResponse message from backend.')\n this._handleErrorEvent(error)\n return\n }\n activeQuery.handleCopyInResponse(this.connection)\n }\n\n _handleCopyData(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected copyData message from backend.')\n this._handleErrorEvent(error)\n return\n }\n activeQuery.handleCopyData(msg, this.connection)\n }\n\n _handleNotification(msg) {\n this.emit('notification', msg)\n }\n\n _handleNotice(msg) {\n this.emit('notice', msg)\n }\n\n getStartupConf() {\n const params = this.connectionParameters\n\n const data = {\n user: params.user,\n database: params.database,\n }\n\n const appName = params.application_name || params.fallback_application_name\n if (appName) {\n data.application_name = appName\n }\n if (params.replication) {\n data.replication = '' + params.replication\n }\n if (params.statement_timeout) {\n data.statement_timeout = String(parseInt(params.statement_timeout, 10))\n }\n if (params.lock_timeout) {\n data.lock_timeout = String(parseInt(params.lock_timeout, 10))\n }\n if (params.idle_in_transaction_session_timeout) {\n data.idle_in_transaction_session_timeout = String(parseInt(params.idle_in_transaction_session_timeout, 10))\n }\n if (params.options) {\n data.options = params.options\n }\n\n return data\n }\n\n cancel(client, query) {\n if (client.activeQuery === query) {\n const con = this.connection\n\n if (this.host && this.host.indexOf('/') === 0) {\n con.connect(this.host + '/.s.PGSQL.' + this.port)\n } else {\n con.connect(this.port, this.host)\n }\n\n // once connection is established send cancel message\n con.on('connect', function () {\n con.cancel(client.processID, client.secretKey)\n })\n } else if (client._queryQueue.indexOf(query) !== -1) {\n client._queryQueue.splice(client._queryQueue.indexOf(query), 1)\n }\n }\n\n setTypeParser(oid, format, parseFn) {\n return this._types.setTypeParser(oid, format, parseFn)\n }\n\n getTypeParser(oid, format) {\n return this._types.getTypeParser(oid, format)\n }\n\n // escapeIdentifier and escapeLiteral moved to utility functions & exported\n // on PG\n // re-exported here for backwards compatibility\n escapeIdentifier(str) {\n return utils.escapeIdentifier(str)\n }\n\n escapeLiteral(str) {\n return utils.escapeLiteral(str)\n }\n\n _pulseQueryQueue() {\n if (this.readyForQuery === true) {\n this._activeQuery = this._queryQueue.shift()\n const activeQuery = this._getActiveQuery()\n if (activeQuery) {\n this.readyForQuery = false\n this.hasExecuted = true\n\n const queryError = activeQuery.submit(this.connection)\n if (queryError) {\n process.nextTick(() => {\n activeQuery.handleError(queryError, this.connection)\n this.readyForQuery = true\n this._pulseQueryQueue()\n })\n }\n } else if (this.hasExecuted) {\n this._activeQuery = null\n this.emit('drain')\n }\n }\n }\n\n query(config, values, callback) {\n // can take in strings, config object or query object\n let query\n let result\n let readTimeout\n let readTimeoutTimer\n let queryCallback\n\n if (config === null || config === undefined) {\n throw new TypeError('Client was passed a null or undefined query')\n } else if (typeof config.submit === 'function') {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n result = query = config\n if (!query.callback) {\n if (typeof values === 'function') {\n query.callback = values\n } else if (callback) {\n query.callback = callback\n }\n }\n } else {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n query = new Query(config, values, callback)\n if (!query.callback) {\n result = new this._Promise((resolve, reject) => {\n query.callback = (err, res) => (err ? reject(err) : resolve(res))\n }).catch((err) => {\n // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the\n // application that created the query\n Error.captureStackTrace(err)\n throw err\n })\n }\n }\n\n if (readTimeout) {\n queryCallback = query.callback || (() => {})\n\n readTimeoutTimer = setTimeout(() => {\n const error = new Error('Query read timeout')\n\n process.nextTick(() => {\n query.handleError(error, this.connection)\n })\n\n queryCallback(error)\n\n // we already returned an error,\n // just do nothing if query completes\n query.callback = () => {}\n\n // Remove from queue\n const index = this._queryQueue.indexOf(query)\n if (index > -1) {\n this._queryQueue.splice(index, 1)\n }\n\n this._pulseQueryQueue()\n }, readTimeout)\n\n query.callback = (err, res) => {\n clearTimeout(readTimeoutTimer)\n queryCallback(err, res)\n }\n }\n\n if (this.binary && !query.binary) {\n query.binary = true\n }\n\n if (query._result && !query._result._types) {\n query._result._types = this._types\n }\n\n if (!this._queryable) {\n process.nextTick(() => {\n query.handleError(new Error('Client has encountered a connection error and is not queryable'), this.connection)\n })\n return result\n }\n\n if (this._ending) {\n process.nextTick(() => {\n query.handleError(new Error('Client was closed and is not queryable'), this.connection)\n })\n return result\n }\n\n if (this._queryQueue.length > 0) {\n queryQueueLengthDeprecationNotice()\n }\n this._queryQueue.push(query)\n this._pulseQueryQueue()\n return result\n }\n\n ref() {\n this.connection.ref()\n }\n\n unref() {\n this.connection.unref()\n }\n\n end(cb) {\n this._ending = true\n\n // if we have never connected, then end is a noop, callback immediately\n if (!this.connection._connecting || this._ended) {\n if (cb) {\n cb()\n } else {\n return this._Promise.resolve()\n }\n }\n\n if (this._getActiveQuery() || !this._queryable) {\n // if we have an active query we need to force a disconnect\n // on the socket - otherwise a hung query could block end forever\n this.connection.stream.destroy()\n } else {\n this.connection.end()\n }\n\n if (cb) {\n this.connection.once('end', cb)\n } else {\n return new this._Promise((resolve) => {\n this.connection.once('end', resolve)\n })\n }\n }\n get queryQueue() {\n queryQueueDeprecationNotice()\n return this._queryQueue\n }\n}\n\n// expose a Query constructor\nClient.Query = Query\n\nmodule.exports = Client\n","'use strict'\nconst EventEmitter = require('events').EventEmitter\n\nconst NOOP = function () {}\n\nconst removeWhere = (list, predicate) => {\n const i = list.findIndex(predicate)\n\n return i === -1 ? undefined : list.splice(i, 1)[0]\n}\n\nclass IdleItem {\n constructor(client, idleListener, timeoutId) {\n this.client = client\n this.idleListener = idleListener\n this.timeoutId = timeoutId\n }\n}\n\nclass PendingItem {\n constructor(callback) {\n this.callback = callback\n }\n}\n\nfunction throwOnDoubleRelease() {\n throw new Error('Release called on client which has already been released to the pool.')\n}\n\nfunction promisify(Promise, callback) {\n if (callback) {\n return { callback: callback, result: undefined }\n }\n let rej\n let res\n const cb = function (err, client) {\n err ? rej(err) : res(client)\n }\n const result = new Promise(function (resolve, reject) {\n res = resolve\n rej = reject\n }).catch((err) => {\n // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the\n // application that created the query\n Error.captureStackTrace(err)\n throw err\n })\n return { callback: cb, result: result }\n}\n\nfunction makeIdleListener(pool, client) {\n return function idleListener(err) {\n err.client = client\n\n client.removeListener('error', idleListener)\n client.on('error', () => {\n pool.log('additional client error after disconnection due to error', err)\n })\n pool._remove(client)\n // TODO - document that once the pool emits an error\n // the client has already been closed & purged and is unusable\n pool.emit('error', err, client)\n }\n}\n\nclass Pool extends EventEmitter {\n constructor(options, Client) {\n super()\n this.options = Object.assign({}, options)\n\n if (options != null && 'password' in options) {\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this.options, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: options.password,\n })\n }\n if (options != null && options.ssl && options.ssl.key) {\n // \"hiding\" the ssl->key so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this.options.ssl, 'key', {\n enumerable: false,\n })\n }\n\n this.options.max = this.options.max || this.options.poolSize || 10\n this.options.min = this.options.min || 0\n this.options.maxUses = this.options.maxUses || Infinity\n this.options.allowExitOnIdle = this.options.allowExitOnIdle || false\n this.options.maxLifetimeSeconds = this.options.maxLifetimeSeconds || 0\n this.log = this.options.log || function () {}\n this.Client = this.options.Client || Client || require('pg').Client\n this.Promise = this.options.Promise || global.Promise\n\n if (typeof this.options.idleTimeoutMillis === 'undefined') {\n this.options.idleTimeoutMillis = 10000\n }\n\n this._clients = []\n this._idle = []\n this._expired = new WeakSet()\n this._pendingQueue = []\n this._endCallback = undefined\n this.ending = false\n this.ended = false\n }\n\n _promiseTry(f) {\n const Promise = this.Promise\n if (typeof Promise.try === 'function') {\n return Promise.try(f)\n }\n return new Promise((resolve) => resolve(f()))\n }\n\n _isFull() {\n return this._clients.length >= this.options.max\n }\n\n _isAboveMin() {\n return this._clients.length > this.options.min\n }\n\n _pulseQueue() {\n this.log('pulse queue')\n if (this.ended) {\n this.log('pulse queue ended')\n return\n }\n if (this.ending) {\n this.log('pulse queue on ending')\n if (this._idle.length) {\n this._idle.slice().map((item) => {\n this._remove(item.client)\n })\n }\n if (!this._clients.length) {\n this.ended = true\n this._endCallback()\n }\n return\n }\n\n // if we don't have any waiting, do nothing\n if (!this._pendingQueue.length) {\n this.log('no queued requests')\n return\n }\n // if we don't have any idle clients and we have no more room do nothing\n if (!this._idle.length && this._isFull()) {\n return\n }\n const pendingItem = this._pendingQueue.shift()\n if (this._idle.length) {\n const idleItem = this._idle.pop()\n clearTimeout(idleItem.timeoutId)\n const client = idleItem.client\n client.ref && client.ref()\n const idleListener = idleItem.idleListener\n\n return this._acquireClient(client, pendingItem, idleListener, false)\n }\n if (!this._isFull()) {\n return this.newClient(pendingItem)\n }\n throw new Error('unexpected condition')\n }\n\n _remove(client, callback) {\n const removed = removeWhere(this._idle, (item) => item.client === client)\n\n if (removed !== undefined) {\n clearTimeout(removed.timeoutId)\n }\n\n this._clients = this._clients.filter((c) => c !== client)\n const context = this\n client.end(() => {\n context.emit('remove', client)\n\n if (typeof callback === 'function') {\n callback()\n }\n })\n }\n\n connect(cb) {\n if (this.ending) {\n const err = new Error('Cannot use a pool after calling end on the pool')\n return cb ? cb(err) : this.Promise.reject(err)\n }\n\n const response = promisify(this.Promise, cb)\n const result = response.result\n\n // if we don't have to connect a new client, don't do so\n if (this._isFull() || this._idle.length) {\n // if we have idle clients schedule a pulse immediately\n if (this._idle.length) {\n process.nextTick(() => this._pulseQueue())\n }\n\n if (!this.options.connectionTimeoutMillis) {\n this._pendingQueue.push(new PendingItem(response.callback))\n return result\n }\n\n const queueCallback = (err, res, done) => {\n clearTimeout(tid)\n response.callback(err, res, done)\n }\n\n const pendingItem = new PendingItem(queueCallback)\n\n // set connection timeout on checking out an existing client\n const tid = setTimeout(() => {\n // remove the callback from pending waiters because\n // we're going to call it with a timeout error\n removeWhere(this._pendingQueue, (i) => i.callback === queueCallback)\n pendingItem.timedOut = true\n response.callback(new Error('timeout exceeded when trying to connect'))\n }, this.options.connectionTimeoutMillis)\n\n if (tid.unref) {\n tid.unref()\n }\n\n this._pendingQueue.push(pendingItem)\n return result\n }\n\n this.newClient(new PendingItem(response.callback))\n\n return result\n }\n\n newClient(pendingItem) {\n const client = new this.Client(this.options)\n this._clients.push(client)\n const idleListener = makeIdleListener(this, client)\n\n this.log('checking client timeout')\n\n // connection timeout logic\n let tid\n let timeoutHit = false\n if (this.options.connectionTimeoutMillis) {\n tid = setTimeout(() => {\n if (client.connection) {\n this.log('ending client due to timeout')\n timeoutHit = true\n client.connection.stream.destroy()\n } else if (!client.isConnected()) {\n this.log('ending client due to timeout')\n timeoutHit = true\n // force kill the node driver, and let libpq do its teardown\n client.end()\n }\n }, this.options.connectionTimeoutMillis)\n }\n\n this.log('connecting new client')\n client.connect((err) => {\n if (tid) {\n clearTimeout(tid)\n }\n client.on('error', idleListener)\n if (err) {\n this.log('client failed to connect', err)\n // remove the dead client from our list of clients\n this._clients = this._clients.filter((c) => c !== client)\n if (timeoutHit) {\n err = new Error('Connection terminated due to connection timeout', { cause: err })\n }\n\n // this client won’t be released, so move on immediately\n this._pulseQueue()\n\n if (!pendingItem.timedOut) {\n pendingItem.callback(err, undefined, NOOP)\n }\n } else {\n this.log('new client connected')\n\n if (this.options.onConnect) {\n this._promiseTry(() => this.options.onConnect(client)).then(\n () => {\n this._afterConnect(client, pendingItem, idleListener)\n },\n (hookErr) => {\n this._clients = this._clients.filter((c) => c !== client)\n client.end(() => {\n this._pulseQueue()\n if (!pendingItem.timedOut) {\n pendingItem.callback(hookErr, undefined, NOOP)\n }\n })\n }\n )\n return\n }\n\n return this._afterConnect(client, pendingItem, idleListener)\n }\n })\n }\n\n _afterConnect(client, pendingItem, idleListener) {\n if (this.options.maxLifetimeSeconds !== 0) {\n const maxLifetimeTimeout = setTimeout(() => {\n this.log('ending client due to expired lifetime')\n this._expired.add(client)\n const idleIndex = this._idle.findIndex((idleItem) => idleItem.client === client)\n if (idleIndex !== -1) {\n this._acquireClient(\n client,\n new PendingItem((err, client, clientRelease) => clientRelease()),\n idleListener,\n false\n )\n }\n }, this.options.maxLifetimeSeconds * 1000)\n\n maxLifetimeTimeout.unref()\n client.once('end', () => clearTimeout(maxLifetimeTimeout))\n }\n\n return this._acquireClient(client, pendingItem, idleListener, true)\n }\n\n // acquire a client for a pending work item\n _acquireClient(client, pendingItem, idleListener, isNew) {\n if (isNew) {\n this.emit('connect', client)\n }\n\n this.emit('acquire', client)\n\n client.release = this._releaseOnce(client, idleListener)\n\n client.removeListener('error', idleListener)\n\n if (!pendingItem.timedOut) {\n if (isNew && this.options.verify) {\n this.options.verify(client, (err) => {\n if (err) {\n client.release(err)\n return pendingItem.callback(err, undefined, NOOP)\n }\n\n pendingItem.callback(undefined, client, client.release)\n })\n } else {\n pendingItem.callback(undefined, client, client.release)\n }\n } else {\n if (isNew && this.options.verify) {\n this.options.verify(client, client.release)\n } else {\n client.release()\n }\n }\n }\n\n // returns a function that wraps _release and throws if called more than once\n _releaseOnce(client, idleListener) {\n let released = false\n\n return (err) => {\n if (released) {\n throwOnDoubleRelease()\n }\n\n released = true\n this._release(client, idleListener, err)\n }\n }\n\n // release a client back to the poll, include an error\n // to remove it from the pool\n _release(client, idleListener, err) {\n client.on('error', idleListener)\n\n client._poolUseCount = (client._poolUseCount || 0) + 1\n\n this.emit('release', err, client)\n\n // TODO(bmc): expose a proper, public interface _queryable and _ending\n if (err || this.ending || !client._queryable || client._ending || client._poolUseCount >= this.options.maxUses) {\n if (client._poolUseCount >= this.options.maxUses) {\n this.log('remove expended client')\n }\n\n return this._remove(client, this._pulseQueue.bind(this))\n }\n\n const isExpired = this._expired.has(client)\n if (isExpired) {\n this.log('remove expired client')\n this._expired.delete(client)\n return this._remove(client, this._pulseQueue.bind(this))\n }\n\n // idle timeout\n let tid\n if (this.options.idleTimeoutMillis && this._isAboveMin()) {\n tid = setTimeout(() => {\n if (this._isAboveMin()) {\n this.log('remove idle client')\n this._remove(client, this._pulseQueue.bind(this))\n }\n }, this.options.idleTimeoutMillis)\n\n if (this.options.allowExitOnIdle) {\n // allow Node to exit if this is all that's left\n tid.unref()\n }\n }\n\n if (this.options.allowExitOnIdle) {\n client.unref()\n }\n\n this._idle.push(new IdleItem(client, idleListener, tid))\n this._pulseQueue()\n }\n\n query(text, values, cb) {\n // guard clause against passing a function as the first parameter\n if (typeof text === 'function') {\n const response = promisify(this.Promise, text)\n setImmediate(function () {\n return response.callback(new Error('Passing a function as the first parameter to pool.query is not supported'))\n })\n return response.result\n }\n\n // allow plain text query without values\n if (typeof values === 'function') {\n cb = values\n values = undefined\n }\n const response = promisify(this.Promise, cb)\n cb = response.callback\n\n this.connect((err, client) => {\n if (err) {\n return cb(err)\n }\n\n let clientReleased = false\n const onError = (err) => {\n if (clientReleased) {\n return\n }\n clientReleased = true\n client.release(err)\n cb(err)\n }\n\n client.once('error', onError)\n this.log('dispatching query')\n try {\n client.query(text, values, (err, res) => {\n this.log('query dispatched')\n client.removeListener('error', onError)\n if (clientReleased) {\n return\n }\n clientReleased = true\n client.release(err)\n if (err) {\n return cb(err)\n }\n return cb(undefined, res)\n })\n } catch (err) {\n client.release(err)\n return cb(err)\n }\n })\n return response.result\n }\n\n end(cb) {\n this.log('ending')\n if (this.ending) {\n const err = new Error('Called end on pool more than once')\n return cb ? cb(err) : this.Promise.reject(err)\n }\n this.ending = true\n const promised = promisify(this.Promise, cb)\n this._endCallback = promised.callback\n this._pulseQueue()\n return promised.result\n }\n\n get waitingCount() {\n return this._pendingQueue.length\n }\n\n get idleCount() {\n return this._idle.length\n }\n\n get expiredCount() {\n return this._clients.reduce((acc, client) => acc + (this._expired.has(client) ? 1 : 0), 0)\n }\n\n get totalCount() {\n return this._clients.length\n }\n}\nmodule.exports = Pool\n","'use strict'\n\nconst EventEmitter = require('events').EventEmitter\nconst util = require('util')\nconst utils = require('../utils')\n\nconst NativeQuery = (module.exports = function (config, values, callback) {\n EventEmitter.call(this)\n config = utils.normalizeQueryConfig(config, values, callback)\n this.text = config.text\n this.values = config.values\n this.name = config.name\n this.queryMode = config.queryMode\n this.callback = config.callback\n this.state = 'new'\n this._arrayMode = config.rowMode === 'array'\n\n // if the 'row' event is listened for\n // then emit them as they come in\n // without setting singleRowMode to true\n // this has almost no meaning because libpq\n // reads all rows into memory before returning any\n this._emitRowEvents = false\n this.on(\n 'newListener',\n function (event) {\n if (event === 'row') this._emitRowEvents = true\n }.bind(this)\n )\n})\n\nutil.inherits(NativeQuery, EventEmitter)\n\nconst errorFieldMap = {\n sqlState: 'code',\n statementPosition: 'position',\n messagePrimary: 'message',\n context: 'where',\n schemaName: 'schema',\n tableName: 'table',\n columnName: 'column',\n dataTypeName: 'dataType',\n constraintName: 'constraint',\n sourceFile: 'file',\n sourceLine: 'line',\n sourceFunction: 'routine',\n}\n\nNativeQuery.prototype.handleError = function (err) {\n // copy pq error fields into the error object\n const fields = this.native.pq.resultErrorFields()\n if (fields) {\n for (const key in fields) {\n const normalizedFieldName = errorFieldMap[key] || key\n err[normalizedFieldName] = fields[key]\n }\n }\n if (this.callback) {\n this.callback(err)\n } else {\n this.emit('error', err)\n }\n this.state = 'error'\n}\n\nNativeQuery.prototype.then = function (onSuccess, onFailure) {\n return this._getPromise().then(onSuccess, onFailure)\n}\n\nNativeQuery.prototype.catch = function (callback) {\n return this._getPromise().catch(callback)\n}\n\nNativeQuery.prototype._getPromise = function () {\n if (this._promise) return this._promise\n this._promise = new Promise(\n function (resolve, reject) {\n this._once('end', resolve)\n this._once('error', reject)\n }.bind(this)\n )\n return this._promise\n}\n\nNativeQuery.prototype.submit = function (client) {\n this.state = 'running'\n const self = this\n this.native = client.native\n client.native.arrayMode = this._arrayMode\n\n let after = function (err, rows, results) {\n client.native.arrayMode = false\n setImmediate(function () {\n self.emit('_done')\n })\n\n // handle possible query error\n if (err) {\n return self.handleError(err)\n }\n\n // emit row events for each row in the result\n if (self._emitRowEvents) {\n if (results.length > 1) {\n rows.forEach((rowOfRows, i) => {\n rowOfRows.forEach((row) => {\n self.emit('row', row, results[i])\n })\n })\n } else {\n rows.forEach(function (row) {\n self.emit('row', row, results)\n })\n }\n }\n\n // handle successful result\n self.state = 'end'\n self.emit('end', results)\n if (self.callback) {\n self.callback(null, results)\n }\n }\n\n if (process.domain) {\n after = process.domain.bind(after)\n }\n\n // named query\n if (this.name) {\n if (this.name.length > 63) {\n console.error('Warning! Postgres only supports 63 characters for query names.')\n console.error('You supplied %s (%s)', this.name, this.name.length)\n console.error('This can cause conflicts and silent errors executing queries')\n }\n const values = (this.values || []).map(utils.prepareValue)\n\n // check if the client has already executed this named query\n // if so...just execute it again - skip the planning phase\n if (client.namedQueries[this.name]) {\n if (this.text && client.namedQueries[this.name] !== this.text) {\n const err = new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)\n return after(err)\n }\n return client.native.execute(this.name, values, after)\n }\n // plan the named query the first time, then execute it\n return client.native.prepare(this.name, this.text, values.length, function (err) {\n if (err) return after(err)\n client.namedQueries[self.name] = self.text\n return self.native.execute(self.name, values, after)\n })\n } else if (this.values) {\n if (!Array.isArray(this.values)) {\n const err = new Error('Query values must be an array')\n return after(err)\n }\n const vals = this.values.map(utils.prepareValue)\n client.native.query(this.text, vals, after)\n } else if (this.queryMode === 'extended') {\n client.native.query(this.text, [], after)\n } else {\n client.native.query(this.text, after)\n }\n}\n","const nodeUtils = require('util')\n// eslint-disable-next-line\nvar Native\n// eslint-disable-next-line no-useless-catch\ntry {\n // Wrap this `require()` in a try-catch to avoid upstream bundlers from complaining that this might not be available since it is an optional import\n Native = require('pg-native')\n} catch (e) {\n throw e\n}\nconst TypeOverrides = require('../type-overrides')\nconst EventEmitter = require('events').EventEmitter\nconst util = require('util')\nconst ConnectionParameters = require('../connection-parameters')\n\nconst NativeQuery = require('./query')\n\nconst queryQueueLengthDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Calling client.query() when the client is already executing a query is deprecated and will be removed in pg@9.0. Use async/await or an external async flow control mechanism instead.'\n)\n\nconst Client = (module.exports = function (config) {\n EventEmitter.call(this)\n config = config || {}\n\n this._Promise = config.Promise || global.Promise\n this._types = new TypeOverrides(config.types)\n\n this.native = new Native({\n types: this._types,\n })\n\n this._queryQueue = []\n this._ending = false\n this._connecting = false\n this._connected = false\n this._queryable = true\n\n // keep these on the object for legacy reasons\n // for the time being. TODO: deprecate all this jazz\n const cp = (this.connectionParameters = new ConnectionParameters(config))\n if (config.nativeConnectionString) cp.nativeConnectionString = config.nativeConnectionString\n this.user = cp.user\n\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: cp.password,\n })\n this.database = cp.database\n this.host = cp.host\n this.port = cp.port\n\n // a hash to hold named queries\n this.namedQueries = {}\n})\n\nClient.Query = NativeQuery\n\nutil.inherits(Client, EventEmitter)\n\nClient.prototype._errorAllQueries = function (err) {\n const enqueueError = (query) => {\n process.nextTick(() => {\n query.native = this.native\n query.handleError(err)\n })\n }\n\n if (this._hasActiveQuery()) {\n enqueueError(this._activeQuery)\n this._activeQuery = null\n }\n\n this._queryQueue.forEach(enqueueError)\n this._queryQueue.length = 0\n}\n\n// connect to the backend\n// pass an optional callback to be called once connected\n// or with an error if there was a connection error\nClient.prototype._connect = function (cb) {\n const self = this\n\n if (this._connecting) {\n process.nextTick(() => cb(new Error('Client has already been connected. You cannot reuse a client.')))\n return\n }\n\n this._connecting = true\n\n this.connectionParameters.getLibpqConnectionString(function (err, conString) {\n if (self.connectionParameters.nativeConnectionString) conString = self.connectionParameters.nativeConnectionString\n if (err) return cb(err)\n self.native.connect(conString, function (err) {\n if (err) {\n self.native.end()\n return cb(err)\n }\n\n // set internal states to connected\n self._connected = true\n\n // handle connection errors from the native layer\n self.native.on('error', function (err) {\n self._queryable = false\n self._errorAllQueries(err)\n self.emit('error', err)\n })\n\n self.native.on('notification', function (msg) {\n self.emit('notification', {\n channel: msg.relname,\n payload: msg.extra,\n })\n })\n\n // signal we are connected now\n self.emit('connect')\n self._pulseQueryQueue(true)\n\n cb(null, this)\n })\n })\n}\n\nClient.prototype.connect = function (callback) {\n if (callback) {\n this._connect(callback)\n return\n }\n\n return new this._Promise((resolve, reject) => {\n this._connect((error) => {\n if (error) {\n reject(error)\n } else {\n resolve(this)\n }\n })\n })\n}\n\n// send a query to the server\n// this method is highly overloaded to take\n// 1) string query, optional array of parameters, optional function callback\n// 2) object query with {\n// string query\n// optional array values,\n// optional function callback instead of as a separate parameter\n// optional string name to name & cache the query plan\n// optional string rowMode = 'array' for an array of results\n// }\nClient.prototype.query = function (config, values, callback) {\n let query\n let result\n let readTimeout\n let readTimeoutTimer\n let queryCallback\n\n if (config === null || config === undefined) {\n throw new TypeError('Client was passed a null or undefined query')\n } else if (typeof config.submit === 'function') {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n result = query = config\n // accept query(new Query(...), (err, res) => { }) style\n if (typeof values === 'function') {\n config.callback = values\n }\n } else {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n query = new NativeQuery(config, values, callback)\n if (!query.callback) {\n let resolveOut, rejectOut\n result = new this._Promise((resolve, reject) => {\n resolveOut = resolve\n rejectOut = reject\n }).catch((err) => {\n Error.captureStackTrace(err)\n throw err\n })\n query.callback = (err, res) => (err ? rejectOut(err) : resolveOut(res))\n }\n }\n\n if (readTimeout) {\n queryCallback = query.callback || (() => {})\n\n readTimeoutTimer = setTimeout(() => {\n const error = new Error('Query read timeout')\n\n process.nextTick(() => {\n query.handleError(error, this.connection)\n })\n\n queryCallback(error)\n\n // we already returned an error,\n // just do nothing if query completes\n query.callback = () => {}\n\n // Remove from queue\n const index = this._queryQueue.indexOf(query)\n if (index > -1) {\n this._queryQueue.splice(index, 1)\n }\n\n this._pulseQueryQueue()\n }, readTimeout)\n\n query.callback = (err, res) => {\n clearTimeout(readTimeoutTimer)\n queryCallback(err, res)\n }\n }\n\n if (!this._queryable) {\n query.native = this.native\n process.nextTick(() => {\n query.handleError(new Error('Client has encountered a connection error and is not queryable'))\n })\n return result\n }\n\n if (this._ending) {\n query.native = this.native\n process.nextTick(() => {\n query.handleError(new Error('Client was closed and is not queryable'))\n })\n return result\n }\n\n if (this._queryQueue.length > 0) {\n queryQueueLengthDeprecationNotice()\n }\n\n this._queryQueue.push(query)\n this._pulseQueryQueue()\n return result\n}\n\n// disconnect from the backend server\nClient.prototype.end = function (cb) {\n const self = this\n\n this._ending = true\n\n if (!this._connected) {\n this.once('connect', this.end.bind(this, cb))\n }\n let result\n if (!cb) {\n result = new this._Promise(function (resolve, reject) {\n cb = (err) => (err ? reject(err) : resolve())\n })\n }\n\n this.native.end(function () {\n self._connected = false\n\n self._errorAllQueries(new Error('Connection terminated'))\n\n process.nextTick(() => {\n self.emit('end')\n if (cb) cb()\n })\n })\n return result\n}\n\nClient.prototype._hasActiveQuery = function () {\n return this._activeQuery && this._activeQuery.state !== 'error' && this._activeQuery.state !== 'end'\n}\n\nClient.prototype._pulseQueryQueue = function (initialConnection) {\n if (!this._connected) {\n return\n }\n if (this._hasActiveQuery()) {\n return\n }\n const query = this._queryQueue.shift()\n if (!query) {\n if (!initialConnection) {\n this.emit('drain')\n }\n return\n }\n this._activeQuery = query\n query.submit(this)\n const self = this\n query.once('_done', function () {\n self._pulseQueryQueue()\n })\n}\n\n// attempt to cancel an in-progress query\nClient.prototype.cancel = function (query) {\n if (this._activeQuery === query) {\n this.native.cancel(function () {})\n } else if (this._queryQueue.indexOf(query) !== -1) {\n this._queryQueue.splice(this._queryQueue.indexOf(query), 1)\n }\n}\n\nClient.prototype.ref = function () {}\nClient.prototype.unref = function () {}\n\nClient.prototype.setTypeParser = function (oid, format, parseFn) {\n return this._types.setTypeParser(oid, format, parseFn)\n}\n\nClient.prototype.getTypeParser = function (oid, format) {\n return this._types.getTypeParser(oid, format)\n}\n\nClient.prototype.isConnected = function () {\n return this._connected\n}\n","'use strict'\nmodule.exports = require('./client')\n","'use strict'\n\nconst Client = require('./client')\nconst defaults = require('./defaults')\nconst Connection = require('./connection')\nconst Result = require('./result')\nconst utils = require('./utils')\nconst Pool = require('pg-pool')\nconst TypeOverrides = require('./type-overrides')\nconst { DatabaseError } = require('pg-protocol')\nconst { escapeIdentifier, escapeLiteral } = require('./utils')\n\nconst poolFactory = (Client) => {\n return class BoundPool extends Pool {\n constructor(options) {\n super(options, Client)\n }\n }\n}\n\nconst PG = function (clientConstructor) {\n this.defaults = defaults\n this.Client = clientConstructor\n this.Query = this.Client.Query\n this.Pool = poolFactory(this.Client)\n this._pools = []\n this.Connection = Connection\n this.types = require('pg-types')\n this.DatabaseError = DatabaseError\n this.TypeOverrides = TypeOverrides\n this.escapeIdentifier = escapeIdentifier\n this.escapeLiteral = escapeLiteral\n this.Result = Result\n this.utils = utils\n}\n\nlet clientConstructor = Client\n\nlet forceNative = false\ntry {\n forceNative = !!process.env.NODE_PG_FORCE_NATIVE\n} catch {\n // ignore, e.g., Deno without --allow-env\n}\n\nif (forceNative) {\n clientConstructor = require('./native')\n}\n\nmodule.exports = new PG(clientConstructor)\n\n// lazy require native module...the native module may not have installed\nObject.defineProperty(module.exports, 'native', {\n configurable: true,\n enumerable: false,\n get() {\n let native = null\n try {\n native = new PG(require('./native'))\n } catch (err) {\n if (err.code !== 'MODULE_NOT_FOUND') {\n throw err\n }\n }\n\n // overwrite module.exports.native so that getter is never called again\n Object.defineProperty(module.exports, 'native', {\n value: native,\n })\n\n return native\n },\n})\n","// ESM wrapper for pg\nimport pg from '../lib/index.js'\n\n// Re-export all the properties\nexport const Client = pg.Client\nexport const Pool = pg.Pool\nexport const Connection = pg.Connection\nexport const types = pg.types\nexport const Query = pg.Query\nexport const DatabaseError = pg.DatabaseError\nexport const escapeIdentifier = pg.escapeIdentifier\nexport const escapeLiteral = pg.escapeLiteral\nexport const Result = pg.Result\nexport const TypeOverrides = pg.TypeOverrides\n\n// Also export the defaults\nexport const defaults = pg.defaults\n\n// Re-export the default\nexport default pg\n","'use strict'\n\nconst BACKSLASH = '\\\\'\nconst DQUOT = '\"'\nconst LBRACE = '{'\nconst RBRACE = '}'\nconst LBRACKET = '['\nconst EQUALS = '='\nconst COMMA = ','\n\n/** When the raw value is this, it means a literal `null` */\nconst NULL_STRING = 'NULL'\n\n/**\n * Parses an array according to\n * https://www.postgresql.org/docs/17/arrays.html#ARRAYS-IO\n *\n * Trusts the data (mostly), so only hook up to trusted Postgres servers.\n */\nfunction makeParseArrayWithTransform (transform) {\n const haveTransform = transform != null\n return function parseArray (str) {\n const rbraceIndex = str.length - 1\n if (rbraceIndex === 1) {\n return []\n }\n if (str[rbraceIndex] !== RBRACE) {\n throw new Error('Invalid array text - must end with }')\n }\n\n // If starts with `[`, it is specifying the index boundas. Skip past first `=`.\n let position = 0\n if (str[position] === LBRACKET) {\n position = str.indexOf(EQUALS) + 1\n }\n\n if (str[position++] !== LBRACE) {\n throw new Error('Invalid array text - must start with {')\n }\n const output = []\n let current = output\n const stack = []\n\n let currentStringStart = position\n let currentString = ''\n let expectValue = true\n\n for (; position < rbraceIndex; ++position) {\n let char = str[position]\n // > The array output routine will put double quotes around element values if\n // > they are empty strings, contain curly braces, delimiter characters, double\n // > quotes, backslashes, or white space, or match the word NULL. Double quotes\n // > and backslashes embedded in element values will be backslash-escaped.\n if (char === DQUOT) {\n // It's escaped\n currentStringStart = ++position\n let dquot = str.indexOf(DQUOT, currentStringStart)\n let backSlash = str.indexOf(BACKSLASH, currentStringStart)\n while (backSlash !== -1 && backSlash < dquot) {\n position = backSlash\n const part = str.slice(currentStringStart, position)\n currentString += part\n currentStringStart = ++position\n if (dquot === position++) {\n // This was an escaped doublequote; find the next one!\n dquot = str.indexOf(DQUOT, position)\n }\n // Either way, find the next backslash\n backSlash = str.indexOf(BACKSLASH, position)\n }\n position = dquot\n const part = str.slice(currentStringStart, position)\n currentString += part\n current.push(haveTransform ? transform(currentString) : currentString)\n currentString = ''\n expectValue = false\n } else if (char === LBRACE) {\n const newArray = []\n current.push(newArray)\n stack.push(current)\n current = newArray\n currentStringStart = position + 1\n expectValue = true\n } else if (char === COMMA) {\n expectValue = true\n } else if (char === RBRACE) {\n expectValue = false\n const arr = stack.pop()\n if (arr === undefined) {\n throw new Error(\"Invalid array text - too many '}'\")\n }\n current = arr\n } else if (expectValue) {\n currentStringStart = position\n while (\n (char = str[position]) !== COMMA &&\n char !== RBRACE &&\n position < rbraceIndex\n ) {\n ++position\n }\n const part = str.slice(currentStringStart, position--)\n current.push(\n part === NULL_STRING ? null : haveTransform ? transform(part) : part\n )\n expectValue = false\n } else {\n throw new Error('Was expecting delimeter')\n }\n }\n\n return output\n }\n}\n\nconst parseArray = makeParseArrayWithTransform()\n\nexports.parse = (source, transform) =>\n transform != null\n ? makeParseArrayWithTransform(transform)(source)\n : parseArray(source)\n","// src/pg.ts\nimport { Debug, DriverAdapterError } from \"@prisma/driver-adapter-utils\";\nimport pg2 from \"pg\";\n\n// package.json\nvar name = \"@prisma/adapter-pg\";\n\n// src/constants.ts\nvar FIRST_NORMAL_OBJECT_ID = 16384;\n\n// src/conversion.ts\nimport { ColumnTypeEnum } from \"@prisma/driver-adapter-utils\";\nimport pg from \"pg\";\nimport { parse as parseArray } from \"postgres-array\";\nvar { types } = pg;\nvar { builtins: ScalarColumnType, getTypeParser } = types;\nvar AdditionalScalarColumnType = {\n NAME: 19\n};\nvar ArrayColumnType = {\n BIT_ARRAY: 1561,\n BOOL_ARRAY: 1e3,\n BYTEA_ARRAY: 1001,\n BPCHAR_ARRAY: 1014,\n CHAR_ARRAY: 1002,\n CIDR_ARRAY: 651,\n DATE_ARRAY: 1182,\n FLOAT4_ARRAY: 1021,\n FLOAT8_ARRAY: 1022,\n INET_ARRAY: 1041,\n INT2_ARRAY: 1005,\n INT4_ARRAY: 1007,\n INT8_ARRAY: 1016,\n JSONB_ARRAY: 3807,\n JSON_ARRAY: 199,\n MONEY_ARRAY: 791,\n NUMERIC_ARRAY: 1231,\n OID_ARRAY: 1028,\n TEXT_ARRAY: 1009,\n TIMESTAMP_ARRAY: 1115,\n TIMESTAMPTZ_ARRAY: 1185,\n TIME_ARRAY: 1183,\n UUID_ARRAY: 2951,\n VARBIT_ARRAY: 1563,\n VARCHAR_ARRAY: 1015,\n XML_ARRAY: 143\n};\nvar UnsupportedNativeDataType = class _UnsupportedNativeDataType extends Error {\n // map of type codes to type names\n static typeNames = {\n 16: \"bool\",\n 17: \"bytea\",\n 18: \"char\",\n 19: \"name\",\n 20: \"int8\",\n 21: \"int2\",\n 22: \"int2vector\",\n 23: \"int4\",\n 24: \"regproc\",\n 25: \"text\",\n 26: \"oid\",\n 27: \"tid\",\n 28: \"xid\",\n 29: \"cid\",\n 30: \"oidvector\",\n 32: \"pg_ddl_command\",\n 71: \"pg_type\",\n 75: \"pg_attribute\",\n 81: \"pg_proc\",\n 83: \"pg_class\",\n 114: \"json\",\n 142: \"xml\",\n 194: \"pg_node_tree\",\n 269: \"table_am_handler\",\n 325: \"index_am_handler\",\n 600: \"point\",\n 601: \"lseg\",\n 602: \"path\",\n 603: \"box\",\n 604: \"polygon\",\n 628: \"line\",\n 650: \"cidr\",\n 700: \"float4\",\n 701: \"float8\",\n 705: \"unknown\",\n 718: \"circle\",\n 774: \"macaddr8\",\n 790: \"money\",\n 829: \"macaddr\",\n 869: \"inet\",\n 1033: \"aclitem\",\n 1042: \"bpchar\",\n 1043: \"varchar\",\n 1082: \"date\",\n 1083: \"time\",\n 1114: \"timestamp\",\n 1184: \"timestamptz\",\n 1186: \"interval\",\n 1266: \"timetz\",\n 1560: \"bit\",\n 1562: \"varbit\",\n 1700: \"numeric\",\n 1790: \"refcursor\",\n 2202: \"regprocedure\",\n 2203: \"regoper\",\n 2204: \"regoperator\",\n 2205: \"regclass\",\n 2206: \"regtype\",\n 2249: \"record\",\n 2275: \"cstring\",\n 2276: \"any\",\n 2277: \"anyarray\",\n 2278: \"void\",\n 2279: \"trigger\",\n 2280: \"language_handler\",\n 2281: \"internal\",\n 2283: \"anyelement\",\n 2287: \"_record\",\n 2776: \"anynonarray\",\n 2950: \"uuid\",\n 2970: \"txid_snapshot\",\n 3115: \"fdw_handler\",\n 3220: \"pg_lsn\",\n 3310: \"tsm_handler\",\n 3361: \"pg_ndistinct\",\n 3402: \"pg_dependencies\",\n 3500: \"anyenum\",\n 3614: \"tsvector\",\n 3615: \"tsquery\",\n 3642: \"gtsvector\",\n 3734: \"regconfig\",\n 3769: \"regdictionary\",\n 3802: \"jsonb\",\n 3831: \"anyrange\",\n 3838: \"event_trigger\",\n 3904: \"int4range\",\n 3906: \"numrange\",\n 3908: \"tsrange\",\n 3910: \"tstzrange\",\n 3912: \"daterange\",\n 3926: \"int8range\",\n 4072: \"jsonpath\",\n 4089: \"regnamespace\",\n 4096: \"regrole\",\n 4191: \"regcollation\",\n 4451: \"int4multirange\",\n 4532: \"nummultirange\",\n 4533: \"tsmultirange\",\n 4534: \"tstzmultirange\",\n 4535: \"datemultirange\",\n 4536: \"int8multirange\",\n 4537: \"anymultirange\",\n 4538: \"anycompatiblemultirange\",\n 4600: \"pg_brin_bloom_summary\",\n 4601: \"pg_brin_minmax_multi_summary\",\n 5017: \"pg_mcv_list\",\n 5038: \"pg_snapshot\",\n 5069: \"xid8\",\n 5077: \"anycompatible\",\n 5078: \"anycompatiblearray\",\n 5079: \"anycompatiblenonarray\",\n 5080: \"anycompatiblerange\"\n };\n type;\n constructor(code) {\n super();\n this.type = _UnsupportedNativeDataType.typeNames[code] || \"Unknown\";\n this.message = `Unsupported column type ${this.type}`;\n }\n};\nfunction fieldToColumnType(fieldTypeId) {\n switch (fieldTypeId) {\n case ScalarColumnType.INT2:\n case ScalarColumnType.INT4:\n return ColumnTypeEnum.Int32;\n case ScalarColumnType.INT8:\n return ColumnTypeEnum.Int64;\n case ScalarColumnType.FLOAT4:\n return ColumnTypeEnum.Float;\n case ScalarColumnType.FLOAT8:\n return ColumnTypeEnum.Double;\n case ScalarColumnType.BOOL:\n return ColumnTypeEnum.Boolean;\n case ScalarColumnType.DATE:\n return ColumnTypeEnum.Date;\n case ScalarColumnType.TIME:\n case ScalarColumnType.TIMETZ:\n return ColumnTypeEnum.Time;\n case ScalarColumnType.TIMESTAMP:\n case ScalarColumnType.TIMESTAMPTZ:\n return ColumnTypeEnum.DateTime;\n case ScalarColumnType.NUMERIC:\n case ScalarColumnType.MONEY:\n return ColumnTypeEnum.Numeric;\n case ScalarColumnType.JSON:\n case ScalarColumnType.JSONB:\n return ColumnTypeEnum.Json;\n case ScalarColumnType.UUID:\n return ColumnTypeEnum.Uuid;\n case ScalarColumnType.OID:\n return ColumnTypeEnum.Int64;\n case ScalarColumnType.BPCHAR:\n case ScalarColumnType.TEXT:\n case ScalarColumnType.VARCHAR:\n case ScalarColumnType.BIT:\n case ScalarColumnType.VARBIT:\n case ScalarColumnType.INET:\n case ScalarColumnType.CIDR:\n case ScalarColumnType.XML:\n case AdditionalScalarColumnType.NAME:\n return ColumnTypeEnum.Text;\n case ScalarColumnType.BYTEA:\n return ColumnTypeEnum.Bytes;\n case ArrayColumnType.INT2_ARRAY:\n case ArrayColumnType.INT4_ARRAY:\n return ColumnTypeEnum.Int32Array;\n case ArrayColumnType.FLOAT4_ARRAY:\n return ColumnTypeEnum.FloatArray;\n case ArrayColumnType.FLOAT8_ARRAY:\n return ColumnTypeEnum.DoubleArray;\n case ArrayColumnType.NUMERIC_ARRAY:\n case ArrayColumnType.MONEY_ARRAY:\n return ColumnTypeEnum.NumericArray;\n case ArrayColumnType.BOOL_ARRAY:\n return ColumnTypeEnum.BooleanArray;\n case ArrayColumnType.CHAR_ARRAY:\n return ColumnTypeEnum.CharacterArray;\n case ArrayColumnType.BPCHAR_ARRAY:\n case ArrayColumnType.TEXT_ARRAY:\n case ArrayColumnType.VARCHAR_ARRAY:\n case ArrayColumnType.VARBIT_ARRAY:\n case ArrayColumnType.BIT_ARRAY:\n case ArrayColumnType.INET_ARRAY:\n case ArrayColumnType.CIDR_ARRAY:\n case ArrayColumnType.XML_ARRAY:\n return ColumnTypeEnum.TextArray;\n case ArrayColumnType.DATE_ARRAY:\n return ColumnTypeEnum.DateArray;\n case ArrayColumnType.TIME_ARRAY:\n return ColumnTypeEnum.TimeArray;\n case ArrayColumnType.TIMESTAMP_ARRAY:\n return ColumnTypeEnum.DateTimeArray;\n case ArrayColumnType.TIMESTAMPTZ_ARRAY:\n return ColumnTypeEnum.DateTimeArray;\n case ArrayColumnType.JSON_ARRAY:\n case ArrayColumnType.JSONB_ARRAY:\n return ColumnTypeEnum.JsonArray;\n case ArrayColumnType.BYTEA_ARRAY:\n return ColumnTypeEnum.BytesArray;\n case ArrayColumnType.UUID_ARRAY:\n return ColumnTypeEnum.UuidArray;\n case ArrayColumnType.INT8_ARRAY:\n case ArrayColumnType.OID_ARRAY:\n return ColumnTypeEnum.Int64Array;\n default:\n if (fieldTypeId >= FIRST_NORMAL_OBJECT_ID) {\n return ColumnTypeEnum.Text;\n }\n throw new UnsupportedNativeDataType(fieldTypeId);\n }\n}\nfunction normalize_array(element_normalizer) {\n return (str) => parseArray(str, element_normalizer);\n}\nfunction normalize_numeric(numeric) {\n return numeric;\n}\nfunction normalize_date(date) {\n return date;\n}\nfunction normalize_timestamp(time) {\n return `${time.replace(\" \", \"T\")}+00:00`;\n}\nfunction normalize_timestamptz(time) {\n return time.replace(\" \", \"T\").replace(/[+-]\\d{2}(:\\d{2})?$/, \"+00:00\");\n}\nfunction normalize_time(time) {\n return time;\n}\nfunction normalize_timez(time) {\n return time.replace(/[+-]\\d{2}(:\\d{2})?$/, \"\");\n}\nfunction normalize_money(money) {\n return money.slice(1);\n}\nfunction normalize_xml(xml) {\n return xml;\n}\nfunction toJson(json) {\n return json;\n}\nvar parsePgBytes = getTypeParser(ScalarColumnType.BYTEA);\nvar normalizeByteaArray = getTypeParser(ArrayColumnType.BYTEA_ARRAY);\nfunction convertBytes(serializedBytes) {\n return parsePgBytes(serializedBytes);\n}\nfunction normalizeBit(bit) {\n return bit;\n}\nvar customParsers = {\n [ScalarColumnType.NUMERIC]: normalize_numeric,\n [ArrayColumnType.NUMERIC_ARRAY]: normalize_array(normalize_numeric),\n [ScalarColumnType.TIME]: normalize_time,\n [ArrayColumnType.TIME_ARRAY]: normalize_array(normalize_time),\n [ScalarColumnType.TIMETZ]: normalize_timez,\n [ScalarColumnType.DATE]: normalize_date,\n [ArrayColumnType.DATE_ARRAY]: normalize_array(normalize_date),\n [ScalarColumnType.TIMESTAMP]: normalize_timestamp,\n [ArrayColumnType.TIMESTAMP_ARRAY]: normalize_array(normalize_timestamp),\n [ScalarColumnType.TIMESTAMPTZ]: normalize_timestamptz,\n [ArrayColumnType.TIMESTAMPTZ_ARRAY]: normalize_array(normalize_timestamptz),\n [ScalarColumnType.MONEY]: normalize_money,\n [ArrayColumnType.MONEY_ARRAY]: normalize_array(normalize_money),\n [ScalarColumnType.JSON]: toJson,\n [ArrayColumnType.JSON_ARRAY]: normalize_array(toJson),\n [ScalarColumnType.JSONB]: toJson,\n [ArrayColumnType.JSONB_ARRAY]: normalize_array(toJson),\n [ScalarColumnType.BYTEA]: convertBytes,\n [ArrayColumnType.BYTEA_ARRAY]: normalizeByteaArray,\n [ArrayColumnType.BIT_ARRAY]: normalize_array(normalizeBit),\n [ArrayColumnType.VARBIT_ARRAY]: normalize_array(normalizeBit),\n [ArrayColumnType.XML_ARRAY]: normalize_array(normalize_xml)\n};\nfunction mapArg(arg, argType) {\n if (arg === null) {\n return null;\n }\n if (Array.isArray(arg) && argType.arity === \"list\") {\n return arg.map((value) => mapArg(value, argType));\n }\n if (typeof arg === \"string\" && argType.scalarType === \"datetime\") {\n arg = new Date(arg);\n }\n if (arg instanceof Date) {\n switch (argType.dbType) {\n case \"TIME\":\n case \"TIMETZ\":\n return formatTime(arg);\n case \"DATE\":\n return formatDate(arg);\n default:\n return formatDateTime(arg);\n }\n }\n if (typeof arg === \"string\" && argType.scalarType === \"bytes\") {\n return Buffer.from(arg, \"base64\");\n }\n if (ArrayBuffer.isView(arg)) {\n return new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength);\n }\n return arg;\n}\nfunction formatDateTime(date) {\n const pad = (n, z = 2) => String(n).padStart(z, \"0\");\n const ms = date.getUTCMilliseconds();\n return pad(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1) + \"-\" + pad(date.getUTCDate()) + \" \" + pad(date.getUTCHours()) + \":\" + pad(date.getUTCMinutes()) + \":\" + pad(date.getUTCSeconds()) + (ms ? \".\" + String(ms).padStart(3, \"0\") : \"\");\n}\nfunction formatDate(date) {\n const pad = (n, z = 2) => String(n).padStart(z, \"0\");\n return pad(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1) + \"-\" + pad(date.getUTCDate());\n}\nfunction formatTime(date) {\n const pad = (n, z = 2) => String(n).padStart(z, \"0\");\n const ms = date.getUTCMilliseconds();\n return pad(date.getUTCHours()) + \":\" + pad(date.getUTCMinutes()) + \":\" + pad(date.getUTCSeconds()) + (ms ? \".\" + String(ms).padStart(3, \"0\") : \"\");\n}\n\n// src/errors.ts\nvar TLS_ERRORS = /* @__PURE__ */ new Set([\n \"UNABLE_TO_GET_ISSUER_CERT\",\n \"UNABLE_TO_GET_CRL\",\n \"UNABLE_TO_DECRYPT_CERT_SIGNATURE\",\n \"UNABLE_TO_DECRYPT_CRL_SIGNATURE\",\n \"UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY\",\n \"CERT_SIGNATURE_FAILURE\",\n \"CRL_SIGNATURE_FAILURE\",\n \"CERT_NOT_YET_VALID\",\n \"CERT_HAS_EXPIRED\",\n \"CRL_NOT_YET_VALID\",\n \"CRL_HAS_EXPIRED\",\n \"ERROR_IN_CERT_NOT_BEFORE_FIELD\",\n \"ERROR_IN_CERT_NOT_AFTER_FIELD\",\n \"ERROR_IN_CRL_LAST_UPDATE_FIELD\",\n \"ERROR_IN_CRL_NEXT_UPDATE_FIELD\",\n \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"SELF_SIGNED_CERT_IN_CHAIN\",\n \"UNABLE_TO_GET_ISSUER_CERT_LOCALLY\",\n \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n \"CERT_CHAIN_TOO_LONG\",\n \"CERT_REVOKED\",\n \"INVALID_CA\",\n \"INVALID_PURPOSE\",\n \"CERT_UNTRUSTED\",\n \"CERT_REJECTED\",\n \"HOSTNAME_MISMATCH\",\n \"ERR_TLS_CERT_ALTNAME_FORMAT\",\n \"ERR_TLS_CERT_ALTNAME_INVALID\"\n]);\nvar SOCKET_ERRORS = /* @__PURE__ */ new Set([\"ENOTFOUND\", \"ECONNREFUSED\", \"ECONNRESET\", \"ETIMEDOUT\"]);\nfunction convertDriverError(error) {\n if (isSocketError(error)) {\n return mapSocketError(error);\n }\n if (isTlsError(error)) {\n return {\n kind: \"TlsConnectionError\",\n reason: error.message\n };\n }\n if (isDriverError(error)) {\n return {\n originalCode: error.code,\n originalMessage: error.message,\n ...mapDriverError(error)\n };\n }\n throw error;\n}\nfunction mapDriverError(error) {\n switch (error.code) {\n case \"22001\":\n return {\n kind: \"LengthMismatch\",\n column: error.column\n };\n case \"22003\":\n return {\n kind: \"ValueOutOfRange\",\n cause: error.message\n };\n case \"22P02\":\n return {\n kind: \"InvalidInputValue\",\n message: error.message\n };\n case \"23505\": {\n const fields = error.detail?.match(/Key \\(([^)]+)\\)/)?.at(1)?.split(\", \");\n return {\n kind: \"UniqueConstraintViolation\",\n constraint: fields !== void 0 ? { fields } : void 0\n };\n }\n case \"23502\": {\n const fields = error.detail?.match(/Key \\(([^)]+)\\)/)?.at(1)?.split(\", \");\n return {\n kind: \"NullConstraintViolation\",\n constraint: fields !== void 0 ? { fields } : void 0\n };\n }\n case \"23503\": {\n let constraint;\n if (error.column) {\n constraint = { fields: [error.column] };\n } else if (error.constraint) {\n constraint = { index: error.constraint };\n }\n return {\n kind: \"ForeignKeyConstraintViolation\",\n constraint\n };\n }\n case \"3D000\":\n return {\n kind: \"DatabaseDoesNotExist\",\n db: error.message.split(\" \").at(1)?.split('\"').at(1)\n };\n case \"28000\":\n return {\n kind: \"DatabaseAccessDenied\",\n db: error.message.split(\",\").find((s) => s.startsWith(\" database\"))?.split('\"').at(1)\n };\n case \"28P01\":\n return {\n kind: \"AuthenticationFailed\",\n user: error.message.split(\" \").pop()?.split('\"').at(1)\n };\n case \"40001\":\n return {\n kind: \"TransactionWriteConflict\"\n };\n case \"42P01\":\n return {\n kind: \"TableDoesNotExist\",\n table: error.message.split(\" \").at(1)?.split('\"').at(1)\n };\n case \"42703\":\n return {\n kind: \"ColumnNotFound\",\n column: error.message.split(\" \").at(1)?.split('\"').at(1)\n };\n case \"42P04\":\n return {\n kind: \"DatabaseAlreadyExists\",\n db: error.message.split(\" \").at(1)?.split('\"').at(1)\n };\n case \"53300\":\n return {\n kind: \"TooManyConnections\",\n cause: error.message\n };\n default:\n return {\n kind: \"postgres\",\n code: error.code ?? \"N/A\",\n severity: error.severity ?? \"N/A\",\n message: error.message,\n detail: error.detail,\n column: error.column,\n hint: error.hint\n };\n }\n}\nfunction isDriverError(error) {\n return typeof error.code === \"string\" && typeof error.message === \"string\" && typeof error.severity === \"string\" && (typeof error.detail === \"string\" || error.detail === void 0) && (typeof error.column === \"string\" || error.column === void 0) && (typeof error.hint === \"string\" || error.hint === void 0);\n}\nfunction mapSocketError(error) {\n switch (error.code) {\n case \"ENOTFOUND\":\n case \"ECONNREFUSED\":\n return {\n kind: \"DatabaseNotReachable\",\n host: error.address ?? error.hostname,\n port: error.port\n };\n case \"ECONNRESET\":\n return {\n kind: \"ConnectionClosed\"\n };\n case \"ETIMEDOUT\":\n return {\n kind: \"SocketTimeout\"\n };\n }\n}\nfunction isSocketError(error) {\n return typeof error.code === \"string\" && typeof error.syscall === \"string\" && typeof error.errno === \"number\" && SOCKET_ERRORS.has(error.code);\n}\nfunction isTlsError(error) {\n if (typeof error.code === \"string\") {\n return TLS_ERRORS.has(error.code);\n }\n switch (error.message) {\n case \"The server does not support SSL connections\":\n case \"There was an error establishing an SSL connection\":\n return true;\n }\n return false;\n}\n\n// src/pg.ts\nvar types2 = pg2.types;\nvar debug = Debug(\"prisma:driver-adapter:pg\");\nvar PgQueryable = class {\n constructor(client, pgOptions) {\n this.client = client;\n this.pgOptions = pgOptions;\n }\n provider = \"postgres\";\n adapterName = name;\n /**\n * Execute a query given as SQL, interpolating the given parameters.\n */\n async queryRaw(query) {\n const tag = \"[js::query_raw]\";\n debug(`${tag} %O`, query);\n const { fields, rows } = await this.performIO(query);\n const columnNames = fields.map((field) => field.name);\n let columnTypes = [];\n try {\n columnTypes = fields.map((field) => fieldToColumnType(field.dataTypeID));\n } catch (e) {\n if (e instanceof UnsupportedNativeDataType) {\n throw new DriverAdapterError({\n kind: \"UnsupportedNativeDataType\",\n type: e.type\n });\n }\n throw e;\n }\n const udtParser = this.pgOptions?.userDefinedTypeParser;\n if (udtParser) {\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (field.dataTypeID >= FIRST_NORMAL_OBJECT_ID && !Object.hasOwn(customParsers, field.dataTypeID)) {\n for (let j = 0; j < rows.length; j++) {\n rows[j][i] = await udtParser(field.dataTypeID, rows[j][i], this);\n }\n }\n }\n }\n return {\n columnNames,\n columnTypes,\n rows\n };\n }\n /**\n * Execute a query given as SQL, interpolating the given parameters and\n * returning the number of affected rows.\n * Note: Queryable expects a u64, but napi.rs only supports u32.\n */\n async executeRaw(query) {\n const tag = \"[js::execute_raw]\";\n debug(`${tag} %O`, query);\n return (await this.performIO(query)).rowCount ?? 0;\n }\n /**\n * Run a query against the database, returning the result set.\n * Should the query fail due to a connection error, the connection is\n * marked as unhealthy.\n */\n async performIO(query) {\n const { sql, args } = query;\n const values = args.map((arg, i) => mapArg(arg, query.argTypes[i]));\n try {\n const result = await this.client.query(\n {\n text: sql,\n values,\n rowMode: \"array\",\n types: {\n // This is the error expected:\n // No overload matches this call.\n // The last overload gave the following error.\n // Type '(oid: number, format?: any) => (json: string) => unknown' is not assignable to type '{ <T>(oid: number): TypeParser<string, string | T>; <T>(oid: number, format: \"text\"): TypeParser<string, string | T>; <T>(oid: number, format: \"binary\"): TypeParser<...>; }'.\n // Type '(json: string) => unknown' is not assignable to type 'TypeParser<Buffer, any>'.\n // Types of parameters 'json' and 'value' are incompatible.\n // Type 'Buffer' is not assignable to type 'string'.ts(2769)\n //\n // Because pg-types types expect us to handle both binary and text protocol versions,\n // where as far we can see, pg will ever pass only text version.\n //\n // @ts-expect-error\n getTypeParser: (oid, format) => {\n if (format === \"text\" && customParsers[oid]) {\n return customParsers[oid];\n }\n return types2.getTypeParser(oid, format);\n }\n }\n },\n values\n );\n return result;\n } catch (e) {\n this.onError(e);\n }\n }\n onError(error) {\n debug(\"Error in performIO: %O\", error);\n throw new DriverAdapterError(convertDriverError(error));\n }\n};\nvar PgTransaction = class extends PgQueryable {\n constructor(client, options, pgOptions, cleanup) {\n super(client, pgOptions);\n this.options = options;\n this.pgOptions = pgOptions;\n this.cleanup = cleanup;\n }\n async commit() {\n debug(`[js::commit]`);\n this.cleanup?.();\n this.client.release();\n }\n async rollback() {\n debug(`[js::rollback]`);\n this.cleanup?.();\n this.client.release();\n }\n};\nvar PrismaPgAdapter = class extends PgQueryable {\n constructor(client, pgOptions, release) {\n super(client);\n this.pgOptions = pgOptions;\n this.release = release;\n }\n async startTransaction(isolationLevel) {\n const options = {\n usePhantomQuery: false\n };\n const tag = \"[js::startTransaction]\";\n debug(\"%s options: %O\", tag, options);\n const conn = await this.client.connect().catch((error) => this.onError(error));\n const onError = (err) => {\n debug(`Error from pool connection: ${err.message} %O`, err);\n this.pgOptions?.onConnectionError?.(err);\n };\n conn.on(\"error\", onError);\n const cleanup = () => {\n conn.removeListener(\"error\", onError);\n };\n try {\n const tx = new PgTransaction(conn, options, this.pgOptions, cleanup);\n await tx.executeRaw({ sql: \"BEGIN\", args: [], argTypes: [] });\n if (isolationLevel) {\n await tx.executeRaw({\n sql: `SET TRANSACTION ISOLATION LEVEL ${isolationLevel}`,\n args: [],\n argTypes: []\n });\n }\n return tx;\n } catch (error) {\n cleanup();\n conn.release(error);\n this.onError(error);\n }\n }\n async executeScript(script) {\n const statements = script.split(\";\").map((stmt) => stmt.trim()).filter((stmt) => stmt.length > 0);\n for (const stmt of statements) {\n try {\n await this.client.query(stmt);\n } catch (error) {\n this.onError(error);\n }\n }\n }\n getConnectionInfo() {\n return {\n schemaName: this.pgOptions?.schema,\n supportsRelationJoins: true\n };\n }\n async dispose() {\n return this.release?.();\n }\n underlyingDriver() {\n return this.client;\n }\n};\nvar PrismaPgAdapterFactory = class {\n constructor(poolOrConfig, options) {\n this.options = options;\n if (poolOrConfig instanceof pg2.Pool) {\n this.externalPool = poolOrConfig;\n this.config = poolOrConfig.options;\n } else {\n this.externalPool = null;\n this.config = poolOrConfig;\n }\n }\n provider = \"postgres\";\n adapterName = name;\n config;\n externalPool;\n async connect() {\n const client = this.externalPool ?? new pg2.Pool(this.config);\n const onIdleClientError = (err) => {\n debug(`Error from idle pool client: ${err.message} %O`, err);\n this.options?.onPoolError?.(err);\n };\n client.on(\"error\", onIdleClientError);\n return new PrismaPgAdapter(client, this.options, async () => {\n if (this.externalPool) {\n if (this.options?.disposeExternalPool) {\n await this.externalPool.end();\n this.externalPool = null;\n } else {\n this.externalPool.removeListener(\"error\", onIdleClientError);\n }\n } else {\n await client.end();\n }\n });\n }\n async connectToShadowDb() {\n const conn = await this.connect();\n const database = `prisma_migrate_shadow_db_${globalThis.crypto.randomUUID()}`;\n await conn.executeScript(`CREATE DATABASE \"${database}\"`);\n const client = new pg2.Pool({ ...this.config, database });\n return new PrismaPgAdapter(client, void 0, async () => {\n await conn.executeScript(`DROP DATABASE \"${database}\"`);\n await client.end();\n });\n }\n};\nexport {\n PrismaPgAdapterFactory as PrismaPg\n};\n","import { PrismaClient } from './prisma'\nimport { PrismaPg } from '@prisma/adapter-pg'\nimport pg from 'pg'\n\nlet prismaClient: PrismaClient | null = null\nlet pool: pg.Pool | null = null\n\n/**\n * Gets the internal Prisma client instance.\n * Creates one if it doesn't exist.\n */\nexport function getDbClient(): PrismaClient {\n if (!prismaClient) {\n const databaseUrl = process.env.AC_CORE_DATABASE_URL\n if (!databaseUrl) {\n throw new Error(\n 'AC_CORE_DATABASE_URL environment variable is required for PrismaClient initialization',\n )\n }\n\n // Prisma 7 with adapter: Create pg pool and wrap with adapter\n pool = new pg.Pool({ connectionString: databaseUrl })\n const adapter = new PrismaPg(pool)\n\n prismaClient = new PrismaClient({ adapter })\n }\n return prismaClient\n}\n\n/**\n * Sets the internal Prisma client instance.\n * Used by middleware to bridge with existing getDbClient() usage.\n */\nexport function setDbClient(client: PrismaClient): void {\n prismaClient = client\n}\n\n/**\n * Connects to the database.\n * Call this before performing database operations.\n */\nexport async function connectDb(): Promise<void> {\n const client = getDbClient()\n await client.$connect()\n}\n\n/**\n * Disconnects from the database.\n * Call this when done with database operations (e.g., in scripts).\n */\nexport async function disconnectDb(): Promise<void> {\n if (prismaClient) {\n await prismaClient.$disconnect()\n prismaClient = null\n }\n if (pool) {\n await pool.end()\n pool = null\n }\n}\n","import { getDbClient } from '../../db/client'\nimport type {\n AppApprovalMethod,\n AppCatalogData,\n AppCategory,\n AppForCatalog,\n GroupingTagDefinition,\n} from '../../types/common/appCatalogTypes'\nimport type {\n CustomConfig,\n PersonTeamConfig,\n ServiceConfig,\n} from '../../types/common/approvalMethodTypes'\nimport { omit } from 'radashi'\n\nfunction capitalize(word: string): string {\n if (!word) return word\n return word.charAt(0).toUpperCase() + word.slice(1)\n}\n\nexport async function getGroupingTagDefinitionsFromPrisma(): Promise<\n Array<GroupingTagDefinition>\n> {\n const prisma = getDbClient()\n\n // Fetch all tag definitions\n const rows = await prisma.dbAppTagDefinition.findMany()\n\n // Fetch all apps to count tag usage\n const apps = await prisma.dbAppForCatalog.findMany({\n select: { tags: true },\n })\n\n // Count tag values across all apps\n const tagCounts = new Map<string, Map<string, number>>()\n\n for (const app of apps) {\n const tags = (app.tags as unknown as Array<string> | null) ?? []\n for (const tag of tags) {\n const [prefix, value] = tag.split(':')\n if (prefix && value) {\n if (!tagCounts.has(prefix)) {\n tagCounts.set(prefix, new Map())\n }\n const prefixCounts = tagCounts.get(prefix)!\n prefixCounts.set(value, (prefixCounts.get(value) ?? 0) + 1)\n }\n }\n }\n\n // Sort values by count and return definitions\n return rows.map((row) => {\n const definition = omit(row, ['id', 'updatedAt', 'createdAt'])\n const counts = tagCounts.get(definition.prefix) ?? new Map()\n\n // Sort values by count (descending)\n const sortedValues = [...definition.values].sort((a, b) => {\n const countA = counts.get(a.value) ?? 0\n const countB = counts.get(b.value) ?? 0\n return countB - countA\n })\n\n return {\n ...definition,\n values: sortedValues,\n }\n })\n}\n\nexport async function getApprovalMethodsFromPrisma(): Promise<\n Array<AppApprovalMethod>\n> {\n const prisma = getDbClient()\n\n // Fetch all apps\n const rows = await prisma.dbApprovalMethod.findMany()\n\n return rows.map((row) => {\n // Handle discriminated union by explicitly narrowing based on type\n const baseFields = {\n slug: row.slug,\n displayName: row.displayName,\n }\n\n // Provide default empty config if null, as AppApprovalMethod discriminated union requires config\n const config = row.config ?? {}\n\n switch (row.type) {\n case 'service':\n return {\n ...baseFields,\n type: 'service',\n config: config as ServiceConfig,\n }\n case 'personTeam':\n return {\n ...baseFields,\n type: 'personTeam',\n config: config as PersonTeamConfig,\n }\n case 'custom':\n return { ...baseFields, type: 'custom', config: config as CustomConfig }\n }\n })\n}\n\nexport async function getAppsFromPrisma(): Promise<Array<AppForCatalog>> {\n const prisma = getDbClient()\n\n // Fetch all apps\n const rows = await prisma.dbAppForCatalog.findMany()\n\n return rows.map((row) => {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as Array<string> | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = (row.sources as unknown as Array<string> | null) ?? []\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n }\n })\n}\n\nexport function deriveCategories(\n apps: Array<AppForCatalog>,\n): Array<AppCategory> {\n const tagSet = new Set<string>()\n for (const app of apps) {\n for (const tag of app.tags ?? []) {\n const normalized = tag.trim().toLowerCase()\n if (normalized) tagSet.add(normalized)\n }\n }\n const categories: Array<AppCategory> = [{ id: 'all', name: 'All' }]\n for (const tag of Array.from(tagSet).sort()) {\n categories.push({ id: tag, name: capitalize(tag) })\n }\n return categories\n}\n\nexport async function getAppCatalogData(\n getAppsOptional?: () => Promise<Array<AppForCatalog>>,\n): Promise<AppCatalogData> {\n const apps = getAppsOptional\n ? await getAppsOptional()\n : await getAppsFromPrisma()\n\n return {\n apps,\n tagsDefinitions: await getGroupingTagDefinitionsFromPrisma(),\n approvalMethods: await getApprovalMethodsFromPrisma(),\n }\n}\n","import { tableSync } from '@igstack/app-catalog-table-sync'\nimport type { Prisma, PrismaClient } from './prisma'\nimport { mapValues, omit, pick } from 'radashi'\n\nexport type ScalarKeys<TPrismaModelName extends Prisma.ModelName> =\n keyof Prisma.TypeMap['model'][TPrismaModelName]['payload']['scalars']\nexport type ObjectKeys<TPrismaModelName extends Prisma.ModelName> =\n keyof Prisma.TypeMap['model'][TPrismaModelName]['payload']['objects']\n\nexport type ScalarFilter<TPrismaModelName extends Prisma.ModelName> = Partial<\n Prisma.TypeMap['model'][TPrismaModelName]['payload']['scalars']\n>\n\nexport type GetOperationFns<TModel extends Prisma.ModelName> = {\n [TOperation in keyof Prisma.TypeMap['model']['DbAppForCatalog']['operations']]: (\n args: Prisma.TypeMap['model'][TModel]['operations'][TOperation]['args'],\n ) => Promise<\n Prisma.TypeMap['model'][TModel]['operations'][TOperation]['result']\n >\n}\n\nexport interface TableSyncParamsPrisma<\n TPrismaClient extends PrismaClient,\n TPrismaModelName extends Prisma.ModelName,\n TUniqColumns extends ReadonlyArray<ScalarKeys<TPrismaModelName>>,\n TRelationColumns extends ReadonlyArray<ObjectKeys<TPrismaModelName>>,\n> {\n id?: ScalarKeys<TPrismaModelName>\n prisma: TPrismaClient\n prismaModelName: TPrismaModelName\n uniqColumns: TUniqColumns\n relationColumns?: TRelationColumns\n where?: ScalarFilter<TPrismaModelName>\n upsertOnly?: boolean\n}\n\nfunction getPrismaModelOperations<\n TPrismaClient,\n TPrismaModelName extends Prisma.ModelName,\n>(prisma: TPrismaClient, prismaModelName: TPrismaModelName) {\n const key = (prismaModelName.slice(0, 1).toLowerCase() +\n prismaModelName.slice(1)) as keyof TPrismaClient\n return prisma[key] as GetOperationFns<TPrismaModelName>\n}\n\nexport type MakeTFromPrismaModel<TPrismaModelName extends Prisma.ModelName> =\n NonNullable<\n Prisma.TypeMap['model'][TPrismaModelName]['operations']['findUnique']['result']\n >\n\nexport function tableSyncPrisma<\n TPrismaClient extends PrismaClient,\n TPrismaModelName extends Prisma.ModelName,\n TUniqColumns extends ReadonlyArray<ScalarKeys<TPrismaModelName>>,\n TRelationColumns extends ReadonlyArray<ObjectKeys<TPrismaModelName>>,\n TId extends ScalarKeys<TPrismaModelName> = ScalarKeys<TPrismaModelName>,\n>(\n params: TableSyncParamsPrisma<\n TPrismaClient,\n TPrismaModelName,\n TUniqColumns,\n TRelationColumns\n >,\n) {\n const {\n prisma,\n prismaModelName,\n uniqColumns,\n where: whereGlobal,\n upsertOnly,\n } = params\n const prismOperations = getPrismaModelOperations(prisma, prismaModelName)\n\n const idColumn = (params.id ?? 'id') as TId\n // @ts-ignore maybe someday later (never)\n return tableSync<MakeTFromPrismaModel<TPrismaModelName>, TUniqColumns, TId>({\n id: idColumn,\n uniqColumns,\n readAll: async () => {\n const findManyArgs = whereGlobal\n ? {\n where: whereGlobal,\n }\n : {}\n return (await prismOperations.findMany(findManyArgs)) as Array<\n MakeTFromPrismaModel<TPrismaModelName>\n >\n },\n writeAll: async (createData, update, deleteIds) => {\n const prismaUniqKey = params.uniqColumns.join('_')\n const relationColumnList =\n params.relationColumns ?? ([] as Array<ObjectKeys<TPrismaModelName>>)\n\n return prisma.$transaction(async (tx) => {\n const txOps = getPrismaModelOperations(tx, prismaModelName)\n for (const { data, where } of update) {\n const uniqKeyWhere =\n Object.keys(where).length > 1\n ? {\n [prismaUniqKey]: where,\n }\n : where\n\n const dataScalar = omit(data, relationColumnList)\n const dataRelations = mapValues(\n pick(data, relationColumnList),\n (value) => {\n return {\n set: value,\n }\n },\n )\n\n // @ts-expect-error This is too difficult for me to come up with right types\n await txOps.update({\n data: { ...dataScalar, ...dataRelations },\n where: { ...uniqKeyWhere },\n })\n }\n\n if (upsertOnly !== true) {\n await txOps.deleteMany({\n where: {\n [idColumn]: {\n in: deleteIds,\n },\n },\n })\n }\n\n // Validate uniqueness of uniqColumns before creating records\n const createDataMapped = createData.map((data) => {\n // @ts-expect-error This is too difficult for me to come up with right types\n const dataScalar = omit(data, relationColumnList)\n\n // @ts-expect-error This is too difficult for me to come up with right types\n const onlyRelationColumns = pick(data, relationColumnList)\n const dataRelations = mapValues(onlyRelationColumns, (value) => {\n return {\n connect: value,\n }\n })\n\n return { ...dataScalar, ...dataRelations }\n })\n\n // Check for duplicates in the data to be created\n if (createDataMapped.length > 0) {\n const uniqKeysInCreate = new Set<string>()\n const duplicateKeys: Array<string> = []\n\n for (const data of createDataMapped) {\n const keyParts = params.uniqColumns.map((col) => {\n const value = data[col as keyof typeof data]\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive: unique columns may be nullable in schemas\n return value === null || value === undefined\n ? 'null'\n : String(value)\n })\n const key = keyParts.join(':')\n\n if (uniqKeysInCreate.has(key)) {\n duplicateKeys.push(key)\n } else {\n uniqKeysInCreate.add(key)\n }\n }\n\n if (duplicateKeys.length > 0) {\n const uniqColumnsStr = params.uniqColumns.join(', ')\n throw new Error(\n `Duplicate unique key values found in data to be created. ` +\n `Model: ${prismaModelName}, Unique columns: [${uniqColumnsStr}], ` +\n `Duplicate keys: [${duplicateKeys.join(', ')}]`,\n )\n }\n }\n\n const results: Array<MakeTFromPrismaModel<TPrismaModelName>> = []\n\n if (relationColumnList.length === 0) {\n // @ts-expect-error This is too difficult for me to come up with right types\n const batchResult = await txOps.createManyAndReturn({\n data: createDataMapped,\n })\n\n results.push(...batchResult)\n } else {\n for (const dataMappedElement of createDataMapped) {\n // @ts-expect-error too difficult for me\n const newVar = await txOps.create({\n data: dataMappedElement,\n })\n results.push(newVar as MakeTFromPrismaModel<TPrismaModelName>)\n }\n }\n\n return results\n })\n },\n })\n}\n","import type { Prisma } from './prisma'\nimport type { ObjectKeys, ScalarKeys } from './tableSyncPrismaAdapter'\n\ninterface CommonSyncTableInfo<TPrismaModelName extends Prisma.ModelName> {\n prismaModelName: TPrismaModelName\n id?: ScalarKeys<TPrismaModelName>\n uniqColumns: Array<ScalarKeys<TPrismaModelName>>\n relationColumns?: Array<ObjectKeys<TPrismaModelName>>\n}\n\ntype TableSyncMagazineType = Partial<{\n [key in Prisma.ModelName]: CommonSyncTableInfo<key>\n}>\n\nexport const TABLE_SYNC_MAGAZINE = {\n DbAppForCatalog: {\n prismaModelName: 'DbAppForCatalog',\n uniqColumns: ['slug'],\n },\n DbAppTagDefinition: {\n prismaModelName: 'DbAppTagDefinition',\n uniqColumns: ['prefix'],\n },\n DbApprovalMethod: {\n id: 'slug',\n prismaModelName: 'DbApprovalMethod',\n uniqColumns: ['slug'],\n },\n} as const satisfies TableSyncMagazineType\n\nexport type TableSyncMagazine = typeof TABLE_SYNC_MAGAZINE\nexport type TableSyncMagazineModelNameKey = keyof TableSyncMagazine\n","import { createHash } from 'node:crypto'\nimport type { FormatEnum } from 'sharp'\nimport sharp from 'sharp'\nimport type { ParseAssetParams, ParseAssetReturn } from './assetRestController'\n\n/**\n * Extract image dimensions from a buffer using sharp\n */\nexport async function getImageDimensions(\n buffer: Buffer,\n): Promise<{ width?: number; height?: number }> {\n try {\n const metadata = await sharp(buffer).metadata()\n return {\n width: metadata.width,\n height: metadata.height,\n }\n } catch (error) {\n console.error('Error extracting image dimensions:', error)\n return { width: undefined, height: undefined }\n }\n}\n\n/**\n * Resize an image buffer to the specified dimensions\n * @param buffer - The image buffer to resize\n * @param width - Target width (optional)\n * @param height - Target height (optional)\n * @param format - Output format ('png', 'jpeg', 'webp'), auto-detected if not provided\n */\nexport async function resizeImage(\n buffer: Buffer,\n width?: number,\n height?: number,\n format?: 'png' | 'jpeg' | 'webp',\n): Promise<Buffer> {\n let pipeline = sharp(buffer)\n\n // Apply resize if dimensions provided\n if (width || height) {\n pipeline = pipeline.resize({\n width,\n height,\n fit: 'inside',\n withoutEnlargement: true,\n })\n }\n\n // Apply format conversion if specified\n if (format === 'png') {\n pipeline = pipeline.png()\n } else if (format === 'webp') {\n pipeline = pipeline.webp()\n } else if (format === 'jpeg') {\n pipeline = pipeline.jpeg()\n }\n\n return pipeline.toBuffer()\n}\n\n/**\n * Generate SHA-256 checksum for a buffer\n */\nexport function generateChecksum(buffer: Buffer): string {\n return createHash('sha256').update(buffer).digest('hex')\n}\n\n/**\n * Detect image format from mime type\n */\nexport function getImageFormat(\n mimeType: string,\n): 'png' | 'webp' | 'jpeg' | null {\n if (mimeType.includes('png')) return 'png'\n if (mimeType.includes('webp')) return 'webp'\n if (mimeType.includes('jpeg') || mimeType.includes('jpg')) return 'jpeg'\n return null\n}\n\n/**\n * Check if a mime type represents a raster image (not SVG)\n */\nexport function isRasterImage(mimeType: string): boolean {\n return mimeType.startsWith('image/') && !mimeType.includes('svg')\n}\n\nexport async function parseAssetMeta(\n p: ParseAssetParams,\n): Promise<ParseAssetReturn> {\n // Get image dimensions using our utility\n const { width, height, format, size } = await sharp(p.buffer).metadata()\n\n const formatToMime: Partial<Record<keyof FormatEnum, string>> = {\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n webp: 'image/webp',\n avif: 'image/avif',\n tiff: 'image/tiff',\n gif: 'image/gif',\n heif: 'image/heif',\n raw: 'application/octet-stream',\n }\n\n return {\n checksum: generateChecksum(p.buffer),\n width,\n height,\n mimeType: format\n ? (formatToMime[format] ?? `image/${format}`)\n : 'application/octet-stream',\n fileSize: size || 0,\n }\n}\n","import { parseAssetMeta } from './assetUtils'\nimport type { AssetType, PrismaClient } from '../../db/prisma'\n\nexport interface UpsertAssetParams {\n prisma: PrismaClient\n buffer: Buffer\n name: string\n originalFilename: string\n assetType: AssetType\n}\n\nexport async function upsertAsset({\n prisma,\n buffer,\n name,\n originalFilename,\n assetType,\n}: UpsertAssetParams) {\n const { checksum, fileSize, width, height, mimeType } = await parseAssetMeta({\n buffer,\n originalFilename,\n })\n\n // If an asset with the same checksum already exists, reuse it instead of storing duplicate binary.\n const existing = await prisma.dbAsset.findUnique({\n where: { name },\n })\n\n if (existing) {\n return existing.id\n }\n\n const asset = await prisma.dbAsset.create({\n data: {\n name,\n checksum,\n assetType,\n content: new Uint8Array(buffer),\n mimeType,\n fileSize,\n width,\n height,\n },\n })\n return asset.id\n}\n","import type {\n AppForCatalog,\n GroupingTagDefinition,\n} from '../types/common/appCatalogTypes'\nimport { getDbClient } from './client'\nimport { TABLE_SYNC_MAGAZINE } from './tableSyncMagazine'\nimport { tableSyncPrisma } from './tableSyncPrismaAdapter'\nimport { readFile, readdir, stat } from 'node:fs/promises'\nimport { group } from 'radashi'\nimport { upsertAsset } from '../modules/assets/upsertAsset'\nimport type { ApprovalMethod } from '../types'\nimport type { PrismaClient } from './prisma'\n\nexport interface SyncAppCatalogResult {\n created: number\n updated: number\n deleted: number\n total: number\n}\n\ninterface AssetSyncResult {\n screenshotIds: Array<string>\n iconName: string | null\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return (\n error instanceof Error &&\n 'code' in error &&\n (error as NodeJS.ErrnoException).code === 'ENOENT'\n )\n}\n\nasync function processAssetDirectory(\n dirPath: string,\n appSlug: string,\n assetType: 'screenshot' | 'icon',\n prisma: PrismaClient,\n): Promise<Array<string>> {\n try {\n const files = await readdir(dirPath)\n const assetIds: Array<string> = []\n\n for (let i = 0; i < files.length; i++) {\n const fileName = files[i]\n if (!fileName) continue\n\n const assetName =\n assetType === 'screenshot'\n ? `${appSlug}-screenshot-${i + 1}`\n : `${appSlug}-icon`\n\n const id = await upsertAsset({\n prisma,\n buffer: await readFile(`${dirPath}/${fileName}`),\n originalFilename: fileName,\n name: assetName,\n assetType,\n })\n assetIds.push(id)\n\n // For icons, only process the first file\n if (assetType === 'icon') {\n break\n }\n }\n\n return assetIds\n } catch (error: unknown) {\n if (isFileNotFoundError(error)) {\n return []\n }\n throw error\n }\n}\n\nasync function syncAppAssets(\n appSlug: string,\n appPath: string,\n prisma: PrismaClient,\n): Promise<AssetSyncResult> {\n const screenshotIds = await processAssetDirectory(\n `${appPath}/screenshots`,\n appSlug,\n 'screenshot',\n prisma,\n )\n\n const iconIds = await processAssetDirectory(\n `${appPath}/icons`,\n appSlug,\n 'icon',\n prisma,\n )\n\n return {\n screenshotIds,\n iconName: iconIds.length > 0 ? `${appSlug}-icon` : null,\n }\n}\n\nasync function syncAssetsFromFileSystem(\n apps: Array<AppForCatalog>,\n allAppsAssetsPath: string,\n) {\n const appDirectories = await readdir(allAppsAssetsPath)\n const prisma = getDbClient()\n const bySlug = group(apps, (a) => a.slug)\n\n for (const appDirName of appDirectories) {\n try {\n const stats = await stat(`${allAppsAssetsPath}/${appDirName}`)\n if (!stats.isDirectory()) {\n continue\n }\n } catch (error: unknown) {\n if (isFileNotFoundError(error)) {\n continue\n }\n throw error\n }\n\n const appSlug = appDirName\n if (!bySlug[appSlug]) {\n throw new Error(\n `App '${appSlug}' does not exist in the app catalog. Existing apps: ${Object.keys(bySlug).join(', ')}`,\n )\n }\n\n try {\n const { screenshotIds, iconName } = await syncAppAssets(\n appSlug,\n `${allAppsAssetsPath}/${appDirName}`,\n prisma,\n )\n\n const updateData: {\n screenshotIds?: Array<string>\n iconName?: string | null\n } = {}\n\n if (screenshotIds.length > 0) {\n updateData.screenshotIds = screenshotIds\n }\n if (iconName !== null) {\n updateData.iconName = iconName\n }\n\n if (Object.keys(updateData).length > 0) {\n await prisma.dbAppForCatalog.update({\n where: { slug: appSlug },\n data: updateData,\n })\n }\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n throw new Error(\n `Error while upserting assets for app '${appSlug}': ${errorMessage}`,\n )\n }\n }\n // private async syncScreenshots(apps: AppForCatalog[], screenshotsPath: string): Promise<void> {\n // const db = getDbClient();\n //\n // for (const app of apps) {\n // const dirPath = join(screenshotsPath, `${app.slug}-screenshots`);\n //\n // try {\n // const files = await readdir(dirPath);\n // const imageFiles = files.filter(f => /\\.(png|jpg|jpeg|gif|webp)$/i.test(f)).sort();\n //\n // if (imageFiles.length === 0) continue;\n //\n // const screenshotIds: string[] = [];\n //\n // for (const filename of imageFiles) {\n // const filePath = join(dirPath, filename);\n // const content = await readFile(filePath);\n // const buffer = Buffer.from(content);\n // const checksum = generateChecksum(buffer);\n // const { width, height } = await getImageDimensions(buffer);\n //\n // const ext = filename.split('.').pop()?.toLowerCase();\n // const mimeType = {\n // png: 'image/png',\n // jpg: 'image/jpeg',\n // jpeg: 'image/jpeg',\n // gif: 'image/gif',\n // webp: 'image/webp',\n // }[ext || ''] || 'application/octet-stream';\n //\n // const asset = await db.dbAsset.upsert({\n // where: { checksum },\n // create: {\n // name: `${app.slug}/${filename}`,\n // assetType: 'screenshot',\n // content: new Uint8Array(buffer),\n // checksum,\n // mimeType,\n // fileSize: buffer.length,\n // width,\n // height,\n // },\n // update: {\n // name: `${app.slug}/${filename}`,\n // content: new Uint8Array(buffer),\n // mimeType,\n // fileSize: buffer.length,\n // width,\n // height,\n // },\n // });\n //\n // screenshotIds.push(asset.id);\n // }\n //\n // await db.dbAppForCatalog.update({\n // where: { slug: app.slug },\n // data: { screenshotIds },\n // });\n //\n // logger.info(`Synced ${screenshotIds.length} screenshots for ${app.slug}`);\n // } catch (error: any) {\n // if (error.code === 'ENOENT') continue; // Skip if directory doesn't exist\n // throw error;\n // }\n // }\n // }\n}\n\n/**\n * Syncs app catalog data to the database using table sync.\n * This will create new apps, update existing ones, and delete any that are no longer in the input.\n *\n * Note: Call connectDb() before and disconnectDb() after if running in a script.\n */\nexport async function syncAppCatalog(\n apps: Array<AppForCatalog>,\n tagsDefinitions: Array<GroupingTagDefinition>,\n approvalMethods: Array<ApprovalMethod>,\n sreenshotsPath?: string,\n): Promise<SyncAppCatalogResult> {\n try {\n const prisma = getDbClient()\n\n await tableSyncPrisma({\n prisma,\n ...TABLE_SYNC_MAGAZINE.DbApprovalMethod,\n }).sync(approvalMethods)\n\n const sync = tableSyncPrisma({\n prisma,\n ...TABLE_SYNC_MAGAZINE.DbAppForCatalog,\n })\n\n await tableSyncPrisma({\n prisma,\n ...TABLE_SYNC_MAGAZINE.DbAppTagDefinition,\n }).sync(tagsDefinitions)\n\n // Transform AppForCatalog to DbAppForCatalog format\n const dbApps = apps.map((app) => {\n const slug =\n app.slug ||\n app.displayName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n\n return {\n slug,\n displayName: app.displayName,\n description: app.description,\n teams: app.teams ?? [],\n accessRequest: app.accessRequest ?? null,\n notes: app.notes ?? null,\n tags: app.tags ?? [],\n appUrl: app.appUrl ?? null,\n links: app.links ?? null,\n iconName: app.iconName ?? null,\n screenshotIds: app.screenshotIds ?? [],\n sources: app.sources ?? [],\n deprecated: app.deprecated ?? null,\n }\n })\n\n const result = await sync.sync(dbApps)\n\n // Get actual synced data to calculate stats\n const actual = result.getActual()\n\n if (sreenshotsPath) {\n await syncAssetsFromFileSystem(apps, sreenshotsPath)\n } else {\n console.warn('Do not sync screenhots')\n }\n\n return {\n created: actual.length - apps.length + (apps.length - actual.length),\n updated: 0, // TableSync doesn't expose this directly\n deleted: 0, // TableSync doesn't expose this directly\n total: actual.length,\n }\n } catch (error) {\n // Wrap error with context\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n throw new Error(\n `Error syncing app catalog: ${errorMessage}\\n\\nDetails:\\n${errorStack || 'No stack trace available'}`,\n )\n }\n}\n","/**\n * Authorization utilities for checking user permissions based on groups\n *\n * Groups are automatically included in the user session when:\n * 1. Okta auth server has a \"groups\" claim configured\n * 2. The auth policy rule includes \"groups\" in scope_whitelist\n *\n * Example usage in tRPC procedures:\n * ```typescript\n * myProcedure: protectedProcedure.query(async ({ ctx }) => {\n * if (requireAdmin(ctx.user)) {\n * // Admin-only logic\n * }\n * // Regular user logic\n * })\n * ```\n */\n\nexport interface UserWithGroups {\n id: string\n email: string\n name?: string\n // Groups from Okta (or other identity provider)\n // This will be populated if groups claim is configured\n [key: string]: any\n}\n\n/**\n * Extract groups from user object\n * Groups can be stored in different locations depending on the OAuth provider\n */\nexport function getUserGroups(\n user: UserWithGroups | null | undefined,\n): Array<string> {\n if (!user) {\n console.log('[getUserGroups] No user provided')\n return []\n }\n\n // Debug: Log all user properties to see what's available\n console.log('[getUserGroups] === USER OBJECT DEBUG ===')\n console.log('[getUserGroups] User ID:', user.id)\n console.log('[getUserGroups] User email:', user.email)\n console.log(\n '[getUserGroups] User.env_hopper_groups:',\n (user as any).env_hopper_groups,\n )\n console.log('[getUserGroups] User.groups:', user.groups)\n console.log('[getUserGroups] User.oktaGroups:', (user as any).oktaGroups)\n console.log('[getUserGroups] User.roles:', (user as any).roles)\n console.log('[getUserGroups] All user keys:', Object.keys(user))\n console.log(\n '[getUserGroups] Full user object:',\n JSON.stringify(user, null, 2),\n )\n\n // Check common locations for group information\n // Order of preference: custom env_hopper_groups first\n const groups =\n (user as any).env_hopper_groups || // Custom env_hopper_groups claim (stores natera.env_hopper_ui.groups)\n user.groups || // Standard \"groups\" claim\n (user as any).oktaGroups || // Okta-specific\n (user as any).roles || // Some providers use \"roles\"\n []\n\n const result = Array.isArray(groups) ? groups : []\n console.log('[getUserGroups] Final groups result:', result)\n\n return result\n}\n\n/**\n * Check if user is a member of any of the specified groups\n */\nexport function isMemberOfAnyGroup(\n user: UserWithGroups | null | undefined,\n allowedGroups: Array<string>,\n): boolean {\n const userGroups = getUserGroups(user)\n return allowedGroups.some((group) => userGroups.includes(group))\n}\n\n/**\n * Check if user is a member of all specified groups\n */\nexport function isMemberOfAllGroups(\n user: UserWithGroups | null | undefined,\n requiredGroups: Array<string>,\n): boolean {\n const userGroups = getUserGroups(user)\n return requiredGroups.every((group) => userGroups.includes(group))\n}\n\n/**\n * Check if user has admin permissions\n * @param user User object with groups\n * @param adminGroups List of admin group names (default: ['env_hopper_ui_super_admins'])\n */\nexport function isAdmin(\n user: UserWithGroups | null | undefined,\n adminGroups: Array<string> = ['env_hopper_ui_super_admins'],\n): boolean {\n return isMemberOfAnyGroup(user, adminGroups)\n}\n\n/**\n * Require admin permissions - throws error if not admin\n * @param user User object with groups\n * @param adminGroups List of admin group names (default: ['env_hopper_ui_super_admins'])\n */\nexport function requireAdmin(\n user: UserWithGroups | null | undefined,\n adminGroups: Array<string> = ['env_hopper_ui_super_admins'],\n): void {\n if (!isAdmin(user, adminGroups)) {\n throw new Error('Forbidden: Admin access required')\n }\n}\n\n/**\n * Require membership in specific groups - throws error if not member\n */\nexport function requireGroups(\n user: UserWithGroups | null | undefined,\n groups: Array<string>,\n): void {\n if (!isMemberOfAnyGroup(user, groups)) {\n throw new Error(\n `Forbidden: Membership in one of these groups required: ${groups.join(', ')}`,\n )\n }\n}\n","import { TRPCError, initTRPC } from '@trpc/server'\nimport type { EhTrpcContext } from './ehTrpcContext'\nimport { isAdmin } from '../modules/auth/authorizationUtils'\n\n/**\n * Initialization of tRPC backend\n * Should be done only once per backend!\n */\nexport const t = initTRPC.context<EhTrpcContext>().create({\n errorFormatter({ error, shape }: { error: unknown; shape: unknown }) {\n // Log all tRPC errors to console\n console.error('[tRPC Error]', {\n path: (shape as { data?: { path?: string } }).data?.path,\n code: (error as { code?: string }).code,\n message: (error as { message?: string }).message,\n cause: (error as { cause?: unknown }).cause,\n stack: (error as { stack?: string }).stack,\n })\n return shape\n },\n})\n\n/**\n * Export reusable router and procedure helpers\n */\nexport const router = t.router\nexport const publicProcedure = t.procedure\n\n/**\n * Middleware to check if user is authenticated\n */\nconst isAuthenticated = t.middleware(({ ctx, next }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'You must be logged in to access this resource',\n })\n }\n return next({\n ctx: {\n ...ctx,\n user: ctx.user,\n },\n })\n})\n\n/**\n * Middleware to check if user is an admin\n */\nconst isAdminMiddleware = t.middleware(({ ctx, next }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'You must be logged in to access this resource',\n })\n }\n\n console.log('[isAdminMiddleware] === ADMIN CHECK DEBUG ===')\n console.log('[isAdminMiddleware] User:', ctx.user.email)\n console.log('[isAdminMiddleware] Required admin groups:', ctx.adminGroups)\n console.log('[isAdminMiddleware] Calling isAdmin()...')\n\n const hasAdminAccess = isAdmin(ctx.user, ctx.adminGroups)\n console.log('[isAdminMiddleware] Has admin access:', hasAdminAccess)\n\n if (!hasAdminAccess) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: `You must be an admin to access this resource. Required groups: ${ctx.adminGroups.join(', ') || 'env_hopper_ui_super_admins'}`,\n })\n }\n\n return next({\n ctx: {\n ...ctx,\n user: ctx.user,\n },\n })\n})\n\n/**\n * Admin procedure that requires admin permissions\n */\nexport const adminProcedure = t.procedure.use(isAdminMiddleware)\n\n/**\n * Protected procedure that requires authentication (but not admin)\n */\nexport const protectedProcedure = t.procedure.use(isAuthenticated)\n","import { z } from 'zod'\nimport { getDbClient } from '../../db'\nimport { adminProcedure, router } from '../../server/trpcSetup'\nimport type { AppAccessRequest } from '../../types'\n\n// Zod schema for access method (simplified for now - you can expand this)\nconst AccessMethodSchema = z\n .object({\n type: z.enum([\n 'bot',\n 'ticketing',\n 'email',\n 'self-service',\n 'documentation',\n 'manual',\n ]),\n })\n .loose()\n\nconst AppLinkSchema = z.object({\n displayName: z.string().optional(),\n url: z.url(),\n})\n\n// New AppAccessRequest schema\nconst AppRoleSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n})\n\nconst ApproverContactSchema = z.object({\n displayName: z.string(),\n contact: z.string().optional(),\n})\n\nconst ApprovalUrlSchema = z.object({\n label: z.string().optional(),\n url: z.url(),\n})\n\nconst AppAccessRequestSchema = z.object({\n approvalMethodId: z.string(),\n comments: z.string().optional(),\n requestPrompt: z.string().optional(),\n postApprovalInstructions: z.string().optional(),\n roles: z.array(AppRoleSchema).optional(),\n approvers: z.array(ApproverContactSchema).optional(),\n urls: z.array(ApprovalUrlSchema).optional(),\n whoToReachOut: z.string().optional(),\n})\n\nconst CreateAppForCatalogSchema = z.object({\n slug: z\n .string()\n .min(1)\n .regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens'),\n displayName: z.string().min(1),\n description: z.string(),\n access: AccessMethodSchema.optional(),\n teams: z.array(z.string()).optional(),\n accessRequest: AppAccessRequestSchema.optional(),\n notes: z.string().optional(),\n tags: z.array(z.string()).optional(),\n appUrl: z.url().optional(),\n links: z.array(AppLinkSchema).optional(),\n iconName: z.string().optional(),\n screenshotIds: z.array(z.string()).optional(),\n})\n\nconst UpdateAppForCatalogSchema = CreateAppForCatalogSchema.partial().extend({\n id: z.string(),\n})\n\nexport function createAppCatalogAdminRouter() {\n const prisma = getDbClient()\n return router({\n list: adminProcedure.query(async () => {\n return prisma.dbAppForCatalog.findMany({\n orderBy: { displayName: 'asc' },\n })\n }),\n\n getById: adminProcedure\n .input(z.object({ id: z.string() }))\n .query(async ({ input }) => {\n return prisma.dbAppForCatalog.findUnique({\n where: { id: input.id },\n })\n }),\n\n getBySlug: adminProcedure\n .input(z.object({ slug: z.string() }))\n .query(async ({ input }) => {\n return prisma.dbAppForCatalog.findUnique({\n where: { slug: input.slug },\n })\n }),\n\n create: adminProcedure\n .input(CreateAppForCatalogSchema)\n .mutation(async ({ input }) => {\n // Type assertion needed because Zod's passthrough() creates index signatures\n // that don't structurally match Prisma's typed JSON fields.\n // This is safe because Zod validates the input shape.\n return prisma.dbAppForCatalog.create({\n data: {\n slug: input.slug,\n displayName: input.displayName,\n description: input.description,\n teams: input.teams ?? [],\n accessRequest: input.accessRequest as AppAccessRequest | undefined,\n notes: input.notes,\n tags: input.tags ?? [],\n appUrl: input.appUrl,\n links: input.links as Array<{ displayName?: string; url: string }>,\n iconName: input.iconName,\n screenshotIds: input.screenshotIds ?? [],\n },\n })\n }),\n\n update: adminProcedure\n .input(UpdateAppForCatalogSchema)\n .mutation(async ({ input }) => {\n const { id, ...updateData } = input\n\n // Type assertion needed because Zod's passthrough() creates index signatures\n return prisma.dbAppForCatalog.update({\n where: { id },\n data: {\n ...(updateData.slug !== undefined && { slug: updateData.slug }),\n ...(updateData.displayName !== undefined && {\n displayName: updateData.displayName,\n }),\n ...(updateData.description !== undefined && {\n description: updateData.description,\n }),\n ...(updateData.teams !== undefined && { teams: updateData.teams }),\n ...(updateData.accessRequest !== undefined && {\n accessRequest: updateData.accessRequest as\n | AppAccessRequest\n | undefined,\n }),\n ...(updateData.notes !== undefined && { notes: updateData.notes }),\n ...(updateData.tags !== undefined && { tags: updateData.tags }),\n ...(updateData.appUrl !== undefined && {\n appUrl: updateData.appUrl,\n }),\n ...(updateData.links !== undefined && {\n links: updateData.links as Array<{\n displayName?: string\n url: string\n }>,\n }),\n ...(updateData.iconName !== undefined && {\n iconName: updateData.iconName,\n }),\n ...(updateData.screenshotIds !== undefined && {\n screenshotIds: updateData.screenshotIds,\n }),\n },\n })\n }),\n\n updateScreenshots: adminProcedure\n .input(\n z.object({\n id: z.string(),\n screenshotIds: z.array(z.string()),\n }),\n )\n .mutation(async ({ input }) => {\n return prisma.dbAppForCatalog.update({\n where: { id: input.id },\n data: { screenshotIds: input.screenshotIds },\n })\n }),\n\n delete: adminProcedure\n .input(z.object({ id: z.string() }))\n .mutation(async ({ input }) => {\n return prisma.dbAppForCatalog.delete({\n where: { id: input.id },\n })\n }),\n })\n}\n","/**\n * Generates a URL-friendly slug from a display name.\n * Converts to lowercase and replaces non-alphanumeric characters with hyphens.\n *\n * @param displayName - The display name to convert\n * @returns A slug suitable for use as a primary key\n *\n * @example\n * generateSlugFromDisplayName(\"My Service\") // \"my-service\"\n * generateSlugFromDisplayName(\"John's Team\") // \"john-s-team\"\n */\nexport function generateSlugFromDisplayName(displayName: string): string {\n return displayName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n","import { z } from 'zod'\nimport { Prisma } from '../../db/prisma'\nimport { getDbClient } from '../../db'\nimport { adminProcedure, publicProcedure, router } from '../../server/trpcSetup'\nimport type {\n ApprovalMethod,\n ApprovalMethodConfig,\n CustomConfig,\n PersonTeamConfig,\n ServiceConfig,\n} from '../../types'\nimport { generateSlugFromDisplayName } from './slugUtils'\n\n// Zod schemas\nconst ReachOutContactSchema = z.object({\n displayName: z.string(),\n contact: z.string(),\n})\n\nconst ServiceConfigSchema = z.object({\n url: z.url().optional(),\n icon: z.string().optional(),\n})\n\nconst PersonTeamConfigSchema = z.object({\n reachOutContacts: z.array(ReachOutContactSchema).optional(),\n})\n\nconst CustomConfigSchema = z.object({})\n\nconst ApprovalMethodConfigSchema = z.union([\n ServiceConfigSchema,\n PersonTeamConfigSchema,\n CustomConfigSchema,\n])\n\nconst CreateApprovalMethodSchema = z.object({\n type: z.enum(['service', 'personTeam', 'custom']),\n displayName: z.string().min(1),\n config: ApprovalMethodConfigSchema.optional(),\n})\n\nconst UpdateApprovalMethodSchema = z.object({\n slug: z.string(),\n type: z.enum(['service', 'personTeam', 'custom']).optional(),\n displayName: z.string().min(1).optional(),\n config: ApprovalMethodConfigSchema.optional(),\n})\n\n/**\n * Convert Prisma DbApprovalMethod to our ApprovalMethod type.\n * This ensures tRPC infers proper types for frontend consumers.\n */\nfunction toApprovalMethod(db: {\n slug: string\n type: ApprovalMethod['type']\n displayName: string\n config: ApprovalMethodConfig | null\n createdAt: Date\n updatedAt: Date\n}): ApprovalMethod {\n // Handle discriminated union by explicitly narrowing based on type\n const baseFields = {\n slug: db.slug,\n displayName: db.displayName,\n createdAt: db.createdAt,\n updatedAt: db.updatedAt,\n }\n\n // Provide default empty config if null, as ApprovalMethod discriminated union requires config\n const config = db.config ?? {}\n\n switch (db.type) {\n case 'service':\n return { ...baseFields, type: 'service', config: config as ServiceConfig }\n case 'personTeam':\n return {\n ...baseFields,\n type: 'personTeam',\n config: config as PersonTeamConfig,\n }\n case 'custom':\n return { ...baseFields, type: 'custom', config: config as CustomConfig }\n }\n}\n\nexport function createApprovalMethodRouter() {\n return router({\n // Public: list for selection in app admin\n list: publicProcedure.query(async (): Promise<Array<ApprovalMethod>> => {\n const prisma = getDbClient()\n const results = await prisma.dbApprovalMethod.findMany({\n orderBy: { displayName: 'asc' },\n })\n return results.map(toApprovalMethod)\n }),\n\n // Public: get by ID\n getById: publicProcedure\n .input(z.object({ slug: z.string() }))\n .query(async ({ input }): Promise<ApprovalMethod | null> => {\n const prisma = getDbClient()\n const result = await prisma.dbApprovalMethod.findUnique({\n where: { slug: input.slug },\n })\n return result ? toApprovalMethod(result) : null\n }),\n\n // Admin: create\n create: adminProcedure\n .input(CreateApprovalMethodSchema)\n .mutation(async ({ input }): Promise<ApprovalMethod> => {\n const prisma = getDbClient()\n const result = await prisma.dbApprovalMethod.create({\n data: {\n slug: generateSlugFromDisplayName(input.displayName),\n type: input.type,\n displayName: input.displayName,\n config: input.config ?? Prisma.JsonNull,\n },\n })\n return toApprovalMethod(result)\n }),\n\n // Admin: update\n update: adminProcedure\n .input(UpdateApprovalMethodSchema)\n .mutation(async ({ input }): Promise<ApprovalMethod> => {\n const prisma = getDbClient()\n const { slug, ...updateData } = input\n const result = await prisma.dbApprovalMethod.update({\n where: { slug },\n data: {\n ...(updateData.type !== undefined && { type: updateData.type }),\n ...(updateData.displayName !== undefined && {\n displayName: updateData.displayName,\n }),\n ...(updateData.config !== undefined && {\n config: updateData.config ?? Prisma.JsonNull,\n }),\n },\n })\n return toApprovalMethod(result)\n }),\n\n // Admin: delete\n delete: adminProcedure\n .input(z.object({ slug: z.string() }))\n .mutation(async ({ input }): Promise<ApprovalMethod> => {\n const prisma = getDbClient()\n const result = await prisma.dbApprovalMethod.delete({\n where: { slug: input.slug },\n })\n return toApprovalMethod(result)\n }),\n\n // Admin: search by type\n listByType: publicProcedure\n .input(z.object({ type: z.enum(['service', 'personTeam', 'custom']) }))\n .query(async ({ input }): Promise<Array<ApprovalMethod>> => {\n const prisma = getDbClient()\n const results = await prisma.dbApprovalMethod.findMany({\n where: { type: input.type },\n orderBy: { displayName: 'asc' },\n })\n return results.map(toApprovalMethod)\n }),\n })\n}\n","import { z } from 'zod'\nimport { getDbClient } from '../../db'\nimport { publicProcedure, router } from '../../server/trpcSetup'\n\nexport function createScreenshotRouter() {\n return router({\n list: publicProcedure.query(async () => {\n const prisma = getDbClient()\n return prisma.dbAsset.findMany({\n where: { assetType: 'screenshot' },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n orderBy: { createdAt: 'desc' },\n })\n }),\n\n getOne: publicProcedure\n .input(z.object({ id: z.string() }))\n .query(async ({ input }) => {\n const prisma = getDbClient()\n return prisma.dbAsset.findFirst({\n where: {\n id: input.id,\n assetType: 'screenshot',\n },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n }),\n\n getByAppSlug: publicProcedure\n .input(z.object({ appSlug: z.string() }))\n .query(async ({ input }) => {\n const prisma = getDbClient()\n\n // Find app by slug\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: input.appSlug },\n select: { screenshotIds: true },\n })\n\n if (!app) {\n return []\n }\n\n // Fetch all screenshots for the app\n return prisma.dbAsset.findMany({\n where: {\n id: { in: app.screenshotIds },\n assetType: 'screenshot',\n },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n }),\n\n getFirstByAppSlug: publicProcedure\n .input(z.object({ appSlug: z.string() }))\n .query(async ({ input }) => {\n const prisma = getDbClient()\n\n // Find app by slug\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: input.appSlug },\n select: { screenshotIds: true },\n })\n\n if (!app || app.screenshotIds.length === 0) {\n return null\n }\n\n // Fetch first screenshot\n return prisma.dbAsset.findUnique({\n where: { id: app.screenshotIds[0] },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n }),\n })\n}\n","import type { BetterAuthPlugin } from 'better-auth'\nimport type { TRPCRootObject } from '@trpc/server'\nimport type { EhTrpcContext } from '../../server/ehTrpcContext'\nimport type { BetterAuth } from './auth'\n\n/**\n * Create auth tRPC procedures\n * @param t - tRPC instance\n * @param auth - Better Auth instance (optional, for future extensions)\n * @returns tRPC router with auth procedures\n */\nexport function createAuthRouter(\n t: TRPCRootObject<EhTrpcContext, {}, {}>,\n auth?: BetterAuth,\n) {\n const router = t.router\n const publicProcedure = t.procedure\n\n return router({\n getSession: publicProcedure.query(async ({ ctx }) => {\n // User is now extracted in the tRPC context creation\n return {\n user: ctx.user ?? null,\n isAuthenticated: !!ctx.user,\n }\n }),\n getProviders: publicProcedure.query(() => {\n // Return configured social providers and OAuth providers from plugins\n const providers: Array<string> = []\n const authOptions = auth?.options\n\n // Add built-in social providers (github, google, etc.)\n if (authOptions?.socialProviders) {\n const socialProviders = authOptions.socialProviders as Record<\n string,\n unknown\n >\n Object.keys(socialProviders).forEach((key) => {\n if (socialProviders[key]) {\n providers.push(key)\n }\n })\n }\n\n // Add OAuth providers from plugins (like Okta via genericOAuth)\n if (authOptions?.plugins) {\n const plugins = authOptions.plugins\n plugins.forEach((plugin) => {\n const pluginWithConfig = plugin as BetterAuthPlugin & {\n options?: {\n config?: Array<{ providerId?: string }>\n }\n }\n if (\n pluginWithConfig.id === 'generic-oauth' &&\n pluginWithConfig.options?.config\n ) {\n const configs = Array.isArray(pluginWithConfig.options.config)\n ? pluginWithConfig.options.config\n : [pluginWithConfig.options.config]\n configs.forEach((config) => {\n if (config.providerId) {\n providers.push(config.providerId)\n }\n })\n }\n })\n }\n\n return { providers }\n }),\n })\n}\n\nexport type AuthRouter = ReturnType<typeof createAuthRouter>\n","/**\n * Get file extension from MIME type\n */\nexport function getExtensionFromMimeType(mimeType: string): string {\n const mimeMap: Record<string, string> = {\n 'image/svg+xml': 'svg',\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/jpg': 'jpg',\n 'image/webp': 'webp',\n 'image/gif': 'gif',\n 'image/bmp': 'bmp',\n 'image/tiff': 'tiff',\n 'image/x-icon': 'ico',\n 'image/vnd.microsoft.icon': 'ico',\n }\n\n return mimeMap[mimeType.toLowerCase()] || 'bin'\n}\n\n/**\n * Get file extension from filename\n */\nexport function getExtensionFromFilename(filename: string): string {\n const match = filename.match(/\\.([^.]+)$/)\n return match?.[1]?.toLowerCase() || ''\n}\n\n/**\n * Get MIME type from extension\n */\nexport function getMimeTypeFromExtension(extension: string): string {\n const extMap: Record<string, string> = {\n svg: 'image/svg+xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tiff: 'image/tiff',\n ico: 'image/x-icon',\n }\n\n return extMap[extension.toLowerCase()] || 'application/octet-stream'\n}\n","import { z } from 'zod'\nimport { getDbClient } from '../../db'\nimport { generateChecksum, getImageDimensions } from '../assets/assetUtils'\nimport { getExtensionFromMimeType } from './iconUtils'\nimport { adminProcedure, publicProcedure, router } from '../../server/trpcSetup'\n\nexport function createIconRouter() {\n return router({\n list: publicProcedure.query(async () => {\n const prisma = getDbClient()\n return prisma.dbAsset.findMany({\n where: { assetType: 'icon' },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n createdAt: true,\n updatedAt: true,\n },\n orderBy: { name: 'asc' },\n })\n }),\n\n getOne: publicProcedure\n .input(z.object({ id: z.string() }))\n .query(async ({ input }) => {\n const prisma = getDbClient()\n return prisma.dbAsset.findFirst({\n where: {\n id: input.id,\n assetType: 'icon',\n },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n }),\n\n create: adminProcedure\n .input(\n z.object({\n name: z.string().min(1), // Name with extension (e.g., \"jira.svg\")\n content: z.string(), // base64 encoded binary\n mimeType: z.string(),\n fileSize: z.number().int().positive(),\n }),\n )\n .mutation(async ({ input }) => {\n const prisma = getDbClient()\n // Convert base64 to Buffer\n const buffer = Buffer.from(input.content, 'base64')\n\n // Generate checksum and extract dimensions\n const checksum = generateChecksum(buffer)\n const { width, height } = await getImageDimensions(buffer)\n\n let name = input.name\n // Add extension if not already present in name\n if (!name.includes('.')) {\n const extension = getExtensionFromMimeType(input.mimeType)\n name = `${name}.${extension}`\n }\n\n // Check if asset with same checksum already exists\n const existing = await prisma.dbAsset.findFirst({\n where: { checksum, assetType: 'icon' },\n })\n\n if (existing) {\n // Return existing asset if content is identical\n return existing\n }\n\n return prisma.dbAsset.create({\n data: {\n name,\n assetType: 'icon',\n content: new Uint8Array(buffer),\n checksum,\n mimeType: input.mimeType,\n fileSize: input.fileSize,\n width,\n height,\n },\n })\n }),\n\n update: adminProcedure\n .input(\n z.object({\n id: z.string(),\n name: z.string().min(1).optional(), // Name with extension (e.g., \"jira.svg\")\n content: z.string().optional(), // base64 encoded binary\n mimeType: z.string().optional(),\n fileSize: z.number().int().positive().optional(),\n }),\n )\n .mutation(async ({ input }) => {\n const prisma = getDbClient()\n const { id, content, name, ...rest } = input\n\n const data: Record<string, unknown> = { ...rest }\n\n if (content) {\n const buffer = Buffer.from(content, 'base64')\n data.content = new Uint8Array(buffer)\n data.checksum = generateChecksum(buffer)\n\n const { width, height } = await getImageDimensions(buffer)\n data.width = width\n data.height = height\n }\n\n // If name is being updated and doesn't have extension, add it\n if (name) {\n if (!name.includes('.') && input.mimeType) {\n const extension = getExtensionFromMimeType(input.mimeType)\n data.name = `${name}.${extension}`\n } else {\n data.name = name\n }\n }\n\n return prisma.dbAsset.update({\n where: { id },\n data,\n })\n }),\n\n delete: adminProcedure\n .input(z.object({ id: z.string() }))\n .mutation(async ({ input }) => {\n const prisma = getDbClient()\n return prisma.dbAsset.delete({\n where: { id: input.id },\n })\n }),\n\n deleteMany: adminProcedure\n .input(z.object({ ids: z.array(z.string()) }))\n .mutation(async ({ input }) => {\n const prisma = getDbClient()\n return prisma.dbAsset.deleteMany({\n where: {\n id: { in: input.ids },\n assetType: 'icon',\n },\n })\n }),\n\n // Serve icon binary content\n getContent: publicProcedure\n .input(z.object({ id: z.string() }))\n .query(async ({ input }) => {\n const prisma = getDbClient()\n const asset = await prisma.dbAsset.findFirst({\n where: {\n id: input.id,\n assetType: 'icon',\n },\n select: { content: true, mimeType: true, name: true },\n })\n if (!asset) {\n throw new Error('Icon not found')\n }\n // Return base64 encoded content\n return {\n content: Buffer.from(asset.content).toString('base64'),\n mimeType: asset.mimeType,\n name: asset.name,\n }\n }),\n })\n}\n","import { getAppCatalogData } from '../modules/appCatalog/service'\nimport type { AppCatalogData } from '../types'\n\nimport { createAppCatalogAdminRouter } from '../modules/appCatalogAdmin/appCatalogAdminRouter.js'\nimport { createApprovalMethodRouter } from '../modules/approvalMethod/approvalMethodRouter.js'\nimport { createScreenshotRouter } from '../modules/assets/screenshotRouter.js'\nimport type { BetterAuth } from '../modules/auth/auth'\nimport { createAuthRouter } from '../modules/auth/authRouter.js'\nimport { createIconRouter } from '../modules/icons/iconRouter.js'\nimport { publicProcedure, router, t } from './trpcSetup'\n\n/**\n * Create the main tRPC router with optional auth instance\n * @param auth - Optional Better Auth instance for auth-related queries\n */\nexport function createTrpcRouter(auth?: BetterAuth) {\n return router({\n authConfig: publicProcedure.query(async ({ ctx }) => {\n return {\n adminGroups: ctx.adminGroups,\n }\n }),\n\n appCatalog: publicProcedure.query(\n async ({ ctx }): Promise<AppCatalogData> => {\n const baseData = await getAppCatalogData()\n const appVersion = ctx.companySpecificBackend.getAppVersion?.()\n return {\n ...baseData,\n ...(appVersion && { appVersion }),\n }\n },\n ),\n\n // Icon management routes\n icon: createIconRouter(),\n\n // Screenshot management routes\n screenshot: createScreenshotRouter(),\n\n // App catalog admin routes\n appCatalogAdmin: createAppCatalogAdminRouter(),\n\n // Approval method routes\n approvalMethod: createApprovalMethodRouter(),\n\n // Auth routes (requires auth instance)\n auth: createAuthRouter(t, auth),\n })\n}\n\nexport type TRPCRouter = ReturnType<typeof createTrpcRouter>\n","import type { AppCatalogCompanySpecificBackend } from '../types'\nimport type { User } from 'better-auth/types'\n\nexport interface EhTrpcContext {\n companySpecificBackend: AppCatalogCompanySpecificBackend\n user: User | null\n adminGroups: Array<string>\n}\n\nexport interface EhTrpcContextOptions {\n companySpecificBackend: AppCatalogCompanySpecificBackend\n user?: User | null\n adminGroups: Array<string>\n}\n\nexport function createEhTrpcContext({\n companySpecificBackend,\n user = null,\n adminGroups,\n}: EhTrpcContextOptions): EhTrpcContext {\n return {\n companySpecificBackend,\n user,\n adminGroups,\n }\n}\n","export interface EhStaticControllerContract {\n methods: { \n getIcon: { method: string; url: string }\n getScreenshot: { method: string; url: string }\n }\n}\n\nexport const staticControllerContract: EhStaticControllerContract = {\n methods: {\n getIcon: {\n method: 'get',\n url: 'icon/:icon',\n },\n getScreenshot: {\n method: 'get',\n url: 'screenshot/:id',\n },\n },\n}\n","import type { BetterAuthOptions, BetterAuthPlugin } from 'better-auth'\nimport { betterAuth } from 'better-auth'\nimport { prismaAdapter } from 'better-auth/adapters/prisma'\nimport { getDbClient } from '../../db'\n\nexport interface AuthConfig {\n appName?: string\n baseURL: string\n secret: string\n providers?: BetterAuthOptions['socialProviders']\n plugins?: Array<BetterAuthPlugin>\n /** Session expiration in seconds. Default: 7 days (604800) */\n sessionExpiresIn?: number\n /** Session update age in seconds. Default: 1 day (86400) */\n sessionUpdateAge?: number\n}\n\nexport function createAuth(config: AuthConfig) {\n const prisma = getDbClient()\n const isProduction = process.env.NODE_ENV === 'production'\n\n const auth = betterAuth({\n appName: config.appName || 'EnvHopper',\n baseURL: config.baseURL,\n basePath: '/api/auth',\n secret: config.secret,\n database: prismaAdapter(prisma, {\n provider: 'postgresql',\n }),\n socialProviders: config.providers || {},\n plugins: config.plugins || [],\n emailAndPassword: {\n enabled: true,\n },\n session: {\n expiresIn: config.sessionExpiresIn ?? 60 * 60 * 24 * 30,\n updateAge: config.sessionUpdateAge ?? 60 * 60 * 24,\n cookieCache: {\n enabled: true,\n maxAge: 300,\n },\n },\n advanced: {\n useSecureCookies: isProduction,\n },\n })\n\n return auth\n}\n\nexport type BetterAuth = ReturnType<typeof createAuth>\n","import { toNodeHandler } from 'better-auth/node'\nimport type { Express, Request, Response } from 'express'\nimport type { BetterAuth } from './auth'\n\n/**\n * Register Better Auth routes with Express\n * @param app - Express application instance\n * @param auth - Better Auth instance\n */\nexport function registerAuthRoutes(app: Express, auth: BetterAuth) {\n // Explicit session endpoint handler\n // Better Auth's toNodeHandler doesn't expose a direct /session endpoint\n app.get('/api/auth/session', async (req: Request, res: Response) => {\n try {\n const session = await auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n res.json(session)\n } else {\n res.status(401).json({ error: 'Not authenticated' })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n })\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n // Express v5 wildcard syntax: /{*any} (also works with Express v4)\n const authHandler = toNodeHandler(auth)\n app.all('/api/auth/{*any}', authHandler)\n}\n","import { stepCountIs, streamText, tool } from 'ai'\nimport type { LanguageModel, Tool } from 'ai'\n\nimport type { Request, Response } from 'express'\n\nexport interface AdminChatHandlerOptions {\n /** The AI model to use (from @ai-sdk/openai, @ai-sdk/anthropic, etc.) */\n model: LanguageModel\n /** System prompt for the AI assistant */\n systemPrompt?: string\n /** Tools available to the AI assistant */\n tools?: Record<string, Tool>\n /**\n * Optional function to validate configuration before processing requests.\n * Should throw an error if configuration is invalid (e.g., missing API key).\n * @example\n * validateConfig: () => {\n * if (!process.env.OPENAI_API_KEY) {\n * throw new Error('OPENAI_API_KEY is not configured')\n * }\n * }\n */\n validateConfig?: () => void\n}\n\ninterface TextPart {\n type: 'text'\n text: string\n}\n\ninterface UIMessageInput {\n role: 'user' | 'assistant' | 'system'\n content?: string\n parts?: Array<TextPart | { type: string }>\n}\n\ninterface CoreMessage {\n role: 'user' | 'assistant' | 'system'\n content: string\n}\n\nfunction convertToCoreMessages(\n messages: Array<UIMessageInput>,\n): Array<CoreMessage> {\n return messages.map((msg) => {\n if (msg.content) {\n return { role: msg.role, content: msg.content }\n }\n // Extract text from parts array (AI SDK v3 format)\n const textContent =\n msg.parts\n ?.filter((part): part is TextPart => part.type === 'text')\n .map((part) => part.text)\n .join('') ?? ''\n return { role: msg.role, content: textContent }\n })\n}\n\n/**\n * Creates an Express handler for the admin chat endpoint.\n *\n * Usage in thin wrappers:\n *\n * ```typescript\n * // With OpenAI\n * import { openai } from '@ai-sdk/openai'\n * app.post('/api/admin/chat', createAdminChatHandler({\n * model: openai('gpt-4o-mini'),\n * }))\n *\n * // With Claude\n * import { anthropic } from '@ai-sdk/anthropic'\n * app.post('/api/admin/chat', createAdminChatHandler({\n * model: anthropic('claude-sonnet-4-20250514'),\n * }))\n * ```\n */\nexport function createAdminChatHandler(options: AdminChatHandlerOptions) {\n const {\n model,\n systemPrompt = 'You are a helpful admin assistant for the App Catalog application. Help users manage apps, data sources, and MCP server configurations.',\n tools = {},\n validateConfig,\n } = options\n\n return async (req: Request, res: Response) => {\n try {\n // Validate configuration if validator provided\n if (validateConfig) {\n validateConfig()\n }\n\n const { messages } = req.body as { messages: Array<UIMessageInput> }\n const coreMessages = convertToCoreMessages(messages)\n\n console.log(\n '[Admin Chat] Received messages:',\n JSON.stringify(coreMessages, null, 2),\n )\n console.log('[Admin Chat] Available tools:', Object.keys(tools))\n\n const result = streamText({\n model,\n system: systemPrompt,\n messages: coreMessages,\n tools,\n // Allow up to 5 steps so the model can call tools and then generate a response\n stopWhen: stepCountIs(5),\n onFinish: (event) => {\n console.log('[Admin Chat] Finished:', {\n finishReason: event.finishReason,\n usage: event.usage,\n hasText: !!event.text,\n textLength: event.text.length,\n })\n },\n })\n\n // Use UI message stream response which is compatible with AI SDK React hooks\n const response = result.toUIMessageStreamResponse()\n\n // Copy headers from the response\n response.headers.forEach((value, key) => {\n res.setHeader(key, value)\n })\n\n // Pipe the stream to the response\n if (response.body) {\n const reader = response.body.getReader()\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read()\n if (done) {\n res.end()\n return\n }\n res.write(value)\n return pump()\n }\n await pump()\n } else {\n console.error('[Admin Chat] No response body')\n res.status(500).json({ error: 'No response from AI model' })\n }\n } catch (error) {\n console.error('[Admin Chat] Error:', error)\n res.status(500).json({ error: 'Failed to process chat request' })\n }\n }\n}\n\n// Re-export tool helper for convenience\nexport { tool }\n","import type { Tool } from 'ai'\nimport { z } from 'zod'\nimport { getDbClient } from '../../../db'\n\n/**\n * Generic interface for executing raw SQL queries.\n * Can be implemented with Prisma's $queryRawUnsafe or any other SQL client.\n */\nexport interface DatabaseClient {\n /** Execute a SELECT query and return results */\n query: <T = unknown>(sql: string) => Promise<Array<T>>\n /** Execute an INSERT/UPDATE/DELETE and return affected row count */\n execute: (sql: string) => Promise<{ affectedRows: number }>\n /** Get list of tables in the database */\n getTables: () => Promise<Array<string>>\n /** Get columns for a specific table */\n getColumns: (\n tableName: string,\n ) => Promise<Array<{ name: string; type: string; nullable: boolean }>>\n}\n\n/**\n * Creates a DatabaseClient from a Prisma client.\n */\nexport function createPrismaDatabaseClient(prisma: {\n $queryRawUnsafe: <T>(sql: string) => Promise<T>\n $executeRawUnsafe: (sql: string) => Promise<number>\n}): DatabaseClient {\n return {\n query: async <T = unknown>(sql: string): Promise<Array<T>> => {\n const result = await prisma.$queryRawUnsafe<Array<T>>(sql)\n return result\n },\n execute: async (sql: string) => {\n const affectedRows = await prisma.$executeRawUnsafe(sql)\n return { affectedRows }\n },\n getTables: async () => {\n const tables = await prisma.$queryRawUnsafe<Array<{ tablename: string }>>(\n `SELECT tablename FROM pg_tables WHERE schemaname = 'public'`,\n )\n return tables.map((t) => t.tablename)\n },\n getColumns: async (tableName: string) => {\n const columns = await prisma.$queryRawUnsafe<\n Array<{\n column_name: string\n data_type: string\n is_nullable: string\n }>\n >(\n `SELECT column_name, data_type, is_nullable\n FROM information_schema.columns\n WHERE table_name = '${tableName}' AND table_schema = 'public'`,\n )\n return columns.map((c) => ({\n name: c.column_name,\n type: c.data_type,\n nullable: c.is_nullable === 'YES',\n }))\n },\n }\n}\n\n// Define zod schemas for tool parameters\nconst querySchema = z.object({\n sql: z.string().describe('The SELECT SQL query to execute'),\n})\n\nconst modifySchema = z.object({\n sql: z\n .string()\n .describe('The INSERT, UPDATE, or DELETE SQL query to execute'),\n confirmed: z\n .boolean()\n .describe('Must be true to execute destructive operations'),\n})\n\nconst schemaParamsSchema = z.object({\n tableName: z\n .string()\n .optional()\n .describe(\n 'Specific table name to get columns for. If not provided, returns list of all tables.',\n ),\n})\n\ntype QueryInput = z.infer<typeof querySchema>\ntype ModifyInput = z.infer<typeof modifySchema>\ntype SchemaInput = z.infer<typeof schemaParamsSchema>\n\n/**\n * Creates a DatabaseClient using the internal backend-core Prisma client.\n * This is a convenience function for apps that don't need to pass their own Prisma client.\n */\nfunction createInternalDatabaseClient(): DatabaseClient {\n return createPrismaDatabaseClient(getDbClient())\n}\n\n/**\n * Creates AI tools for generic database access.\n *\n * The AI uses these internally - users interact via natural language.\n * Results are formatted as tables by the AI based on the system prompt.\n * Uses the internal backend-core Prisma client automatically.\n */\nexport function createDatabaseTools(): Record<string, Tool> {\n const db = createInternalDatabaseClient()\n const queryDatabase: Tool<QueryInput, unknown> = {\n description: `Execute a SELECT query to read data from the database.\nUse this to list, search, or filter records from any table.\nAlways use double quotes around table and column names for PostgreSQL (e.g., SELECT * FROM \"App\").\nReturn results will be formatted as a table for the user.`,\n inputSchema: querySchema,\n execute: async ({ sql }) => {\n console.log(`Executing ${sql}`)\n // Safety check - only allow SELECT\n const normalizedSql = sql.trim().toUpperCase()\n if (!normalizedSql.startsWith('SELECT')) {\n return {\n error:\n 'Only SELECT queries are allowed with queryDatabase. Use modifyDatabase for changes.',\n }\n }\n try {\n const results = await db.query(sql)\n return {\n success: true,\n rowCount: Array.isArray(results) ? results.length : 0,\n data: results,\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Query failed',\n }\n }\n },\n }\n\n const modifyDatabase: Tool<ModifyInput, unknown> = {\n description: `Execute an INSERT, UPDATE, or DELETE query to modify data.\nUse double quotes around table and column names for PostgreSQL.\nIMPORTANT: Always ask for user confirmation before executing. Set confirmed=true only after user confirms.\nFor UPDATE/DELETE, always include a WHERE clause to avoid affecting all rows.`,\n inputSchema: modifySchema,\n execute: async ({ sql, confirmed }) => {\n if (!confirmed) {\n return {\n needsConfirmation: true,\n message: 'Please confirm you want to execute this operation.',\n sql,\n }\n }\n\n // Safety check - don't allow SELECT here\n const normalizedSql = sql.trim().toUpperCase()\n if (normalizedSql.startsWith('SELECT')) {\n return { error: 'Use queryDatabase for SELECT queries.' }\n }\n\n // Extra safety - warn about missing WHERE on UPDATE/DELETE\n if (\n (normalizedSql.startsWith('UPDATE') ||\n normalizedSql.startsWith('DELETE')) &&\n !normalizedSql.includes('WHERE')\n ) {\n return {\n error:\n 'UPDATE and DELETE queries must include a WHERE clause for safety.',\n sql,\n }\n }\n\n try {\n const result = await db.execute(sql)\n return {\n success: true,\n affectedRows: result.affectedRows,\n message: `Operation completed. ${result.affectedRows} row(s) affected.`,\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Operation failed',\n }\n }\n },\n }\n\n const getDatabaseSchema: Tool<SchemaInput, unknown> = {\n description: `Get information about database tables and their columns.\nUse this to understand the database structure before writing queries.\nCall without tableName to list all tables, or with tableName to get columns for a specific table.`,\n inputSchema: schemaParamsSchema,\n execute: async ({ tableName }) => {\n try {\n if (tableName) {\n const columns = await db.getColumns(tableName)\n return {\n success: true,\n table: tableName,\n columns,\n }\n } else {\n const tables = await db.getTables()\n return {\n success: true,\n tables,\n }\n }\n } catch (error) {\n return {\n success: false,\n error:\n error instanceof Error ? error.message : 'Failed to get schema',\n }\n }\n },\n }\n\n return {\n queryDatabase,\n modifyDatabase,\n getDatabaseSchema,\n }\n}\n\n/**\n * Default system prompt for the database admin assistant.\n * Can be customized or extended.\n */\nexport const DEFAULT_ADMIN_SYSTEM_PROMPT = `You are a helpful database admin assistant. You help users view and manage data in the database.\n\nIMPORTANT RULES:\n1. When showing data, ALWAYS format it as a numbered ASCII table so users can reference rows by number\n2. NEVER show raw SQL to users - just describe what you're doing in plain language\n3. When users ask to modify data (update, delete, create), ALWAYS confirm before executing\n4. For updates, show the current value and ask for confirmation before changing\n5. Keep responses concise and focused on the data\n\nFORMATTING EXAMPLE:\nWhen user asks \"show me all apps\", respond like:\n\"Here are all the apps:\n\n| # | ID | Slug | Display Name | Icon |\n|---|----|---------|-----------------| -------|\n| 1 | 1 | portal | Portal | portal |\n| 2 | 2 | admin | Admin Dashboard | admin |\n| 3 | 3 | api | API Service | null |\n\nFound 3 apps total.\"\n\nWhen user says \"update row 2 display name to 'Admin Panel'\":\n1. First confirm: \"I'll update the app 'Admin Dashboard' (ID: 2) to have display name 'Admin Panel'. Proceed?\"\n2. Only after user confirms, execute the update\n3. Then show the updated row\n\nAVAILABLE TABLES:\nUse getDatabaseSchema tool to discover tables and their columns.\n`\n","import type { Request, Response, Router } from 'express'\nimport multer from 'multer'\nimport { createHash } from 'node:crypto'\nimport { getDbClient } from '../../db'\nimport { getExtensionFromFilename, getExtensionFromMimeType } from './iconUtils'\n\n// Configure multer for memory storage\nconst upload = multer({\n storage: multer.memoryStorage(),\n limits: {\n fileSize: 10 * 1024 * 1024, // 10MB limit\n },\n fileFilter: (_req, file, cb) => {\n // Accept images only\n if (!file.mimetype.startsWith('image/')) {\n cb(new Error('Only image files are allowed'))\n return\n }\n cb(null, true)\n },\n})\n\nexport interface IconRestControllerConfig {\n /**\n * Base path for icon endpoints (e.g., '/api/icons')\n */\n basePath: string\n}\n\n/**\n * Registers REST endpoints for icon upload and retrieval\n *\n * Endpoints:\n * - POST {basePath}/upload - Upload a new icon (multipart/form-data with 'icon' field and 'name' field)\n * - GET {basePath}/:id - Get icon binary by ID\n * - GET {basePath}/:id/metadata - Get icon metadata only\n */\nexport function registerIconRestController(\n router: Router,\n config: IconRestControllerConfig,\n): void {\n const { basePath } = config\n\n // Upload endpoint - accepts multipart/form-data\n router.post(\n `${basePath}/upload`,\n upload.single('icon'),\n async (req: Request, res: Response) => {\n try {\n if (!req.file) {\n res.status(400).json({ error: 'No file uploaded' })\n return\n }\n\n let name = req.body['name'] as string\n if (!name) {\n res.status(400).json({ error: 'Name is required' })\n return\n }\n\n // Extract extension from original filename or derive from MIME type\n const extension =\n getExtensionFromFilename(req.file.originalname) ||\n getExtensionFromMimeType(req.file.mimetype)\n\n // Add extension to name if not already present\n if (!name.includes('.')) {\n name = `${name}.${extension}`\n }\n\n const prisma = getDbClient()\n const checksum = createHash('sha256')\n .update(req.file.buffer)\n .digest('hex')\n const icon = await prisma.dbAsset.create({\n data: {\n name,\n assetType: 'icon',\n content: new Uint8Array(req.file.buffer),\n mimeType: req.file.mimetype,\n fileSize: req.file.size,\n checksum,\n },\n })\n\n res.status(201).json({\n id: icon.id,\n name: icon.name,\n mimeType: icon.mimeType,\n fileSize: icon.fileSize,\n createdAt: icon.createdAt,\n })\n } catch (error) {\n console.error('Error uploading icon:', error)\n res.status(500).json({ error: 'Failed to upload icon' })\n }\n },\n )\n\n // Get icon binary by name (e.g., /api/icons/jira.svg)\n router.get(`${basePath}/:name`, async (req: Request, res: Response) => {\n try {\n const { name } = req.params\n\n const prisma = getDbClient()\n const icon = await prisma.dbAsset.findFirst({\n where: {\n name,\n assetType: 'icon',\n },\n select: {\n content: true,\n mimeType: true,\n name: true,\n },\n })\n\n if (!icon) {\n res.status(404).json({ error: 'Icon not found' })\n return\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', icon.mimeType)\n res.setHeader('Content-Disposition', `inline; filename=\"${icon.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content\n res.send(icon.content)\n } catch (error) {\n console.error('Error fetching icon:', error)\n res.status(500).json({ error: 'Failed to fetch icon' })\n }\n })\n\n // Get icon metadata only (no binary content)\n router.get(\n `${basePath}/:name/metadata`,\n async (req: Request, res: Response) => {\n try {\n const { name } = req.params\n\n const prisma = getDbClient()\n const icon = await prisma.dbAsset.findFirst({\n where: {\n name,\n assetType: 'icon',\n },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n\n if (!icon) {\n res.status(404).json({ error: 'Icon not found' })\n return\n }\n\n res.json(icon)\n } catch (error) {\n console.error('Error fetching icon metadata:', error)\n res.status(500).json({ error: 'Failed to fetch icon metadata' })\n }\n },\n )\n}\n","import { getDbClient } from '../../db'\nimport { generateChecksum, getImageDimensions } from '../assets/assetUtils'\n\nexport interface UpsertIconInput {\n name: string\n content: Buffer\n mimeType: string\n fileSize: number\n}\n\n/**\n * Upsert an icon to the database.\n * If an icon with the same name exists, it will be updated.\n * Otherwise, a new icon will be created.\n */\nexport async function upsertIcon(input: UpsertIconInput) {\n const prisma = getDbClient()\n \n const checksum = generateChecksum(input.content)\n const { width, height } = await getImageDimensions(input.content)\n \n return prisma.dbAsset.upsert({\n where: { name: input.name },\n update: {\n content: new Uint8Array(input.content),\n checksum,\n mimeType: input.mimeType,\n fileSize: input.fileSize,\n width,\n height,\n },\n create: {\n name: input.name,\n assetType: 'icon',\n content: new Uint8Array(input.content),\n checksum,\n mimeType: input.mimeType,\n fileSize: input.fileSize,\n width,\n height,\n },\n })\n}\n\n/**\n * Upsert multiple icons to the database.\n * This is more efficient than calling upsertIcon multiple times.\n */\nexport async function upsertIcons(icons: Array<UpsertIconInput>) {\n const results: Array<Awaited<ReturnType<typeof upsertIcon>>> = []\n for (const icon of icons) {\n const result = await upsertIcon(icon)\n results.push(result)\n }\n return results\n}\n\n/**\n * Get an asset (icon or screenshot) by name from the database.\n * Returns the asset content, mimeType, and name if found.\n */\nexport async function getAssetByName(name: string) {\n const prisma = getDbClient()\n \n return prisma.dbAsset.findUnique({\n where: { name },\n select: {\n content: true,\n mimeType: true,\n name: true,\n },\n })\n}\n","import type { Request, Response, Router } from 'express'\nimport multer from 'multer'\nimport sharp from 'sharp'\nimport { getDbClient } from '../../db'\nimport { getImageFormat, isRasterImage, resizeImage } from './assetUtils'\nimport { upsertAsset } from './upsertAsset'\n\n// Configure multer for memory storage\nconst upload = multer({\n storage: multer.memoryStorage(),\n limits: {\n fileSize: 10 * 1024 * 1024, // 10MB limit\n },\n fileFilter: (_req, file, cb) => {\n // Accept images only\n if (!file.mimetype.startsWith('image/')) {\n cb(new Error('Only image files are allowed'))\n return\n }\n cb(null, true)\n },\n})\n\nexport interface AssetRestControllerConfig {\n /**\n * Base path for asset endpoints (e.g., '/api/assets')\n */\n basePath: string\n}\n\nexport interface ParseAssetParams {\n buffer: Buffer\n originalFilename: string\n fileSize?: number\n}\n\nexport interface ParseAssetReturn {\n checksum: string\n fileSize: number\n mimeType: string\n width?: number\n height?: number\n}\n\n/**\n * Registers REST endpoints for universal asset upload and retrieval\n *\n * Endpoints:\n * - POST {basePath}/upload - Upload a new asset (multipart/form-data)\n * - GET {basePath}/:id - Get asset binary by ID\n * - GET {basePath}/:id/metadata - Get asset metadata only\n * - GET {basePath}/by-name/:name - Get asset binary by name\n */\nexport function registerAssetRestController(\n router: Router,\n config: AssetRestControllerConfig,\n): void {\n const { basePath } = config\n const prisma = getDbClient()\n\n // Upload endpoint - accepts multipart/form-data\n router.post(\n `${basePath}/upload`,\n upload.single('asset'),\n async (req: Request, res: Response) => {\n try {\n if (!req.file) {\n res.status(400).json({ error: 'No file uploaded' })\n return\n }\n\n const name = req.body['name'] as string\n const assetType = req.body['assetType']\n\n if (!name) {\n res.status(400).json({ error: 'Name is required' })\n return\n }\n\n const id = await upsertAsset({\n prisma,\n buffer: req.file.buffer,\n name,\n originalFilename: req.file.filename,\n assetType,\n })\n\n res.status(201).json({ id })\n } catch (error) {\n console.error('Error uploading asset:', error)\n res.status(500).json({ error: 'Failed to upload asset' })\n }\n },\n )\n\n // Get asset binary by ID\n router.get(`${basePath}/:id`, async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n\n const asset = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n content: true,\n mimeType: true,\n name: true,\n width: true,\n height: true,\n },\n })\n\n if (!asset) {\n res.status(404).json({ error: 'Asset not found' })\n return\n }\n\n const resizeEnabled =\n String(process.env.EH_ASSETS_RESIZE_ENABLED || 'true') === 'true'\n const wParam = req.query['w'] as string | undefined\n const width = wParam ? Number.parseInt(wParam, 10) : undefined\n\n let outBuffer: Uint8Array = asset.content\n let outMime = asset.mimeType\n\n const shouldResize =\n resizeEnabled &&\n isRasterImage(asset.mimeType) &&\n !!width &&\n Number.isFinite(width) &&\n width > 0\n\n if (shouldResize) {\n const fmt = getImageFormat(asset.mimeType) || 'jpeg'\n const buf = await resizeImage(\n Buffer.from(asset.content),\n width,\n undefined,\n fmt,\n )\n outBuffer = new Uint8Array(buf)\n outMime = `image/${fmt}`\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', outMime)\n res.setHeader('Content-Disposition', `inline; filename=\"${asset.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content (resized if requested)\n res.send(outBuffer)\n } catch (error) {\n console.error('Error fetching asset:', error)\n res.status(500).json({ error: 'Failed to fetch asset' })\n }\n })\n\n // Get asset metadata only (no binary content)\n router.get(\n `${basePath}/:id/metadata`,\n async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n\n const asset = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n assetType: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n\n if (!asset) {\n res.status(404).json({ error: 'Asset not found' })\n return\n }\n\n res.json(asset)\n } catch (error) {\n console.error('Error fetching asset metadata:', error)\n res.status(500).json({ error: 'Failed to fetch asset metadata' })\n }\n },\n )\n\n // Get asset binary by name\n router.get(\n `${basePath}/by-name/:name`,\n async (req: Request, res: Response) => {\n try {\n const { name } = req.params\n\n const asset = await prisma.dbAsset.findUnique({\n where: { name },\n select: {\n content: true,\n mimeType: true,\n name: true,\n width: true,\n height: true,\n },\n })\n\n if (!asset) {\n res.status(404).json({ error: 'Asset not found' })\n return\n }\n\n const resizeEnabled =\n String(process.env.EH_ASSETS_RESIZE_ENABLED || 'true') === 'true'\n const wParam = req.query['w'] as string | undefined\n const width = wParam ? Number.parseInt(wParam, 10) : undefined\n\n let outBuffer: Uint8Array = asset.content\n let outMime = asset.mimeType\n\n const isRaster =\n asset.mimeType.startsWith('image/') && !asset.mimeType.includes('svg')\n const shouldResize =\n resizeEnabled &&\n isRaster &&\n !!width &&\n Number.isFinite(width) &&\n width > 0\n\n if (shouldResize) {\n const fmt = asset.mimeType.includes('png')\n ? 'png'\n : asset.mimeType.includes('webp')\n ? 'webp'\n : 'jpeg'\n\n let buf: Buffer\n const pipeline = sharp(Buffer.from(asset.content)).resize({\n width,\n fit: 'inside',\n withoutEnlargement: true,\n })\n if (fmt === 'png') {\n buf = await pipeline.png().toBuffer()\n outMime = 'image/png'\n } else if (fmt === 'webp') {\n buf = await pipeline.webp().toBuffer()\n outMime = 'image/webp'\n } else {\n buf = await pipeline.jpeg().toBuffer()\n outMime = 'image/jpeg'\n }\n outBuffer = new Uint8Array(buf)\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', outMime)\n res.setHeader('Content-Disposition', `inline; filename=\"${asset.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content (resized if requested)\n res.send(outBuffer)\n } catch (error) {\n console.error('Error fetching asset by name:', error)\n res.status(500).json({ error: 'Failed to fetch asset' })\n }\n },\n )\n}\n","import type { Request, Response, Router } from 'express'\nimport sharp from 'sharp'\nimport { getDbClient } from '../../db'\n\nexport interface ScreenshotRestControllerConfig {\n /**\n * Base path for screenshot endpoints (e.g., '/api/screenshots')\n */\n basePath: string\n}\n\n/**\n * Registers REST endpoints for screenshot retrieval\n * \n * Endpoints:\n * - GET {basePath}/app/:appId - Get all screenshots for an app\n * - GET {basePath}/:id - Get screenshot binary by ID\n * - GET {basePath}/:id/metadata - Get screenshot metadata only\n */\nexport function registerScreenshotRestController(\n router: Router,\n config: ScreenshotRestControllerConfig,\n): void {\n const { basePath } = config\n\n // Get all screenshots for an app\n router.get(`${basePath}/app/:appSlug`, async (req: Request, res: Response) => {\n try {\n const { appSlug } = req.params\n\n const prisma = getDbClient()\n \n // Find app by slug\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appSlug },\n select: { screenshotIds: true },\n })\n\n if (!app) {\n res.status(404).json({ error: 'App not found' })\n return\n }\n\n // Fetch all screenshots for the app\n const screenshots = await prisma.dbAsset.findMany({\n where: {\n id: { in: app.screenshotIds },\n assetType: 'screenshot',\n },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n },\n })\n\n res.json(screenshots)\n } catch (error) {\n console.error('Error fetching app screenshots:', error)\n res.status(500).json({ error: 'Failed to fetch screenshots' })\n }\n })\n\n // Get first screenshot for an app (convenience endpoint)\n router.get(`${basePath}/app/:appSlug/first`, async (req: Request, res: Response) => {\n try {\n const { appSlug } = req.params\n\n const prisma = getDbClient()\n \n // Find app by slug\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appSlug },\n select: { screenshotIds: true },\n })\n\n if (!app || app.screenshotIds.length === 0) {\n res.status(404).json({ error: 'No screenshots found' })\n return\n }\n\n // Fetch first screenshot\n const screenshot = await prisma.dbAsset.findUnique({\n where: { id: app.screenshotIds[0] },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n },\n })\n\n if (!screenshot) {\n res.status(404).json({ error: 'Screenshot not found' })\n return\n }\n\n res.json(screenshot)\n } catch (error) {\n console.error('Error fetching first screenshot:', error)\n res.status(500).json({ error: 'Failed to fetch screenshot' })\n }\n })\n\n // Get screenshot binary by ID\n router.get(`${basePath}/:id`, async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n const sizeParam = req.query.size as string | undefined\n const targetSize = sizeParam ? parseInt(sizeParam, 10) : undefined\n\n const prisma = getDbClient()\n const screenshot = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n content: true,\n mimeType: true,\n name: true,\n },\n })\n\n if (!screenshot) {\n res.status(404).json({ error: 'Screenshot not found' })\n return\n }\n\n let content: Uint8Array | Buffer = screenshot.content\n\n // Resize if size parameter provided\n if (targetSize && targetSize > 0) {\n try {\n content = await sharp(screenshot.content)\n .resize(targetSize, targetSize, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .toBuffer()\n } catch (resizeError) {\n console.error('Error resizing screenshot:', resizeError)\n // Fall back to original if resize fails\n }\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', screenshot.mimeType)\n res.setHeader('Content-Disposition', `inline; filename=\"${screenshot.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content\n res.send(content)\n } catch (error) {\n console.error('Error fetching screenshot:', error)\n res.status(500).json({ error: 'Failed to fetch screenshot' })\n }\n })\n\n // Get screenshot metadata only (no binary content)\n router.get(`${basePath}/:id/metadata`, async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n\n const prisma = getDbClient()\n const screenshot = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n\n if (!screenshot) {\n res.status(404).json({ error: 'Screenshot not found' })\n return\n }\n\n res.json(screenshot)\n } catch (error) {\n console.error('Error fetching screenshot metadata:', error)\n res.status(500).json({ error: 'Failed to fetch screenshot metadata' })\n }\n })\n}\n","import { readFileSync, readdirSync } from 'node:fs'\nimport { extname, join } from 'node:path'\nimport { getDbClient } from '../../db'\nimport { generateChecksum, getImageDimensions } from './assetUtils'\n\nexport interface SyncAssetsConfig {\n /**\n * Directory containing icon files to sync\n */\n iconsDir?: string\n\n /**\n * Directory containing screenshot files to sync\n */\n screenshotsDir?: string\n}\n\n/**\n * Sync local asset files (icons and screenshots) from directories into the database.\n *\n * This function allows consuming applications to sync asset files without directly\n * exposing the Prisma client. It handles:\n * - Icon files: Assigned to apps by matching filename to icon name patterns\n * - Screenshot files: Assigned to apps by matching filename to app ID (format: <app-id>_screenshot_<no>.<ext>)\n *\n * @param config Configuration with paths to icon and screenshot directories\n */\nexport async function syncAssets(config: SyncAssetsConfig): Promise<{\n iconsUpserted: number\n screenshotsUpserted: number\n}> {\n const prisma = getDbClient()\n let iconsUpserted = 0\n let screenshotsUpserted = 0\n\n // Sync icons from local/icons directory\n if (config.iconsDir) {\n console.log(`📁 Syncing icons from ${config.iconsDir}...`)\n iconsUpserted = await syncIconsFromDirectory(prisma, config.iconsDir)\n console.log(` ✓ Upserted ${iconsUpserted} icons`)\n }\n\n // Sync screenshots from local/screenshots directory\n if (config.screenshotsDir) {\n console.log(`📷 Syncing screenshots from ${config.screenshotsDir}...`)\n screenshotsUpserted = await syncScreenshotsFromDirectory(\n prisma,\n config.screenshotsDir,\n )\n console.log(\n ` ✓ Upserted ${screenshotsUpserted} screenshots and assigned to apps`,\n )\n }\n\n return {\n iconsUpserted,\n screenshotsUpserted,\n }\n}\n\n/**\n * Sync icon files from a directory\n */\nasync function syncIconsFromDirectory(\n prisma: ReturnType<typeof getDbClient>,\n iconsDir: string,\n): Promise<number> {\n let count = 0\n\n try {\n const files = readdirSync(iconsDir)\n\n for (const file of files) {\n const filePath = join(iconsDir, file)\n const ext = extname(file).toLowerCase().slice(1) // Remove leading dot\n\n // Skip non-image files\n if (!['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(ext)) {\n continue\n }\n\n try {\n const content = readFileSync(filePath)\n const buffer = Buffer.from(content)\n const checksum = generateChecksum(buffer)\n const iconName = file.replace(/\\.[^/.]+$/, '') // Remove extension\n\n // Check if asset with same checksum already exists\n const existing = await prisma.dbAsset.findFirst({\n where: { checksum, assetType: 'icon' },\n })\n\n if (existing) {\n continue // Already synced\n }\n\n // Extract dimensions for raster images\n let width: number | null = null\n let height: number | null = null\n if (!ext.includes('svg')) {\n const { width: w, height: h } = await getImageDimensions(buffer)\n width = w ?? null\n height = h ?? null\n }\n\n // Determine MIME type\n const mimeType =\n {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n }[ext] || 'application/octet-stream'\n\n await prisma.dbAsset.create({\n data: {\n name: iconName,\n assetType: 'icon',\n content: new Uint8Array(buffer),\n checksum,\n mimeType,\n fileSize: buffer.length,\n width,\n height,\n },\n })\n\n count++\n } catch (error) {\n console.warn(` ⚠ Failed to sync icon ${file}:`, error)\n }\n }\n } catch (error) {\n console.error(` ❌ Error reading icons directory:`, error)\n }\n\n return count\n}\n\n/**\n * Sync screenshot files from a directory and assign to apps\n */\nasync function syncScreenshotsFromDirectory(\n prisma: ReturnType<typeof getDbClient>,\n screenshotsDir: string,\n): Promise<number> {\n let count = 0\n\n try {\n const files = readdirSync(screenshotsDir)\n\n // Group screenshots by app ID\n const screenshotsByApp = new Map<\n string,\n Array<{ path: string; ext: string }>\n >()\n\n for (const file of files) {\n // Parse filename: <app-id>_screenshot_<no>.<ext>\n const match = file.match(/^(.+?)_screenshot_(\\d+)\\.([^.]+)$/)\n if (!match || !match[1] || !match[3]) {\n continue\n }\n\n const appId = match[1]\n const ext = match[3]\n if (!screenshotsByApp.has(appId)) {\n screenshotsByApp.set(appId, [])\n }\n screenshotsByApp.get(appId)!.push({\n path: join(screenshotsDir, file),\n ext,\n })\n }\n\n // Process each app's screenshots\n for (const [appId, screenshots] of screenshotsByApp) {\n try {\n // Check if app exists\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appId },\n select: { id: true },\n })\n\n if (!app) {\n console.warn(` ⚠ App not found: ${appId}`)\n continue\n }\n\n // Sync screenshots for this app\n for (const screenshot of screenshots) {\n try {\n const content = readFileSync(screenshot.path)\n const buffer = Buffer.from(content)\n const checksum = generateChecksum(buffer)\n\n // Check if screenshot with same checksum already exists\n const existing = await prisma.dbAsset.findFirst({\n where: { checksum, assetType: 'screenshot' },\n })\n\n if (existing) {\n // Link to app via screenshotIds array if not already linked\n const existingApp = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appId },\n })\n if (\n existingApp &&\n !existingApp.screenshotIds.includes(existing.id)\n ) {\n await prisma.dbAppForCatalog.update({\n where: { slug: appId },\n data: {\n screenshotIds: [...existingApp.screenshotIds, existing.id],\n },\n })\n }\n continue\n }\n\n // Extract dimensions\n const { width, height } = await getImageDimensions(buffer)\n\n // Determine MIME type\n const mimeType =\n {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n }[screenshot.ext.toLowerCase()] || 'application/octet-stream'\n\n // Create screenshot asset\n const asset = await prisma.dbAsset.create({\n data: {\n name: `${appId}-screenshot-${Date.now()}`,\n assetType: 'screenshot',\n content: new Uint8Array(buffer),\n checksum,\n mimeType,\n fileSize: buffer.length,\n width: width ?? null,\n height: height ?? null,\n },\n })\n\n // Link screenshot to app via screenshotIds array\n await prisma.dbAppForCatalog.update({\n where: { slug: appId },\n data: {\n screenshotIds: {\n push: asset.id,\n },\n },\n })\n\n count++\n } catch (error) {\n console.warn(\n ` ⚠ Failed to sync screenshot ${screenshot.path}:`,\n error,\n )\n }\n }\n } catch (error) {\n console.warn(` ⚠ Failed to process app ${appId}:`, error)\n }\n }\n } catch (error) {\n console.error(` ❌ Error reading screenshots directory:`, error)\n }\n\n return count\n}\n","import type { AppForCatalog } from '../../types/common/appCatalogTypes'\nimport { getDbClient } from '../../db/client'\n\ninterface LinkCheck {\n url: string\n status: number | null\n error?: string\n appSlug: string\n linkType: 'appUrl' | 'sources' | 'accessRequest.urls'\n}\n\ninterface CheckLinksOptions {\n maxConcurrent?: number\n timeout?: number\n maxRetries?: number\n onProgress?: (result: LinkCheck) => void\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function checkUrlWithRetry(\n url: string,\n options: {\n timeout: number\n maxRetries: number\n },\n): Promise<{ status: number | null; error?: string }> {\n let lastError: string | undefined\n\n for (let attempt = 0; attempt <= options.maxRetries; attempt++) {\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n redirect: 'manual', // Don't follow redirects\n signal: AbortSignal.timeout(options.timeout),\n })\n return { status: response.status }\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n lastError = errorMessage\n\n // Check if it's a retryable error (timeout or fetch failed)\n const isRetryable =\n errorMessage.includes('aborted') ||\n errorMessage.includes('timeout') ||\n errorMessage.includes('fetch failed')\n\n if (isRetryable && attempt < options.maxRetries) {\n // Exponential backoff: 1s, 2s, 4s\n const backoffMs = 1000 * 2 ** attempt\n await sleep(backoffMs)\n continue\n }\n\n break\n }\n }\n\n return { status: null, error: lastError }\n}\n\nfunction getStatusEmoji(status: number | null): string {\n if (status === null) return '❌'\n if (status >= 200 && status < 300) return '✅'\n if (status >= 300 && status < 400) return '🔀'\n if (status === 403) return '🔒' // 403 is not an error, just forbidden\n if (status && status >= 400 && status < 500) return '⚠️'\n return '❌'\n}\n\nfunction isWorkingLink(status: number | null): boolean {\n if (status === null) return false\n // 2xx, 3xx, and 403 are considered working\n if (status >= 200 && status < 400) return true\n if (status === 403) return true\n return false\n}\n\nfunction isBrokenLink(status: number | null): boolean {\n if (status === null) return true\n // 403 is not broken\n if (status === 403) return false\n // 4xx (except 403) and 5xx are broken\n return status >= 400\n}\n\nfunction formatStatus(status: number | null, error?: string): string {\n if (status === null) {\n return `ERROR: ${error || 'Unknown error'}`\n }\n return `${status}`\n}\n\nasync function getAppsFromDb(): Promise<Array<AppForCatalog>> {\n const prisma = getDbClient()\n const rows = await prisma.dbAppForCatalog.findMany()\n\n return rows.map((row) => {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as Array<string> | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = (row.sources as unknown as Array<string> | null) ?? []\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n }\n })\n}\n\n/**\n * Check all links in the app catalog and return a report\n */\nexport async function checkAllLinks(options: CheckLinksOptions = {}): Promise<{\n total: number\n working: number\n broken: number\n redirects: number\n checks: Array<LinkCheck>\n}> {\n const {\n maxConcurrent = 10,\n timeout = 60000,\n maxRetries = 3,\n onProgress,\n } = options\n\n const apps = await getAppsFromDb()\n const checks: Array<Omit<LinkCheck, 'status' | 'error'>> = []\n\n // Collect all links\n for (const app of apps) {\n // Check appUrl\n if (app.appUrl) {\n checks.push({\n url: app.appUrl,\n appSlug: app.slug,\n linkType: 'appUrl',\n })\n }\n\n // Check sources\n if (app.sources && app.sources.length > 0) {\n for (const source of app.sources) {\n checks.push({\n url: source,\n appSlug: app.slug,\n linkType: 'sources',\n })\n }\n }\n\n // Check accessRequest.urls\n if (app.accessRequest?.urls && app.accessRequest.urls.length > 0) {\n for (const link of app.accessRequest.urls) {\n checks.push({\n url: link.url,\n appSlug: app.slug,\n linkType: 'accessRequest.urls',\n })\n }\n }\n }\n\n // Check all links with concurrency control\n const results: Array<LinkCheck> = []\n const queue = [...checks]\n const inProgress = new Set<Promise<void>>()\n\n while (queue.length > 0 || inProgress.size > 0) {\n // Start new requests up to maxConcurrent\n while (queue.length > 0 && inProgress.size < maxConcurrent) {\n const check = queue.shift()!\n\n const promise = (async () => {\n const result = await checkUrlWithRetry(check.url, {\n timeout,\n maxRetries,\n })\n\n const linkCheck: LinkCheck = {\n ...check,\n status: result.status,\n error: result.error,\n }\n results.push(linkCheck)\n\n // Stream result if callback provided\n if (onProgress) {\n onProgress(linkCheck)\n }\n })()\n\n inProgress.add(promise)\n\n // Clean up when promise completes\n void promise.finally(() => {\n inProgress.delete(promise)\n })\n }\n\n // Wait for at least one to complete before continuing\n if (inProgress.size > 0) {\n await Promise.race(inProgress)\n }\n }\n\n const working = results.filter((r) => isWorkingLink(r.status))\n const broken = results.filter((r) => isBrokenLink(r.status))\n const redirects = results.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n return {\n total: results.length,\n working: working.length,\n broken: broken.length,\n redirects: redirects.length,\n checks: results,\n }\n}\n\n/**\n * Print a formatted report of link check results\n */\nexport function printLinkCheckReport(report: {\n total: number\n working: number\n broken: number\n redirects: number\n checks: Array<LinkCheck>\n}): void {\n console.log('📊 Results:\\n')\n console.log(`✅ Working links: ${report.working}`)\n console.log(`❌ Broken links: ${report.broken}`)\n console.log(`🔀 Redirects: ${report.redirects}`)\n console.log()\n\n const broken = report.checks.filter((r) => isBrokenLink(r.status))\n const redirects = report.checks.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n // Show broken links\n if (broken.length > 0) {\n console.log('❌ Broken Links:\\n')\n for (const link of broken) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Show redirects\n if (redirects.length > 0) {\n console.log('🔀 Redirects:\\n')\n for (const link of redirects) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Summary by app\n const appStats = new Map<\n string,\n { working: number; broken: number; total: number }\n >()\n for (const result of report.checks) {\n const stats = appStats.get(result.appSlug) || {\n working: 0,\n broken: 0,\n total: 0,\n }\n stats.total++\n if (isWorkingLink(result.status)) {\n stats.working++\n } else {\n stats.broken++\n }\n appStats.set(result.appSlug, stats)\n }\n\n const appsWithBrokenLinks = Array.from(appStats.entries())\n .filter(([_, stats]) => stats.broken > 0)\n .sort((a, b) => b[1].broken - a[1].broken)\n\n if (appsWithBrokenLinks.length > 0) {\n console.log('📱 Apps with broken links:\\n')\n for (const [appSlug, stats] of appsWithBrokenLinks) {\n console.log(` ${appSlug}: ${stats.broken}/${stats.total} broken`)\n }\n console.log()\n }\n\n if (broken.length > 0) {\n console.log(`\\n❌ Found ${broken.length} broken link(s)`)\n } else {\n console.log('\\n✅ All links are working!')\n }\n}\n","import type { PrismaClient as CorePrismaClient } from '../../db/prisma'\n\nexport interface ApprovalMethodSyncInput {\n slug: string\n type: 'service' | 'personTeam' | 'custom'\n displayName: string\n}\n\n/**\n * Syncs approval methods to the database using upsert logic based on type + displayName.\n *\n * @param prisma - The PrismaClient instance from the backend-core database\n * @param methods - Array of approval methods to sync\n */\nexport async function syncApprovalMethods(\n prisma: CorePrismaClient,\n methods: Array<ApprovalMethodSyncInput>,\n): Promise<void> {\n // Use transaction for atomicity\n await prisma.$transaction(\n methods.map((method) =>\n prisma.dbApprovalMethod.upsert({\n where: {\n slug: method.slug,\n },\n update: {\n displayName: method.displayName,\n type: method.type,\n },\n create: {\n slug: method.slug,\n type: method.type,\n displayName: method.displayName,\n },\n }),\n ),\n )\n}\n","import { PrismaClient } from '../db/prisma'\nimport { PrismaPg } from '@prisma/adapter-pg'\nimport pg from 'pg'\nimport type { EhDatabaseConfig } from './types'\nimport { setDbClient } from '../db/client'\n\n/**\n * Formats a database connection URL from structured config.\n */\nfunction formatConnectionUrl(config: EhDatabaseConfig): string {\n if ('url' in config) {\n return config.url\n }\n\n const { host, port, database, username, password, schema = 'public' } = config\n return `postgresql://${username}:${encodeURIComponent(password)}@${host}:${port}/${database}?schema=${schema}`\n}\n\n/**\n * Internal database manager used by the middleware.\n * Handles connection URL formatting and lifecycle.\n */\nexport class EhDatabaseManager {\n private client: PrismaClient | null = null\n private pool: pg.Pool | null = null\n private config: EhDatabaseConfig\n\n constructor(config: EhDatabaseConfig) {\n this.config = config\n }\n\n /**\n * Get or create the Prisma client instance.\n * Uses lazy initialization for flexibility.\n */\n getClient(): PrismaClient {\n if (!this.client) {\n const datasourceUrl = formatConnectionUrl(this.config)\n\n // Prisma 7 with adapter: Create pg pool and wrap with adapter\n this.pool = new pg.Pool({ connectionString: datasourceUrl })\n const adapter = new PrismaPg(this.pool)\n\n this.client = new PrismaClient({\n adapter,\n log:\n process.env.NODE_ENV === 'development'\n ? ['warn', 'error']\n : ['warn', 'error'],\n })\n\n // Bridge with existing backend-core getDbClient() usage\n setDbClient(this.client)\n }\n return this.client\n }\n\n async connect(): Promise<void> {\n const client = this.getClient()\n await client.$connect()\n }\n\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.$disconnect()\n this.client = null\n }\n if (this.pool) {\n await this.pool.end()\n this.pool = null\n }\n }\n}\n","import type { AppCatalogCompanySpecificBackend } from '../types/backend/companySpecificBackend'\nimport type { EhBackendProvider } from './types'\n\n/**\n * Type guard to check if an object implements AppCatalogCompanySpecificBackend.\n */\nfunction isBackendInstance(\n obj: unknown,\n): obj is AppCatalogCompanySpecificBackend {\n return typeof obj === 'object' && obj !== null\n}\n\n/**\n * Normalizes different backend provider types into a consistent async factory function.\n * Supports:\n * - Direct object implementing AppCatalogCompanySpecificBackend\n * - Sync factory function that returns the backend\n * - Async factory function that returns the backend\n */\nexport function createBackendResolver(\n provider: EhBackendProvider,\n): () => Promise<AppCatalogCompanySpecificBackend> {\n // If it's already an object with the required methods, wrap it\n if (isBackendInstance(provider)) {\n return async () => provider\n }\n\n // If it's a function, call it and handle both sync and async results\n if (typeof provider === 'function') {\n return async () => {\n const result = (\n provider as () =>\n | AppCatalogCompanySpecificBackend\n | Promise<AppCatalogCompanySpecificBackend>\n )()\n return result instanceof Promise ? await result : result\n }\n }\n\n throw new Error(\n 'Invalid backend provider: must be an object implementing AppCatalogCompanySpecificBackend or a factory function',\n )\n}\n","import type { Request, Response } from 'express'\nimport { getDbClient } from '../../db'\n\n/**\n * Export the complete app catalog as JSON\n * Includes all fields from DbAppForCatalog and DbApprovalMethod\n */\nexport async function exportCatalog(\n _req: Request,\n res: Response,\n): Promise<void> {\n try {\n const prisma = getDbClient()\n\n // Fetch all catalog entries\n const apps = await prisma.dbAppForCatalog.findMany({\n orderBy: { slug: 'asc' },\n })\n\n // Fetch all approval methods\n const approvalMethods = await prisma.dbApprovalMethod.findMany({\n orderBy: { displayName: 'asc' },\n })\n\n res.json({\n version: '2.0',\n exportDate: new Date().toISOString(),\n apps,\n approvalMethods,\n })\n } catch (error) {\n console.error('Error exporting catalog:', error)\n res.status(500).json({ error: 'Failed to export catalog' })\n }\n}\n\n/**\n * Import/restore the complete app catalog from JSON\n * Overwrites existing data\n */\nexport async function importCatalog(\n req: Request,\n res: Response,\n): Promise<void> {\n try {\n const prisma = getDbClient()\n const { apps, approvalMethods } = req.body\n\n if (!Array.isArray(apps)) {\n res\n .status(400)\n .json({ error: 'Invalid data format: apps must be an array' })\n return\n }\n\n // Use transaction to ensure atomicity\n await prisma.$transaction(async (tx) => {\n // Delete all existing approval methods first (due to potential FK references)\n if (Array.isArray(approvalMethods)) {\n await tx.dbApprovalMethod.deleteMany({})\n }\n\n // Delete all existing catalog entries\n await tx.dbAppForCatalog.deleteMany({})\n\n // Insert approval methods first\n if (Array.isArray(approvalMethods)) {\n for (const method of approvalMethods) {\n // Remove id, createdAt, updatedAt to let Prisma generate new ones\n const { id, createdAt, updatedAt, ...methodData } = method\n\n await tx.dbApprovalMethod.create({\n data: methodData,\n })\n }\n }\n\n // Insert app catalog entries\n for (const app of apps) {\n // Remove id, createdAt, updatedAt to let Prisma generate new ones\n const { id, createdAt, updatedAt, ...appData } = app\n\n await tx.dbAppForCatalog.create({\n data: appData,\n })\n }\n })\n\n res.json({\n success: true,\n imported: {\n apps: apps.length,\n approvalMethods: Array.isArray(approvalMethods)\n ? approvalMethods.length\n : 0,\n },\n })\n } catch (error) {\n console.error('Error importing catalog:', error)\n res.status(500).json({ error: 'Failed to import catalog' })\n }\n}\n\n/**\n * Export an asset (icon or screenshot) by name\n */\nexport async function exportAsset(req: Request, res: Response): Promise<void> {\n try {\n const { name } = req.params\n const prisma = getDbClient()\n\n const asset = await prisma.dbAsset.findUnique({\n where: { name },\n })\n\n if (!asset) {\n res.status(404).json({ error: 'Asset not found' })\n return\n }\n\n // Set appropriate content type and send binary data\n res.set('Content-Type', asset.mimeType)\n res.set('Content-Disposition', `attachment; filename=\"${name}\"`)\n res.send(Buffer.from(asset.content))\n } catch (error) {\n console.error('Error exporting asset:', error)\n res.status(500).json({ error: 'Failed to export asset' })\n }\n}\n\n/**\n * List all assets with metadata\n */\nexport async function listAssets(_req: Request, res: Response): Promise<void> {\n try {\n const prisma = getDbClient()\n\n const assets = await prisma.dbAsset.findMany({\n select: {\n id: true,\n name: true,\n assetType: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n checksum: true,\n },\n orderBy: { name: 'asc' },\n })\n\n res.json({ assets })\n } catch (error) {\n console.error('Error listing assets:', error)\n res.status(500).json({ error: 'Failed to list assets' })\n }\n}\n\n/**\n * Import an asset (icon or screenshot)\n */\nexport async function importAsset(req: Request, res: Response): Promise<void> {\n try {\n const file = req.file\n const { name, assetType, mimeType, width, height } = req.body\n\n if (!file) {\n res.status(400).json({ error: 'No file uploaded' })\n return\n }\n\n const prisma = getDbClient()\n const crypto = await import('node:crypto')\n\n // Calculate checksum\n const checksum = crypto\n .createHash('sha256')\n .update(file.buffer)\n .digest('hex')\n\n // Convert Buffer to Uint8Array for Prisma Bytes type\n const content = new Uint8Array(file.buffer)\n\n // Upsert asset (update if exists, create if not)\n await prisma.dbAsset.upsert({\n where: { name },\n update: {\n content,\n checksum,\n mimeType: mimeType || file.mimetype,\n fileSize: file.size,\n width: width ? parseInt(width) : null,\n height: height ? parseInt(height) : null,\n assetType: assetType || 'icon',\n },\n create: {\n name,\n content,\n checksum,\n mimeType: mimeType || file.mimetype,\n fileSize: file.size,\n width: width ? parseInt(width) : null,\n height: height ? parseInt(height) : null,\n assetType: assetType || 'icon',\n },\n })\n\n res.json({ success: true, name, size: file.size })\n } catch (error) {\n console.error('Error importing asset:', error)\n res.status(500).json({ error: 'Failed to import asset' })\n }\n}\n","import type { EhDevMockUser } from '../../middleware/types'\nimport type { User } from 'better-auth/types'\n\n/**\n * Extended User type with app-catalog specific fields\n */\ntype EhUser = User & {\n env_hopper_groups?: Array<string>\n}\n\n/**\n * Creates a complete User object from basic dev mock user details\n */\nexport function createMockUserFromDevConfig(devUser: EhDevMockUser): EhUser {\n return {\n id: devUser.id,\n email: devUser.email,\n name: devUser.name,\n emailVerified: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n env_hopper_groups: devUser.groups,\n }\n}\n\n/**\n * Creates a mock session response for /api/auth/session endpoint\n */\nexport function createMockSessionResponse(devUser: EhDevMockUser) {\n return {\n user: {\n id: devUser.id,\n email: devUser.email,\n name: devUser.name,\n emailVerified: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n env_hopper_groups: devUser.groups,\n },\n session: {\n id: `${devUser.id}-session`,\n userId: devUser.id,\n expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30).toISOString(), // 30 days\n token: `${devUser.id}-token`,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n }\n}\n","import type { Router } from 'express'\nimport { toNodeHandler } from 'better-auth/node'\nimport type {\n EhFeatureToggles,\n EhMiddlewareOptions,\n MiddlewareContext,\n} from './types'\nimport { registerIconRestController } from '../modules/icons/iconRestController'\nimport { registerAssetRestController } from '../modules/assets/assetRestController'\nimport { registerScreenshotRestController } from '../modules/assets/screenshotRestController'\nimport { createAdminChatHandler } from '../modules/admin/chat/createAdminChatHandler'\nimport { getAssetByName } from '../modules/icons/iconService'\nimport {\n exportAsset,\n exportCatalog,\n importAsset,\n importCatalog,\n listAssets,\n} from '../modules/appCatalogAdmin/catalogBackupController'\nimport multer from 'multer'\nimport { createMockSessionResponse } from '../modules/auth/devMockUserUtils'\n\ninterface FeatureRegistration {\n name: keyof EhFeatureToggles\n defaultEnabled: boolean\n register: (\n router: Router,\n options: Required<Pick<EhMiddlewareOptions, 'basePath'>> &\n EhMiddlewareOptions,\n context: MiddlewareContext,\n ) => void\n}\n\n// Optional features that can be toggled\nconst FEATURES: Array<FeatureRegistration> = [\n {\n name: 'auth',\n defaultEnabled: true,\n register: (router, options, ctx) => {\n const basePath = options.basePath\n\n // Explicit session endpoint handler\n router.get(\n `${basePath}/auth/session`,\n async (req, res): Promise<void> => {\n try {\n // Check if dev mock user is configured\n if (ctx.authConfig.devMockUser) {\n res.json(createMockSessionResponse(ctx.authConfig.devMockUser))\n return\n }\n\n const session = await ctx.auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n res.json(session)\n } else {\n res.status(401).json({ error: 'Not authenticated' })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n },\n )\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n const authHandler = toNodeHandler(ctx.auth)\n router.all(`${basePath}/auth/{*any}`, authHandler)\n },\n },\n {\n name: 'adminChat',\n defaultEnabled: false, // Only enabled if adminChat config is provided\n register: (router, options) => {\n if (options.adminChat) {\n router.post(\n `${options.basePath}/admin/chat`,\n createAdminChatHandler(options.adminChat),\n )\n }\n },\n },\n {\n name: 'legacyIconEndpoint',\n defaultEnabled: false,\n register: (router) => {\n // Legacy endpoint at /static/icon/:icon for backwards compatibility\n router.get('/static/icon/:icon', async (req, res) => {\n const { icon } = req.params\n\n if (!icon || !/^[a-z0-9-]+$/i.test(icon)) {\n res.status(400).send('Invalid icon name')\n return\n }\n\n try {\n const dbIcon = await getAssetByName(icon)\n\n if (!dbIcon) {\n res.status(404).send('Icon not found')\n return\n }\n\n res.setHeader('Content-Type', dbIcon.mimeType)\n res.setHeader('Cache-Control', 'public, max-age=86400')\n res.send(dbIcon.content)\n } catch (error) {\n console.error('Error fetching icon:', error)\n res.status(404).send('Icon not found')\n }\n })\n },\n },\n]\n\n/**\n * Registers all enabled features on the router.\n */\nexport function registerFeatures(\n router: Router,\n options: Required<Pick<EhMiddlewareOptions, 'basePath'>> &\n EhMiddlewareOptions,\n context: MiddlewareContext,\n): void {\n const basePath = options.basePath\n\n // Always-on features (required for core functionality)\n\n // Icons\n registerIconRestController(router, {\n basePath: `${basePath}/icons`,\n })\n\n // Assets\n registerAssetRestController(router, {\n basePath: `${basePath}/assets`,\n })\n\n // Screenshots\n registerScreenshotRestController(router, {\n basePath: `${basePath}/screenshots`,\n })\n\n // Catalog backup/restore\n const upload = multer({ storage: multer.memoryStorage() })\n router.get(`${basePath}/catalog/backup/export`, exportCatalog)\n router.post(`${basePath}/catalog/backup/import`, importCatalog)\n router.get(`${basePath}/catalog/backup/assets`, listAssets)\n router.get(`${basePath}/catalog/backup/assets/:name`, exportAsset)\n router.post(\n `${basePath}/catalog/backup/assets`,\n upload.single('file'),\n importAsset,\n )\n\n // Optional toggleable features\n const toggles = options.features || {}\n\n for (const feature of FEATURES) {\n const isEnabled = toggles[feature.name] ?? feature.defaultEnabled\n\n // Special case: adminChat is only enabled if config is provided\n if (feature.name === 'adminChat' && !options.adminChat) {\n continue\n }\n\n if (isEnabled) {\n feature.register(router, options, context)\n }\n }\n}\n","import express, { Router } from 'express'\nimport * as trpcExpress from '@trpc/server/adapters/express'\nimport type {\n EhMiddlewareOptions,\n EhMiddlewareResult,\n MiddlewareContext,\n} from './types'\nimport { EhDatabaseManager } from './database'\nimport { createBackendResolver } from './backendResolver'\nimport { registerFeatures } from './featureRegistry'\nimport { createTrpcRouter } from '../server/controller'\nimport { createEhTrpcContext } from '../server/ehTrpcContext'\nimport { createAuth } from '../modules/auth/auth'\nimport { createMockUserFromDevConfig } from '../modules/auth/devMockUserUtils'\n\nexport async function createEhMiddleware(\n options: EhMiddlewareOptions,\n): Promise<EhMiddlewareResult> {\n // Normalize options with defaults\n const basePath = options.basePath ?? '/api'\n const normalizedOptions = { ...options, basePath }\n\n // Initialize database manager\n const dbManager = new EhDatabaseManager(options.database)\n // Initialize the client (which also sets the global singleton)\n dbManager.getClient()\n\n // Create auth instance\n const auth = createAuth({\n appName: options.auth.appName,\n baseURL: options.auth.baseURL,\n secret: options.auth.secret,\n providers: options.auth.providers,\n plugins: options.auth.plugins,\n sessionExpiresIn: options.auth.sessionExpiresIn,\n sessionUpdateAge: options.auth.sessionUpdateAge,\n })\n\n // Create tRPC router\n const trpcRouter = createTrpcRouter(auth)\n\n // Normalize backend provider to async factory function\n const resolveBackend = createBackendResolver(options.backend)\n\n // Get admin groups from config with default\n const adminGroups = options.auth.adminGroups ?? ['env_hopper_ui_super_admins']\n\n // Create tRPC context factory\n const createContext = async ({\n req,\n }: trpcExpress.CreateExpressContextOptions) => {\n const companySpecificBackend = await resolveBackend()\n\n let user = null\n let userGroups: Array<string> = []\n\n // Check if dev mock user is configured\n if (options.auth.devMockUser) {\n user = createMockUserFromDevConfig(options.auth.devMockUser)\n userGroups = options.auth.devMockUser.groups\n } else {\n // Extract user from session\n try {\n const session = await auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n user = session?.user ?? null\n\n // If user is authenticated and Okta is configured, decode groups from access token\n if (user && options.auth.oktaGroupsClaim) {\n try {\n // Get the current access token (auto-refreshes if expired)\n // Note: better-auth requires providerId, but we use 'okta' as default\n const tokenResult = await auth.api.getAccessToken({\n body: {\n providerId: 'okta',\n },\n headers: req.headers as HeadersInit,\n })\n\n if (tokenResult.accessToken) {\n // Decode JWT to extract groups claim\n const parts = tokenResult.accessToken.split('.')\n if (parts.length === 3 && parts[1]) {\n const payload = JSON.parse(\n Buffer.from(parts[1], 'base64').toString(),\n )\n const groups = payload[options.auth.oktaGroupsClaim]\n userGroups = Array.isArray(groups) ? groups : []\n }\n }\n } catch (error) {\n console.error('[tRPC Context] Failed to get access token:', error)\n }\n }\n } catch (error) {\n console.error('[tRPC Context] Failed to get session:', error)\n }\n }\n\n // Attach groups to user object for authorization checks\n const userWithGroups = user ? { ...user, groups: userGroups } : null\n\n return createEhTrpcContext({\n companySpecificBackend,\n user: userWithGroups,\n adminGroups,\n })\n }\n\n // Create Express router\n const router = Router()\n router.use(express.json())\n\n // Build middleware context for feature registration\n const middlewareContext: MiddlewareContext = {\n auth,\n trpcRouter,\n createContext: async () => {\n const companySpecificBackend = await resolveBackend()\n return createEhTrpcContext({\n companySpecificBackend,\n adminGroups,\n })\n },\n authConfig: options.auth,\n }\n\n // Register tRPC middleware (if enabled)\n if (normalizedOptions.features?.trpc !== false) {\n router.use(\n `${basePath}/trpc`,\n trpcExpress.createExpressMiddleware({\n router: trpcRouter,\n createContext,\n }),\n )\n }\n\n // Register all enabled features\n registerFeatures(router, normalizedOptions, middlewareContext)\n\n // Call onRoutesRegistered hook if provided\n if (options.hooks?.onRoutesRegistered) {\n await options.hooks.onRoutesRegistered(router)\n }\n\n return {\n router,\n auth,\n trpcRouter,\n\n async connect(): Promise<void> {\n await dbManager.connect()\n if (options.hooks?.onDatabaseConnected) {\n await options.hooks.onDatabaseConnected()\n }\n },\n\n async disconnect(): Promise<void> {\n if (options.hooks?.onDatabaseDisconnecting) {\n await options.hooks.onDatabaseDisconnecting()\n }\n await dbManager.disconnect()\n },\n\n addRoutes(callback: (router: Router) => void): void {\n callback(router)\n },\n }\n}\n","/**\n * Injects custom script tags into HTML content.\n *\n * Inserts script tags at the end of the body tag (before </body>).\n * This is useful for analytics, monitoring, or other third-party scripts.\n *\n * @param html - The HTML content to modify\n * @param scriptUrls - Array of script URLs to inject\n * @returns Modified HTML with injected scripts\n */\nexport function injectCustomScripts(\n html: string,\n scriptUrls: Array<string>,\n): string {\n if (scriptUrls.length === 0) {\n return html\n }\n\n const scriptTags = scriptUrls\n .map((url) => ` <script src=\"${url}\"></script>`)\n .join('\\n')\n\n // Insert scripts before the closing </body> tag\n return html.replace('</body>', `${scriptTags}\\n </body>`)\n}\n"],"x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["config: runtime.GetPrismaClientConfig","Buffer","path","$Class.getPrismaClientClass","transform","array","transform","parseDate","extend","parse","arrayParser","parseDate","parseBool","parseBigIntegerArray","parseBigInteger","init","t","bits","value","elementType","parse","array","i","val","val","defaults","util","val","config","escapeIdentifier","escapeLiteral","nodeCrypto","md5","postgresMd5PasswordHash","password","user","sha256","hashByName","hmacSha256","deriveKey","password","user","signatureAlgorithmHashFromCertificate","crypto","password","types","TypeOverrides","parse","config","fs","defaults","parse","config","ConnectionParameters","types","Result","Result","utils","Query","EventEmitter","config","DatabaseError","password","parse","query","types","config","flushBuffer","syncBuffer","endBuffer","serialize","messages_1","parse","getStream","getSecureStream","EventEmitter","Connection","config","password","query","val","split","matcher","util","val","stat","EventEmitter","utils","nodeUtils","TypeOverrides","ConnectionParameters","Query","defaults","Connection","queryQueueLengthDeprecationNotice","Client","config","val","query","EventEmitter","Promise","Pool","Client","response","err","EventEmitter","util","utils","NativeQuery","config","TypeOverrides","Client","config","err","query","Client","defaults","Connection","Result","Pool","TypeOverrides","clientConstructor","DatabaseError","escapeIdentifier","escapeLiteral","pg","prismaClient: PrismaClient | null","pool: pg.Pool | null","pg","config","router","t","publicProcedure","providers: Array<string>","config","user","group","staticControllerContract: EhStaticControllerContract","duplicateKeys: Array<string>","results: Array<MakeTFromPrismaModel<TPrismaModelName>>","assetIds: Array<string>","error: unknown","updateData: {\n screenshotIds?: Array<string>\n iconName?: string | null\n }","config","upload","config","results: Array<Awaited<ReturnType<typeof upsertIcon>>>","config","outBuffer: Uint8Array","buf: Buffer","config","content: Uint8Array | Buffer","config","width: number | null","height: number | null","lastError: string | undefined","error: unknown","checks: Array<Omit<LinkCheck, 'status' | 'error'>>","results: Array<LinkCheck>","linkCheck: LinkCheck","config","password","pg","FEATURES: Array<FeatureRegistration>","router","user","userGroups: Array<string>","router","middlewareContext: MiddlewareContext"],"sources":["../src/generated/prisma/internal/class.ts","../src/generated/prisma/client.ts","../../../node_modules/.pnpm/postgres-array@2.0.0/node_modules/postgres-array/index.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/arrayParser.js","../../../node_modules/.pnpm/postgres-date@1.0.7/node_modules/postgres-date/index.js","../../../node_modules/.pnpm/xtend@4.0.2/node_modules/xtend/mutable.js","../../../node_modules/.pnpm/postgres-interval@1.2.0/node_modules/postgres-interval/index.js","../../../node_modules/.pnpm/postgres-bytea@1.0.1/node_modules/postgres-bytea/index.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/textParsers.js","../../../node_modules/.pnpm/pg-int8@1.0.1/node_modules/pg-int8/index.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/binaryParsers.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/builtins.js","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/defaults.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/utils.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-legacy.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-webcrypto.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/cert-signatures.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/sasl.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/type-overrides.js","../../../node_modules/.pnpm/pg-connection-string@2.12.0/node_modules/pg-connection-string/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection-parameters.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/result.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/query.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/messages.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-writer.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/serializer.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-reader.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/parser.js","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/index.js","../../../node_modules/.pnpm/pg-cloudflare@1.3.0/node_modules/pg-cloudflare/dist/empty.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/stream.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection.js","../../../node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js","../../../node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/helper.js","../../../node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/client.js","../../../node_modules/.pnpm/pg-pool@3.13.0_pg@8.20.0/node_modules/pg-pool/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/query.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/client.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/index.js","../../../node_modules/.pnpm/pg@8.20.0/node_modules/pg/esm/index.mjs","../src/db/client.ts","../src/modules/appCatalog/service.ts","../src/modules/auth/authRouter.ts","../src/modules/auth/authorizationUtils.ts","../src/server/trpcSetup.ts","../src/server/controller.ts","../src/server/ehTrpcContext.ts","../src/server/ehStaticControllerContract.ts","../src/db/tableSyncPrismaAdapter.ts","../src/db/tableSyncMagazine.ts","../src/modules/assets/assetUtils.ts","../src/modules/assets/upsertAsset.ts","../src/db/syncAppCatalog.ts","../src/modules/auth/auth.ts","../src/modules/auth/registerAuthRoutes.ts","../src/modules/icons/iconUtils.ts","../src/modules/icons/iconRestController.ts","../src/modules/icons/iconService.ts","../src/modules/assets/assetRestController.ts","../src/modules/assets/screenshotRestController.ts","../src/modules/assets/syncAssets.ts","../src/modules/appCatalog/checkLinks.ts","../src/middleware/database.ts","../src/middleware/backendResolver.ts","../src/modules/auth/devMockUserUtils.ts","../src/middleware/featureRegistry.ts","../src/middleware/createEhMiddleware.ts","../src/middleware/htmlInjection.ts"],"sourcesContent":["\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.4.2\",\n \"engineVersion\": \"94a226be1cf2967af2541cca5529f0f7ba866919\",\n \"activeProvider\": \"postgresql\",\n \"inlineSchema\": \"// Prisma schema for backend-core library\\n// Uses AC_CORE_DATABASE_URL environment variable\\n\\ndatasource db {\\n provider = \\\"postgresql\\\"\\n}\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n output = \\\"../src/generated/prisma\\\"\\n}\\n\\ngenerator json {\\n provider = \\\"prisma-json-types-generator\\\"\\n}\\n\\n// ========== Better Auth Models ==========\\nmodel user {\\n id String @id\\n name String?\\n email String? @unique\\n emailVerified Boolean @default(false)\\n image String?\\n role String @default(\\\"user\\\") // 'user' | 'admin'\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n accounts account[]\\n sessions session[]\\n}\\n\\nmodel session {\\n id String @id\\n token String @unique\\n userId String\\n user user @relation(fields: [userId], references: [id], onDelete: Cascade)\\n expiresAt DateTime\\n ipAddress String?\\n userAgent String?\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n}\\n\\nmodel account {\\n id String @id\\n userId String\\n user user @relation(fields: [userId], references: [id], onDelete: Cascade)\\n accountId String\\n providerId String\\n refreshToken String?\\n accessToken String?\\n accessTokenExpiresAt DateTime?\\n refreshTokenExpiresAt DateTime?\\n idToken String?\\n scope String?\\n password String?\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@unique([providerId, accountId])\\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 @@unique([identifier, value])\\n}\\n\\n// ========== EnvHopper Models ==========\\n\\nenum ApprovalMethodType {\\n service\\n personTeam\\n custom\\n}\\n\\nmodel DbApprovalMethod {\\n slug String @id\\n type ApprovalMethodType\\n displayName String\\n /// [ApprovalMethodConfig] - Type-specific configuration\\n config Json?\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@unique([type, displayName])\\n}\\n\\nmodel DbAppForCatalog {\\n id String @id @default(cuid())\\n slug String @unique // URL-friendly identifier for navigation\\n displayName String\\n description String\\n /// [AccessMethod]\\n access Json?\\n teams String[] @default([])\\n /// [AppAccessRequest] - Per-app approval configuration linking to ApprovalMethod\\n accessRequest Json?\\n notes String?\\n tags String[] @default([])\\n appUrl String?\\n /// [AppLink[]]\\n links Json? // Array of {displayName?: string, url: string}\\n iconName String? // Optional icon identifier matching DbAsset.name\\n screenshotIds String[] @default([]) // Ordered array of DbAsset IDs\\n /// [AppDeprecation] - Deprecation info with optional replacement slug\\n deprecated Json?\\n sources String[] @default([]) // Array of source URLs (Confluence pages, docs, etc.)\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@index([displayName])\\n @@index([slug])\\n @@index([tags])\\n}\\n\\nmodel DbAppTagDefinition {\\n id String @id @default(cuid())\\n prefix String @unique\\n displayName String\\n description String\\n /// [GroupingTagValue[]]\\n values Json\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n}\\n\\nenum AssetType {\\n icon\\n screenshot\\n}\\n\\nmodel DbAsset {\\n id String @id @default(cuid())\\n name String @unique // Name with extension (e.g., \\\"jira.svg\\\", \\\"github.png\\\")\\n assetType AssetType @default(icon)\\n content Bytes // Binary storage for all asset types (SVG, PNG, etc)\\n checksum String // SHA-256 of content for deduplication\\n mimeType String // e.g., \\\"image/svg+xml\\\", \\\"image/png\\\", \\\"image/jpeg\\\"\\n fileSize Int // Size in bytes\\n width Int? // Image width in pixels\\n height Int? // Image height in pixels\\n createdAt DateTime @default(now())\\n updatedAt DateTime @updatedAt\\n\\n @@index([name])\\n @@index([assetType])\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n },\n \"parameterizationSchema\": {\n \"strings\": [],\n \"graph\": \"\"\n }\n}\n\nconfig.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\\\":\\\"role\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"accounts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"account\\\",\\\"relationName\\\":\\\"accountTouser\\\"},{\\\"name\\\":\\\"sessions\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"session\\\",\\\"relationName\\\":\\\"sessionTouser\\\"}],\\\"dbName\\\":null},\\\"session\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"token\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"user\\\",\\\"relationName\\\":\\\"sessionTouser\\\"},{\\\"name\\\":\\\"expiresAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"ipAddress\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userAgent\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"account\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"user\\\",\\\"relationName\\\":\\\"accountTouser\\\"},{\\\"name\\\":\\\"accountId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"providerId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"refreshToken\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"accessToken\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"accessTokenExpiresAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"refreshTokenExpiresAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"idToken\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"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\\\":null},\\\"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\\\":null},\\\"DbApprovalMethod\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"slug\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"type\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"ApprovalMethodType\\\"},{\\\"name\\\":\\\"displayName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"config\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"DbAppForCatalog\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"slug\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"displayName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"access\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"teams\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"accessRequest\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"notes\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"tags\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"appUrl\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"links\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"iconName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"screenshotIds\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"deprecated\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"sources\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"DbAppTagDefinition\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"prefix\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"displayName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"values\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Json\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"DbAsset\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"assetType\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"AssetType\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Bytes\\\"},{\\\"name\\\":\\\"checksum\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"mimeType\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"fileSize\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"width\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"height\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\nconfig.parameterizationSchema = {\n strings: JSON.parse(\"[\\\"where\\\",\\\"orderBy\\\",\\\"cursor\\\",\\\"user\\\",\\\"accounts\\\",\\\"sessions\\\",\\\"_count\\\",\\\"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\\\",\\\"DbApprovalMethod.findUnique\\\",\\\"DbApprovalMethod.findUniqueOrThrow\\\",\\\"DbApprovalMethod.findFirst\\\",\\\"DbApprovalMethod.findFirstOrThrow\\\",\\\"DbApprovalMethod.findMany\\\",\\\"DbApprovalMethod.createOne\\\",\\\"DbApprovalMethod.createMany\\\",\\\"DbApprovalMethod.createManyAndReturn\\\",\\\"DbApprovalMethod.updateOne\\\",\\\"DbApprovalMethod.updateMany\\\",\\\"DbApprovalMethod.updateManyAndReturn\\\",\\\"DbApprovalMethod.upsertOne\\\",\\\"DbApprovalMethod.deleteOne\\\",\\\"DbApprovalMethod.deleteMany\\\",\\\"DbApprovalMethod.groupBy\\\",\\\"DbApprovalMethod.aggregate\\\",\\\"DbAppForCatalog.findUnique\\\",\\\"DbAppForCatalog.findUniqueOrThrow\\\",\\\"DbAppForCatalog.findFirst\\\",\\\"DbAppForCatalog.findFirstOrThrow\\\",\\\"DbAppForCatalog.findMany\\\",\\\"DbAppForCatalog.createOne\\\",\\\"DbAppForCatalog.createMany\\\",\\\"DbAppForCatalog.createManyAndReturn\\\",\\\"DbAppForCatalog.updateOne\\\",\\\"DbAppForCatalog.updateMany\\\",\\\"DbAppForCatalog.updateManyAndReturn\\\",\\\"DbAppForCatalog.upsertOne\\\",\\\"DbAppForCatalog.deleteOne\\\",\\\"DbAppForCatalog.deleteMany\\\",\\\"DbAppForCatalog.groupBy\\\",\\\"DbAppForCatalog.aggregate\\\",\\\"DbAppTagDefinition.findUnique\\\",\\\"DbAppTagDefinition.findUniqueOrThrow\\\",\\\"DbAppTagDefinition.findFirst\\\",\\\"DbAppTagDefinition.findFirstOrThrow\\\",\\\"DbAppTagDefinition.findMany\\\",\\\"DbAppTagDefinition.createOne\\\",\\\"DbAppTagDefinition.createMany\\\",\\\"DbAppTagDefinition.createManyAndReturn\\\",\\\"DbAppTagDefinition.updateOne\\\",\\\"DbAppTagDefinition.updateMany\\\",\\\"DbAppTagDefinition.updateManyAndReturn\\\",\\\"DbAppTagDefinition.upsertOne\\\",\\\"DbAppTagDefinition.deleteOne\\\",\\\"DbAppTagDefinition.deleteMany\\\",\\\"DbAppTagDefinition.groupBy\\\",\\\"DbAppTagDefinition.aggregate\\\",\\\"DbAsset.findUnique\\\",\\\"DbAsset.findUniqueOrThrow\\\",\\\"DbAsset.findFirst\\\",\\\"DbAsset.findFirstOrThrow\\\",\\\"DbAsset.findMany\\\",\\\"DbAsset.createOne\\\",\\\"DbAsset.createMany\\\",\\\"DbAsset.createManyAndReturn\\\",\\\"DbAsset.updateOne\\\",\\\"DbAsset.updateMany\\\",\\\"DbAsset.updateManyAndReturn\\\",\\\"DbAsset.upsertOne\\\",\\\"DbAsset.deleteOne\\\",\\\"DbAsset.deleteMany\\\",\\\"_avg\\\",\\\"_sum\\\",\\\"DbAsset.groupBy\\\",\\\"DbAsset.aggregate\\\",\\\"AND\\\",\\\"OR\\\",\\\"NOT\\\",\\\"id\\\",\\\"name\\\",\\\"AssetType\\\",\\\"assetType\\\",\\\"content\\\",\\\"checksum\\\",\\\"mimeType\\\",\\\"fileSize\\\",\\\"width\\\",\\\"height\\\",\\\"createdAt\\\",\\\"updatedAt\\\",\\\"equals\\\",\\\"in\\\",\\\"notIn\\\",\\\"lt\\\",\\\"lte\\\",\\\"gt\\\",\\\"gte\\\",\\\"not\\\",\\\"contains\\\",\\\"startsWith\\\",\\\"endsWith\\\",\\\"prefix\\\",\\\"displayName\\\",\\\"description\\\",\\\"values\\\",\\\"string_contains\\\",\\\"string_starts_with\\\",\\\"string_ends_with\\\",\\\"array_starts_with\\\",\\\"array_ends_with\\\",\\\"array_contains\\\",\\\"slug\\\",\\\"access\\\",\\\"teams\\\",\\\"accessRequest\\\",\\\"notes\\\",\\\"tags\\\",\\\"appUrl\\\",\\\"links\\\",\\\"iconName\\\",\\\"screenshotIds\\\",\\\"deprecated\\\",\\\"sources\\\",\\\"has\\\",\\\"hasEvery\\\",\\\"hasSome\\\",\\\"ApprovalMethodType\\\",\\\"type\\\",\\\"config\\\",\\\"type_displayName\\\",\\\"identifier\\\",\\\"value\\\",\\\"expiresAt\\\",\\\"identifier_value\\\",\\\"userId\\\",\\\"accountId\\\",\\\"providerId\\\",\\\"refreshToken\\\",\\\"accessToken\\\",\\\"accessTokenExpiresAt\\\",\\\"refreshTokenExpiresAt\\\",\\\"idToken\\\",\\\"scope\\\",\\\"password\\\",\\\"token\\\",\\\"ipAddress\\\",\\\"userAgent\\\",\\\"email\\\",\\\"emailVerified\\\",\\\"image\\\",\\\"role\\\",\\\"every\\\",\\\"some\\\",\\\"none\\\",\\\"providerId_accountId\\\",\\\"is\\\",\\\"isNot\\\",\\\"connectOrCreate\\\",\\\"upsert\\\",\\\"createMany\\\",\\\"set\\\",\\\"disconnect\\\",\\\"delete\\\",\\\"connect\\\",\\\"updateMany\\\",\\\"deleteMany\\\",\\\"push\\\",\\\"increment\\\",\\\"decrement\\\",\\\"multiply\\\",\\\"divide\\\"]\"),\n graph: \"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_AgAgkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhyAFAAJ8CACHKAQEAmgIAIdQBAQCaAgAh1QEBAKcCACHWAQEApwIAIQIAAAAJACAMAAAuACAIkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhyAFAAJ8CACHKAQEAmgIAIdQBAQCaAgAh1QEBAKcCACHWAQEApwIAIQIAAAAHACAMAAAwACACAAAABwAgDAAAMAAgAwAAAAkAIBMAACkAIBQAAC4AIAEAAAAJACABAAAABwAgBQYAALwCACAZAAC-AgAgGgAAvQIAINUBAACUAgAg1gEAAJQCACALjwEAAIYCADCQAQAANwAQkQEAAIYCADCSAQEAzgEAIZwBQADTAQAhnQFAANMBACHIAUAA0wEAIcoBAQDOAQAh1AEBAM4BACHVAQEA8QEAIdYBAQDxAQAhAwAAAAcAIAEAADYAMBgAADcAIAMAAAAHACABAAAIADACAAAJACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAAC7AgAgkgEBAAAAAZwBQAAAAAGdAUAAAAABygEBAAAAAcsBAQAAAAHMAQEAAAABzQEBAAAAAc4BAQAAAAHPAUAAAAAB0AFAAAAAAdEBAQAAAAHSAQEAAAAB0wEBAAAAAQEMAAA_ACANkgEBAAAAAZwBQAAAAAGdAUAAAAABygEBAAAAAcsBAQAAAAHMAQEAAAABzQEBAAAAAc4BAQAAAAHPAUAAAAAB0AFAAAAAAdEBAQAAAAHSAQEAAAAB0wEBAAAAAQEMAABBADABDAAAQQAwDgMAALoCACCSAQEAmgIAIZwBQACfAgAhnQFAAJ8CACHKAQEAmgIAIcsBAQCaAgAhzAEBAJoCACHNAQEApwIAIc4BAQCnAgAhzwFAALkCACHQAUAAuQIAIdEBAQCnAgAh0gEBAKcCACHTAQEApwIAIQIAAAAFACAMAABEACANkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhygEBAJoCACHLAQEAmgIAIcwBAQCaAgAhzQEBAKcCACHOAQEApwIAIc8BQAC5AgAh0AFAALkCACHRAQEApwIAIdIBAQCnAgAh0wEBAKcCACECAAAAAwAgDAAARgAgAgAAAAMAIAwAAEYAIAMAAAAFACATAAA_ACAUAABEACABAAAABQAgAQAAAAMAIAoGAAC2AgAgGQAAuAIAIBoAALcCACDNAQAAlAIAIM4BAACUAgAgzwEAAJQCACDQAQAAlAIAINEBAACUAgAg0gEAAJQCACDTAQAAlAIAIBCPAQAAggIAMJABAABNABCRAQAAggIAMJIBAQDOAQAhnAFAANMBACGdAUAA0wEAIcoBAQDOAQAhywEBAM4BACHMAQEAzgEAIc0BAQDxAQAhzgEBAPEBACHPAUAAgwIAIdABQACDAgAh0QEBAPEBACHSAQEA8QEAIdMBAQDxAQAhAwAAAAMAIAEAAEwAMBgAAE0AIAMAAAADACABAAAEADACAAAFACAKjwEAAIACADCQAQAAUwAQkQEAAIACADCSAQEAAAABnAFAAOgBACGdAUAA6AEAIcYBAQDjAQAhxwEBAOMBACHIAUAA6AEAIckBAACBAgAgAQAAAFAAIAEAAABQACAJjwEAAIACADCQAQAAUwAQkQEAAIACADCSAQEA4wEAIZwBQADoAQAhnQFAAOgBACHGAQEA4wEAIccBAQDjAQAhyAFAAOgBACEAAwAAAFMAIAEAAFQAMAIAAFAAIAMAAABTACABAABUADACAABQACADAAAAUwAgAQAAVAAwAgAAUAAgBpIBAQAAAAGcAUAAAAABnQFAAAAAAcYBAQAAAAHHAQEAAAAByAFAAAAAAQEMAABYACAGkgEBAAAAAZwBQAAAAAGdAUAAAAABxgEBAAAAAccBAQAAAAHIAUAAAAABAQwAAFoAMAEMAABaADAGkgEBAJoCACGcAUAAnwIAIZ0BQACfAgAhxgEBAJoCACHHAQEAmgIAIcgBQACfAgAhAgAAAFAAIAwAAF0AIAaSAQEAmgIAIZwBQACfAgAhnQFAAJ8CACHGAQEAmgIAIccBAQCaAgAhyAFAAJ8CACECAAAAUwAgDAAAXwAgAgAAAFMAIAwAAF8AIAMAAABQACATAABYACAUAABdACABAAAAUAAgAQAAAFMAIAMGAACzAgAgGQAAtQIAIBoAALQCACAJjwEAAP8BADCQAQAAZgAQkQEAAP8BADCSAQEAzgEAIZwBQADTAQAhnQFAANMBACHGAQEAzgEAIccBAQDOAQAhyAFAANMBACEDAAAAUwAgAQAAZQAwGAAAZgAgAwAAAFMAIAEAAFQAMAIAAFAAIAqPAQAA_AEAMJABAABsABCRAQAA_AEAMJwBQADoAQAhnQFAAOgBACGqAQEA4wEAIbMBAQAAAAHDAQAA_QHDASLEAQAA9gEAIMUBAAD-AQAgAQAAAGkAIAEAAABpACAJjwEAAPwBADCQAQAAbAAQkQEAAPwBADCcAUAA6AEAIZ0BQADoAQAhqgEBAOMBACGzAQEA4wEAIcMBAAD9AcMBIsQBAAD2AQAgAcQBAACUAgAgAwAAAGwAIAEAAG0AMAIAAGkAIAMAAABsACABAABtADACAABpACADAAAAbAAgAQAAbQAwAgAAaQAgBpwBQAAAAAGdAUAAAAABqgEBAAAAAbMBAQAAAAHDAQAAAMMBAsQBgAAAAAEBDAAAcQAgBpwBQAAAAAGdAUAAAAABqgEBAAAAAbMBAQAAAAHDAQAAAMMBAsQBgAAAAAEBDAAAcwAwAQwAAHMAMAacAUAAnwIAIZ0BQACfAgAhqgEBAJoCACGzAQEAmgIAIcMBAACyAsMBIsQBgAAAAAECAAAAaQAgDAAAdgAgBpwBQACfAgAhnQFAAJ8CACGqAQEAmgIAIbMBAQCaAgAhwwEAALICwwEixAGAAAAAAQIAAABsACAMAAB4ACACAAAAbAAgDAAAeAAgAwAAAGkAIBMAAHEAIBQAAHYAIAEAAABpACABAAAAbAAgBAYAAK8CACAZAACxAgAgGgAAsAIAIMQBAACUAgAgCY8BAAD4AQAwkAEAAH8AEJEBAAD4AQAwnAFAANMBACGdAUAA0wEAIaoBAQDOAQAhswEBAM4BACHDAQAA-QHDASLEAQAA7wEAIAMAAABsACABAAB-ADAYAAB_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-QHDASLEAQAA7wEAIAcGAADVAQAgGQAA-wEAIBoAAPsBACCeAQAAAMMBAp8BAAAAwwEIoAEAAADDAQilAQAA-gHDASIHBgAA1QEAIBkAAPsBACAaAAD7AQAgngEAAADDAQKfAQAAAMMBCKABAAAAwwEIpQEAAPoBwwEiBJ4BAAAAwwECnwEAAADDAQigAQAAAMMBCKUBAAD7AcMBIgmPAQAA_AEAMJABAABsABCRAQAA_AEAMJwBQADoAQAhnQFAAOgBACGqAQEA4wEAIbMBAQDjAQAhwwEAAP0BwwEixAEAAPYBACAEngEAAADDAQKfAQAAAMMBCKABAAAAwwEIpQEAAPsBwwEiAqoBAQAAAAHDAQAAAMMBAgmPAQAA_wEAMJABAABmABCRAQAA_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_GQBCGgBDiwEAQIwBAEEHAgEIDQEJEAEKEQELEgENFAEOFgUPFwYQGQERGwUSHAcVHQEWHgEXHwUbIggcIwwdJAMeJQMfJgMgJwMhKAMiKgMjLAUkLQ0lLwMmMQUnMg4oMwMpNAMqNQUrOA8sORMtOgIuOwIvPAIwPQIxPgIyQAIzQgU0QxQ1RQI2RwU3SBU4SQI5SgI6SwU7ThY8Txo9URs-Uhs_VRtAVhtBVxtCWRtDWwVEXBxFXhtGYAVHYR1IYhtJYxtKZAVLZx5MaCJNaiNOayNPbiNQbyNRcCNSciNTdAVUdSRVdyNWeQVXeiVYeyNZfCNafQVbgAEmXIEBKl2DAStehAErX4cBK2CIASthiQErYosBK2ONAQVkjgEsZZABK2aSAQVnkwEtaJQBK2mVAStqlgEFa5kBLmyaATJtnAEzbp0BM2-gATNwoQEzcaIBM3KkATNzpgEFdKcBNHWpATN2qwEFd6wBNXitATN5rgEzeq8BBXuyATZ8swE6fbUBO362ATt_uQE7gAG6ATuBAbsBO4IBvQE7gwG_AQWEAcABPIUBwgE7hgHEAQWHAcUBPYgBxgE7iQHHATuKAcgBBY0BywE-jgHMAUQ\"\n}\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/orm/prisma-client/queries/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.user`: Exposes CRUD operations for the **user** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n */\n get user(): Prisma.userDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.session`: Exposes CRUD operations for the **session** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Sessions\n * const sessions = await prisma.session.findMany()\n * ```\n */\n get session(): Prisma.sessionDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.account`: Exposes CRUD operations for the **account** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Accounts\n * const accounts = await prisma.account.findMany()\n * ```\n */\n get account(): Prisma.accountDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.verification`: Exposes CRUD operations for the **verification** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Verifications\n * const verifications = await prisma.verification.findMany()\n * ```\n */\n get verification(): Prisma.verificationDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbApprovalMethod`: Exposes CRUD operations for the **DbApprovalMethod** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbApprovalMethods\n * const dbApprovalMethods = await prisma.dbApprovalMethod.findMany()\n * ```\n */\n get dbApprovalMethod(): Prisma.DbApprovalMethodDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbAppForCatalog`: Exposes CRUD operations for the **DbAppForCatalog** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbAppForCatalogs\n * const dbAppForCatalogs = await prisma.dbAppForCatalog.findMany()\n * ```\n */\n get dbAppForCatalog(): Prisma.DbAppForCatalogDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbAppTagDefinition`: Exposes CRUD operations for the **DbAppTagDefinition** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbAppTagDefinitions\n * const dbAppTagDefinitions = await prisma.dbAppTagDefinition.findMany()\n * ```\n */\n get dbAppTagDefinition(): Prisma.DbAppTagDefinitionDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dbAsset`: Exposes CRUD operations for the **DbAsset** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DbAssets\n * const dbAssets = await prisma.dbAsset.findMany()\n * ```\n */\n get dbAsset(): Prisma.DbAssetDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums\"\nimport * as $Class from \"./internal/class\"\nimport * as Prisma from \"./internal/prismaNamespace\"\n\nexport * as $Enums from './enums'\nexport * from \"./enums\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model user\n * \n */\nexport type user = Prisma.userModel\n/**\n * Model session\n * \n */\nexport type session = Prisma.sessionModel\n/**\n * Model account\n * \n */\nexport type account = Prisma.accountModel\n/**\n * Model verification\n * \n */\nexport type verification = Prisma.verificationModel\n/**\n * Model DbApprovalMethod\n * \n */\nexport type DbApprovalMethod = Prisma.DbApprovalMethodModel\n/**\n * Model DbAppForCatalog\n * \n */\nexport type DbAppForCatalog = Prisma.DbAppForCatalogModel\n/**\n * Model DbAppTagDefinition\n * \n */\nexport type DbAppTagDefinition = Prisma.DbAppTagDefinitionModel\n/**\n * Model DbAsset\n * \n */\nexport type DbAsset = Prisma.DbAssetModel\n","'use strict'\n\nexports.parse = function (source, transform) {\n return new ArrayParser(source, transform).parse()\n}\n\nclass ArrayParser {\n constructor (source, transform) {\n this.source = source\n this.transform = transform || identity\n this.position = 0\n this.entries = []\n this.recorded = []\n this.dimension = 0\n }\n\n isEof () {\n return this.position >= this.source.length\n }\n\n nextCharacter () {\n var character = this.source[this.position++]\n if (character === '\\\\') {\n return {\n value: this.source[this.position++],\n escaped: true\n }\n }\n return {\n value: character,\n escaped: false\n }\n }\n\n record (character) {\n this.recorded.push(character)\n }\n\n newEntry (includeEmpty) {\n var entry\n if (this.recorded.length > 0 || includeEmpty) {\n entry = this.recorded.join('')\n if (entry === 'NULL' && !includeEmpty) {\n entry = null\n }\n if (entry !== null) entry = this.transform(entry)\n this.entries.push(entry)\n this.recorded = []\n }\n }\n\n consumeDimensions () {\n if (this.source[0] === '[') {\n while (!this.isEof()) {\n var char = this.nextCharacter()\n if (char.value === '=') break\n }\n }\n }\n\n parse (nested) {\n var character, parser, quote\n this.consumeDimensions()\n while (!this.isEof()) {\n character = this.nextCharacter()\n if (character.value === '{' && !quote) {\n this.dimension++\n if (this.dimension > 1) {\n parser = new ArrayParser(this.source.substr(this.position - 1), this.transform)\n this.entries.push(parser.parse(true))\n this.position += parser.position - 2\n }\n } else if (character.value === '}' && !quote) {\n this.dimension--\n if (!this.dimension) {\n this.newEntry()\n if (nested) return this.entries\n }\n } else if (character.value === '\"' && !character.escaped) {\n if (quote) this.newEntry(true)\n quote = !quote\n } else if (character.value === ',' && !quote) {\n this.newEntry()\n } else {\n this.record(character.value)\n }\n }\n if (this.dimension !== 0) {\n throw new Error('array dimension not balanced')\n }\n return this.entries\n }\n}\n\nfunction identity (value) {\n return value\n}\n","var array = require('postgres-array');\n\nmodule.exports = {\n create: function (source, transform) {\n return {\n parse: function() {\n return array.parse(source, transform);\n }\n };\n }\n};\n","'use strict'\n\nvar DATE_TIME = /(\\d{1,})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})(\\.\\d{1,})?.*?( BC)?$/\nvar DATE = /^(\\d{1,})-(\\d{2})-(\\d{2})( BC)?$/\nvar TIME_ZONE = /([Z+-])(\\d{2})?:?(\\d{2})?:?(\\d{2})?/\nvar INFINITY = /^-?infinity$/\n\nmodule.exports = function parseDate (isoDate) {\n if (INFINITY.test(isoDate)) {\n // Capitalize to Infinity before passing to Number\n return Number(isoDate.replace('i', 'I'))\n }\n var matches = DATE_TIME.exec(isoDate)\n\n if (!matches) {\n // Force YYYY-MM-DD dates to be parsed as local time\n return getDate(isoDate) || null\n }\n\n var isBC = !!matches[8]\n var year = parseInt(matches[1], 10)\n if (isBC) {\n year = bcYearToNegativeYear(year)\n }\n\n var month = parseInt(matches[2], 10) - 1\n var day = matches[3]\n var hour = parseInt(matches[4], 10)\n var minute = parseInt(matches[5], 10)\n var second = parseInt(matches[6], 10)\n\n var ms = matches[7]\n ms = ms ? 1000 * parseFloat(ms) : 0\n\n var date\n var offset = timeZoneOffset(isoDate)\n if (offset != null) {\n date = new Date(Date.UTC(year, month, day, hour, minute, second, ms))\n\n // Account for years from 0 to 99 being interpreted as 1900-1999\n // by Date.UTC / the multi-argument form of the Date constructor\n if (is0To99(year)) {\n date.setUTCFullYear(year)\n }\n\n if (offset !== 0) {\n date.setTime(date.getTime() - offset)\n }\n } else {\n date = new Date(year, month, day, hour, minute, second, ms)\n\n if (is0To99(year)) {\n date.setFullYear(year)\n }\n }\n\n return date\n}\n\nfunction getDate (isoDate) {\n var matches = DATE.exec(isoDate)\n if (!matches) {\n return\n }\n\n var year = parseInt(matches[1], 10)\n var isBC = !!matches[4]\n if (isBC) {\n year = bcYearToNegativeYear(year)\n }\n\n var month = parseInt(matches[2], 10) - 1\n var day = matches[3]\n // YYYY-MM-DD will be parsed as local time\n var date = new Date(year, month, day)\n\n if (is0To99(year)) {\n date.setFullYear(year)\n }\n\n return date\n}\n\n// match timezones:\n// Z (UTC)\n// -05\n// +06:30\nfunction timeZoneOffset (isoDate) {\n if (isoDate.endsWith('+00')) {\n return 0\n }\n\n var zone = TIME_ZONE.exec(isoDate.split(' ')[1])\n if (!zone) return\n var type = zone[1]\n\n if (type === 'Z') {\n return 0\n }\n var sign = type === '-' ? -1 : 1\n var offset = parseInt(zone[2], 10) * 3600 +\n parseInt(zone[3] || 0, 10) * 60 +\n parseInt(zone[4] || 0, 10)\n\n return offset * sign * 1000\n}\n\nfunction bcYearToNegativeYear (year) {\n // Account for numerical difference between representations of BC years\n // See: https://github.com/bendrucker/postgres-date/issues/5\n return -(year - 1)\n}\n\nfunction is0To99 (num) {\n return num >= 0 && num < 100\n}\n","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n","'use strict'\n\nvar extend = require('xtend/mutable')\n\nmodule.exports = PostgresInterval\n\nfunction PostgresInterval (raw) {\n if (!(this instanceof PostgresInterval)) {\n return new PostgresInterval(raw)\n }\n extend(this, parse(raw))\n}\nvar properties = ['seconds', 'minutes', 'hours', 'days', 'months', 'years']\nPostgresInterval.prototype.toPostgres = function () {\n var filtered = properties.filter(this.hasOwnProperty, this)\n\n // In addition to `properties`, we need to account for fractions of seconds.\n if (this.milliseconds && filtered.indexOf('seconds') < 0) {\n filtered.push('seconds')\n }\n\n if (filtered.length === 0) return '0'\n return filtered\n .map(function (property) {\n var value = this[property] || 0\n\n // Account for fractional part of seconds,\n // remove trailing zeroes.\n if (property === 'seconds' && this.milliseconds) {\n value = (value + this.milliseconds / 1000).toFixed(6).replace(/\\.?0+$/, '')\n }\n\n return value + ' ' + property\n }, this)\n .join(' ')\n}\n\nvar propertiesISOEquivalent = {\n years: 'Y',\n months: 'M',\n days: 'D',\n hours: 'H',\n minutes: 'M',\n seconds: 'S'\n}\nvar dateProperties = ['years', 'months', 'days']\nvar timeProperties = ['hours', 'minutes', 'seconds']\n// according to ISO 8601\nPostgresInterval.prototype.toISOString = PostgresInterval.prototype.toISO = function () {\n var datePart = dateProperties\n .map(buildProperty, this)\n .join('')\n\n var timePart = timeProperties\n .map(buildProperty, this)\n .join('')\n\n return 'P' + datePart + 'T' + timePart\n\n function buildProperty (property) {\n var value = this[property] || 0\n\n // Account for fractional part of seconds,\n // remove trailing zeroes.\n if (property === 'seconds' && this.milliseconds) {\n value = (value + this.milliseconds / 1000).toFixed(6).replace(/0+$/, '')\n }\n\n return value + propertiesISOEquivalent[property]\n }\n}\n\nvar NUMBER = '([+-]?\\\\d+)'\nvar YEAR = NUMBER + '\\\\s+years?'\nvar MONTH = NUMBER + '\\\\s+mons?'\nvar DAY = NUMBER + '\\\\s+days?'\nvar TIME = '([+-])?([\\\\d]*):(\\\\d\\\\d):(\\\\d\\\\d)\\\\.?(\\\\d{1,6})?'\nvar INTERVAL = new RegExp([YEAR, MONTH, DAY, TIME].map(function (regexString) {\n return '(' + regexString + ')?'\n})\n .join('\\\\s*'))\n\n// Positions of values in regex match\nvar positions = {\n years: 2,\n months: 4,\n days: 6,\n hours: 9,\n minutes: 10,\n seconds: 11,\n milliseconds: 12\n}\n// We can use negative time\nvar negatives = ['hours', 'minutes', 'seconds', 'milliseconds']\n\nfunction parseMilliseconds (fraction) {\n // add omitted zeroes\n var microseconds = fraction + '000000'.slice(fraction.length)\n return parseInt(microseconds, 10) / 1000\n}\n\nfunction parse (interval) {\n if (!interval) return {}\n var matches = INTERVAL.exec(interval)\n var isNegative = matches[8] === '-'\n return Object.keys(positions)\n .reduce(function (parsed, property) {\n var position = positions[property]\n var value = matches[position]\n // no empty string\n if (!value) return parsed\n // milliseconds are actually microseconds (up to 6 digits)\n // with omitted trailing zeroes.\n value = property === 'milliseconds'\n ? parseMilliseconds(value)\n : parseInt(value, 10)\n // no zeros\n if (!value) return parsed\n if (isNegative && ~negatives.indexOf(property)) {\n value *= -1\n }\n parsed[property] = value\n return parsed\n }, {})\n}\n","'use strict'\n\nvar bufferFrom = Buffer.from || Buffer\n\nmodule.exports = function parseBytea (input) {\n if (/^\\\\x/.test(input)) {\n // new 'hex' style response (pg >9.0)\n return bufferFrom(input.substr(2), 'hex')\n }\n var output = ''\n var i = 0\n while (i < input.length) {\n if (input[i] !== '\\\\') {\n output += input[i]\n ++i\n } else {\n if (/[0-7]{3}/.test(input.substr(i + 1, 3))) {\n output += String.fromCharCode(parseInt(input.substr(i + 1, 3), 8))\n i += 4\n } else {\n var backslashes = 1\n while (i + backslashes < input.length && input[i + backslashes] === '\\\\') {\n backslashes++\n }\n for (var k = 0; k < Math.floor(backslashes / 2); ++k) {\n output += '\\\\'\n }\n i += Math.floor(backslashes / 2) * 2\n }\n }\n }\n return bufferFrom(output, 'binary')\n}\n","var array = require('postgres-array')\nvar arrayParser = require('./arrayParser');\nvar parseDate = require('postgres-date');\nvar parseInterval = require('postgres-interval');\nvar parseByteA = require('postgres-bytea');\n\nfunction allowNull (fn) {\n return function nullAllowed (value) {\n if (value === null) return value\n return fn(value)\n }\n}\n\nfunction parseBool (value) {\n if (value === null) return value\n return value === 'TRUE' ||\n value === 't' ||\n value === 'true' ||\n value === 'y' ||\n value === 'yes' ||\n value === 'on' ||\n value === '1';\n}\n\nfunction parseBoolArray (value) {\n if (!value) return null\n return array.parse(value, parseBool)\n}\n\nfunction parseBaseTenInt (string) {\n return parseInt(string, 10)\n}\n\nfunction parseIntegerArray (value) {\n if (!value) return null\n return array.parse(value, allowNull(parseBaseTenInt))\n}\n\nfunction parseBigIntegerArray (value) {\n if (!value) return null\n return array.parse(value, allowNull(function (entry) {\n return parseBigInteger(entry).trim()\n }))\n}\n\nvar parsePointArray = function(value) {\n if(!value) { return null; }\n var p = arrayParser.create(value, function(entry) {\n if(entry !== null) {\n entry = parsePoint(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseFloatArray = function(value) {\n if(!value) { return null; }\n var p = arrayParser.create(value, function(entry) {\n if(entry !== null) {\n entry = parseFloat(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseStringArray = function(value) {\n if(!value) { return null; }\n\n var p = arrayParser.create(value);\n return p.parse();\n};\n\nvar parseDateArray = function(value) {\n if (!value) { return null; }\n\n var p = arrayParser.create(value, function(entry) {\n if (entry !== null) {\n entry = parseDate(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseIntervalArray = function(value) {\n if (!value) { return null; }\n\n var p = arrayParser.create(value, function(entry) {\n if (entry !== null) {\n entry = parseInterval(entry);\n }\n return entry;\n });\n\n return p.parse();\n};\n\nvar parseByteAArray = function(value) {\n if (!value) { return null; }\n\n return array.parse(value, allowNull(parseByteA));\n};\n\nvar parseInteger = function(value) {\n return parseInt(value, 10);\n};\n\nvar parseBigInteger = function(value) {\n var valStr = String(value);\n if (/^\\d+$/.test(valStr)) { return valStr; }\n return value;\n};\n\nvar parseJsonArray = function(value) {\n if (!value) { return null; }\n\n return array.parse(value, allowNull(JSON.parse));\n};\n\nvar parsePoint = function(value) {\n if (value[0] !== '(') { return null; }\n\n value = value.substring( 1, value.length - 1 ).split(',');\n\n return {\n x: parseFloat(value[0])\n , y: parseFloat(value[1])\n };\n};\n\nvar parseCircle = function(value) {\n if (value[0] !== '<' && value[1] !== '(') { return null; }\n\n var point = '(';\n var radius = '';\n var pointParsed = false;\n for (var i = 2; i < value.length - 1; i++){\n if (!pointParsed) {\n point += value[i];\n }\n\n if (value[i] === ')') {\n pointParsed = true;\n continue;\n } else if (!pointParsed) {\n continue;\n }\n\n if (value[i] === ','){\n continue;\n }\n\n radius += value[i];\n }\n var result = parsePoint(point);\n result.radius = parseFloat(radius);\n\n return result;\n};\n\nvar init = function(register) {\n register(20, parseBigInteger); // int8\n register(21, parseInteger); // int2\n register(23, parseInteger); // int4\n register(26, parseInteger); // oid\n register(700, parseFloat); // float4/real\n register(701, parseFloat); // float8/double\n register(16, parseBool);\n register(1082, parseDate); // date\n register(1114, parseDate); // timestamp without timezone\n register(1184, parseDate); // timestamp\n register(600, parsePoint); // point\n register(651, parseStringArray); // cidr[]\n register(718, parseCircle); // circle\n register(1000, parseBoolArray);\n register(1001, parseByteAArray);\n register(1005, parseIntegerArray); // _int2\n register(1007, parseIntegerArray); // _int4\n register(1028, parseIntegerArray); // oid[]\n register(1016, parseBigIntegerArray); // _int8\n register(1017, parsePointArray); // point[]\n register(1021, parseFloatArray); // _float4\n register(1022, parseFloatArray); // _float8\n register(1231, parseFloatArray); // _numeric\n register(1014, parseStringArray); //char\n register(1015, parseStringArray); //varchar\n register(1008, parseStringArray);\n register(1009, parseStringArray);\n register(1040, parseStringArray); // macaddr[]\n register(1041, parseStringArray); // inet[]\n register(1115, parseDateArray); // timestamp without time zone[]\n register(1182, parseDateArray); // _date\n register(1185, parseDateArray); // timestamp with time zone[]\n register(1186, parseInterval);\n register(1187, parseIntervalArray);\n register(17, parseByteA);\n register(114, JSON.parse.bind(JSON)); // json\n register(3802, JSON.parse.bind(JSON)); // jsonb\n register(199, parseJsonArray); // json[]\n register(3807, parseJsonArray); // jsonb[]\n register(3907, parseStringArray); // numrange[]\n register(2951, parseStringArray); // uuid[]\n register(791, parseStringArray); // money[]\n register(1183, parseStringArray); // time[]\n register(1270, parseStringArray); // timetz[]\n};\n\nmodule.exports = {\n init: init\n};\n","'use strict';\n\n// selected so (BASE - 1) * 0x100000000 + 0xffffffff is a safe integer\nvar BASE = 1000000;\n\nfunction readInt8(buffer) {\n\tvar high = buffer.readInt32BE(0);\n\tvar low = buffer.readUInt32BE(4);\n\tvar sign = '';\n\n\tif (high < 0) {\n\t\thigh = ~high + (low === 0);\n\t\tlow = (~low + 1) >>> 0;\n\t\tsign = '-';\n\t}\n\n\tvar result = '';\n\tvar carry;\n\tvar t;\n\tvar digits;\n\tvar pad;\n\tvar l;\n\tvar i;\n\n\t{\n\t\tcarry = high % BASE;\n\t\thigh = high / BASE >>> 0;\n\n\t\tt = 0x100000000 * carry + low;\n\t\tlow = t / BASE >>> 0;\n\t\tdigits = '' + (t - BASE * low);\n\n\t\tif (low === 0 && high === 0) {\n\t\t\treturn sign + digits + result;\n\t\t}\n\n\t\tpad = '';\n\t\tl = 6 - digits.length;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tpad += '0';\n\t\t}\n\n\t\tresult = pad + digits + result;\n\t}\n\n\t{\n\t\tcarry = high % BASE;\n\t\thigh = high / BASE >>> 0;\n\n\t\tt = 0x100000000 * carry + low;\n\t\tlow = t / BASE >>> 0;\n\t\tdigits = '' + (t - BASE * low);\n\n\t\tif (low === 0 && high === 0) {\n\t\t\treturn sign + digits + result;\n\t\t}\n\n\t\tpad = '';\n\t\tl = 6 - digits.length;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tpad += '0';\n\t\t}\n\n\t\tresult = pad + digits + result;\n\t}\n\n\t{\n\t\tcarry = high % BASE;\n\t\thigh = high / BASE >>> 0;\n\n\t\tt = 0x100000000 * carry + low;\n\t\tlow = t / BASE >>> 0;\n\t\tdigits = '' + (t - BASE * low);\n\n\t\tif (low === 0 && high === 0) {\n\t\t\treturn sign + digits + result;\n\t\t}\n\n\t\tpad = '';\n\t\tl = 6 - digits.length;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tpad += '0';\n\t\t}\n\n\t\tresult = pad + digits + result;\n\t}\n\n\t{\n\t\tcarry = high % BASE;\n\t\tt = 0x100000000 * carry + low;\n\t\tdigits = '' + t % BASE;\n\n\t\treturn sign + digits + result;\n\t}\n}\n\nmodule.exports = readInt8;\n","var parseInt64 = require('pg-int8');\n\nvar parseBits = function(data, bits, offset, invert, callback) {\n offset = offset || 0;\n invert = invert || false;\n callback = callback || function(lastValue, newValue, bits) { return (lastValue * Math.pow(2, bits)) + newValue; };\n var offsetBytes = offset >> 3;\n\n var inv = function(value) {\n if (invert) {\n return ~value & 0xff;\n }\n\n return value;\n };\n\n // read first (maybe partial) byte\n var mask = 0xff;\n var firstBits = 8 - (offset % 8);\n if (bits < firstBits) {\n mask = (0xff << (8 - bits)) & 0xff;\n firstBits = bits;\n }\n\n if (offset) {\n mask = mask >> (offset % 8);\n }\n\n var result = 0;\n if ((offset % 8) + bits >= 8) {\n result = callback(0, inv(data[offsetBytes]) & mask, firstBits);\n }\n\n // read bytes\n var bytes = (bits + offset) >> 3;\n for (var i = offsetBytes + 1; i < bytes; i++) {\n result = callback(result, inv(data[i]), 8);\n }\n\n // bits to read, that are not a complete byte\n var lastBits = (bits + offset) % 8;\n if (lastBits > 0) {\n result = callback(result, inv(data[bytes]) >> (8 - lastBits), lastBits);\n }\n\n return result;\n};\n\nvar parseFloatFromBits = function(data, precisionBits, exponentBits) {\n var bias = Math.pow(2, exponentBits - 1) - 1;\n var sign = parseBits(data, 1);\n var exponent = parseBits(data, exponentBits, 1);\n\n if (exponent === 0) {\n return 0;\n }\n\n // parse mantissa\n var precisionBitsCounter = 1;\n var parsePrecisionBits = function(lastValue, newValue, bits) {\n if (lastValue === 0) {\n lastValue = 1;\n }\n\n for (var i = 1; i <= bits; i++) {\n precisionBitsCounter /= 2;\n if ((newValue & (0x1 << (bits - i))) > 0) {\n lastValue += precisionBitsCounter;\n }\n }\n\n return lastValue;\n };\n\n var mantissa = parseBits(data, precisionBits, exponentBits + 1, false, parsePrecisionBits);\n\n // special cases\n if (exponent == (Math.pow(2, exponentBits + 1) - 1)) {\n if (mantissa === 0) {\n return (sign === 0) ? Infinity : -Infinity;\n }\n\n return NaN;\n }\n\n // normale number\n return ((sign === 0) ? 1 : -1) * Math.pow(2, exponent - bias) * mantissa;\n};\n\nvar parseInt16 = function(value) {\n if (parseBits(value, 1) == 1) {\n return -1 * (parseBits(value, 15, 1, true) + 1);\n }\n\n return parseBits(value, 15, 1);\n};\n\nvar parseInt32 = function(value) {\n if (parseBits(value, 1) == 1) {\n return -1 * (parseBits(value, 31, 1, true) + 1);\n }\n\n return parseBits(value, 31, 1);\n};\n\nvar parseFloat32 = function(value) {\n return parseFloatFromBits(value, 23, 8);\n};\n\nvar parseFloat64 = function(value) {\n return parseFloatFromBits(value, 52, 11);\n};\n\nvar parseNumeric = function(value) {\n var sign = parseBits(value, 16, 32);\n if (sign == 0xc000) {\n return NaN;\n }\n\n var weight = Math.pow(10000, parseBits(value, 16, 16));\n var result = 0;\n\n var digits = [];\n var ndigits = parseBits(value, 16);\n for (var i = 0; i < ndigits; i++) {\n result += parseBits(value, 16, 64 + (16 * i)) * weight;\n weight /= 10000;\n }\n\n var scale = Math.pow(10, parseBits(value, 16, 48));\n return ((sign === 0) ? 1 : -1) * Math.round(result * scale) / scale;\n};\n\nvar parseDate = function(isUTC, value) {\n var sign = parseBits(value, 1);\n var rawValue = parseBits(value, 63, 1);\n\n // discard usecs and shift from 2000 to 1970\n var result = new Date((((sign === 0) ? 1 : -1) * rawValue / 1000) + 946684800000);\n\n if (!isUTC) {\n result.setTime(result.getTime() + result.getTimezoneOffset() * 60000);\n }\n\n // add microseconds to the date\n result.usec = rawValue % 1000;\n result.getMicroSeconds = function() {\n return this.usec;\n };\n result.setMicroSeconds = function(value) {\n this.usec = value;\n };\n result.getUTCMicroSeconds = function() {\n return this.usec;\n };\n\n return result;\n};\n\nvar parseArray = function(value) {\n var dim = parseBits(value, 32);\n\n var flags = parseBits(value, 32, 32);\n var elementType = parseBits(value, 32, 64);\n\n var offset = 96;\n var dims = [];\n for (var i = 0; i < dim; i++) {\n // parse dimension\n dims[i] = parseBits(value, 32, offset);\n offset += 32;\n\n // ignore lower bounds\n offset += 32;\n }\n\n var parseElement = function(elementType) {\n // parse content length\n var length = parseBits(value, 32, offset);\n offset += 32;\n\n // parse null values\n if (length == 0xffffffff) {\n return null;\n }\n\n var result;\n if ((elementType == 0x17) || (elementType == 0x14)) {\n // int/bigint\n result = parseBits(value, length * 8, offset);\n offset += length * 8;\n return result;\n }\n else if (elementType == 0x19) {\n // string\n result = value.toString(this.encoding, offset >> 3, (offset += (length << 3)) >> 3);\n return result;\n }\n else {\n console.log(\"ERROR: ElementType not implemented: \" + elementType);\n }\n };\n\n var parse = function(dimension, elementType) {\n var array = [];\n var i;\n\n if (dimension.length > 1) {\n var count = dimension.shift();\n for (i = 0; i < count; i++) {\n array[i] = parse(dimension, elementType);\n }\n dimension.unshift(count);\n }\n else {\n for (i = 0; i < dimension[0]; i++) {\n array[i] = parseElement(elementType);\n }\n }\n\n return array;\n };\n\n return parse(dims, elementType);\n};\n\nvar parseText = function(value) {\n return value.toString('utf8');\n};\n\nvar parseBool = function(value) {\n if(value === null) return null;\n return (parseBits(value, 8) > 0);\n};\n\nvar init = function(register) {\n register(20, parseInt64);\n register(21, parseInt16);\n register(23, parseInt32);\n register(26, parseInt32);\n register(1700, parseNumeric);\n register(700, parseFloat32);\n register(701, parseFloat64);\n register(16, parseBool);\n register(1114, parseDate.bind(null, false));\n register(1184, parseDate.bind(null, true));\n register(1000, parseArray);\n register(1007, parseArray);\n register(1016, parseArray);\n register(1008, parseArray);\n register(1009, parseArray);\n register(25, parseText);\n};\n\nmodule.exports = {\n init: init\n};\n","/**\n * Following query was used to generate this file:\n\n SELECT json_object_agg(UPPER(PT.typname), PT.oid::int4 ORDER BY pt.oid)\n FROM pg_type PT\n WHERE typnamespace = (SELECT pgn.oid FROM pg_namespace pgn WHERE nspname = 'pg_catalog') -- Take only builting Postgres types with stable OID (extension types are not guaranted to be stable)\n AND typtype = 'b' -- Only basic types\n AND typelem = 0 -- Ignore aliases\n AND typisdefined -- Ignore undefined types\n */\n\nmodule.exports = {\n BOOL: 16,\n BYTEA: 17,\n CHAR: 18,\n INT8: 20,\n INT2: 21,\n INT4: 23,\n REGPROC: 24,\n TEXT: 25,\n OID: 26,\n TID: 27,\n XID: 28,\n CID: 29,\n JSON: 114,\n XML: 142,\n PG_NODE_TREE: 194,\n SMGR: 210,\n PATH: 602,\n POLYGON: 604,\n CIDR: 650,\n FLOAT4: 700,\n FLOAT8: 701,\n ABSTIME: 702,\n RELTIME: 703,\n TINTERVAL: 704,\n CIRCLE: 718,\n MACADDR8: 774,\n MONEY: 790,\n MACADDR: 829,\n INET: 869,\n ACLITEM: 1033,\n BPCHAR: 1042,\n VARCHAR: 1043,\n DATE: 1082,\n TIME: 1083,\n TIMESTAMP: 1114,\n TIMESTAMPTZ: 1184,\n INTERVAL: 1186,\n TIMETZ: 1266,\n BIT: 1560,\n VARBIT: 1562,\n NUMERIC: 1700,\n REFCURSOR: 1790,\n REGPROCEDURE: 2202,\n REGOPER: 2203,\n REGOPERATOR: 2204,\n REGCLASS: 2205,\n REGTYPE: 2206,\n UUID: 2950,\n TXID_SNAPSHOT: 2970,\n PG_LSN: 3220,\n PG_NDISTINCT: 3361,\n PG_DEPENDENCIES: 3402,\n TSVECTOR: 3614,\n TSQUERY: 3615,\n GTSVECTOR: 3642,\n REGCONFIG: 3734,\n REGDICTIONARY: 3769,\n JSONB: 3802,\n REGNAMESPACE: 4089,\n REGROLE: 4096\n};\n","var textParsers = require('./lib/textParsers');\nvar binaryParsers = require('./lib/binaryParsers');\nvar arrayParser = require('./lib/arrayParser');\nvar builtinTypes = require('./lib/builtins');\n\nexports.getTypeParser = getTypeParser;\nexports.setTypeParser = setTypeParser;\nexports.arrayParser = arrayParser;\nexports.builtins = builtinTypes;\n\nvar typeParsers = {\n text: {},\n binary: {}\n};\n\n//the empty parse function\nfunction noParse (val) {\n return String(val);\n};\n\n//returns a function used to convert a specific type (specified by\n//oid) into a result javascript type\n//note: the oid can be obtained via the following sql query:\n//SELECT oid FROM pg_type WHERE typname = 'TYPE_NAME_HERE';\nfunction getTypeParser (oid, format) {\n format = format || 'text';\n if (!typeParsers[format]) {\n return noParse;\n }\n return typeParsers[format][oid] || noParse;\n};\n\nfunction setTypeParser (oid, format, parseFn) {\n if(typeof format == 'function') {\n parseFn = format;\n format = 'text';\n }\n typeParsers[format][oid] = parseFn;\n};\n\ntextParsers.init(function(oid, converter) {\n typeParsers.text[oid] = converter;\n});\n\nbinaryParsers.init(function(oid, converter) {\n typeParsers.binary[oid] = converter;\n});\n","'use strict'\n\nlet user\ntry {\n user = process.platform === 'win32' ? process.env.USERNAME : process.env.USER\n} catch {\n // ignore, e.g., Deno without --allow-env\n}\n\nmodule.exports = {\n // database host. defaults to localhost\n host: 'localhost',\n\n // database user's name\n user,\n\n // name of database to connect\n database: undefined,\n\n // database user's password\n password: null,\n\n // a Postgres connection string to be used instead of setting individual connection items\n // NOTE: Setting this value will cause it to override any other value (such as database or user) defined\n // in the defaults object.\n connectionString: undefined,\n\n // database port\n port: 5432,\n\n // number of rows to return at a time from a prepared statement's\n // portal. 0 will return all rows at once\n rows: 0,\n\n // binary result mode\n binary: false,\n\n // Connection pool options - see https://github.com/brianc/node-pg-pool\n\n // number of connections to use in connection pool\n // 0 will disable connection pooling\n max: 10,\n\n // max milliseconds a client can go unused before it is removed\n // from the pool and destroyed\n idleTimeoutMillis: 30000,\n\n client_encoding: '',\n\n ssl: false,\n\n application_name: undefined,\n\n fallback_application_name: undefined,\n\n options: undefined,\n\n parseInputDatesAsUTC: false,\n\n // max milliseconds any query using this connection will execute for before timing out in error.\n // false=unlimited\n statement_timeout: false,\n\n // Abort any statement that waits longer than the specified duration in milliseconds while attempting to acquire a lock.\n // false=unlimited\n lock_timeout: false,\n\n // Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds\n // false=unlimited\n idle_in_transaction_session_timeout: false,\n\n // max milliseconds to wait for query to complete (client side)\n query_timeout: false,\n\n connect_timeout: 0,\n\n keepalives: 1,\n\n keepalives_idle: 0,\n}\n\nconst pgTypes = require('pg-types')\n// save default parsers\nconst parseBigInteger = pgTypes.getTypeParser(20, 'text')\nconst parseBigIntegerArray = pgTypes.getTypeParser(1016, 'text')\n\n// parse int8 so you can get your count values as actual numbers\nmodule.exports.__defineSetter__('parseInt8', function (val) {\n pgTypes.setTypeParser(20, 'text', val ? pgTypes.getTypeParser(23, 'text') : parseBigInteger)\n pgTypes.setTypeParser(1016, 'text', val ? pgTypes.getTypeParser(1007, 'text') : parseBigIntegerArray)\n})\n","'use strict'\n\nconst defaults = require('./defaults')\n\nconst util = require('util')\nconst { isDate } = util.types || util // Node 8 doesn't have `util.types`\n\nfunction escapeElement(elementRepresentation) {\n const escaped = elementRepresentation.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n\n return '\"' + escaped + '\"'\n}\n\n// convert a JS array to a postgres array literal\n// uses comma separator so won't work for types like box that use\n// a different array separator.\nfunction arrayString(val) {\n let result = '{'\n for (let i = 0; i < val.length; i++) {\n if (i > 0) {\n result = result + ','\n }\n if (val[i] === null || typeof val[i] === 'undefined') {\n result = result + 'NULL'\n } else if (Array.isArray(val[i])) {\n result = result + arrayString(val[i])\n } else if (ArrayBuffer.isView(val[i])) {\n let item = val[i]\n if (!(item instanceof Buffer)) {\n const buf = Buffer.from(item.buffer, item.byteOffset, item.byteLength)\n if (buf.length === item.byteLength) {\n item = buf\n } else {\n item = buf.slice(item.byteOffset, item.byteOffset + item.byteLength)\n }\n }\n result += '\\\\\\\\x' + item.toString('hex')\n } else {\n result += escapeElement(prepareValue(val[i]))\n }\n }\n result = result + '}'\n return result\n}\n\n// converts values from javascript types\n// to their 'raw' counterparts for use as a postgres parameter\n// note: you can override this function to provide your own conversion mechanism\n// for complex types, etc...\nconst prepareValue = function (val, seen) {\n // null and undefined are both null for postgres\n if (val == null) {\n return null\n }\n if (typeof val === 'object') {\n if (val instanceof Buffer) {\n return val\n }\n if (ArrayBuffer.isView(val)) {\n const buf = Buffer.from(val.buffer, val.byteOffset, val.byteLength)\n if (buf.length === val.byteLength) {\n return buf\n }\n return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params\n }\n if (isDate(val)) {\n if (defaults.parseInputDatesAsUTC) {\n return dateToStringUTC(val)\n } else {\n return dateToString(val)\n }\n }\n if (Array.isArray(val)) {\n return arrayString(val)\n }\n\n return prepareObject(val, seen)\n }\n return val.toString()\n}\n\nfunction prepareObject(val, seen) {\n if (val && typeof val.toPostgres === 'function') {\n seen = seen || []\n if (seen.indexOf(val) !== -1) {\n throw new Error('circular reference detected while preparing \"' + val + '\" for query')\n }\n seen.push(val)\n\n return prepareValue(val.toPostgres(prepareValue), seen)\n }\n return JSON.stringify(val)\n}\n\nfunction dateToString(date) {\n let offset = -date.getTimezoneOffset()\n\n let year = date.getFullYear()\n const isBCYear = year < 1\n if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation\n\n let ret =\n String(year).padStart(4, '0') +\n '-' +\n String(date.getMonth() + 1).padStart(2, '0') +\n '-' +\n String(date.getDate()).padStart(2, '0') +\n 'T' +\n String(date.getHours()).padStart(2, '0') +\n ':' +\n String(date.getMinutes()).padStart(2, '0') +\n ':' +\n String(date.getSeconds()).padStart(2, '0') +\n '.' +\n String(date.getMilliseconds()).padStart(3, '0')\n\n if (offset < 0) {\n ret += '-'\n offset *= -1\n } else {\n ret += '+'\n }\n\n ret += String(Math.floor(offset / 60)).padStart(2, '0') + ':' + String(offset % 60).padStart(2, '0')\n if (isBCYear) ret += ' BC'\n return ret\n}\n\nfunction dateToStringUTC(date) {\n let year = date.getUTCFullYear()\n const isBCYear = year < 1\n if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation\n\n let ret =\n String(year).padStart(4, '0') +\n '-' +\n String(date.getUTCMonth() + 1).padStart(2, '0') +\n '-' +\n String(date.getUTCDate()).padStart(2, '0') +\n 'T' +\n String(date.getUTCHours()).padStart(2, '0') +\n ':' +\n String(date.getUTCMinutes()).padStart(2, '0') +\n ':' +\n String(date.getUTCSeconds()).padStart(2, '0') +\n '.' +\n String(date.getUTCMilliseconds()).padStart(3, '0')\n\n ret += '+00:00'\n if (isBCYear) ret += ' BC'\n return ret\n}\n\nfunction normalizeQueryConfig(config, values, callback) {\n // can take in strings or config objects\n config = typeof config === 'string' ? { text: config } : config\n if (values) {\n if (typeof values === 'function') {\n config.callback = values\n } else {\n config.values = values\n }\n }\n if (callback) {\n config.callback = callback\n }\n return config\n}\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst escapeIdentifier = function (str) {\n return '\"' + str.replace(/\"/g, '\"\"') + '\"'\n}\n\nconst escapeLiteral = function (str) {\n let hasBackslash = false\n let escaped = \"'\"\n\n if (str == null) {\n return \"''\"\n }\n\n if (typeof str !== 'string') {\n return \"''\"\n }\n\n for (let i = 0; i < str.length; i++) {\n const c = str[i]\n if (c === \"'\") {\n escaped += c + c\n } else if (c === '\\\\') {\n escaped += c + c\n hasBackslash = true\n } else {\n escaped += c\n }\n }\n\n escaped += \"'\"\n\n if (hasBackslash === true) {\n escaped = ' E' + escaped\n }\n\n return escaped\n}\n\nmodule.exports = {\n prepareValue: function prepareValueWrapper(value) {\n // this ensures that extra arguments do not get passed into prepareValue\n // by accident, eg: from calling values.map(utils.prepareValue)\n return prepareValue(value)\n },\n normalizeQueryConfig,\n escapeIdentifier,\n escapeLiteral,\n}\n","'use strict'\n// This file contains crypto utility functions for versions of Node.js < 15.0.0,\n// which does not support the WebCrypto.subtle API.\n\nconst nodeCrypto = require('crypto')\n\nfunction md5(string) {\n return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')\n}\n\n// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html\nfunction postgresMd5PasswordHash(user, password, salt) {\n const inner = md5(password + user)\n const outer = md5(Buffer.concat([Buffer.from(inner), salt]))\n return 'md5' + outer\n}\n\nfunction sha256(text) {\n return nodeCrypto.createHash('sha256').update(text).digest()\n}\n\nfunction hashByName(hashName, text) {\n hashName = hashName.replace(/(\\D)-/, '$1') // e.g. SHA-256 -> SHA256\n return nodeCrypto.createHash(hashName).update(text).digest()\n}\n\nfunction hmacSha256(key, msg) {\n return nodeCrypto.createHmac('sha256', key).update(msg).digest()\n}\n\nasync function deriveKey(password, salt, iterations) {\n return nodeCrypto.pbkdf2Sync(password, salt, iterations, 32, 'sha256')\n}\n\nmodule.exports = {\n postgresMd5PasswordHash,\n randomBytes: nodeCrypto.randomBytes,\n deriveKey,\n sha256,\n hashByName,\n hmacSha256,\n md5,\n}\n","const nodeCrypto = require('crypto')\n\nmodule.exports = {\n postgresMd5PasswordHash,\n randomBytes,\n deriveKey,\n sha256,\n hashByName,\n hmacSha256,\n md5,\n}\n\n/**\n * The Web Crypto API - grabbed from the Node.js library or the global\n * @type Crypto\n */\n// eslint-disable-next-line no-undef\nconst webCrypto = nodeCrypto.webcrypto || globalThis.crypto\n/**\n * The SubtleCrypto API for low level crypto operations.\n * @type SubtleCrypto\n */\nconst subtleCrypto = webCrypto.subtle\nconst textEncoder = new TextEncoder()\n\n/**\n *\n * @param {*} length\n * @returns\n */\nfunction randomBytes(length) {\n return webCrypto.getRandomValues(Buffer.alloc(length))\n}\n\nasync function md5(string) {\n try {\n return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')\n } catch (e) {\n // `createHash()` failed so we are probably not in Node.js, use the WebCrypto API instead.\n // Note that the MD5 algorithm on WebCrypto is not available in Node.js.\n // This is why we cannot just use WebCrypto in all environments.\n const data = typeof string === 'string' ? textEncoder.encode(string) : string\n const hash = await subtleCrypto.digest('MD5', data)\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n}\n\n// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html\nasync function postgresMd5PasswordHash(user, password, salt) {\n const inner = await md5(password + user)\n const outer = await md5(Buffer.concat([Buffer.from(inner), salt]))\n return 'md5' + outer\n}\n\n/**\n * Create a SHA-256 digest of the given data\n * @param {Buffer} data\n */\nasync function sha256(text) {\n return await subtleCrypto.digest('SHA-256', text)\n}\n\nasync function hashByName(hashName, text) {\n return await subtleCrypto.digest(hashName, text)\n}\n\n/**\n * Sign the message with the given key\n * @param {ArrayBuffer} keyBuffer\n * @param {string} msg\n */\nasync function hmacSha256(keyBuffer, msg) {\n const key = await subtleCrypto.importKey('raw', keyBuffer, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])\n return await subtleCrypto.sign('HMAC', key, textEncoder.encode(msg))\n}\n\n/**\n * Derive a key from the password and salt\n * @param {string} password\n * @param {Uint8Array} salt\n * @param {number} iterations\n */\nasync function deriveKey(password, salt, iterations) {\n const key = await subtleCrypto.importKey('raw', textEncoder.encode(password), 'PBKDF2', false, ['deriveBits'])\n const params = { name: 'PBKDF2', hash: 'SHA-256', salt: salt, iterations: iterations }\n return await subtleCrypto.deriveBits(params, key, 32 * 8, ['deriveBits'])\n}\n","'use strict'\n\nconst useLegacyCrypto = parseInt(process.versions && process.versions.node && process.versions.node.split('.')[0]) < 15\nif (useLegacyCrypto) {\n // We are on an old version of Node.js that requires legacy crypto utilities.\n module.exports = require('./utils-legacy')\n} else {\n module.exports = require('./utils-webcrypto')\n}\n","function x509Error(msg, cert) {\n return new Error('SASL channel binding: ' + msg + ' when parsing public certificate ' + cert.toString('base64'))\n}\n\nfunction readASN1Length(data, index) {\n let length = data[index++]\n if (length < 0x80) return { length, index }\n\n const lengthBytes = length & 0x7f\n if (lengthBytes > 4) throw x509Error('bad length', data)\n\n length = 0\n for (let i = 0; i < lengthBytes; i++) {\n length = (length << 8) | data[index++]\n }\n\n return { length, index }\n}\n\nfunction readASN1OID(data, index) {\n if (data[index++] !== 0x6) throw x509Error('non-OID data', data) // 6 = OID\n\n const { length: OIDLength, index: indexAfterOIDLength } = readASN1Length(data, index)\n index = indexAfterOIDLength\n const lastIndex = index + OIDLength\n\n const byte1 = data[index++]\n let oid = ((byte1 / 40) >> 0) + '.' + (byte1 % 40)\n\n while (index < lastIndex) {\n // loop over numbers in OID\n let value = 0\n while (index < lastIndex) {\n // loop over bytes in number\n const nextByte = data[index++]\n value = (value << 7) | (nextByte & 0x7f)\n if (nextByte < 0x80) break\n }\n oid += '.' + value\n }\n\n return { oid, index }\n}\n\nfunction expectASN1Seq(data, index) {\n if (data[index++] !== 0x30) throw x509Error('non-sequence data', data) // 30 = Sequence\n return readASN1Length(data, index)\n}\n\nfunction signatureAlgorithmHashFromCertificate(data, index) {\n // read this thread: https://www.postgresql.org/message-id/17760-b6c61e752ec07060%40postgresql.org\n if (index === undefined) index = 0\n index = expectASN1Seq(data, index).index\n const { length: certInfoLength, index: indexAfterCertInfoLength } = expectASN1Seq(data, index)\n index = indexAfterCertInfoLength + certInfoLength // skip over certificate info\n index = expectASN1Seq(data, index).index // skip over signature length field\n const { oid, index: indexAfterOID } = readASN1OID(data, index)\n switch (oid) {\n // RSA\n case '1.2.840.113549.1.1.4':\n return 'MD5'\n case '1.2.840.113549.1.1.5':\n return 'SHA-1'\n case '1.2.840.113549.1.1.11':\n return 'SHA-256'\n case '1.2.840.113549.1.1.12':\n return 'SHA-384'\n case '1.2.840.113549.1.1.13':\n return 'SHA-512'\n case '1.2.840.113549.1.1.14':\n return 'SHA-224'\n case '1.2.840.113549.1.1.15':\n return 'SHA512-224'\n case '1.2.840.113549.1.1.16':\n return 'SHA512-256'\n // ECDSA\n case '1.2.840.10045.4.1':\n return 'SHA-1'\n case '1.2.840.10045.4.3.1':\n return 'SHA-224'\n case '1.2.840.10045.4.3.2':\n return 'SHA-256'\n case '1.2.840.10045.4.3.3':\n return 'SHA-384'\n case '1.2.840.10045.4.3.4':\n return 'SHA-512'\n // RSASSA-PSS: hash is indicated separately\n case '1.2.840.113549.1.1.10': {\n index = indexAfterOID\n index = expectASN1Seq(data, index).index\n if (data[index++] !== 0xa0) throw x509Error('non-tag data', data) // a0 = constructed tag 0\n index = readASN1Length(data, index).index // skip over tag length field\n index = expectASN1Seq(data, index).index // skip over sequence length field\n const { oid: hashOID } = readASN1OID(data, index)\n switch (hashOID) {\n // standalone hash OIDs\n case '1.2.840.113549.2.5':\n return 'MD5'\n case '1.3.14.3.2.26':\n return 'SHA-1'\n case '2.16.840.1.101.3.4.2.1':\n return 'SHA-256'\n case '2.16.840.1.101.3.4.2.2':\n return 'SHA-384'\n case '2.16.840.1.101.3.4.2.3':\n return 'SHA-512'\n }\n throw x509Error('unknown hash OID ' + hashOID, data)\n }\n // Ed25519 -- see https: return//github.com/openssl/openssl/issues/15477\n case '1.3.101.110':\n case '1.3.101.112': // ph\n return 'SHA-512'\n // Ed448 -- still not in pg 17.2 (if supported, digest would be SHAKE256 x 64 bytes)\n case '1.3.101.111':\n case '1.3.101.113': // ph\n throw x509Error('Ed448 certificate channel binding is not currently supported by Postgres')\n }\n throw x509Error('unknown OID ' + oid, data)\n}\n\nmodule.exports = { signatureAlgorithmHashFromCertificate }\n","'use strict'\nconst crypto = require('./utils')\nconst { signatureAlgorithmHashFromCertificate } = require('./cert-signatures')\n\nfunction startSession(mechanisms, stream) {\n const candidates = ['SCRAM-SHA-256']\n if (stream) candidates.unshift('SCRAM-SHA-256-PLUS') // higher-priority, so placed first\n\n const mechanism = candidates.find((candidate) => mechanisms.includes(candidate))\n\n if (!mechanism) {\n throw new Error('SASL: Only mechanism(s) ' + candidates.join(' and ') + ' are supported')\n }\n\n if (mechanism === 'SCRAM-SHA-256-PLUS' && typeof stream.getPeerCertificate !== 'function') {\n // this should never happen if we are really talking to a Postgres server\n throw new Error('SASL: Mechanism SCRAM-SHA-256-PLUS requires a certificate')\n }\n\n const clientNonce = crypto.randomBytes(18).toString('base64')\n const gs2Header = mechanism === 'SCRAM-SHA-256-PLUS' ? 'p=tls-server-end-point' : stream ? 'y' : 'n'\n\n return {\n mechanism,\n clientNonce,\n response: gs2Header + ',,n=*,r=' + clientNonce,\n message: 'SASLInitialResponse',\n }\n}\n\nasync function continueSession(session, password, serverData, stream) {\n if (session.message !== 'SASLInitialResponse') {\n throw new Error('SASL: Last message was not SASLInitialResponse')\n }\n if (typeof password !== 'string') {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')\n }\n if (password === '') {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a non-empty string')\n }\n if (typeof serverData !== 'string') {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: serverData must be a string')\n }\n\n const sv = parseServerFirstMessage(serverData)\n\n if (!sv.nonce.startsWith(session.clientNonce)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce does not start with client nonce')\n } else if (sv.nonce.length === session.clientNonce.length) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce is too short')\n }\n\n const clientFirstMessageBare = 'n=*,r=' + session.clientNonce\n const serverFirstMessage = 'r=' + sv.nonce + ',s=' + sv.salt + ',i=' + sv.iteration\n\n // without channel binding:\n let channelBinding = stream ? 'eSws' : 'biws' // 'y,,' or 'n,,', base64-encoded\n\n // override if channel binding is in use:\n if (session.mechanism === 'SCRAM-SHA-256-PLUS') {\n const peerCert = stream.getPeerCertificate().raw\n let hashName = signatureAlgorithmHashFromCertificate(peerCert)\n if (hashName === 'MD5' || hashName === 'SHA-1') hashName = 'SHA-256'\n const certHash = await crypto.hashByName(hashName, peerCert)\n const bindingData = Buffer.concat([Buffer.from('p=tls-server-end-point,,'), Buffer.from(certHash)])\n channelBinding = bindingData.toString('base64')\n }\n\n const clientFinalMessageWithoutProof = 'c=' + channelBinding + ',r=' + sv.nonce\n const authMessage = clientFirstMessageBare + ',' + serverFirstMessage + ',' + clientFinalMessageWithoutProof\n\n const saltBytes = Buffer.from(sv.salt, 'base64')\n const saltedPassword = await crypto.deriveKey(password, saltBytes, sv.iteration)\n const clientKey = await crypto.hmacSha256(saltedPassword, 'Client Key')\n const storedKey = await crypto.sha256(clientKey)\n const clientSignature = await crypto.hmacSha256(storedKey, authMessage)\n const clientProof = xorBuffers(Buffer.from(clientKey), Buffer.from(clientSignature)).toString('base64')\n const serverKey = await crypto.hmacSha256(saltedPassword, 'Server Key')\n const serverSignatureBytes = await crypto.hmacSha256(serverKey, authMessage)\n\n session.message = 'SASLResponse'\n session.serverSignature = Buffer.from(serverSignatureBytes).toString('base64')\n session.response = clientFinalMessageWithoutProof + ',p=' + clientProof\n}\n\nfunction finalizeSession(session, serverData) {\n if (session.message !== 'SASLResponse') {\n throw new Error('SASL: Last message was not SASLResponse')\n }\n if (typeof serverData !== 'string') {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: serverData must be a string')\n }\n\n const { serverSignature } = parseServerFinalMessage(serverData)\n\n if (serverSignature !== session.serverSignature) {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature does not match')\n }\n}\n\n/**\n * printable = %x21-2B / %x2D-7E\n * ;; Printable ASCII except \",\".\n * ;; Note that any \"printable\" is also\n * ;; a valid \"value\".\n */\nfunction isPrintableChars(text) {\n if (typeof text !== 'string') {\n throw new TypeError('SASL: text must be a string')\n }\n return text\n .split('')\n .map((_, i) => text.charCodeAt(i))\n .every((c) => (c >= 0x21 && c <= 0x2b) || (c >= 0x2d && c <= 0x7e))\n}\n\n/**\n * base64-char = ALPHA / DIGIT / \"/\" / \"+\"\n *\n * base64-4 = 4base64-char\n *\n * base64-3 = 3base64-char \"=\"\n *\n * base64-2 = 2base64-char \"==\"\n *\n * base64 = *base64-4 [base64-3 / base64-2]\n */\nfunction isBase64(text) {\n return /^(?:[a-zA-Z0-9+/]{4})*(?:[a-zA-Z0-9+/]{2}==|[a-zA-Z0-9+/]{3}=)?$/.test(text)\n}\n\nfunction parseAttributePairs(text) {\n if (typeof text !== 'string') {\n throw new TypeError('SASL: attribute pairs text must be a string')\n }\n\n return new Map(\n text.split(',').map((attrValue) => {\n if (!/^.=/.test(attrValue)) {\n throw new Error('SASL: Invalid attribute pair entry')\n }\n const name = attrValue[0]\n const value = attrValue.substring(2)\n return [name, value]\n })\n )\n}\n\nfunction parseServerFirstMessage(data) {\n const attrPairs = parseAttributePairs(data)\n\n const nonce = attrPairs.get('r')\n if (!nonce) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce missing')\n } else if (!isPrintableChars(nonce)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce must only contain printable characters')\n }\n const salt = attrPairs.get('s')\n if (!salt) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt missing')\n } else if (!isBase64(salt)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt must be base64')\n }\n const iterationText = attrPairs.get('i')\n if (!iterationText) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: iteration missing')\n } else if (!/^[1-9][0-9]*$/.test(iterationText)) {\n throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: invalid iteration count')\n }\n const iteration = parseInt(iterationText, 10)\n\n return {\n nonce,\n salt,\n iteration,\n }\n}\n\nfunction parseServerFinalMessage(serverData) {\n const attrPairs = parseAttributePairs(serverData)\n const serverSignature = attrPairs.get('v')\n if (!serverSignature) {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature is missing')\n } else if (!isBase64(serverSignature)) {\n throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature must be base64')\n }\n return {\n serverSignature,\n }\n}\n\nfunction xorBuffers(a, b) {\n if (!Buffer.isBuffer(a)) {\n throw new TypeError('first argument must be a Buffer')\n }\n if (!Buffer.isBuffer(b)) {\n throw new TypeError('second argument must be a Buffer')\n }\n if (a.length !== b.length) {\n throw new Error('Buffer lengths must match')\n }\n if (a.length === 0) {\n throw new Error('Buffers cannot be empty')\n }\n return Buffer.from(a.map((_, i) => a[i] ^ b[i]))\n}\n\nmodule.exports = {\n startSession,\n continueSession,\n finalizeSession,\n}\n","'use strict'\n\nconst types = require('pg-types')\n\nfunction TypeOverrides(userTypes) {\n this._types = userTypes || types\n this.text = {}\n this.binary = {}\n}\n\nTypeOverrides.prototype.getOverrides = function (format) {\n switch (format) {\n case 'text':\n return this.text\n case 'binary':\n return this.binary\n default:\n return {}\n }\n}\n\nTypeOverrides.prototype.setTypeParser = function (oid, format, parseFn) {\n if (typeof format === 'function') {\n parseFn = format\n format = 'text'\n }\n this.getOverrides(format)[oid] = parseFn\n}\n\nTypeOverrides.prototype.getTypeParser = function (oid, format) {\n format = format || 'text'\n return this.getOverrides(format)[oid] || this._types.getTypeParser(oid, format)\n}\n\nmodule.exports = TypeOverrides\n","'use strict'\n\n//Parse method copied from https://github.com/brianc/node-postgres\n//Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)\n//MIT License\n\n//parses a connection string\nfunction parse(str, options = {}) {\n //unix socket\n if (str.charAt(0) === '/') {\n const config = str.split(' ')\n return { host: config[0], database: config[1] }\n }\n\n // Check for empty host in URL\n\n const config = {}\n let result\n let dummyHost = false\n if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {\n // Ensure spaces are encoded as %20\n str = encodeURI(str).replace(/%25(\\d\\d)/g, '%$1')\n }\n\n try {\n try {\n result = new URL(str, 'postgres://base')\n } catch (e) {\n // The URL is invalid so try again with a dummy host\n result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base')\n dummyHost = true\n }\n } catch (err) {\n // Remove the input from the error message to avoid leaking sensitive information\n err.input && (err.input = '*****REDACTED*****')\n throw err\n }\n\n // We'd like to use Object.fromEntries() here but Node.js 10 does not support it\n for (const entry of result.searchParams.entries()) {\n config[entry[0]] = entry[1]\n }\n\n config.user = config.user || decodeURIComponent(result.username)\n config.password = config.password || decodeURIComponent(result.password)\n\n if (result.protocol == 'socket:') {\n config.host = decodeURI(result.pathname)\n config.database = result.searchParams.get('db')\n config.client_encoding = result.searchParams.get('encoding')\n return config\n }\n const hostname = dummyHost ? '' : result.hostname\n if (!config.host) {\n // Only set the host if there is no equivalent query param.\n config.host = decodeURIComponent(hostname)\n } else if (hostname && /^%2f/i.test(hostname)) {\n // Only prepend the hostname to the pathname if it is not a URL encoded Unix socket host.\n result.pathname = hostname + result.pathname\n }\n if (!config.port) {\n // Only set the port if there is no equivalent query param.\n config.port = result.port\n }\n\n const pathname = result.pathname.slice(1) || null\n config.database = pathname ? decodeURI(pathname) : null\n\n if (config.ssl === 'true' || config.ssl === '1') {\n config.ssl = true\n }\n\n if (config.ssl === '0') {\n config.ssl = false\n }\n\n if (config.sslcert || config.sslkey || config.sslrootcert || config.sslmode) {\n config.ssl = {}\n }\n\n // Only try to load fs if we expect to read from the disk\n const fs = config.sslcert || config.sslkey || config.sslrootcert ? require('fs') : null\n\n if (config.sslcert) {\n config.ssl.cert = fs.readFileSync(config.sslcert).toString()\n }\n\n if (config.sslkey) {\n config.ssl.key = fs.readFileSync(config.sslkey).toString()\n }\n\n if (config.sslrootcert) {\n config.ssl.ca = fs.readFileSync(config.sslrootcert).toString()\n }\n\n if (options.useLibpqCompat && config.uselibpqcompat) {\n throw new Error('Both useLibpqCompat and uselibpqcompat are set. Please use only one of them.')\n }\n\n if (config.uselibpqcompat === 'true' || options.useLibpqCompat) {\n switch (config.sslmode) {\n case 'disable': {\n config.ssl = false\n break\n }\n case 'prefer': {\n config.ssl.rejectUnauthorized = false\n break\n }\n case 'require': {\n if (config.sslrootcert) {\n // If a root CA is specified, behavior of `sslmode=require` will be the same as that of `verify-ca`\n config.ssl.checkServerIdentity = function () {}\n } else {\n config.ssl.rejectUnauthorized = false\n }\n break\n }\n case 'verify-ca': {\n if (!config.ssl.ca) {\n throw new Error(\n 'SECURITY WARNING: Using sslmode=verify-ca requires specifying a CA with sslrootcert. If a public CA is used, verify-ca allows connections to a server that somebody else may have registered with the CA, making you vulnerable to Man-in-the-Middle attacks. Either specify a custom CA certificate with sslrootcert parameter or use sslmode=verify-full for proper security.'\n )\n }\n config.ssl.checkServerIdentity = function () {}\n break\n }\n case 'verify-full': {\n break\n }\n }\n } else {\n switch (config.sslmode) {\n case 'disable': {\n config.ssl = false\n break\n }\n case 'prefer':\n case 'require':\n case 'verify-ca':\n case 'verify-full': {\n if (config.sslmode !== 'verify-full') {\n deprecatedSslModeWarning(config.sslmode)\n }\n break\n }\n case 'no-verify': {\n config.ssl.rejectUnauthorized = false\n break\n }\n }\n }\n\n return config\n}\n\n// convert pg-connection-string ssl config to a ClientConfig.ConnectionOptions\nfunction toConnectionOptions(sslConfig) {\n const connectionOptions = Object.entries(sslConfig).reduce((c, [key, value]) => {\n // we explicitly check for undefined and null instead of `if (value)` because some\n // options accept falsy values. Example: `ssl.rejectUnauthorized = false`\n if (value !== undefined && value !== null) {\n c[key] = value\n }\n\n return c\n }, {})\n\n return connectionOptions\n}\n\n// convert pg-connection-string config to a ClientConfig\nfunction toClientConfig(config) {\n const poolConfig = Object.entries(config).reduce((c, [key, value]) => {\n if (key === 'ssl') {\n const sslConfig = value\n\n if (typeof sslConfig === 'boolean') {\n c[key] = sslConfig\n }\n\n if (typeof sslConfig === 'object') {\n c[key] = toConnectionOptions(sslConfig)\n }\n } else if (value !== undefined && value !== null) {\n if (key === 'port') {\n // when port is not specified, it is converted into an empty string\n // we want to avoid NaN or empty string as a values in ClientConfig\n if (value !== '') {\n const v = parseInt(value, 10)\n if (isNaN(v)) {\n throw new Error(`Invalid ${key}: ${value}`)\n }\n\n c[key] = v\n }\n } else {\n c[key] = value\n }\n }\n\n return c\n }, {})\n\n return poolConfig\n}\n\n// parses a connection string into ClientConfig\nfunction parseIntoClientConfig(str) {\n return toClientConfig(parse(str))\n}\n\nfunction deprecatedSslModeWarning(sslmode) {\n if (!deprecatedSslModeWarning.warned && typeof process !== 'undefined' && process.emitWarning) {\n deprecatedSslModeWarning.warned = true\n process.emitWarning(`SECURITY WARNING: The SSL modes 'prefer', 'require', and 'verify-ca' are treated as aliases for 'verify-full'.\nIn the next major version (pg-connection-string v3.0.0 and pg v9.0.0), these modes will adopt standard libpq semantics, which have weaker security guarantees.\n\nTo prepare for this change:\n- If you want the current behavior, explicitly use 'sslmode=verify-full'\n- If you want libpq compatibility now, use 'uselibpqcompat=true&sslmode=${sslmode}'\n\nSee https://www.postgresql.org/docs/current/libpq-ssl.html for libpq SSL mode definitions.`)\n }\n}\n\nmodule.exports = parse\n\nparse.parse = parse\nparse.toClientConfig = toClientConfig\nparse.parseIntoClientConfig = parseIntoClientConfig\n","'use strict'\n\nconst dns = require('dns')\n\nconst defaults = require('./defaults')\n\nconst parse = require('pg-connection-string').parse // parses a connection string\n\nconst val = function (key, config, envVar) {\n if (config[key]) {\n return config[key]\n }\n\n if (envVar === undefined) {\n envVar = process.env['PG' + key.toUpperCase()]\n } else if (envVar === false) {\n // do nothing ... use false\n } else {\n envVar = process.env[envVar]\n }\n\n return envVar || defaults[key]\n}\n\nconst readSSLConfigFromEnvironment = function () {\n switch (process.env.PGSSLMODE) {\n case 'disable':\n return false\n case 'prefer':\n case 'require':\n case 'verify-ca':\n case 'verify-full':\n return true\n case 'no-verify':\n return { rejectUnauthorized: false }\n }\n return defaults.ssl\n}\n\n// Convert arg to a string, surround in single quotes, and escape single quotes and backslashes\nconst quoteParamValue = function (value) {\n return \"'\" + ('' + value).replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\") + \"'\"\n}\n\nconst add = function (params, config, paramName) {\n const value = config[paramName]\n if (value !== undefined && value !== null) {\n params.push(paramName + '=' + quoteParamValue(value))\n }\n}\n\nclass ConnectionParameters {\n constructor(config) {\n // if a string is passed, it is a raw connection string so we parse it into a config\n config = typeof config === 'string' ? parse(config) : config || {}\n\n // if the config has a connectionString defined, parse IT into the config we use\n // this will override other default values with what is stored in connectionString\n if (config.connectionString) {\n config = Object.assign({}, config, parse(config.connectionString))\n }\n\n this.user = val('user', config)\n this.database = val('database', config)\n\n if (this.database === undefined) {\n this.database = this.user\n }\n\n this.port = parseInt(val('port', config), 10)\n this.host = val('host', config)\n\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val('password', config),\n })\n\n this.binary = val('binary', config)\n this.options = val('options', config)\n\n this.ssl = typeof config.ssl === 'undefined' ? readSSLConfigFromEnvironment() : config.ssl\n\n if (typeof this.ssl === 'string') {\n if (this.ssl === 'true') {\n this.ssl = true\n }\n }\n // support passing in ssl=no-verify via connection string\n if (this.ssl === 'no-verify') {\n this.ssl = { rejectUnauthorized: false }\n }\n if (this.ssl && this.ssl.key) {\n Object.defineProperty(this.ssl, 'key', {\n enumerable: false,\n })\n }\n\n this.client_encoding = val('client_encoding', config)\n this.replication = val('replication', config)\n // a domain socket begins with '/'\n this.isDomainSocket = !(this.host || '').indexOf('/')\n\n this.application_name = val('application_name', config, 'PGAPPNAME')\n this.fallback_application_name = val('fallback_application_name', config, false)\n this.statement_timeout = val('statement_timeout', config, false)\n this.lock_timeout = val('lock_timeout', config, false)\n this.idle_in_transaction_session_timeout = val('idle_in_transaction_session_timeout', config, false)\n this.query_timeout = val('query_timeout', config, false)\n\n if (config.connectionTimeoutMillis === undefined) {\n this.connect_timeout = process.env.PGCONNECT_TIMEOUT || 0\n } else {\n this.connect_timeout = Math.floor(config.connectionTimeoutMillis / 1000)\n }\n\n if (config.keepAlive === false) {\n this.keepalives = 0\n } else if (config.keepAlive === true) {\n this.keepalives = 1\n }\n\n if (typeof config.keepAliveInitialDelayMillis === 'number') {\n this.keepalives_idle = Math.floor(config.keepAliveInitialDelayMillis / 1000)\n }\n }\n\n getLibpqConnectionString(cb) {\n const params = []\n add(params, this, 'user')\n add(params, this, 'password')\n add(params, this, 'port')\n add(params, this, 'application_name')\n add(params, this, 'fallback_application_name')\n add(params, this, 'connect_timeout')\n add(params, this, 'options')\n\n const ssl = typeof this.ssl === 'object' ? this.ssl : this.ssl ? { sslmode: this.ssl } : {}\n add(params, ssl, 'sslmode')\n add(params, ssl, 'sslca')\n add(params, ssl, 'sslkey')\n add(params, ssl, 'sslcert')\n add(params, ssl, 'sslrootcert')\n\n if (this.database) {\n params.push('dbname=' + quoteParamValue(this.database))\n }\n if (this.replication) {\n params.push('replication=' + quoteParamValue(this.replication))\n }\n if (this.host) {\n params.push('host=' + quoteParamValue(this.host))\n }\n if (this.isDomainSocket) {\n return cb(null, params.join(' '))\n }\n if (this.client_encoding) {\n params.push('client_encoding=' + quoteParamValue(this.client_encoding))\n }\n dns.lookup(this.host, function (err, address) {\n if (err) return cb(err, null)\n params.push('hostaddr=' + quoteParamValue(address))\n return cb(null, params.join(' '))\n })\n }\n}\n\nmodule.exports = ConnectionParameters\n","'use strict'\n\nconst types = require('pg-types')\n\nconst matchRegexp = /^([A-Za-z]+)(?: (\\d+))?(?: (\\d+))?/\n\n// result object returned from query\n// in the 'end' event and also\n// passed as second argument to provided callback\nclass Result {\n constructor(rowMode, types) {\n this.command = null\n this.rowCount = null\n this.oid = null\n this.rows = []\n this.fields = []\n this._parsers = undefined\n this._types = types\n this.RowCtor = null\n this.rowAsArray = rowMode === 'array'\n if (this.rowAsArray) {\n this.parseRow = this._parseRowAsArray\n }\n this._prebuiltEmptyResultObject = null\n }\n\n // adds a command complete message\n addCommandComplete(msg) {\n let match\n if (msg.text) {\n // pure javascript\n match = matchRegexp.exec(msg.text)\n } else {\n // native bindings\n match = matchRegexp.exec(msg.command)\n }\n if (match) {\n this.command = match[1]\n if (match[3]) {\n // COMMAND OID ROWS\n this.oid = parseInt(match[2], 10)\n this.rowCount = parseInt(match[3], 10)\n } else if (match[2]) {\n // COMMAND ROWS\n this.rowCount = parseInt(match[2], 10)\n }\n }\n }\n\n _parseRowAsArray(rowData) {\n const row = new Array(rowData.length)\n for (let i = 0, len = rowData.length; i < len; i++) {\n const rawValue = rowData[i]\n if (rawValue !== null) {\n row[i] = this._parsers[i](rawValue)\n } else {\n row[i] = null\n }\n }\n return row\n }\n\n parseRow(rowData) {\n const row = { ...this._prebuiltEmptyResultObject }\n for (let i = 0, len = rowData.length; i < len; i++) {\n const rawValue = rowData[i]\n const field = this.fields[i].name\n if (rawValue !== null) {\n const v = this.fields[i].format === 'binary' ? Buffer.from(rawValue) : rawValue\n row[field] = this._parsers[i](v)\n } else {\n row[field] = null\n }\n }\n return row\n }\n\n addRow(row) {\n this.rows.push(row)\n }\n\n addFields(fieldDescriptions) {\n // clears field definitions\n // multiple query statements in 1 action can result in multiple sets\n // of rowDescriptions...eg: 'select NOW(); select 1::int;'\n // you need to reset the fields\n this.fields = fieldDescriptions\n if (this.fields.length) {\n this._parsers = new Array(fieldDescriptions.length)\n }\n\n const row = {}\n\n for (let i = 0; i < fieldDescriptions.length; i++) {\n const desc = fieldDescriptions[i]\n row[desc.name] = null\n\n if (this._types) {\n this._parsers[i] = this._types.getTypeParser(desc.dataTypeID, desc.format || 'text')\n } else {\n this._parsers[i] = types.getTypeParser(desc.dataTypeID, desc.format || 'text')\n }\n }\n\n this._prebuiltEmptyResultObject = { ...row }\n }\n}\n\nmodule.exports = Result\n","'use strict'\n\nconst { EventEmitter } = require('events')\n\nconst Result = require('./result')\nconst utils = require('./utils')\n\nclass Query extends EventEmitter {\n constructor(config, values, callback) {\n super()\n\n config = utils.normalizeQueryConfig(config, values, callback)\n\n this.text = config.text\n this.values = config.values\n this.rows = config.rows\n this.types = config.types\n this.name = config.name\n this.queryMode = config.queryMode\n this.binary = config.binary\n // use unique portal name each time\n this.portal = config.portal || ''\n this.callback = config.callback\n this._rowMode = config.rowMode\n if (process.domain && config.callback) {\n this.callback = process.domain.bind(config.callback)\n }\n this._result = new Result(this._rowMode, this.types)\n\n // potential for multiple results\n this._results = this._result\n this._canceledDueToError = false\n }\n\n requiresPreparation() {\n if (this.queryMode === 'extended') {\n return true\n }\n\n // named queries must always be prepared\n if (this.name) {\n return true\n }\n // always prepare if there are max number of rows expected per\n // portal execution\n if (this.rows) {\n return true\n }\n // don't prepare empty text queries\n if (!this.text) {\n return false\n }\n // prepare if there are values\n if (!this.values) {\n return false\n }\n return this.values.length > 0\n }\n\n _checkForMultirow() {\n // if we already have a result with a command property\n // then we've already executed one query in a multi-statement simple query\n // turn our results into an array of results\n if (this._result.command) {\n if (!Array.isArray(this._results)) {\n this._results = [this._result]\n }\n this._result = new Result(this._rowMode, this._result._types)\n this._results.push(this._result)\n }\n }\n\n // associates row metadata from the supplied\n // message with this query object\n // metadata used when parsing row results\n handleRowDescription(msg) {\n this._checkForMultirow()\n this._result.addFields(msg.fields)\n this._accumulateRows = this.callback || !this.listeners('row').length\n }\n\n handleDataRow(msg) {\n let row\n\n if (this._canceledDueToError) {\n return\n }\n\n try {\n row = this._result.parseRow(msg.fields)\n } catch (err) {\n this._canceledDueToError = err\n return\n }\n\n this.emit('row', row, this._result)\n if (this._accumulateRows) {\n this._result.addRow(row)\n }\n }\n\n handleCommandComplete(msg, connection) {\n this._checkForMultirow()\n this._result.addCommandComplete(msg)\n // need to sync after each command complete of a prepared statement\n // if we were using a row count which results in multiple calls to _getRows\n if (this.rows) {\n connection.sync()\n }\n }\n\n // if a named prepared statement is created with empty query text\n // the backend will send an emptyQuery message but *not* a command complete message\n // since we pipeline sync immediately after execute we don't need to do anything here\n // unless we have rows specified, in which case we did not pipeline the initial sync call\n handleEmptyQuery(connection) {\n if (this.rows) {\n connection.sync()\n }\n }\n\n handleError(err, connection) {\n // need to sync after error during a prepared statement\n if (this._canceledDueToError) {\n err = this._canceledDueToError\n this._canceledDueToError = false\n }\n // if callback supplied do not emit error event as uncaught error\n // events will bubble up to node process\n if (this.callback) {\n return this.callback(err)\n }\n this.emit('error', err)\n }\n\n handleReadyForQuery(con) {\n if (this._canceledDueToError) {\n return this.handleError(this._canceledDueToError, con)\n }\n if (this.callback) {\n try {\n this.callback(null, this._results)\n } catch (err) {\n process.nextTick(() => {\n throw err\n })\n }\n }\n this.emit('end', this._results)\n }\n\n submit(connection) {\n if (typeof this.text !== 'string' && typeof this.name !== 'string') {\n return new Error('A query must have either text or a name. Supplying neither is unsupported.')\n }\n const previous = connection.parsedStatements[this.name]\n if (this.text && previous && this.text !== previous) {\n return new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)\n }\n if (this.values && !Array.isArray(this.values)) {\n return new Error('Query values must be an array')\n }\n if (this.requiresPreparation()) {\n // If we're using the extended query protocol we fire off several separate commands\n // to the backend. On some versions of node & some operating system versions\n // the network stack writes each message separately instead of buffering them together\n // causing the client & network to send more slowly. Corking & uncorking the stream\n // allows node to buffer up the messages internally before sending them all off at once.\n // note: we're checking for existence of cork/uncork because some versions of streams\n // might not have this (cloudflare?)\n connection.stream.cork && connection.stream.cork()\n try {\n this.prepare(connection)\n } finally {\n // while unlikely for this.prepare to throw, if it does & we don't uncork this stream\n // this client becomes unresponsive, so put in finally block \"just in case\"\n connection.stream.uncork && connection.stream.uncork()\n }\n } else {\n connection.query(this.text)\n }\n return null\n }\n\n hasBeenParsed(connection) {\n return this.name && connection.parsedStatements[this.name]\n }\n\n handlePortalSuspended(connection) {\n this._getRows(connection, this.rows)\n }\n\n _getRows(connection, rows) {\n connection.execute({\n portal: this.portal,\n rows: rows,\n })\n // if we're not reading pages of rows send the sync command\n // to indicate the pipeline is finished\n if (!rows) {\n connection.sync()\n } else {\n // otherwise flush the call out to read more rows\n connection.flush()\n }\n }\n\n // http://developer.postgresql.org/pgdocs/postgres/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY\n prepare(connection) {\n // TODO refactor this poor encapsulation\n if (!this.hasBeenParsed(connection)) {\n connection.parse({\n text: this.text,\n name: this.name,\n types: this.types,\n })\n }\n\n // because we're mapping user supplied values to\n // postgres wire protocol compatible values it could\n // throw an exception, so try/catch this section\n try {\n connection.bind({\n portal: this.portal,\n statement: this.name,\n values: this.values,\n binary: this.binary,\n valueMapper: utils.prepareValue,\n })\n } catch (err) {\n this.handleError(err, connection)\n return\n }\n\n connection.describe({\n type: 'P',\n name: this.portal || '',\n })\n\n this._getRows(connection, this.rows)\n }\n\n handleCopyInResponse(connection) {\n connection.sendCopyFail('No source stream defined')\n }\n\n handleCopyData(msg, connection) {\n // noop\n }\n}\n\nmodule.exports = Query\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoticeMessage = exports.DataRowMessage = exports.CommandCompleteMessage = exports.ReadyForQueryMessage = exports.NotificationResponseMessage = exports.BackendKeyDataMessage = exports.AuthenticationMD5Password = exports.ParameterStatusMessage = exports.ParameterDescriptionMessage = exports.RowDescriptionMessage = exports.Field = exports.CopyResponse = exports.CopyDataMessage = exports.DatabaseError = exports.copyDone = exports.emptyQuery = exports.replicationStart = exports.portalSuspended = exports.noData = exports.closeComplete = exports.bindComplete = exports.parseComplete = void 0;\nexports.parseComplete = {\n name: 'parseComplete',\n length: 5,\n};\nexports.bindComplete = {\n name: 'bindComplete',\n length: 5,\n};\nexports.closeComplete = {\n name: 'closeComplete',\n length: 5,\n};\nexports.noData = {\n name: 'noData',\n length: 5,\n};\nexports.portalSuspended = {\n name: 'portalSuspended',\n length: 5,\n};\nexports.replicationStart = {\n name: 'replicationStart',\n length: 4,\n};\nexports.emptyQuery = {\n name: 'emptyQuery',\n length: 4,\n};\nexports.copyDone = {\n name: 'copyDone',\n length: 4,\n};\nclass DatabaseError extends Error {\n constructor(message, length, name) {\n super(message);\n this.length = length;\n this.name = name;\n }\n}\nexports.DatabaseError = DatabaseError;\nclass CopyDataMessage {\n constructor(length, chunk) {\n this.length = length;\n this.chunk = chunk;\n this.name = 'copyData';\n }\n}\nexports.CopyDataMessage = CopyDataMessage;\nclass CopyResponse {\n constructor(length, name, binary, columnCount) {\n this.length = length;\n this.name = name;\n this.binary = binary;\n this.columnTypes = new Array(columnCount);\n }\n}\nexports.CopyResponse = CopyResponse;\nclass Field {\n constructor(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, format) {\n this.name = name;\n this.tableID = tableID;\n this.columnID = columnID;\n this.dataTypeID = dataTypeID;\n this.dataTypeSize = dataTypeSize;\n this.dataTypeModifier = dataTypeModifier;\n this.format = format;\n }\n}\nexports.Field = Field;\nclass RowDescriptionMessage {\n constructor(length, fieldCount) {\n this.length = length;\n this.fieldCount = fieldCount;\n this.name = 'rowDescription';\n this.fields = new Array(this.fieldCount);\n }\n}\nexports.RowDescriptionMessage = RowDescriptionMessage;\nclass ParameterDescriptionMessage {\n constructor(length, parameterCount) {\n this.length = length;\n this.parameterCount = parameterCount;\n this.name = 'parameterDescription';\n this.dataTypeIDs = new Array(this.parameterCount);\n }\n}\nexports.ParameterDescriptionMessage = ParameterDescriptionMessage;\nclass ParameterStatusMessage {\n constructor(length, parameterName, parameterValue) {\n this.length = length;\n this.parameterName = parameterName;\n this.parameterValue = parameterValue;\n this.name = 'parameterStatus';\n }\n}\nexports.ParameterStatusMessage = ParameterStatusMessage;\nclass AuthenticationMD5Password {\n constructor(length, salt) {\n this.length = length;\n this.salt = salt;\n this.name = 'authenticationMD5Password';\n }\n}\nexports.AuthenticationMD5Password = AuthenticationMD5Password;\nclass BackendKeyDataMessage {\n constructor(length, processID, secretKey) {\n this.length = length;\n this.processID = processID;\n this.secretKey = secretKey;\n this.name = 'backendKeyData';\n }\n}\nexports.BackendKeyDataMessage = BackendKeyDataMessage;\nclass NotificationResponseMessage {\n constructor(length, processId, channel, payload) {\n this.length = length;\n this.processId = processId;\n this.channel = channel;\n this.payload = payload;\n this.name = 'notification';\n }\n}\nexports.NotificationResponseMessage = NotificationResponseMessage;\nclass ReadyForQueryMessage {\n constructor(length, status) {\n this.length = length;\n this.status = status;\n this.name = 'readyForQuery';\n }\n}\nexports.ReadyForQueryMessage = ReadyForQueryMessage;\nclass CommandCompleteMessage {\n constructor(length, text) {\n this.length = length;\n this.text = text;\n this.name = 'commandComplete';\n }\n}\nexports.CommandCompleteMessage = CommandCompleteMessage;\nclass DataRowMessage {\n constructor(length, fields) {\n this.length = length;\n this.fields = fields;\n this.name = 'dataRow';\n this.fieldCount = fields.length;\n }\n}\nexports.DataRowMessage = DataRowMessage;\nclass NoticeMessage {\n constructor(length, message) {\n this.length = length;\n this.message = message;\n this.name = 'notice';\n }\n}\nexports.NoticeMessage = NoticeMessage;\n//# sourceMappingURL=messages.js.map","\"use strict\";\n//binary data writer tuned for encoding binary specific to the postgres binary protocol\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Writer = void 0;\nclass Writer {\n constructor(size = 256) {\n this.size = size;\n this.offset = 5;\n this.headerPosition = 0;\n this.buffer = Buffer.allocUnsafe(size);\n }\n ensure(size) {\n const remaining = this.buffer.length - this.offset;\n if (remaining < size) {\n const oldBuffer = this.buffer;\n // exponential growth factor of around ~ 1.5\n // https://stackoverflow.com/questions/2269063/buffer-growth-strategy\n const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size;\n this.buffer = Buffer.allocUnsafe(newSize);\n oldBuffer.copy(this.buffer);\n }\n }\n addInt32(num) {\n this.ensure(4);\n this.buffer[this.offset++] = (num >>> 24) & 0xff;\n this.buffer[this.offset++] = (num >>> 16) & 0xff;\n this.buffer[this.offset++] = (num >>> 8) & 0xff;\n this.buffer[this.offset++] = (num >>> 0) & 0xff;\n return this;\n }\n addInt16(num) {\n this.ensure(2);\n this.buffer[this.offset++] = (num >>> 8) & 0xff;\n this.buffer[this.offset++] = (num >>> 0) & 0xff;\n return this;\n }\n addCString(string) {\n if (!string) {\n this.ensure(1);\n }\n else {\n const len = Buffer.byteLength(string);\n this.ensure(len + 1); // +1 for null terminator\n this.buffer.write(string, this.offset, 'utf-8');\n this.offset += len;\n }\n this.buffer[this.offset++] = 0; // null terminator\n return this;\n }\n addString(string = '') {\n const len = Buffer.byteLength(string);\n this.ensure(len);\n this.buffer.write(string, this.offset);\n this.offset += len;\n return this;\n }\n add(otherBuffer) {\n this.ensure(otherBuffer.length);\n otherBuffer.copy(this.buffer, this.offset);\n this.offset += otherBuffer.length;\n return this;\n }\n join(code) {\n if (code) {\n this.buffer[this.headerPosition] = code;\n //length is everything in this packet minus the code\n const length = this.offset - (this.headerPosition + 1);\n this.buffer.writeInt32BE(length, this.headerPosition + 1);\n }\n return this.buffer.slice(code ? 0 : 5, this.offset);\n }\n flush(code) {\n const result = this.join(code);\n this.offset = 5;\n this.headerPosition = 0;\n this.buffer = Buffer.allocUnsafe(this.size);\n return result;\n }\n}\nexports.Writer = Writer;\n//# sourceMappingURL=buffer-writer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serialize = void 0;\nconst buffer_writer_1 = require(\"./buffer-writer\");\nconst writer = new buffer_writer_1.Writer();\nconst startup = (opts) => {\n // protocol version\n writer.addInt16(3).addInt16(0);\n for (const key of Object.keys(opts)) {\n writer.addCString(key).addCString(opts[key]);\n }\n writer.addCString('client_encoding').addCString('UTF8');\n const bodyBuffer = writer.addCString('').flush();\n // this message is sent without a code\n const length = bodyBuffer.length + 4;\n return new buffer_writer_1.Writer().addInt32(length).add(bodyBuffer).flush();\n};\nconst requestSsl = () => {\n const response = Buffer.allocUnsafe(8);\n response.writeInt32BE(8, 0);\n response.writeInt32BE(80877103, 4);\n return response;\n};\nconst password = (password) => {\n return writer.addCString(password).flush(112 /* code.startup */);\n};\nconst sendSASLInitialResponseMessage = function (mechanism, initialResponse) {\n // 0x70 = 'p'\n writer.addCString(mechanism).addInt32(Buffer.byteLength(initialResponse)).addString(initialResponse);\n return writer.flush(112 /* code.startup */);\n};\nconst sendSCRAMClientFinalMessage = function (additionalData) {\n return writer.addString(additionalData).flush(112 /* code.startup */);\n};\nconst query = (text) => {\n return writer.addCString(text).flush(81 /* code.query */);\n};\nconst emptyArray = [];\nconst parse = (query) => {\n // expect something like this:\n // { name: 'queryName',\n // text: 'select * from blah',\n // types: ['int8', 'bool'] }\n // normalize missing query names to allow for null\n const name = query.name || '';\n if (name.length > 63) {\n console.error('Warning! Postgres only supports 63 characters for query names.');\n console.error('You supplied %s (%s)', name, name.length);\n console.error('This can cause conflicts and silent errors executing queries');\n }\n const types = query.types || emptyArray;\n const len = types.length;\n const buffer = writer\n .addCString(name) // name of query\n .addCString(query.text) // actual query text\n .addInt16(len);\n for (let i = 0; i < len; i++) {\n buffer.addInt32(types[i]);\n }\n return writer.flush(80 /* code.parse */);\n};\nconst paramWriter = new buffer_writer_1.Writer();\nconst writeValues = function (values, valueMapper) {\n for (let i = 0; i < values.length; i++) {\n const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i];\n if (mappedVal == null) {\n // add the param type (string) to the writer\n writer.addInt16(0 /* ParamType.STRING */);\n // write -1 to the param writer to indicate null\n paramWriter.addInt32(-1);\n }\n else if (mappedVal instanceof Buffer) {\n // add the param type (binary) to the writer\n writer.addInt16(1 /* ParamType.BINARY */);\n // add the buffer to the param writer\n paramWriter.addInt32(mappedVal.length);\n paramWriter.add(mappedVal);\n }\n else {\n // add the param type (string) to the writer\n writer.addInt16(0 /* ParamType.STRING */);\n paramWriter.addInt32(Buffer.byteLength(mappedVal));\n paramWriter.addString(mappedVal);\n }\n }\n};\nconst bind = (config = {}) => {\n // normalize config\n const portal = config.portal || '';\n const statement = config.statement || '';\n const binary = config.binary || false;\n const values = config.values || emptyArray;\n const len = values.length;\n writer.addCString(portal).addCString(statement);\n writer.addInt16(len);\n writeValues(values, config.valueMapper);\n writer.addInt16(len);\n writer.add(paramWriter.flush());\n // all results use the same format code\n writer.addInt16(1);\n // format code\n writer.addInt16(binary ? 1 /* ParamType.BINARY */ : 0 /* ParamType.STRING */);\n return writer.flush(66 /* code.bind */);\n};\nconst emptyExecute = Buffer.from([69 /* code.execute */, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]);\nconst execute = (config) => {\n // this is the happy path for most queries\n if (!config || (!config.portal && !config.rows)) {\n return emptyExecute;\n }\n const portal = config.portal || '';\n const rows = config.rows || 0;\n const portalLength = Buffer.byteLength(portal);\n const len = 4 + portalLength + 1 + 4;\n // one extra bit for code\n const buff = Buffer.allocUnsafe(1 + len);\n buff[0] = 69 /* code.execute */;\n buff.writeInt32BE(len, 1);\n buff.write(portal, 5, 'utf-8');\n buff[portalLength + 5] = 0; // null terminate portal cString\n buff.writeUInt32BE(rows, buff.length - 4);\n return buff;\n};\nconst cancel = (processID, secretKey) => {\n const buffer = Buffer.allocUnsafe(16);\n buffer.writeInt32BE(16, 0);\n buffer.writeInt16BE(1234, 4);\n buffer.writeInt16BE(5678, 6);\n buffer.writeInt32BE(processID, 8);\n buffer.writeInt32BE(secretKey, 12);\n return buffer;\n};\nconst cstringMessage = (code, string) => {\n const stringLen = Buffer.byteLength(string);\n const len = 4 + stringLen + 1;\n // one extra bit for code\n const buffer = Buffer.allocUnsafe(1 + len);\n buffer[0] = code;\n buffer.writeInt32BE(len, 1);\n buffer.write(string, 5, 'utf-8');\n buffer[len] = 0; // null terminate cString\n return buffer;\n};\nconst emptyDescribePortal = writer.addCString('P').flush(68 /* code.describe */);\nconst emptyDescribeStatement = writer.addCString('S').flush(68 /* code.describe */);\nconst describe = (msg) => {\n return msg.name\n ? cstringMessage(68 /* code.describe */, `${msg.type}${msg.name || ''}`)\n : msg.type === 'P'\n ? emptyDescribePortal\n : emptyDescribeStatement;\n};\nconst close = (msg) => {\n const text = `${msg.type}${msg.name || ''}`;\n return cstringMessage(67 /* code.close */, text);\n};\nconst copyData = (chunk) => {\n return writer.add(chunk).flush(100 /* code.copyFromChunk */);\n};\nconst copyFail = (message) => {\n return cstringMessage(102 /* code.copyFail */, message);\n};\nconst codeOnlyBuffer = (code) => Buffer.from([code, 0x00, 0x00, 0x00, 0x04]);\nconst flushBuffer = codeOnlyBuffer(72 /* code.flush */);\nconst syncBuffer = codeOnlyBuffer(83 /* code.sync */);\nconst endBuffer = codeOnlyBuffer(88 /* code.end */);\nconst copyDoneBuffer = codeOnlyBuffer(99 /* code.copyDone */);\nconst serialize = {\n startup,\n password,\n requestSsl,\n sendSASLInitialResponseMessage,\n sendSCRAMClientFinalMessage,\n query,\n parse,\n bind,\n execute,\n describe,\n close,\n flush: () => flushBuffer,\n sync: () => syncBuffer,\n end: () => endBuffer,\n copyData,\n copyDone: () => copyDoneBuffer,\n copyFail,\n cancel,\n};\nexports.serialize = serialize;\n//# sourceMappingURL=serializer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BufferReader = void 0;\nclass BufferReader {\n constructor(offset = 0) {\n this.offset = offset;\n this.buffer = Buffer.allocUnsafe(0);\n // TODO(bmc): support non-utf8 encoding?\n this.encoding = 'utf-8';\n }\n setBuffer(offset, buffer) {\n this.offset = offset;\n this.buffer = buffer;\n }\n int16() {\n const result = this.buffer.readInt16BE(this.offset);\n this.offset += 2;\n return result;\n }\n byte() {\n const result = this.buffer[this.offset];\n this.offset++;\n return result;\n }\n int32() {\n const result = this.buffer.readInt32BE(this.offset);\n this.offset += 4;\n return result;\n }\n uint32() {\n const result = this.buffer.readUInt32BE(this.offset);\n this.offset += 4;\n return result;\n }\n string(length) {\n const result = this.buffer.toString(this.encoding, this.offset, this.offset + length);\n this.offset += length;\n return result;\n }\n cstring() {\n const start = this.offset;\n let end = start;\n // eslint-disable-next-line no-empty\n while (this.buffer[end++] !== 0) { }\n this.offset = end;\n return this.buffer.toString(this.encoding, start, end - 1);\n }\n bytes(length) {\n const result = this.buffer.slice(this.offset, this.offset + length);\n this.offset += length;\n return result;\n }\n}\nexports.BufferReader = BufferReader;\n//# sourceMappingURL=buffer-reader.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Parser = void 0;\nconst messages_1 = require(\"./messages\");\nconst buffer_reader_1 = require(\"./buffer-reader\");\n// every message is prefixed with a single bye\nconst CODE_LENGTH = 1;\n// every message has an int32 length which includes itself but does\n// NOT include the code in the length\nconst LEN_LENGTH = 4;\nconst HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH;\n// A placeholder for a `BackendMessage`’s length value that will be set after construction.\nconst LATEINIT_LENGTH = -1;\nconst emptyBuffer = Buffer.allocUnsafe(0);\nclass Parser {\n constructor(opts) {\n this.buffer = emptyBuffer;\n this.bufferLength = 0;\n this.bufferOffset = 0;\n this.reader = new buffer_reader_1.BufferReader();\n if ((opts === null || opts === void 0 ? void 0 : opts.mode) === 'binary') {\n throw new Error('Binary mode not supported yet');\n }\n this.mode = (opts === null || opts === void 0 ? void 0 : opts.mode) || 'text';\n }\n parse(buffer, callback) {\n this.mergeBuffer(buffer);\n const bufferFullLength = this.bufferOffset + this.bufferLength;\n let offset = this.bufferOffset;\n while (offset + HEADER_LENGTH <= bufferFullLength) {\n // code is 1 byte long - it identifies the message type\n const code = this.buffer[offset];\n // length is 1 Uint32BE - it is the length of the message EXCLUDING the code\n const length = this.buffer.readUInt32BE(offset + CODE_LENGTH);\n const fullMessageLength = CODE_LENGTH + length;\n if (fullMessageLength + offset <= bufferFullLength) {\n const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer);\n callback(message);\n offset += fullMessageLength;\n }\n else {\n break;\n }\n }\n if (offset === bufferFullLength) {\n // No more use for the buffer\n this.buffer = emptyBuffer;\n this.bufferLength = 0;\n this.bufferOffset = 0;\n }\n else {\n // Adjust the cursors of remainingBuffer\n this.bufferLength = bufferFullLength - offset;\n this.bufferOffset = offset;\n }\n }\n mergeBuffer(buffer) {\n if (this.bufferLength > 0) {\n const newLength = this.bufferLength + buffer.byteLength;\n const newFullLength = newLength + this.bufferOffset;\n if (newFullLength > this.buffer.byteLength) {\n // We can't concat the new buffer with the remaining one\n let newBuffer;\n if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {\n // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer\n newBuffer = this.buffer;\n }\n else {\n // Allocate a new larger buffer\n let newBufferLength = this.buffer.byteLength * 2;\n while (newLength >= newBufferLength) {\n newBufferLength *= 2;\n }\n newBuffer = Buffer.allocUnsafe(newBufferLength);\n }\n // Move the remaining buffer to the new one\n this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength);\n this.buffer = newBuffer;\n this.bufferOffset = 0;\n }\n // Concat the new buffer with the remaining one\n buffer.copy(this.buffer, this.bufferOffset + this.bufferLength);\n this.bufferLength = newLength;\n }\n else {\n this.buffer = buffer;\n this.bufferOffset = 0;\n this.bufferLength = buffer.byteLength;\n }\n }\n handlePacket(offset, code, length, bytes) {\n const { reader } = this;\n // NOTE: This undesirably retains the buffer in `this.reader` if the `parse*Message` calls below throw. However, those should only throw in the case of a protocol error, which normally results in the reader being discarded.\n reader.setBuffer(offset, bytes);\n let message;\n switch (code) {\n case 50 /* MessageCodes.BindComplete */:\n message = messages_1.bindComplete;\n break;\n case 49 /* MessageCodes.ParseComplete */:\n message = messages_1.parseComplete;\n break;\n case 51 /* MessageCodes.CloseComplete */:\n message = messages_1.closeComplete;\n break;\n case 110 /* MessageCodes.NoData */:\n message = messages_1.noData;\n break;\n case 115 /* MessageCodes.PortalSuspended */:\n message = messages_1.portalSuspended;\n break;\n case 99 /* MessageCodes.CopyDone */:\n message = messages_1.copyDone;\n break;\n case 87 /* MessageCodes.ReplicationStart */:\n message = messages_1.replicationStart;\n break;\n case 73 /* MessageCodes.EmptyQuery */:\n message = messages_1.emptyQuery;\n break;\n case 68 /* MessageCodes.DataRow */:\n message = parseDataRowMessage(reader);\n break;\n case 67 /* MessageCodes.CommandComplete */:\n message = parseCommandCompleteMessage(reader);\n break;\n case 90 /* MessageCodes.ReadyForQuery */:\n message = parseReadyForQueryMessage(reader);\n break;\n case 65 /* MessageCodes.NotificationResponse */:\n message = parseNotificationMessage(reader);\n break;\n case 82 /* MessageCodes.AuthenticationResponse */:\n message = parseAuthenticationResponse(reader, length);\n break;\n case 83 /* MessageCodes.ParameterStatus */:\n message = parseParameterStatusMessage(reader);\n break;\n case 75 /* MessageCodes.BackendKeyData */:\n message = parseBackendKeyData(reader);\n break;\n case 69 /* MessageCodes.ErrorMessage */:\n message = parseErrorMessage(reader, 'error');\n break;\n case 78 /* MessageCodes.NoticeMessage */:\n message = parseErrorMessage(reader, 'notice');\n break;\n case 84 /* MessageCodes.RowDescriptionMessage */:\n message = parseRowDescriptionMessage(reader);\n break;\n case 116 /* MessageCodes.ParameterDescriptionMessage */:\n message = parseParameterDescriptionMessage(reader);\n break;\n case 71 /* MessageCodes.CopyIn */:\n message = parseCopyInMessage(reader);\n break;\n case 72 /* MessageCodes.CopyOut */:\n message = parseCopyOutMessage(reader);\n break;\n case 100 /* MessageCodes.CopyData */:\n message = parseCopyData(reader, length);\n break;\n default:\n return new messages_1.DatabaseError('received invalid response: ' + code.toString(16), length, 'error');\n }\n reader.setBuffer(0, emptyBuffer);\n message.length = length;\n return message;\n }\n}\nexports.Parser = Parser;\nconst parseReadyForQueryMessage = (reader) => {\n const status = reader.string(1);\n return new messages_1.ReadyForQueryMessage(LATEINIT_LENGTH, status);\n};\nconst parseCommandCompleteMessage = (reader) => {\n const text = reader.cstring();\n return new messages_1.CommandCompleteMessage(LATEINIT_LENGTH, text);\n};\nconst parseCopyData = (reader, length) => {\n const chunk = reader.bytes(length - 4);\n return new messages_1.CopyDataMessage(LATEINIT_LENGTH, chunk);\n};\nconst parseCopyInMessage = (reader) => parseCopyMessage(reader, 'copyInResponse');\nconst parseCopyOutMessage = (reader) => parseCopyMessage(reader, 'copyOutResponse');\nconst parseCopyMessage = (reader, messageName) => {\n const isBinary = reader.byte() !== 0;\n const columnCount = reader.int16();\n const message = new messages_1.CopyResponse(LATEINIT_LENGTH, messageName, isBinary, columnCount);\n for (let i = 0; i < columnCount; i++) {\n message.columnTypes[i] = reader.int16();\n }\n return message;\n};\nconst parseNotificationMessage = (reader) => {\n const processId = reader.int32();\n const channel = reader.cstring();\n const payload = reader.cstring();\n return new messages_1.NotificationResponseMessage(LATEINIT_LENGTH, processId, channel, payload);\n};\nconst parseRowDescriptionMessage = (reader) => {\n const fieldCount = reader.int16();\n const message = new messages_1.RowDescriptionMessage(LATEINIT_LENGTH, fieldCount);\n for (let i = 0; i < fieldCount; i++) {\n message.fields[i] = parseField(reader);\n }\n return message;\n};\nconst parseField = (reader) => {\n const name = reader.cstring();\n const tableID = reader.uint32();\n const columnID = reader.int16();\n const dataTypeID = reader.uint32();\n const dataTypeSize = reader.int16();\n const dataTypeModifier = reader.int32();\n const mode = reader.int16() === 0 ? 'text' : 'binary';\n return new messages_1.Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode);\n};\nconst parseParameterDescriptionMessage = (reader) => {\n const parameterCount = reader.int16();\n const message = new messages_1.ParameterDescriptionMessage(LATEINIT_LENGTH, parameterCount);\n for (let i = 0; i < parameterCount; i++) {\n message.dataTypeIDs[i] = reader.int32();\n }\n return message;\n};\nconst parseDataRowMessage = (reader) => {\n const fieldCount = reader.int16();\n const fields = new Array(fieldCount);\n for (let i = 0; i < fieldCount; i++) {\n const len = reader.int32();\n // a -1 for length means the value of the field is null\n fields[i] = len === -1 ? null : reader.string(len);\n }\n return new messages_1.DataRowMessage(LATEINIT_LENGTH, fields);\n};\nconst parseParameterStatusMessage = (reader) => {\n const name = reader.cstring();\n const value = reader.cstring();\n return new messages_1.ParameterStatusMessage(LATEINIT_LENGTH, name, value);\n};\nconst parseBackendKeyData = (reader) => {\n const processID = reader.int32();\n const secretKey = reader.int32();\n return new messages_1.BackendKeyDataMessage(LATEINIT_LENGTH, processID, secretKey);\n};\nconst parseAuthenticationResponse = (reader, length) => {\n const code = reader.int32();\n // TODO(bmc): maybe better types here\n const message = {\n name: 'authenticationOk',\n length,\n };\n switch (code) {\n case 0: // AuthenticationOk\n break;\n case 3: // AuthenticationCleartextPassword\n if (message.length === 8) {\n message.name = 'authenticationCleartextPassword';\n }\n break;\n case 5: // AuthenticationMD5Password\n if (message.length === 12) {\n message.name = 'authenticationMD5Password';\n const salt = reader.bytes(4);\n return new messages_1.AuthenticationMD5Password(LATEINIT_LENGTH, salt);\n }\n break;\n case 10: // AuthenticationSASL\n {\n message.name = 'authenticationSASL';\n message.mechanisms = [];\n let mechanism;\n do {\n mechanism = reader.cstring();\n if (mechanism) {\n message.mechanisms.push(mechanism);\n }\n } while (mechanism);\n }\n break;\n case 11: // AuthenticationSASLContinue\n message.name = 'authenticationSASLContinue';\n message.data = reader.string(length - 8);\n break;\n case 12: // AuthenticationSASLFinal\n message.name = 'authenticationSASLFinal';\n message.data = reader.string(length - 8);\n break;\n default:\n throw new Error('Unknown authenticationOk message type ' + code);\n }\n return message;\n};\nconst parseErrorMessage = (reader, name) => {\n const fields = {};\n let fieldType = reader.string(1);\n while (fieldType !== '\\0') {\n fields[fieldType] = reader.cstring();\n fieldType = reader.string(1);\n }\n const messageValue = fields.M;\n const message = name === 'notice'\n ? new messages_1.NoticeMessage(LATEINIT_LENGTH, messageValue)\n : new messages_1.DatabaseError(messageValue, LATEINIT_LENGTH, name);\n message.severity = fields.S;\n message.code = fields.C;\n message.detail = fields.D;\n message.hint = fields.H;\n message.position = fields.P;\n message.internalPosition = fields.p;\n message.internalQuery = fields.q;\n message.where = fields.W;\n message.schema = fields.s;\n message.table = fields.t;\n message.column = fields.c;\n message.dataType = fields.d;\n message.constraint = fields.n;\n message.file = fields.F;\n message.line = fields.L;\n message.routine = fields.R;\n return message;\n};\n//# sourceMappingURL=parser.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DatabaseError = exports.serialize = exports.parse = void 0;\nconst messages_1 = require(\"./messages\");\nObject.defineProperty(exports, \"DatabaseError\", { enumerable: true, get: function () { return messages_1.DatabaseError; } });\nconst serializer_1 = require(\"./serializer\");\nObject.defineProperty(exports, \"serialize\", { enumerable: true, get: function () { return serializer_1.serialize; } });\nconst parser_1 = require(\"./parser\");\nfunction parse(stream, callback) {\n const parser = new parser_1.Parser();\n stream.on('data', (buffer) => parser.parse(buffer, callback));\n return new Promise((resolve) => stream.on('end', () => resolve()));\n}\nexports.parse = parse;\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// This is an empty module that is served up when outside of a workerd environment\n// See the `exports` field in package.json\nexports.default = {};\n//# sourceMappingURL=empty.js.map","const { getStream, getSecureStream } = getStreamFuncs()\n\nmodule.exports = {\n /**\n * Get a socket stream compatible with the current runtime environment.\n * @returns {Duplex}\n */\n getStream,\n /**\n * Get a TLS secured socket, compatible with the current environment,\n * using the socket and other settings given in `options`.\n * @returns {Duplex}\n */\n getSecureStream,\n}\n\n/**\n * The stream functions that work in Node.js\n */\nfunction getNodejsStreamFuncs() {\n function getStream(ssl) {\n const net = require('net')\n return new net.Socket()\n }\n\n function getSecureStream(options) {\n const tls = require('tls')\n return tls.connect(options)\n }\n return {\n getStream,\n getSecureStream,\n }\n}\n\n/**\n * The stream functions that work in Cloudflare Workers\n */\nfunction getCloudflareStreamFuncs() {\n function getStream(ssl) {\n const { CloudflareSocket } = require('pg-cloudflare')\n return new CloudflareSocket(ssl)\n }\n\n function getSecureStream(options) {\n options.socket.startTls(options)\n return options.socket\n }\n return {\n getStream,\n getSecureStream,\n }\n}\n\n/**\n * Are we running in a Cloudflare Worker?\n *\n * @returns true if the code is currently running inside a Cloudflare Worker.\n */\nfunction isCloudflareRuntime() {\n // Since 2022-03-21 the `global_navigator` compatibility flag is on for Cloudflare Workers\n // which means that `navigator.userAgent` will be defined.\n // eslint-disable-next-line no-undef\n if (typeof navigator === 'object' && navigator !== null && typeof navigator.userAgent === 'string') {\n // eslint-disable-next-line no-undef\n return navigator.userAgent === 'Cloudflare-Workers'\n }\n // In case `navigator` or `navigator.userAgent` is not defined then try a more sneaky approach\n if (typeof Response === 'function') {\n const resp = new Response(null, { cf: { thing: true } })\n if (typeof resp.cf === 'object' && resp.cf !== null && resp.cf.thing) {\n return true\n }\n }\n return false\n}\n\nfunction getStreamFuncs() {\n if (isCloudflareRuntime()) {\n return getCloudflareStreamFuncs()\n }\n return getNodejsStreamFuncs()\n}\n","'use strict'\n\nconst EventEmitter = require('events').EventEmitter\n\nconst { parse, serialize } = require('pg-protocol')\nconst { getStream, getSecureStream } = require('./stream')\n\nconst flushBuffer = serialize.flush()\nconst syncBuffer = serialize.sync()\nconst endBuffer = serialize.end()\n\n// TODO(bmc) support binary mode at some point\nclass Connection extends EventEmitter {\n constructor(config) {\n super()\n config = config || {}\n\n this.stream = config.stream || getStream(config.ssl)\n if (typeof this.stream === 'function') {\n this.stream = this.stream(config)\n }\n\n this._keepAlive = config.keepAlive\n this._keepAliveInitialDelayMillis = config.keepAliveInitialDelayMillis\n this.parsedStatements = {}\n this.ssl = config.ssl || false\n this._ending = false\n this._emitMessage = false\n const self = this\n this.on('newListener', function (eventName) {\n if (eventName === 'message') {\n self._emitMessage = true\n }\n })\n }\n\n connect(port, host) {\n const self = this\n\n this._connecting = true\n this.stream.setNoDelay(true)\n this.stream.connect(port, host)\n\n this.stream.once('connect', function () {\n if (self._keepAlive) {\n self.stream.setKeepAlive(true, self._keepAliveInitialDelayMillis)\n }\n self.emit('connect')\n })\n\n const reportStreamError = function (error) {\n // errors about disconnections should be ignored during disconnect\n if (self._ending && (error.code === 'ECONNRESET' || error.code === 'EPIPE')) {\n return\n }\n self.emit('error', error)\n }\n this.stream.on('error', reportStreamError)\n\n this.stream.on('close', function () {\n self.emit('end')\n })\n\n if (!this.ssl) {\n return this.attachListeners(this.stream)\n }\n\n this.stream.once('data', function (buffer) {\n const responseCode = buffer.toString('utf8')\n switch (responseCode) {\n case 'S': // Server supports SSL connections, continue with a secure connection\n break\n case 'N': // Server does not support SSL connections\n self.stream.end()\n return self.emit('error', new Error('The server does not support SSL connections'))\n default:\n // Any other response byte, including 'E' (ErrorResponse) indicating a server error\n self.stream.end()\n return self.emit('error', new Error('There was an error establishing an SSL connection'))\n }\n const options = {\n socket: self.stream,\n }\n\n if (self.ssl !== true) {\n Object.assign(options, self.ssl)\n\n if ('key' in self.ssl) {\n options.key = self.ssl.key\n }\n }\n\n const net = require('net')\n if (net.isIP && net.isIP(host) === 0) {\n options.servername = host\n }\n try {\n self.stream = getSecureStream(options)\n } catch (err) {\n return self.emit('error', err)\n }\n self.attachListeners(self.stream)\n self.stream.on('error', reportStreamError)\n\n self.emit('sslconnect')\n })\n }\n\n attachListeners(stream) {\n parse(stream, (msg) => {\n const eventName = msg.name === 'error' ? 'errorMessage' : msg.name\n if (this._emitMessage) {\n this.emit('message', msg)\n }\n this.emit(eventName, msg)\n })\n }\n\n requestSsl() {\n this.stream.write(serialize.requestSsl())\n }\n\n startup(config) {\n this.stream.write(serialize.startup(config))\n }\n\n cancel(processID, secretKey) {\n this._send(serialize.cancel(processID, secretKey))\n }\n\n password(password) {\n this._send(serialize.password(password))\n }\n\n sendSASLInitialResponseMessage(mechanism, initialResponse) {\n this._send(serialize.sendSASLInitialResponseMessage(mechanism, initialResponse))\n }\n\n sendSCRAMClientFinalMessage(additionalData) {\n this._send(serialize.sendSCRAMClientFinalMessage(additionalData))\n }\n\n _send(buffer) {\n if (!this.stream.writable) {\n return false\n }\n return this.stream.write(buffer)\n }\n\n query(text) {\n this._send(serialize.query(text))\n }\n\n // send parse message\n parse(query) {\n this._send(serialize.parse(query))\n }\n\n // send bind message\n bind(config) {\n this._send(serialize.bind(config))\n }\n\n // send execute message\n execute(config) {\n this._send(serialize.execute(config))\n }\n\n flush() {\n if (this.stream.writable) {\n this.stream.write(flushBuffer)\n }\n }\n\n sync() {\n this._ending = true\n this._send(syncBuffer)\n }\n\n ref() {\n this.stream.ref()\n }\n\n unref() {\n this.stream.unref()\n }\n\n end() {\n // 0x58 = 'X'\n this._ending = true\n if (!this._connecting || !this.stream.writable) {\n this.stream.end()\n return\n }\n return this.stream.write(endBuffer, () => {\n this.stream.end()\n })\n }\n\n close(msg) {\n this._send(serialize.close(msg))\n }\n\n describe(msg) {\n this._send(serialize.describe(msg))\n }\n\n sendCopyFromChunk(chunk) {\n this._send(serialize.copyData(chunk))\n }\n\n endCopyFrom() {\n this._send(serialize.copyDone())\n }\n\n sendCopyFail(msg) {\n this._send(serialize.copyFail(msg))\n }\n}\n\nmodule.exports = Connection\n","/*\nCopyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n*/\n\n'use strict'\n\nconst { Transform } = require('stream')\nconst { StringDecoder } = require('string_decoder')\nconst kLast = Symbol('last')\nconst kDecoder = Symbol('decoder')\n\nfunction transform (chunk, enc, cb) {\n let list\n if (this.overflow) { // Line buffer is full. Skip to start of next line.\n const buf = this[kDecoder].write(chunk)\n list = buf.split(this.matcher)\n\n if (list.length === 1) return cb() // Line ending not found. Discard entire chunk.\n\n // Line ending found. Discard trailing fragment of previous line and reset overflow state.\n list.shift()\n this.overflow = false\n } else {\n this[kLast] += this[kDecoder].write(chunk)\n list = this[kLast].split(this.matcher)\n }\n\n this[kLast] = list.pop()\n\n for (let i = 0; i < list.length; i++) {\n try {\n push(this, this.mapper(list[i]))\n } catch (error) {\n return cb(error)\n }\n }\n\n this.overflow = this[kLast].length > this.maxLength\n if (this.overflow && !this.skipOverflow) {\n cb(new Error('maximum buffer reached'))\n return\n }\n\n cb()\n}\n\nfunction flush (cb) {\n // forward any gibberish left in there\n this[kLast] += this[kDecoder].end()\n\n if (this[kLast]) {\n try {\n push(this, this.mapper(this[kLast]))\n } catch (error) {\n return cb(error)\n }\n }\n\n cb()\n}\n\nfunction push (self, val) {\n if (val !== undefined) {\n self.push(val)\n }\n}\n\nfunction noop (incoming) {\n return incoming\n}\n\nfunction split (matcher, mapper, options) {\n // Set defaults for any arguments not supplied.\n matcher = matcher || /\\r?\\n/\n mapper = mapper || noop\n options = options || {}\n\n // Test arguments explicitly.\n switch (arguments.length) {\n case 1:\n // If mapper is only argument.\n if (typeof matcher === 'function') {\n mapper = matcher\n matcher = /\\r?\\n/\n // If options is only argument.\n } else if (typeof matcher === 'object' && !(matcher instanceof RegExp) && !matcher[Symbol.split]) {\n options = matcher\n matcher = /\\r?\\n/\n }\n break\n\n case 2:\n // If mapper and options are arguments.\n if (typeof matcher === 'function') {\n options = mapper\n mapper = matcher\n matcher = /\\r?\\n/\n // If matcher and options are arguments.\n } else if (typeof mapper === 'object') {\n options = mapper\n mapper = noop\n }\n }\n\n options = Object.assign({}, options)\n options.autoDestroy = true\n options.transform = transform\n options.flush = flush\n options.readableObjectMode = true\n\n const stream = new Transform(options)\n\n stream[kLast] = ''\n stream[kDecoder] = new StringDecoder('utf8')\n stream.matcher = matcher\n stream.mapper = mapper\n stream.maxLength = options.maxLength\n stream.skipOverflow = options.skipOverflow || false\n stream.overflow = false\n stream._destroy = function (err, cb) {\n // Weird Node v12 bug that we need to work around\n this._writableState.errorEmitted = false\n cb(err)\n }\n\n return stream\n}\n\nmodule.exports = split\n","'use strict';\n\nvar path = require('path')\n , Stream = require('stream').Stream\n , split = require('split2')\n , util = require('util')\n , defaultPort = 5432\n , isWin = (process.platform === 'win32')\n , warnStream = process.stderr\n;\n\n\nvar S_IRWXG = 56 // 00070(8)\n , S_IRWXO = 7 // 00007(8)\n , S_IFMT = 61440 // 00170000(8)\n , S_IFREG = 32768 // 0100000(8)\n;\nfunction isRegFile(mode) {\n return ((mode & S_IFMT) == S_IFREG);\n}\n\nvar fieldNames = [ 'host', 'port', 'database', 'user', 'password' ];\nvar nrOfFields = fieldNames.length;\nvar passKey = fieldNames[ nrOfFields -1 ];\n\n\nfunction warn() {\n var isWritable = (\n warnStream instanceof Stream &&\n true === warnStream.writable\n );\n\n if (isWritable) {\n var args = Array.prototype.slice.call(arguments).concat(\"\\n\");\n warnStream.write( util.format.apply(util, args) );\n }\n}\n\n\nObject.defineProperty(module.exports, 'isWin', {\n get : function() {\n return isWin;\n } ,\n set : function(val) {\n isWin = val;\n }\n});\n\n\nmodule.exports.warnTo = function(stream) {\n var old = warnStream;\n warnStream = stream;\n return old;\n};\n\nmodule.exports.getFileName = function(rawEnv){\n var env = rawEnv || process.env;\n var file = env.PGPASSFILE || (\n isWin ?\n path.join( env.APPDATA || './' , 'postgresql', 'pgpass.conf' ) :\n path.join( env.HOME || './', '.pgpass' )\n );\n return file;\n};\n\nmodule.exports.usePgPass = function(stats, fname) {\n if (Object.prototype.hasOwnProperty.call(process.env, 'PGPASSWORD')) {\n return false;\n }\n\n if (isWin) {\n return true;\n }\n\n fname = fname || '<unkn>';\n\n if (! isRegFile(stats.mode)) {\n warn('WARNING: password file \"%s\" is not a plain file', fname);\n return false;\n }\n\n if (stats.mode & (S_IRWXG | S_IRWXO)) {\n /* If password file is insecure, alert the user and ignore it. */\n warn('WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less', fname);\n return false;\n }\n\n return true;\n};\n\n\nvar matcher = module.exports.match = function(connInfo, entry) {\n return fieldNames.slice(0, -1).reduce(function(prev, field, idx){\n if (idx == 1) {\n // the port\n if ( Number( connInfo[field] || defaultPort ) === Number( entry[field] ) ) {\n return prev && true;\n }\n }\n return prev && (\n entry[field] === '*' ||\n entry[field] === connInfo[field]\n );\n }, true);\n};\n\n\nmodule.exports.getPassword = function(connInfo, stream, cb) {\n var pass;\n var lineStream = stream.pipe(split());\n\n function onLine(line) {\n var entry = parseLine(line);\n if (entry && isValidEntry(entry) && matcher(connInfo, entry)) {\n pass = entry[passKey];\n lineStream.end(); // -> calls onEnd(), but pass is set now\n }\n }\n\n var onEnd = function() {\n stream.destroy();\n cb(pass);\n };\n\n var onErr = function(err) {\n stream.destroy();\n warn('WARNING: error on reading file: %s', err);\n cb(undefined);\n };\n\n stream.on('error', onErr);\n lineStream\n .on('data', onLine)\n .on('end', onEnd)\n .on('error', onErr)\n ;\n\n};\n\n\nvar parseLine = module.exports.parseLine = function(line) {\n if (line.length < 11 || line.match(/^\\s+#/)) {\n return null;\n }\n\n var curChar = '';\n var prevChar = '';\n var fieldIdx = 0;\n var startIdx = 0;\n var endIdx = 0;\n var obj = {};\n var isLastField = false;\n var addToObj = function(idx, i0, i1) {\n var field = line.substring(i0, i1);\n\n if (! Object.hasOwnProperty.call(process.env, 'PGPASS_NO_DEESCAPE')) {\n field = field.replace(/\\\\([:\\\\])/g, '$1');\n }\n\n obj[ fieldNames[idx] ] = field;\n };\n\n for (var i = 0 ; i < line.length-1 ; i += 1) {\n curChar = line.charAt(i+1);\n prevChar = line.charAt(i);\n\n isLastField = (fieldIdx == nrOfFields-1);\n\n if (isLastField) {\n addToObj(fieldIdx, startIdx);\n break;\n }\n\n if (i >= 0 && curChar == ':' && prevChar !== '\\\\') {\n addToObj(fieldIdx, startIdx, i+1);\n\n startIdx = i+2;\n fieldIdx += 1;\n }\n }\n\n obj = ( Object.keys(obj).length === nrOfFields ) ? obj : null;\n\n return obj;\n};\n\n\nvar isValidEntry = module.exports.isValidEntry = function(entry){\n var rules = {\n // host\n 0 : function(x){\n return x.length > 0;\n } ,\n // port\n 1 : function(x){\n if (x === '*') {\n return true;\n }\n x = Number(x);\n return (\n isFinite(x) &&\n x > 0 &&\n x < 9007199254740992 &&\n Math.floor(x) === x\n );\n } ,\n // database\n 2 : function(x){\n return x.length > 0;\n } ,\n // username\n 3 : function(x){\n return x.length > 0;\n } ,\n // password\n 4 : function(x){\n return x.length > 0;\n }\n };\n\n for (var idx = 0 ; idx < fieldNames.length ; idx += 1) {\n var rule = rules[idx];\n var value = entry[ fieldNames[idx] ] || '';\n\n var res = rule(value);\n if (!res) {\n return false;\n }\n }\n\n return true;\n};\n\n","'use strict';\n\nvar path = require('path')\n , fs = require('fs')\n , helper = require('./helper.js')\n;\n\n\nmodule.exports = function(connInfo, cb) {\n var file = helper.getFileName();\n \n fs.stat(file, function(err, stat){\n if (err || !helper.usePgPass(stat, file)) {\n return cb(undefined);\n }\n\n var st = fs.createReadStream(file);\n\n helper.getPassword(connInfo, st, cb);\n });\n};\n\nmodule.exports.warnTo = helper.warnTo;\n","const EventEmitter = require('events').EventEmitter\nconst utils = require('./utils')\nconst nodeUtils = require('util')\nconst sasl = require('./crypto/sasl')\nconst TypeOverrides = require('./type-overrides')\n\nconst ConnectionParameters = require('./connection-parameters')\nconst Query = require('./query')\nconst defaults = require('./defaults')\nconst Connection = require('./connection')\nconst crypto = require('./crypto/utils')\n\nconst activeQueryDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Client.activeQuery is deprecated and will be removed in pg@9.0'\n)\n\nconst queryQueueDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Client.queryQueue is deprecated and will be removed in pg@9.0.'\n)\n\nconst pgPassDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'pgpass support is deprecated and will be removed in pg@9.0. ' +\n 'You can provide an async function as the password property to the Client/Pool constructor that returns a password instead. Within this function you can call the pgpass module in your own code.'\n)\n\nconst byoPromiseDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Passing a custom Promise implementation to the Client/Pool constructor is deprecated and will be removed in pg@9.0.'\n)\n\nconst queryQueueLengthDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Calling client.query() when the client is already executing a query is deprecated and will be removed in pg@9.0. Use async/await or an external async flow control mechanism instead.'\n)\n\nclass Client extends EventEmitter {\n constructor(config) {\n super()\n\n this.connectionParameters = new ConnectionParameters(config)\n this.user = this.connectionParameters.user\n this.database = this.connectionParameters.database\n this.port = this.connectionParameters.port\n this.host = this.connectionParameters.host\n\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: this.connectionParameters.password,\n })\n\n this.replication = this.connectionParameters.replication\n\n const c = config || {}\n\n if (c.Promise) {\n byoPromiseDeprecationNotice()\n }\n this._Promise = c.Promise || global.Promise\n this._types = new TypeOverrides(c.types)\n this._ending = false\n this._ended = false\n this._connecting = false\n this._connected = false\n this._connectionError = false\n this._queryable = true\n this._activeQuery = null\n\n this.enableChannelBinding = Boolean(c.enableChannelBinding) // set true to use SCRAM-SHA-256-PLUS when offered\n this.connection =\n c.connection ||\n new Connection({\n stream: c.stream,\n ssl: this.connectionParameters.ssl,\n keepAlive: c.keepAlive || false,\n keepAliveInitialDelayMillis: c.keepAliveInitialDelayMillis || 0,\n encoding: this.connectionParameters.client_encoding || 'utf8',\n })\n this._queryQueue = []\n this.binary = c.binary || defaults.binary\n this.processID = null\n this.secretKey = null\n this.ssl = this.connectionParameters.ssl || false\n // As with Password, make SSL->Key (the private key) non-enumerable.\n // It won't show up in stack traces\n // or if the client is console.logged\n if (this.ssl && this.ssl.key) {\n Object.defineProperty(this.ssl, 'key', {\n enumerable: false,\n })\n }\n\n this._connectionTimeoutMillis = c.connectionTimeoutMillis || 0\n }\n\n get activeQuery() {\n activeQueryDeprecationNotice()\n return this._activeQuery\n }\n\n set activeQuery(val) {\n activeQueryDeprecationNotice()\n this._activeQuery = val\n }\n\n _getActiveQuery() {\n return this._activeQuery\n }\n\n _errorAllQueries(err) {\n const enqueueError = (query) => {\n process.nextTick(() => {\n query.handleError(err, this.connection)\n })\n }\n\n const activeQuery = this._getActiveQuery()\n if (activeQuery) {\n enqueueError(activeQuery)\n this._activeQuery = null\n }\n\n this._queryQueue.forEach(enqueueError)\n this._queryQueue.length = 0\n }\n\n _connect(callback) {\n const self = this\n const con = this.connection\n this._connectionCallback = callback\n\n if (this._connecting || this._connected) {\n const err = new Error('Client has already been connected. You cannot reuse a client.')\n process.nextTick(() => {\n callback(err)\n })\n return\n }\n this._connecting = true\n\n if (this._connectionTimeoutMillis > 0) {\n this.connectionTimeoutHandle = setTimeout(() => {\n con._ending = true\n con.stream.destroy(new Error('timeout expired'))\n }, this._connectionTimeoutMillis)\n\n if (this.connectionTimeoutHandle.unref) {\n this.connectionTimeoutHandle.unref()\n }\n }\n\n if (this.host && this.host.indexOf('/') === 0) {\n con.connect(this.host + '/.s.PGSQL.' + this.port)\n } else {\n con.connect(this.port, this.host)\n }\n\n // once connection is established send startup message\n con.on('connect', function () {\n if (self.ssl) {\n con.requestSsl()\n } else {\n con.startup(self.getStartupConf())\n }\n })\n\n con.on('sslconnect', function () {\n con.startup(self.getStartupConf())\n })\n\n this._attachListeners(con)\n\n con.once('end', () => {\n const error = this._ending ? new Error('Connection terminated') : new Error('Connection terminated unexpectedly')\n\n clearTimeout(this.connectionTimeoutHandle)\n this._errorAllQueries(error)\n this._ended = true\n\n if (!this._ending) {\n // if the connection is ended without us calling .end()\n // on this client then we have an unexpected disconnection\n // treat this as an error unless we've already emitted an error\n // during connection.\n if (this._connecting && !this._connectionError) {\n if (this._connectionCallback) {\n this._connectionCallback(error)\n } else {\n this._handleErrorEvent(error)\n }\n } else if (!this._connectionError) {\n this._handleErrorEvent(error)\n }\n }\n\n process.nextTick(() => {\n this.emit('end')\n })\n })\n }\n\n connect(callback) {\n if (callback) {\n this._connect(callback)\n return\n }\n\n return new this._Promise((resolve, reject) => {\n this._connect((error) => {\n if (error) {\n reject(error)\n } else {\n resolve(this)\n }\n })\n })\n }\n\n _attachListeners(con) {\n // password request handling\n con.on('authenticationCleartextPassword', this._handleAuthCleartextPassword.bind(this))\n // password request handling\n con.on('authenticationMD5Password', this._handleAuthMD5Password.bind(this))\n // password request handling (SASL)\n con.on('authenticationSASL', this._handleAuthSASL.bind(this))\n con.on('authenticationSASLContinue', this._handleAuthSASLContinue.bind(this))\n con.on('authenticationSASLFinal', this._handleAuthSASLFinal.bind(this))\n con.on('backendKeyData', this._handleBackendKeyData.bind(this))\n con.on('error', this._handleErrorEvent.bind(this))\n con.on('errorMessage', this._handleErrorMessage.bind(this))\n con.on('readyForQuery', this._handleReadyForQuery.bind(this))\n con.on('notice', this._handleNotice.bind(this))\n con.on('rowDescription', this._handleRowDescription.bind(this))\n con.on('dataRow', this._handleDataRow.bind(this))\n con.on('portalSuspended', this._handlePortalSuspended.bind(this))\n con.on('emptyQuery', this._handleEmptyQuery.bind(this))\n con.on('commandComplete', this._handleCommandComplete.bind(this))\n con.on('parseComplete', this._handleParseComplete.bind(this))\n con.on('copyInResponse', this._handleCopyInResponse.bind(this))\n con.on('copyData', this._handleCopyData.bind(this))\n con.on('notification', this._handleNotification.bind(this))\n }\n\n _getPassword(cb) {\n const con = this.connection\n if (typeof this.password === 'function') {\n this._Promise\n .resolve()\n .then(() => this.password(this.connectionParameters))\n .then((pass) => {\n if (pass !== undefined) {\n if (typeof pass !== 'string') {\n con.emit('error', new TypeError('Password must be a string'))\n return\n }\n this.connectionParameters.password = this.password = pass\n } else {\n this.connectionParameters.password = this.password = null\n }\n cb()\n })\n .catch((err) => {\n con.emit('error', err)\n })\n } else if (this.password !== null) {\n cb()\n } else {\n try {\n const pgPass = require('pgpass')\n pgPass(this.connectionParameters, (pass) => {\n if (undefined !== pass) {\n pgPassDeprecationNotice()\n this.connectionParameters.password = this.password = pass\n }\n cb()\n })\n } catch (e) {\n this.emit('error', e)\n }\n }\n }\n\n _handleAuthCleartextPassword(msg) {\n this._getPassword(() => {\n this.connection.password(this.password)\n })\n }\n\n _handleAuthMD5Password(msg) {\n this._getPassword(async () => {\n try {\n const hashedPassword = await crypto.postgresMd5PasswordHash(this.user, this.password, msg.salt)\n this.connection.password(hashedPassword)\n } catch (e) {\n this.emit('error', e)\n }\n })\n }\n\n _handleAuthSASL(msg) {\n this._getPassword(() => {\n try {\n this.saslSession = sasl.startSession(msg.mechanisms, this.enableChannelBinding && this.connection.stream)\n this.connection.sendSASLInitialResponseMessage(this.saslSession.mechanism, this.saslSession.response)\n } catch (err) {\n this.connection.emit('error', err)\n }\n })\n }\n\n async _handleAuthSASLContinue(msg) {\n try {\n await sasl.continueSession(\n this.saslSession,\n this.password,\n msg.data,\n this.enableChannelBinding && this.connection.stream\n )\n this.connection.sendSCRAMClientFinalMessage(this.saslSession.response)\n } catch (err) {\n this.connection.emit('error', err)\n }\n }\n\n _handleAuthSASLFinal(msg) {\n try {\n sasl.finalizeSession(this.saslSession, msg.data)\n this.saslSession = null\n } catch (err) {\n this.connection.emit('error', err)\n }\n }\n\n _handleBackendKeyData(msg) {\n this.processID = msg.processID\n this.secretKey = msg.secretKey\n }\n\n _handleReadyForQuery(msg) {\n if (this._connecting) {\n this._connecting = false\n this._connected = true\n clearTimeout(this.connectionTimeoutHandle)\n\n // process possible callback argument to Client#connect\n if (this._connectionCallback) {\n this._connectionCallback(null, this)\n // remove callback for proper error handling\n // after the connect event\n this._connectionCallback = null\n }\n this.emit('connect')\n }\n const activeQuery = this._getActiveQuery()\n this._activeQuery = null\n this.readyForQuery = true\n if (activeQuery) {\n activeQuery.handleReadyForQuery(this.connection)\n }\n this._pulseQueryQueue()\n }\n\n // if we receive an error event or error message\n // during the connection process we handle it here\n _handleErrorWhileConnecting(err) {\n if (this._connectionError) {\n // TODO(bmc): this is swallowing errors - we shouldn't do this\n return\n }\n this._connectionError = true\n clearTimeout(this.connectionTimeoutHandle)\n if (this._connectionCallback) {\n return this._connectionCallback(err)\n }\n this.emit('error', err)\n }\n\n // if we're connected and we receive an error event from the connection\n // this means the socket is dead - do a hard abort of all queries and emit\n // the socket error on the client as well\n _handleErrorEvent(err) {\n if (this._connecting) {\n return this._handleErrorWhileConnecting(err)\n }\n this._queryable = false\n this._errorAllQueries(err)\n this.emit('error', err)\n }\n\n // handle error messages from the postgres backend\n _handleErrorMessage(msg) {\n if (this._connecting) {\n return this._handleErrorWhileConnecting(msg)\n }\n const activeQuery = this._getActiveQuery()\n\n if (!activeQuery) {\n this._handleErrorEvent(msg)\n return\n }\n\n this._activeQuery = null\n activeQuery.handleError(msg, this.connection)\n }\n\n _handleRowDescription(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected rowDescription message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate rowDescription to active query\n activeQuery.handleRowDescription(msg)\n }\n\n _handleDataRow(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected dataRow message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate dataRow to active query\n activeQuery.handleDataRow(msg)\n }\n\n _handlePortalSuspended(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected portalSuspended message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate portalSuspended to active query\n activeQuery.handlePortalSuspended(this.connection)\n }\n\n _handleEmptyQuery(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected emptyQuery message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate emptyQuery to active query\n activeQuery.handleEmptyQuery(this.connection)\n }\n\n _handleCommandComplete(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected commandComplete message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // delegate commandComplete to active query\n activeQuery.handleCommandComplete(msg, this.connection)\n }\n\n _handleParseComplete() {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected parseComplete message from backend.')\n this._handleErrorEvent(error)\n return\n }\n // if a prepared statement has a name and properly parses\n // we track that its already been executed so we don't parse\n // it again on the same client\n if (activeQuery.name) {\n this.connection.parsedStatements[activeQuery.name] = activeQuery.text\n }\n }\n\n _handleCopyInResponse(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected copyInResponse message from backend.')\n this._handleErrorEvent(error)\n return\n }\n activeQuery.handleCopyInResponse(this.connection)\n }\n\n _handleCopyData(msg) {\n const activeQuery = this._getActiveQuery()\n if (activeQuery == null) {\n const error = new Error('Received unexpected copyData message from backend.')\n this._handleErrorEvent(error)\n return\n }\n activeQuery.handleCopyData(msg, this.connection)\n }\n\n _handleNotification(msg) {\n this.emit('notification', msg)\n }\n\n _handleNotice(msg) {\n this.emit('notice', msg)\n }\n\n getStartupConf() {\n const params = this.connectionParameters\n\n const data = {\n user: params.user,\n database: params.database,\n }\n\n const appName = params.application_name || params.fallback_application_name\n if (appName) {\n data.application_name = appName\n }\n if (params.replication) {\n data.replication = '' + params.replication\n }\n if (params.statement_timeout) {\n data.statement_timeout = String(parseInt(params.statement_timeout, 10))\n }\n if (params.lock_timeout) {\n data.lock_timeout = String(parseInt(params.lock_timeout, 10))\n }\n if (params.idle_in_transaction_session_timeout) {\n data.idle_in_transaction_session_timeout = String(parseInt(params.idle_in_transaction_session_timeout, 10))\n }\n if (params.options) {\n data.options = params.options\n }\n\n return data\n }\n\n cancel(client, query) {\n if (client.activeQuery === query) {\n const con = this.connection\n\n if (this.host && this.host.indexOf('/') === 0) {\n con.connect(this.host + '/.s.PGSQL.' + this.port)\n } else {\n con.connect(this.port, this.host)\n }\n\n // once connection is established send cancel message\n con.on('connect', function () {\n con.cancel(client.processID, client.secretKey)\n })\n } else if (client._queryQueue.indexOf(query) !== -1) {\n client._queryQueue.splice(client._queryQueue.indexOf(query), 1)\n }\n }\n\n setTypeParser(oid, format, parseFn) {\n return this._types.setTypeParser(oid, format, parseFn)\n }\n\n getTypeParser(oid, format) {\n return this._types.getTypeParser(oid, format)\n }\n\n // escapeIdentifier and escapeLiteral moved to utility functions & exported\n // on PG\n // re-exported here for backwards compatibility\n escapeIdentifier(str) {\n return utils.escapeIdentifier(str)\n }\n\n escapeLiteral(str) {\n return utils.escapeLiteral(str)\n }\n\n _pulseQueryQueue() {\n if (this.readyForQuery === true) {\n this._activeQuery = this._queryQueue.shift()\n const activeQuery = this._getActiveQuery()\n if (activeQuery) {\n this.readyForQuery = false\n this.hasExecuted = true\n\n const queryError = activeQuery.submit(this.connection)\n if (queryError) {\n process.nextTick(() => {\n activeQuery.handleError(queryError, this.connection)\n this.readyForQuery = true\n this._pulseQueryQueue()\n })\n }\n } else if (this.hasExecuted) {\n this._activeQuery = null\n this.emit('drain')\n }\n }\n }\n\n query(config, values, callback) {\n // can take in strings, config object or query object\n let query\n let result\n let readTimeout\n let readTimeoutTimer\n let queryCallback\n\n if (config === null || config === undefined) {\n throw new TypeError('Client was passed a null or undefined query')\n } else if (typeof config.submit === 'function') {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n result = query = config\n if (!query.callback) {\n if (typeof values === 'function') {\n query.callback = values\n } else if (callback) {\n query.callback = callback\n }\n }\n } else {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n query = new Query(config, values, callback)\n if (!query.callback) {\n result = new this._Promise((resolve, reject) => {\n query.callback = (err, res) => (err ? reject(err) : resolve(res))\n }).catch((err) => {\n // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the\n // application that created the query\n Error.captureStackTrace(err)\n throw err\n })\n }\n }\n\n if (readTimeout) {\n queryCallback = query.callback || (() => {})\n\n readTimeoutTimer = setTimeout(() => {\n const error = new Error('Query read timeout')\n\n process.nextTick(() => {\n query.handleError(error, this.connection)\n })\n\n queryCallback(error)\n\n // we already returned an error,\n // just do nothing if query completes\n query.callback = () => {}\n\n // Remove from queue\n const index = this._queryQueue.indexOf(query)\n if (index > -1) {\n this._queryQueue.splice(index, 1)\n }\n\n this._pulseQueryQueue()\n }, readTimeout)\n\n query.callback = (err, res) => {\n clearTimeout(readTimeoutTimer)\n queryCallback(err, res)\n }\n }\n\n if (this.binary && !query.binary) {\n query.binary = true\n }\n\n if (query._result && !query._result._types) {\n query._result._types = this._types\n }\n\n if (!this._queryable) {\n process.nextTick(() => {\n query.handleError(new Error('Client has encountered a connection error and is not queryable'), this.connection)\n })\n return result\n }\n\n if (this._ending) {\n process.nextTick(() => {\n query.handleError(new Error('Client was closed and is not queryable'), this.connection)\n })\n return result\n }\n\n if (this._queryQueue.length > 0) {\n queryQueueLengthDeprecationNotice()\n }\n this._queryQueue.push(query)\n this._pulseQueryQueue()\n return result\n }\n\n ref() {\n this.connection.ref()\n }\n\n unref() {\n this.connection.unref()\n }\n\n end(cb) {\n this._ending = true\n\n // if we have never connected, then end is a noop, callback immediately\n if (!this.connection._connecting || this._ended) {\n if (cb) {\n cb()\n } else {\n return this._Promise.resolve()\n }\n }\n\n if (this._getActiveQuery() || !this._queryable) {\n // if we have an active query we need to force a disconnect\n // on the socket - otherwise a hung query could block end forever\n this.connection.stream.destroy()\n } else {\n this.connection.end()\n }\n\n if (cb) {\n this.connection.once('end', cb)\n } else {\n return new this._Promise((resolve) => {\n this.connection.once('end', resolve)\n })\n }\n }\n get queryQueue() {\n queryQueueDeprecationNotice()\n return this._queryQueue\n }\n}\n\n// expose a Query constructor\nClient.Query = Query\n\nmodule.exports = Client\n","'use strict'\nconst EventEmitter = require('events').EventEmitter\n\nconst NOOP = function () {}\n\nconst removeWhere = (list, predicate) => {\n const i = list.findIndex(predicate)\n\n return i === -1 ? undefined : list.splice(i, 1)[0]\n}\n\nclass IdleItem {\n constructor(client, idleListener, timeoutId) {\n this.client = client\n this.idleListener = idleListener\n this.timeoutId = timeoutId\n }\n}\n\nclass PendingItem {\n constructor(callback) {\n this.callback = callback\n }\n}\n\nfunction throwOnDoubleRelease() {\n throw new Error('Release called on client which has already been released to the pool.')\n}\n\nfunction promisify(Promise, callback) {\n if (callback) {\n return { callback: callback, result: undefined }\n }\n let rej\n let res\n const cb = function (err, client) {\n err ? rej(err) : res(client)\n }\n const result = new Promise(function (resolve, reject) {\n res = resolve\n rej = reject\n }).catch((err) => {\n // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the\n // application that created the query\n Error.captureStackTrace(err)\n throw err\n })\n return { callback: cb, result: result }\n}\n\nfunction makeIdleListener(pool, client) {\n return function idleListener(err) {\n err.client = client\n\n client.removeListener('error', idleListener)\n client.on('error', () => {\n pool.log('additional client error after disconnection due to error', err)\n })\n pool._remove(client)\n // TODO - document that once the pool emits an error\n // the client has already been closed & purged and is unusable\n pool.emit('error', err, client)\n }\n}\n\nclass Pool extends EventEmitter {\n constructor(options, Client) {\n super()\n this.options = Object.assign({}, options)\n\n if (options != null && 'password' in options) {\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this.options, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: options.password,\n })\n }\n if (options != null && options.ssl && options.ssl.key) {\n // \"hiding\" the ssl->key so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this.options.ssl, 'key', {\n enumerable: false,\n })\n }\n\n this.options.max = this.options.max || this.options.poolSize || 10\n this.options.min = this.options.min || 0\n this.options.maxUses = this.options.maxUses || Infinity\n this.options.allowExitOnIdle = this.options.allowExitOnIdle || false\n this.options.maxLifetimeSeconds = this.options.maxLifetimeSeconds || 0\n this.log = this.options.log || function () {}\n this.Client = this.options.Client || Client || require('pg').Client\n this.Promise = this.options.Promise || global.Promise\n\n if (typeof this.options.idleTimeoutMillis === 'undefined') {\n this.options.idleTimeoutMillis = 10000\n }\n\n this._clients = []\n this._idle = []\n this._expired = new WeakSet()\n this._pendingQueue = []\n this._endCallback = undefined\n this.ending = false\n this.ended = false\n }\n\n _promiseTry(f) {\n const Promise = this.Promise\n if (typeof Promise.try === 'function') {\n return Promise.try(f)\n }\n return new Promise((resolve) => resolve(f()))\n }\n\n _isFull() {\n return this._clients.length >= this.options.max\n }\n\n _isAboveMin() {\n return this._clients.length > this.options.min\n }\n\n _pulseQueue() {\n this.log('pulse queue')\n if (this.ended) {\n this.log('pulse queue ended')\n return\n }\n if (this.ending) {\n this.log('pulse queue on ending')\n if (this._idle.length) {\n this._idle.slice().map((item) => {\n this._remove(item.client)\n })\n }\n if (!this._clients.length) {\n this.ended = true\n this._endCallback()\n }\n return\n }\n\n // if we don't have any waiting, do nothing\n if (!this._pendingQueue.length) {\n this.log('no queued requests')\n return\n }\n // if we don't have any idle clients and we have no more room do nothing\n if (!this._idle.length && this._isFull()) {\n return\n }\n const pendingItem = this._pendingQueue.shift()\n if (this._idle.length) {\n const idleItem = this._idle.pop()\n clearTimeout(idleItem.timeoutId)\n const client = idleItem.client\n client.ref && client.ref()\n const idleListener = idleItem.idleListener\n\n return this._acquireClient(client, pendingItem, idleListener, false)\n }\n if (!this._isFull()) {\n return this.newClient(pendingItem)\n }\n throw new Error('unexpected condition')\n }\n\n _remove(client, callback) {\n const removed = removeWhere(this._idle, (item) => item.client === client)\n\n if (removed !== undefined) {\n clearTimeout(removed.timeoutId)\n }\n\n this._clients = this._clients.filter((c) => c !== client)\n const context = this\n client.end(() => {\n context.emit('remove', client)\n\n if (typeof callback === 'function') {\n callback()\n }\n })\n }\n\n connect(cb) {\n if (this.ending) {\n const err = new Error('Cannot use a pool after calling end on the pool')\n return cb ? cb(err) : this.Promise.reject(err)\n }\n\n const response = promisify(this.Promise, cb)\n const result = response.result\n\n // if we don't have to connect a new client, don't do so\n if (this._isFull() || this._idle.length) {\n // if we have idle clients schedule a pulse immediately\n if (this._idle.length) {\n process.nextTick(() => this._pulseQueue())\n }\n\n if (!this.options.connectionTimeoutMillis) {\n this._pendingQueue.push(new PendingItem(response.callback))\n return result\n }\n\n const queueCallback = (err, res, done) => {\n clearTimeout(tid)\n response.callback(err, res, done)\n }\n\n const pendingItem = new PendingItem(queueCallback)\n\n // set connection timeout on checking out an existing client\n const tid = setTimeout(() => {\n // remove the callback from pending waiters because\n // we're going to call it with a timeout error\n removeWhere(this._pendingQueue, (i) => i.callback === queueCallback)\n pendingItem.timedOut = true\n response.callback(new Error('timeout exceeded when trying to connect'))\n }, this.options.connectionTimeoutMillis)\n\n if (tid.unref) {\n tid.unref()\n }\n\n this._pendingQueue.push(pendingItem)\n return result\n }\n\n this.newClient(new PendingItem(response.callback))\n\n return result\n }\n\n newClient(pendingItem) {\n const client = new this.Client(this.options)\n this._clients.push(client)\n const idleListener = makeIdleListener(this, client)\n\n this.log('checking client timeout')\n\n // connection timeout logic\n let tid\n let timeoutHit = false\n if (this.options.connectionTimeoutMillis) {\n tid = setTimeout(() => {\n if (client.connection) {\n this.log('ending client due to timeout')\n timeoutHit = true\n client.connection.stream.destroy()\n } else if (!client.isConnected()) {\n this.log('ending client due to timeout')\n timeoutHit = true\n // force kill the node driver, and let libpq do its teardown\n client.end()\n }\n }, this.options.connectionTimeoutMillis)\n }\n\n this.log('connecting new client')\n client.connect((err) => {\n if (tid) {\n clearTimeout(tid)\n }\n client.on('error', idleListener)\n if (err) {\n this.log('client failed to connect', err)\n // remove the dead client from our list of clients\n this._clients = this._clients.filter((c) => c !== client)\n if (timeoutHit) {\n err = new Error('Connection terminated due to connection timeout', { cause: err })\n }\n\n // this client won’t be released, so move on immediately\n this._pulseQueue()\n\n if (!pendingItem.timedOut) {\n pendingItem.callback(err, undefined, NOOP)\n }\n } else {\n this.log('new client connected')\n\n if (this.options.onConnect) {\n this._promiseTry(() => this.options.onConnect(client)).then(\n () => {\n this._afterConnect(client, pendingItem, idleListener)\n },\n (hookErr) => {\n this._clients = this._clients.filter((c) => c !== client)\n client.end(() => {\n this._pulseQueue()\n if (!pendingItem.timedOut) {\n pendingItem.callback(hookErr, undefined, NOOP)\n }\n })\n }\n )\n return\n }\n\n return this._afterConnect(client, pendingItem, idleListener)\n }\n })\n }\n\n _afterConnect(client, pendingItem, idleListener) {\n if (this.options.maxLifetimeSeconds !== 0) {\n const maxLifetimeTimeout = setTimeout(() => {\n this.log('ending client due to expired lifetime')\n this._expired.add(client)\n const idleIndex = this._idle.findIndex((idleItem) => idleItem.client === client)\n if (idleIndex !== -1) {\n this._acquireClient(\n client,\n new PendingItem((err, client, clientRelease) => clientRelease()),\n idleListener,\n false\n )\n }\n }, this.options.maxLifetimeSeconds * 1000)\n\n maxLifetimeTimeout.unref()\n client.once('end', () => clearTimeout(maxLifetimeTimeout))\n }\n\n return this._acquireClient(client, pendingItem, idleListener, true)\n }\n\n // acquire a client for a pending work item\n _acquireClient(client, pendingItem, idleListener, isNew) {\n if (isNew) {\n this.emit('connect', client)\n }\n\n this.emit('acquire', client)\n\n client.release = this._releaseOnce(client, idleListener)\n\n client.removeListener('error', idleListener)\n\n if (!pendingItem.timedOut) {\n if (isNew && this.options.verify) {\n this.options.verify(client, (err) => {\n if (err) {\n client.release(err)\n return pendingItem.callback(err, undefined, NOOP)\n }\n\n pendingItem.callback(undefined, client, client.release)\n })\n } else {\n pendingItem.callback(undefined, client, client.release)\n }\n } else {\n if (isNew && this.options.verify) {\n this.options.verify(client, client.release)\n } else {\n client.release()\n }\n }\n }\n\n // returns a function that wraps _release and throws if called more than once\n _releaseOnce(client, idleListener) {\n let released = false\n\n return (err) => {\n if (released) {\n throwOnDoubleRelease()\n }\n\n released = true\n this._release(client, idleListener, err)\n }\n }\n\n // release a client back to the poll, include an error\n // to remove it from the pool\n _release(client, idleListener, err) {\n client.on('error', idleListener)\n\n client._poolUseCount = (client._poolUseCount || 0) + 1\n\n this.emit('release', err, client)\n\n // TODO(bmc): expose a proper, public interface _queryable and _ending\n if (err || this.ending || !client._queryable || client._ending || client._poolUseCount >= this.options.maxUses) {\n if (client._poolUseCount >= this.options.maxUses) {\n this.log('remove expended client')\n }\n\n return this._remove(client, this._pulseQueue.bind(this))\n }\n\n const isExpired = this._expired.has(client)\n if (isExpired) {\n this.log('remove expired client')\n this._expired.delete(client)\n return this._remove(client, this._pulseQueue.bind(this))\n }\n\n // idle timeout\n let tid\n if (this.options.idleTimeoutMillis && this._isAboveMin()) {\n tid = setTimeout(() => {\n if (this._isAboveMin()) {\n this.log('remove idle client')\n this._remove(client, this._pulseQueue.bind(this))\n }\n }, this.options.idleTimeoutMillis)\n\n if (this.options.allowExitOnIdle) {\n // allow Node to exit if this is all that's left\n tid.unref()\n }\n }\n\n if (this.options.allowExitOnIdle) {\n client.unref()\n }\n\n this._idle.push(new IdleItem(client, idleListener, tid))\n this._pulseQueue()\n }\n\n query(text, values, cb) {\n // guard clause against passing a function as the first parameter\n if (typeof text === 'function') {\n const response = promisify(this.Promise, text)\n setImmediate(function () {\n return response.callback(new Error('Passing a function as the first parameter to pool.query is not supported'))\n })\n return response.result\n }\n\n // allow plain text query without values\n if (typeof values === 'function') {\n cb = values\n values = undefined\n }\n const response = promisify(this.Promise, cb)\n cb = response.callback\n\n this.connect((err, client) => {\n if (err) {\n return cb(err)\n }\n\n let clientReleased = false\n const onError = (err) => {\n if (clientReleased) {\n return\n }\n clientReleased = true\n client.release(err)\n cb(err)\n }\n\n client.once('error', onError)\n this.log('dispatching query')\n try {\n client.query(text, values, (err, res) => {\n this.log('query dispatched')\n client.removeListener('error', onError)\n if (clientReleased) {\n return\n }\n clientReleased = true\n client.release(err)\n if (err) {\n return cb(err)\n }\n return cb(undefined, res)\n })\n } catch (err) {\n client.release(err)\n return cb(err)\n }\n })\n return response.result\n }\n\n end(cb) {\n this.log('ending')\n if (this.ending) {\n const err = new Error('Called end on pool more than once')\n return cb ? cb(err) : this.Promise.reject(err)\n }\n this.ending = true\n const promised = promisify(this.Promise, cb)\n this._endCallback = promised.callback\n this._pulseQueue()\n return promised.result\n }\n\n get waitingCount() {\n return this._pendingQueue.length\n }\n\n get idleCount() {\n return this._idle.length\n }\n\n get expiredCount() {\n return this._clients.reduce((acc, client) => acc + (this._expired.has(client) ? 1 : 0), 0)\n }\n\n get totalCount() {\n return this._clients.length\n }\n}\nmodule.exports = Pool\n","'use strict'\n\nconst EventEmitter = require('events').EventEmitter\nconst util = require('util')\nconst utils = require('../utils')\n\nconst NativeQuery = (module.exports = function (config, values, callback) {\n EventEmitter.call(this)\n config = utils.normalizeQueryConfig(config, values, callback)\n this.text = config.text\n this.values = config.values\n this.name = config.name\n this.queryMode = config.queryMode\n this.callback = config.callback\n this.state = 'new'\n this._arrayMode = config.rowMode === 'array'\n\n // if the 'row' event is listened for\n // then emit them as they come in\n // without setting singleRowMode to true\n // this has almost no meaning because libpq\n // reads all rows into memory before returning any\n this._emitRowEvents = false\n this.on(\n 'newListener',\n function (event) {\n if (event === 'row') this._emitRowEvents = true\n }.bind(this)\n )\n})\n\nutil.inherits(NativeQuery, EventEmitter)\n\nconst errorFieldMap = {\n sqlState: 'code',\n statementPosition: 'position',\n messagePrimary: 'message',\n context: 'where',\n schemaName: 'schema',\n tableName: 'table',\n columnName: 'column',\n dataTypeName: 'dataType',\n constraintName: 'constraint',\n sourceFile: 'file',\n sourceLine: 'line',\n sourceFunction: 'routine',\n}\n\nNativeQuery.prototype.handleError = function (err) {\n // copy pq error fields into the error object\n const fields = this.native.pq.resultErrorFields()\n if (fields) {\n for (const key in fields) {\n const normalizedFieldName = errorFieldMap[key] || key\n err[normalizedFieldName] = fields[key]\n }\n }\n if (this.callback) {\n this.callback(err)\n } else {\n this.emit('error', err)\n }\n this.state = 'error'\n}\n\nNativeQuery.prototype.then = function (onSuccess, onFailure) {\n return this._getPromise().then(onSuccess, onFailure)\n}\n\nNativeQuery.prototype.catch = function (callback) {\n return this._getPromise().catch(callback)\n}\n\nNativeQuery.prototype._getPromise = function () {\n if (this._promise) return this._promise\n this._promise = new Promise(\n function (resolve, reject) {\n this._once('end', resolve)\n this._once('error', reject)\n }.bind(this)\n )\n return this._promise\n}\n\nNativeQuery.prototype.submit = function (client) {\n this.state = 'running'\n const self = this\n this.native = client.native\n client.native.arrayMode = this._arrayMode\n\n let after = function (err, rows, results) {\n client.native.arrayMode = false\n setImmediate(function () {\n self.emit('_done')\n })\n\n // handle possible query error\n if (err) {\n return self.handleError(err)\n }\n\n // emit row events for each row in the result\n if (self._emitRowEvents) {\n if (results.length > 1) {\n rows.forEach((rowOfRows, i) => {\n rowOfRows.forEach((row) => {\n self.emit('row', row, results[i])\n })\n })\n } else {\n rows.forEach(function (row) {\n self.emit('row', row, results)\n })\n }\n }\n\n // handle successful result\n self.state = 'end'\n self.emit('end', results)\n if (self.callback) {\n self.callback(null, results)\n }\n }\n\n if (process.domain) {\n after = process.domain.bind(after)\n }\n\n // named query\n if (this.name) {\n if (this.name.length > 63) {\n console.error('Warning! Postgres only supports 63 characters for query names.')\n console.error('You supplied %s (%s)', this.name, this.name.length)\n console.error('This can cause conflicts and silent errors executing queries')\n }\n const values = (this.values || []).map(utils.prepareValue)\n\n // check if the client has already executed this named query\n // if so...just execute it again - skip the planning phase\n if (client.namedQueries[this.name]) {\n if (this.text && client.namedQueries[this.name] !== this.text) {\n const err = new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)\n return after(err)\n }\n return client.native.execute(this.name, values, after)\n }\n // plan the named query the first time, then execute it\n return client.native.prepare(this.name, this.text, values.length, function (err) {\n if (err) return after(err)\n client.namedQueries[self.name] = self.text\n return self.native.execute(self.name, values, after)\n })\n } else if (this.values) {\n if (!Array.isArray(this.values)) {\n const err = new Error('Query values must be an array')\n return after(err)\n }\n const vals = this.values.map(utils.prepareValue)\n client.native.query(this.text, vals, after)\n } else if (this.queryMode === 'extended') {\n client.native.query(this.text, [], after)\n } else {\n client.native.query(this.text, after)\n }\n}\n","const nodeUtils = require('util')\n// eslint-disable-next-line\nvar Native\n// eslint-disable-next-line no-useless-catch\ntry {\n // Wrap this `require()` in a try-catch to avoid upstream bundlers from complaining that this might not be available since it is an optional import\n Native = require('pg-native')\n} catch (e) {\n throw e\n}\nconst TypeOverrides = require('../type-overrides')\nconst EventEmitter = require('events').EventEmitter\nconst util = require('util')\nconst ConnectionParameters = require('../connection-parameters')\n\nconst NativeQuery = require('./query')\n\nconst queryQueueLengthDeprecationNotice = nodeUtils.deprecate(\n () => {},\n 'Calling client.query() when the client is already executing a query is deprecated and will be removed in pg@9.0. Use async/await or an external async flow control mechanism instead.'\n)\n\nconst Client = (module.exports = function (config) {\n EventEmitter.call(this)\n config = config || {}\n\n this._Promise = config.Promise || global.Promise\n this._types = new TypeOverrides(config.types)\n\n this.native = new Native({\n types: this._types,\n })\n\n this._queryQueue = []\n this._ending = false\n this._connecting = false\n this._connected = false\n this._queryable = true\n\n // keep these on the object for legacy reasons\n // for the time being. TODO: deprecate all this jazz\n const cp = (this.connectionParameters = new ConnectionParameters(config))\n if (config.nativeConnectionString) cp.nativeConnectionString = config.nativeConnectionString\n this.user = cp.user\n\n // \"hiding\" the password so it doesn't show up in stack traces\n // or if the client is console.logged\n Object.defineProperty(this, 'password', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: cp.password,\n })\n this.database = cp.database\n this.host = cp.host\n this.port = cp.port\n\n // a hash to hold named queries\n this.namedQueries = {}\n})\n\nClient.Query = NativeQuery\n\nutil.inherits(Client, EventEmitter)\n\nClient.prototype._errorAllQueries = function (err) {\n const enqueueError = (query) => {\n process.nextTick(() => {\n query.native = this.native\n query.handleError(err)\n })\n }\n\n if (this._hasActiveQuery()) {\n enqueueError(this._activeQuery)\n this._activeQuery = null\n }\n\n this._queryQueue.forEach(enqueueError)\n this._queryQueue.length = 0\n}\n\n// connect to the backend\n// pass an optional callback to be called once connected\n// or with an error if there was a connection error\nClient.prototype._connect = function (cb) {\n const self = this\n\n if (this._connecting) {\n process.nextTick(() => cb(new Error('Client has already been connected. You cannot reuse a client.')))\n return\n }\n\n this._connecting = true\n\n this.connectionParameters.getLibpqConnectionString(function (err, conString) {\n if (self.connectionParameters.nativeConnectionString) conString = self.connectionParameters.nativeConnectionString\n if (err) return cb(err)\n self.native.connect(conString, function (err) {\n if (err) {\n self.native.end()\n return cb(err)\n }\n\n // set internal states to connected\n self._connected = true\n\n // handle connection errors from the native layer\n self.native.on('error', function (err) {\n self._queryable = false\n self._errorAllQueries(err)\n self.emit('error', err)\n })\n\n self.native.on('notification', function (msg) {\n self.emit('notification', {\n channel: msg.relname,\n payload: msg.extra,\n })\n })\n\n // signal we are connected now\n self.emit('connect')\n self._pulseQueryQueue(true)\n\n cb(null, this)\n })\n })\n}\n\nClient.prototype.connect = function (callback) {\n if (callback) {\n this._connect(callback)\n return\n }\n\n return new this._Promise((resolve, reject) => {\n this._connect((error) => {\n if (error) {\n reject(error)\n } else {\n resolve(this)\n }\n })\n })\n}\n\n// send a query to the server\n// this method is highly overloaded to take\n// 1) string query, optional array of parameters, optional function callback\n// 2) object query with {\n// string query\n// optional array values,\n// optional function callback instead of as a separate parameter\n// optional string name to name & cache the query plan\n// optional string rowMode = 'array' for an array of results\n// }\nClient.prototype.query = function (config, values, callback) {\n let query\n let result\n let readTimeout\n let readTimeoutTimer\n let queryCallback\n\n if (config === null || config === undefined) {\n throw new TypeError('Client was passed a null or undefined query')\n } else if (typeof config.submit === 'function') {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n result = query = config\n // accept query(new Query(...), (err, res) => { }) style\n if (typeof values === 'function') {\n config.callback = values\n }\n } else {\n readTimeout = config.query_timeout || this.connectionParameters.query_timeout\n query = new NativeQuery(config, values, callback)\n if (!query.callback) {\n let resolveOut, rejectOut\n result = new this._Promise((resolve, reject) => {\n resolveOut = resolve\n rejectOut = reject\n }).catch((err) => {\n Error.captureStackTrace(err)\n throw err\n })\n query.callback = (err, res) => (err ? rejectOut(err) : resolveOut(res))\n }\n }\n\n if (readTimeout) {\n queryCallback = query.callback || (() => {})\n\n readTimeoutTimer = setTimeout(() => {\n const error = new Error('Query read timeout')\n\n process.nextTick(() => {\n query.handleError(error, this.connection)\n })\n\n queryCallback(error)\n\n // we already returned an error,\n // just do nothing if query completes\n query.callback = () => {}\n\n // Remove from queue\n const index = this._queryQueue.indexOf(query)\n if (index > -1) {\n this._queryQueue.splice(index, 1)\n }\n\n this._pulseQueryQueue()\n }, readTimeout)\n\n query.callback = (err, res) => {\n clearTimeout(readTimeoutTimer)\n queryCallback(err, res)\n }\n }\n\n if (!this._queryable) {\n query.native = this.native\n process.nextTick(() => {\n query.handleError(new Error('Client has encountered a connection error and is not queryable'))\n })\n return result\n }\n\n if (this._ending) {\n query.native = this.native\n process.nextTick(() => {\n query.handleError(new Error('Client was closed and is not queryable'))\n })\n return result\n }\n\n if (this._queryQueue.length > 0) {\n queryQueueLengthDeprecationNotice()\n }\n\n this._queryQueue.push(query)\n this._pulseQueryQueue()\n return result\n}\n\n// disconnect from the backend server\nClient.prototype.end = function (cb) {\n const self = this\n\n this._ending = true\n\n if (!this._connected) {\n this.once('connect', this.end.bind(this, cb))\n }\n let result\n if (!cb) {\n result = new this._Promise(function (resolve, reject) {\n cb = (err) => (err ? reject(err) : resolve())\n })\n }\n\n this.native.end(function () {\n self._connected = false\n\n self._errorAllQueries(new Error('Connection terminated'))\n\n process.nextTick(() => {\n self.emit('end')\n if (cb) cb()\n })\n })\n return result\n}\n\nClient.prototype._hasActiveQuery = function () {\n return this._activeQuery && this._activeQuery.state !== 'error' && this._activeQuery.state !== 'end'\n}\n\nClient.prototype._pulseQueryQueue = function (initialConnection) {\n if (!this._connected) {\n return\n }\n if (this._hasActiveQuery()) {\n return\n }\n const query = this._queryQueue.shift()\n if (!query) {\n if (!initialConnection) {\n this.emit('drain')\n }\n return\n }\n this._activeQuery = query\n query.submit(this)\n const self = this\n query.once('_done', function () {\n self._pulseQueryQueue()\n })\n}\n\n// attempt to cancel an in-progress query\nClient.prototype.cancel = function (query) {\n if (this._activeQuery === query) {\n this.native.cancel(function () {})\n } else if (this._queryQueue.indexOf(query) !== -1) {\n this._queryQueue.splice(this._queryQueue.indexOf(query), 1)\n }\n}\n\nClient.prototype.ref = function () {}\nClient.prototype.unref = function () {}\n\nClient.prototype.setTypeParser = function (oid, format, parseFn) {\n return this._types.setTypeParser(oid, format, parseFn)\n}\n\nClient.prototype.getTypeParser = function (oid, format) {\n return this._types.getTypeParser(oid, format)\n}\n\nClient.prototype.isConnected = function () {\n return this._connected\n}\n","'use strict'\nmodule.exports = require('./client')\n","'use strict'\n\nconst Client = require('./client')\nconst defaults = require('./defaults')\nconst Connection = require('./connection')\nconst Result = require('./result')\nconst utils = require('./utils')\nconst Pool = require('pg-pool')\nconst TypeOverrides = require('./type-overrides')\nconst { DatabaseError } = require('pg-protocol')\nconst { escapeIdentifier, escapeLiteral } = require('./utils')\n\nconst poolFactory = (Client) => {\n return class BoundPool extends Pool {\n constructor(options) {\n super(options, Client)\n }\n }\n}\n\nconst PG = function (clientConstructor) {\n this.defaults = defaults\n this.Client = clientConstructor\n this.Query = this.Client.Query\n this.Pool = poolFactory(this.Client)\n this._pools = []\n this.Connection = Connection\n this.types = require('pg-types')\n this.DatabaseError = DatabaseError\n this.TypeOverrides = TypeOverrides\n this.escapeIdentifier = escapeIdentifier\n this.escapeLiteral = escapeLiteral\n this.Result = Result\n this.utils = utils\n}\n\nlet clientConstructor = Client\n\nlet forceNative = false\ntry {\n forceNative = !!process.env.NODE_PG_FORCE_NATIVE\n} catch {\n // ignore, e.g., Deno without --allow-env\n}\n\nif (forceNative) {\n clientConstructor = require('./native')\n}\n\nmodule.exports = new PG(clientConstructor)\n\n// lazy require native module...the native module may not have installed\nObject.defineProperty(module.exports, 'native', {\n configurable: true,\n enumerable: false,\n get() {\n let native = null\n try {\n native = new PG(require('./native'))\n } catch (err) {\n if (err.code !== 'MODULE_NOT_FOUND') {\n throw err\n }\n }\n\n // overwrite module.exports.native so that getter is never called again\n Object.defineProperty(module.exports, 'native', {\n value: native,\n })\n\n return native\n },\n})\n","// ESM wrapper for pg\nimport pg from '../lib/index.js'\n\n// Re-export all the properties\nexport const Client = pg.Client\nexport const Pool = pg.Pool\nexport const Connection = pg.Connection\nexport const types = pg.types\nexport const Query = pg.Query\nexport const DatabaseError = pg.DatabaseError\nexport const escapeIdentifier = pg.escapeIdentifier\nexport const escapeLiteral = pg.escapeLiteral\nexport const Result = pg.Result\nexport const TypeOverrides = pg.TypeOverrides\n\n// Also export the defaults\nexport const defaults = pg.defaults\n\n// Re-export the default\nexport default pg\n","import { PrismaClient } from './prisma'\nimport { PrismaPg } from '@prisma/adapter-pg'\nimport pg from 'pg'\n\nlet prismaClient: PrismaClient | null = null\nlet pool: pg.Pool | null = null\n\n/**\n * Gets the internal Prisma client instance.\n * Creates one if it doesn't exist.\n */\nexport function getDbClient(): PrismaClient {\n if (!prismaClient) {\n const databaseUrl = process.env.AC_CORE_DATABASE_URL\n if (!databaseUrl) {\n throw new Error(\n 'AC_CORE_DATABASE_URL environment variable is required for PrismaClient initialization',\n )\n }\n\n // Prisma 7 with adapter: Create pg pool and wrap with adapter\n pool = new pg.Pool({ connectionString: databaseUrl })\n const adapter = new PrismaPg(pool)\n\n prismaClient = new PrismaClient({ adapter })\n }\n return prismaClient\n}\n\n/**\n * Sets the internal Prisma client instance.\n * Used by middleware to bridge with existing getDbClient() usage.\n */\nexport function setDbClient(client: PrismaClient): void {\n prismaClient = client\n}\n\n/**\n * Connects to the database.\n * Call this before performing database operations.\n */\nexport async function connectDb(): Promise<void> {\n const client = getDbClient()\n await client.$connect()\n}\n\n/**\n * Disconnects from the database.\n * Call this when done with database operations (e.g., in scripts).\n */\nexport async function disconnectDb(): Promise<void> {\n if (prismaClient) {\n await prismaClient.$disconnect()\n prismaClient = null\n }\n if (pool) {\n await pool.end()\n pool = null\n }\n}\n","import { getDbClient } from '../../db/client'\nimport type {\n AppApprovalMethod,\n AppCatalogData,\n AppCategory,\n AppForCatalog,\n GroupingTagDefinition,\n} from '../../types/common/appCatalogTypes'\nimport type {\n CustomConfig,\n PersonTeamConfig,\n ServiceConfig,\n} from '../../types/common/approvalMethodTypes'\nimport { omit } from 'radashi'\n\nfunction capitalize(word: string): string {\n if (!word) return word\n return word.charAt(0).toUpperCase() + word.slice(1)\n}\n\nexport async function getGroupingTagDefinitionsFromPrisma(): Promise<\n Array<GroupingTagDefinition>\n> {\n const prisma = getDbClient()\n\n // Fetch all tag definitions\n const rows = await prisma.dbAppTagDefinition.findMany()\n\n // Fetch all apps to count tag usage\n const apps = await prisma.dbAppForCatalog.findMany({\n select: { tags: true },\n })\n\n // Count tag values across all apps\n const tagCounts = new Map<string, Map<string, number>>()\n\n for (const app of apps) {\n const tags = (app.tags as unknown as Array<string> | null) ?? []\n for (const tag of tags) {\n const [prefix, value] = tag.split(':')\n if (prefix && value) {\n if (!tagCounts.has(prefix)) {\n tagCounts.set(prefix, new Map())\n }\n const prefixCounts = tagCounts.get(prefix)!\n prefixCounts.set(value, (prefixCounts.get(value) ?? 0) + 1)\n }\n }\n }\n\n // Sort values by count and return definitions\n return rows.map((row) => {\n const definition = omit(row, ['id', 'updatedAt', 'createdAt'])\n const counts = tagCounts.get(definition.prefix) ?? new Map()\n\n // Sort values by count (descending)\n const sortedValues = [...definition.values].sort((a, b) => {\n const countA = counts.get(a.value) ?? 0\n const countB = counts.get(b.value) ?? 0\n return countB - countA\n })\n\n return {\n ...definition,\n values: sortedValues,\n }\n })\n}\n\nexport async function getApprovalMethodsFromPrisma(): Promise<\n Array<AppApprovalMethod>\n> {\n const prisma = getDbClient()\n\n // Fetch all apps\n const rows = await prisma.dbApprovalMethod.findMany()\n\n return rows.map((row) => {\n // Handle discriminated union by explicitly narrowing based on type\n const baseFields = {\n slug: row.slug,\n displayName: row.displayName,\n }\n\n // Provide default empty config if null, as AppApprovalMethod discriminated union requires config\n const config = row.config ?? {}\n\n switch (row.type) {\n case 'service':\n return {\n ...baseFields,\n type: 'service',\n config: config as ServiceConfig,\n }\n case 'personTeam':\n return {\n ...baseFields,\n type: 'personTeam',\n config: config as PersonTeamConfig,\n }\n case 'custom':\n return { ...baseFields, type: 'custom', config: config as CustomConfig }\n }\n })\n}\n\nexport async function getAppsFromPrisma(): Promise<Array<AppForCatalog>> {\n const prisma = getDbClient()\n\n // Fetch all apps\n const rows = await prisma.dbAppForCatalog.findMany()\n\n return rows.map((row) => {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as Array<string> | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = (row.sources as unknown as Array<string> | null) ?? []\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n }\n })\n}\n\nexport function deriveCategories(\n apps: Array<AppForCatalog>,\n): Array<AppCategory> {\n const tagSet = new Set<string>()\n for (const app of apps) {\n for (const tag of app.tags ?? []) {\n const normalized = tag.trim().toLowerCase()\n if (normalized) tagSet.add(normalized)\n }\n }\n const categories: Array<AppCategory> = [{ id: 'all', name: 'All' }]\n for (const tag of Array.from(tagSet).sort()) {\n categories.push({ id: tag, name: capitalize(tag) })\n }\n return categories\n}\n\nexport async function getAppCatalogData(\n getAppsOptional?: () => Promise<Array<AppForCatalog>>,\n): Promise<AppCatalogData> {\n const apps = getAppsOptional\n ? await getAppsOptional()\n : await getAppsFromPrisma()\n\n return {\n apps,\n tagsDefinitions: await getGroupingTagDefinitionsFromPrisma(),\n approvalMethods: await getApprovalMethodsFromPrisma(),\n }\n}\n","import type { BetterAuthPlugin } from 'better-auth'\nimport type { TRPCRootObject } from '@trpc/server'\nimport type { EhTrpcContext } from '../../server/ehTrpcContext'\nimport type { BetterAuth } from './auth'\n\n/**\n * Create auth tRPC procedures\n * @param t - tRPC instance\n * @param auth - Better Auth instance (optional, for future extensions)\n * @returns tRPC router with auth procedures\n */\nexport function createAuthRouter(\n t: TRPCRootObject<EhTrpcContext, {}, {}>,\n auth?: BetterAuth,\n) {\n const router = t.router\n const publicProcedure = t.procedure\n\n return router({\n getSession: publicProcedure.query(async ({ ctx }) => {\n // User is now extracted in the tRPC context creation\n return {\n user: ctx.user ?? null,\n isAuthenticated: !!ctx.user,\n }\n }),\n getProviders: publicProcedure.query(() => {\n // Return configured social providers and OAuth providers from plugins\n const providers: Array<string> = []\n const authOptions = auth?.options\n\n // Add built-in social providers (github, google, etc.)\n if (authOptions?.socialProviders) {\n const socialProviders = authOptions.socialProviders as Record<\n string,\n unknown\n >\n Object.keys(socialProviders).forEach((key) => {\n if (socialProviders[key]) {\n providers.push(key)\n }\n })\n }\n\n // Add OAuth providers from plugins (like Okta via genericOAuth)\n if (authOptions?.plugins) {\n const plugins = authOptions.plugins\n plugins.forEach((plugin) => {\n const pluginWithConfig = plugin as BetterAuthPlugin & {\n options?: {\n config?: Array<{ providerId?: string }>\n }\n }\n if (\n pluginWithConfig.id === 'generic-oauth' &&\n pluginWithConfig.options?.config\n ) {\n const configs = Array.isArray(pluginWithConfig.options.config)\n ? pluginWithConfig.options.config\n : [pluginWithConfig.options.config]\n configs.forEach((config) => {\n if (config.providerId) {\n providers.push(config.providerId)\n }\n })\n }\n })\n }\n\n return { providers }\n }),\n })\n}\n\nexport type AuthRouter = ReturnType<typeof createAuthRouter>\n","/**\n * Authorization utilities for checking user permissions based on groups\n *\n * Groups are automatically included in the user session when:\n * 1. Okta auth server has a \"groups\" claim configured\n * 2. The auth policy rule includes \"groups\" in scope_whitelist\n *\n * Example usage in tRPC procedures:\n * ```typescript\n * myProcedure: protectedProcedure.query(async ({ ctx }) => {\n * if (requireAdmin(ctx.user)) {\n * // Admin-only logic\n * }\n * // Regular user logic\n * })\n * ```\n */\n\nexport interface UserWithGroups {\n id: string\n email: string\n name?: string\n // Groups from Okta (or other identity provider)\n // This will be populated if groups claim is configured\n [key: string]: any\n}\n\n/**\n * Extract groups from user object\n * Groups can be stored in different locations depending on the OAuth provider\n */\nexport function getUserGroups(\n user: UserWithGroups | null | undefined,\n): Array<string> {\n if (!user) {\n console.log('[getUserGroups] No user provided')\n return []\n }\n\n // Debug: Log all user properties to see what's available\n console.log('[getUserGroups] === USER OBJECT DEBUG ===')\n console.log('[getUserGroups] User ID:', user.id)\n console.log('[getUserGroups] User email:', user.email)\n console.log(\n '[getUserGroups] User.env_hopper_groups:',\n (user as any).env_hopper_groups,\n )\n console.log('[getUserGroups] User.groups:', user.groups)\n console.log('[getUserGroups] User.oktaGroups:', (user as any).oktaGroups)\n console.log('[getUserGroups] User.roles:', (user as any).roles)\n console.log('[getUserGroups] All user keys:', Object.keys(user))\n console.log(\n '[getUserGroups] Full user object:',\n JSON.stringify(user, null, 2),\n )\n\n // Check common locations for group information\n // Order of preference: custom env_hopper_groups first\n const groups =\n (user as any).env_hopper_groups || // Custom env_hopper_groups claim (stores natera.env_hopper_ui.groups)\n user.groups || // Standard \"groups\" claim\n (user as any).oktaGroups || // Okta-specific\n (user as any).roles || // Some providers use \"roles\"\n []\n\n const result = Array.isArray(groups) ? groups : []\n console.log('[getUserGroups] Final groups result:', result)\n\n return result\n}\n\n/**\n * Check if user is a member of any of the specified groups\n */\nexport function isMemberOfAnyGroup(\n user: UserWithGroups | null | undefined,\n allowedGroups: Array<string>,\n): boolean {\n const userGroups = getUserGroups(user)\n return allowedGroups.some((group) => userGroups.includes(group))\n}\n\n/**\n * Check if user is a member of all specified groups\n */\nexport function isMemberOfAllGroups(\n user: UserWithGroups | null | undefined,\n requiredGroups: Array<string>,\n): boolean {\n const userGroups = getUserGroups(user)\n return requiredGroups.every((group) => userGroups.includes(group))\n}\n\n/**\n * Check if user has admin permissions\n * @param user User object with groups\n * @param adminGroups List of admin group names (default: ['env_hopper_ui_super_admins'])\n */\nexport function isAdmin(\n user: UserWithGroups | null | undefined,\n adminGroups: Array<string> = ['env_hopper_ui_super_admins'],\n): boolean {\n return isMemberOfAnyGroup(user, adminGroups)\n}\n\n/**\n * Require admin permissions - throws error if not admin\n * @param user User object with groups\n * @param adminGroups List of admin group names (default: ['env_hopper_ui_super_admins'])\n */\nexport function requireAdmin(\n user: UserWithGroups | null | undefined,\n adminGroups: Array<string> = ['env_hopper_ui_super_admins'],\n): void {\n if (!isAdmin(user, adminGroups)) {\n throw new Error('Forbidden: Admin access required')\n }\n}\n\n/**\n * Require membership in specific groups - throws error if not member\n */\nexport function requireGroups(\n user: UserWithGroups | null | undefined,\n groups: Array<string>,\n): void {\n if (!isMemberOfAnyGroup(user, groups)) {\n throw new Error(\n `Forbidden: Membership in one of these groups required: ${groups.join(', ')}`,\n )\n }\n}\n","import { TRPCError, initTRPC } from '@trpc/server'\nimport type { EhTrpcContext } from './ehTrpcContext'\nimport { isAdmin } from '../modules/auth/authorizationUtils'\n\n/**\n * Initialization of tRPC backend\n * Should be done only once per backend!\n */\nexport const t = initTRPC.context<EhTrpcContext>().create({\n errorFormatter({ error, shape }: { error: unknown; shape: unknown }) {\n // Log all tRPC errors to console\n console.error('[tRPC Error]', {\n path: (shape as { data?: { path?: string } }).data?.path,\n code: (error as { code?: string }).code,\n message: (error as { message?: string }).message,\n cause: (error as { cause?: unknown }).cause,\n stack: (error as { stack?: string }).stack,\n })\n return shape\n },\n})\n\n/**\n * Export reusable router and procedure helpers\n */\nexport const router = t.router\nexport const publicProcedure = t.procedure\n\n/**\n * Middleware to check if user is authenticated\n */\nconst isAuthenticated = t.middleware(({ ctx, next }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'You must be logged in to access this resource',\n })\n }\n return next({\n ctx: {\n ...ctx,\n user: ctx.user,\n },\n })\n})\n\n/**\n * Middleware to check if user is an admin\n */\nconst isAdminMiddleware = t.middleware(({ ctx, next }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'You must be logged in to access this resource',\n })\n }\n\n console.log('[isAdminMiddleware] === ADMIN CHECK DEBUG ===')\n console.log('[isAdminMiddleware] User:', ctx.user.email)\n console.log('[isAdminMiddleware] Required admin groups:', ctx.adminGroups)\n console.log('[isAdminMiddleware] Calling isAdmin()...')\n\n const hasAdminAccess = isAdmin(ctx.user, ctx.adminGroups)\n console.log('[isAdminMiddleware] Has admin access:', hasAdminAccess)\n\n if (!hasAdminAccess) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: `You must be an admin to access this resource. Required groups: ${ctx.adminGroups.join(', ') || 'env_hopper_ui_super_admins'}`,\n })\n }\n\n return next({\n ctx: {\n ...ctx,\n user: ctx.user,\n },\n })\n})\n\n/**\n * Admin procedure that requires admin permissions\n */\nexport const adminProcedure = t.procedure.use(isAdminMiddleware)\n\n/**\n * Protected procedure that requires authentication (but not admin)\n */\nexport const protectedProcedure = t.procedure.use(isAuthenticated)\n","import { getAppCatalogData } from '../modules/appCatalog/service'\nimport type { AppCatalogData } from '../types'\n\nimport type { BetterAuth } from '../modules/auth/auth'\nimport { createAuthRouter } from '../modules/auth/authRouter.js'\nimport { publicProcedure, router, t } from './trpcSetup'\n\n/**\n * Create the main tRPC router with optional auth instance\n * @param auth - Optional Better Auth instance for auth-related queries\n */\nexport function createTrpcRouter(auth?: BetterAuth) {\n return router({\n authConfig: publicProcedure.query(async ({ ctx }) => {\n return {\n adminGroups: ctx.adminGroups,\n }\n }),\n\n appCatalog: publicProcedure.query(\n async ({ ctx }): Promise<AppCatalogData> => {\n const baseData = await getAppCatalogData()\n const appVersion = ctx.companySpecificBackend.getAppVersion?.()\n return {\n ...baseData,\n ...(appVersion && { appVersion }),\n }\n },\n ),\n\n // Auth routes (requires auth instance)\n auth: createAuthRouter(t, auth),\n })\n}\n\nexport type TRPCRouter = ReturnType<typeof createTrpcRouter>\n","import type { AppCatalogCompanySpecificBackend } from '../types'\nimport type { User } from 'better-auth/types'\n\nexport interface EhTrpcContext {\n companySpecificBackend: AppCatalogCompanySpecificBackend\n user: User | null\n adminGroups: Array<string>\n}\n\nexport interface EhTrpcContextOptions {\n companySpecificBackend: AppCatalogCompanySpecificBackend\n user?: User | null\n adminGroups: Array<string>\n}\n\nexport function createEhTrpcContext({\n companySpecificBackend,\n user = null,\n adminGroups,\n}: EhTrpcContextOptions): EhTrpcContext {\n return {\n companySpecificBackend,\n user,\n adminGroups,\n }\n}\n","export interface EhStaticControllerContract {\n methods: { \n getIcon: { method: string; url: string }\n getScreenshot: { method: string; url: string }\n }\n}\n\nexport const staticControllerContract: EhStaticControllerContract = {\n methods: {\n getIcon: {\n method: 'get',\n url: 'icon/:icon',\n },\n getScreenshot: {\n method: 'get',\n url: 'screenshot/:id',\n },\n },\n}\n","import { tableSync } from '@igstack/app-catalog-table-sync'\nimport type { Prisma, PrismaClient } from './prisma'\nimport { mapValues, omit, pick } from 'radashi'\n\nexport type ScalarKeys<TPrismaModelName extends Prisma.ModelName> =\n keyof Prisma.TypeMap['model'][TPrismaModelName]['payload']['scalars']\nexport type ObjectKeys<TPrismaModelName extends Prisma.ModelName> =\n keyof Prisma.TypeMap['model'][TPrismaModelName]['payload']['objects']\n\nexport type ScalarFilter<TPrismaModelName extends Prisma.ModelName> = Partial<\n Prisma.TypeMap['model'][TPrismaModelName]['payload']['scalars']\n>\n\nexport type GetOperationFns<TModel extends Prisma.ModelName> = {\n [TOperation in keyof Prisma.TypeMap['model']['DbAppForCatalog']['operations']]: (\n args: Prisma.TypeMap['model'][TModel]['operations'][TOperation]['args'],\n ) => Promise<\n Prisma.TypeMap['model'][TModel]['operations'][TOperation]['result']\n >\n}\n\nexport interface TableSyncParamsPrisma<\n TPrismaClient extends PrismaClient,\n TPrismaModelName extends Prisma.ModelName,\n TUniqColumns extends ReadonlyArray<ScalarKeys<TPrismaModelName>>,\n TRelationColumns extends ReadonlyArray<ObjectKeys<TPrismaModelName>>,\n> {\n id?: ScalarKeys<TPrismaModelName>\n prisma: TPrismaClient\n prismaModelName: TPrismaModelName\n uniqColumns: TUniqColumns\n relationColumns?: TRelationColumns\n where?: ScalarFilter<TPrismaModelName>\n upsertOnly?: boolean\n}\n\nfunction getPrismaModelOperations<\n TPrismaClient,\n TPrismaModelName extends Prisma.ModelName,\n>(prisma: TPrismaClient, prismaModelName: TPrismaModelName) {\n const key = (prismaModelName.slice(0, 1).toLowerCase() +\n prismaModelName.slice(1)) as keyof TPrismaClient\n return prisma[key] as GetOperationFns<TPrismaModelName>\n}\n\nexport type MakeTFromPrismaModel<TPrismaModelName extends Prisma.ModelName> =\n NonNullable<\n Prisma.TypeMap['model'][TPrismaModelName]['operations']['findUnique']['result']\n >\n\nexport function tableSyncPrisma<\n TPrismaClient extends PrismaClient,\n TPrismaModelName extends Prisma.ModelName,\n TUniqColumns extends ReadonlyArray<ScalarKeys<TPrismaModelName>>,\n TRelationColumns extends ReadonlyArray<ObjectKeys<TPrismaModelName>>,\n TId extends ScalarKeys<TPrismaModelName> = ScalarKeys<TPrismaModelName>,\n>(\n params: TableSyncParamsPrisma<\n TPrismaClient,\n TPrismaModelName,\n TUniqColumns,\n TRelationColumns\n >,\n) {\n const {\n prisma,\n prismaModelName,\n uniqColumns,\n where: whereGlobal,\n upsertOnly,\n } = params\n const prismOperations = getPrismaModelOperations(prisma, prismaModelName)\n\n const idColumn = (params.id ?? 'id') as TId\n // @ts-ignore maybe someday later (never)\n return tableSync<MakeTFromPrismaModel<TPrismaModelName>, TUniqColumns, TId>({\n id: idColumn,\n uniqColumns,\n readAll: async () => {\n const findManyArgs = whereGlobal\n ? {\n where: whereGlobal,\n }\n : {}\n return (await prismOperations.findMany(findManyArgs)) as Array<\n MakeTFromPrismaModel<TPrismaModelName>\n >\n },\n writeAll: async (createData, update, deleteIds) => {\n const prismaUniqKey = params.uniqColumns.join('_')\n const relationColumnList =\n params.relationColumns ?? ([] as Array<ObjectKeys<TPrismaModelName>>)\n\n return prisma.$transaction(async (tx) => {\n const txOps = getPrismaModelOperations(tx, prismaModelName)\n for (const { data, where } of update) {\n const uniqKeyWhere =\n Object.keys(where).length > 1\n ? {\n [prismaUniqKey]: where,\n }\n : where\n\n const dataScalar = omit(data, relationColumnList)\n const dataRelations = mapValues(\n pick(data, relationColumnList),\n (value) => {\n return {\n set: value,\n }\n },\n )\n\n // @ts-expect-error This is too difficult for me to come up with right types\n await txOps.update({\n data: { ...dataScalar, ...dataRelations },\n where: { ...uniqKeyWhere },\n })\n }\n\n if (upsertOnly !== true) {\n await txOps.deleteMany({\n where: {\n [idColumn]: {\n in: deleteIds,\n },\n },\n })\n }\n\n // Validate uniqueness of uniqColumns before creating records\n const createDataMapped = createData.map((data) => {\n // @ts-expect-error This is too difficult for me to come up with right types\n const dataScalar = omit(data, relationColumnList)\n\n // @ts-expect-error This is too difficult for me to come up with right types\n const onlyRelationColumns = pick(data, relationColumnList)\n const dataRelations = mapValues(onlyRelationColumns, (value) => {\n return {\n connect: value,\n }\n })\n\n return { ...dataScalar, ...dataRelations }\n })\n\n // Check for duplicates in the data to be created\n if (createDataMapped.length > 0) {\n const uniqKeysInCreate = new Set<string>()\n const duplicateKeys: Array<string> = []\n\n for (const data of createDataMapped) {\n const keyParts = params.uniqColumns.map((col) => {\n const value = data[col as keyof typeof data]\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive: unique columns may be nullable in schemas\n return value === null || value === undefined\n ? 'null'\n : String(value)\n })\n const key = keyParts.join(':')\n\n if (uniqKeysInCreate.has(key)) {\n duplicateKeys.push(key)\n } else {\n uniqKeysInCreate.add(key)\n }\n }\n\n if (duplicateKeys.length > 0) {\n const uniqColumnsStr = params.uniqColumns.join(', ')\n throw new Error(\n `Duplicate unique key values found in data to be created. ` +\n `Model: ${prismaModelName}, Unique columns: [${uniqColumnsStr}], ` +\n `Duplicate keys: [${duplicateKeys.join(', ')}]`,\n )\n }\n }\n\n const results: Array<MakeTFromPrismaModel<TPrismaModelName>> = []\n\n if (relationColumnList.length === 0) {\n // @ts-expect-error This is too difficult for me to come up with right types\n const batchResult = await txOps.createManyAndReturn({\n data: createDataMapped,\n })\n\n results.push(...batchResult)\n } else {\n for (const dataMappedElement of createDataMapped) {\n // @ts-expect-error too difficult for me\n const newVar = await txOps.create({\n data: dataMappedElement,\n })\n results.push(newVar as MakeTFromPrismaModel<TPrismaModelName>)\n }\n }\n\n return results\n })\n },\n })\n}\n","import type { Prisma } from './prisma'\nimport type { ObjectKeys, ScalarKeys } from './tableSyncPrismaAdapter'\n\ninterface CommonSyncTableInfo<TPrismaModelName extends Prisma.ModelName> {\n prismaModelName: TPrismaModelName\n id?: ScalarKeys<TPrismaModelName>\n uniqColumns: Array<ScalarKeys<TPrismaModelName>>\n relationColumns?: Array<ObjectKeys<TPrismaModelName>>\n}\n\ntype TableSyncMagazineType = Partial<{\n [key in Prisma.ModelName]: CommonSyncTableInfo<key>\n}>\n\nexport const TABLE_SYNC_MAGAZINE = {\n DbAppForCatalog: {\n prismaModelName: 'DbAppForCatalog',\n uniqColumns: ['slug'],\n },\n DbAppTagDefinition: {\n prismaModelName: 'DbAppTagDefinition',\n uniqColumns: ['prefix'],\n },\n DbApprovalMethod: {\n id: 'slug',\n prismaModelName: 'DbApprovalMethod',\n uniqColumns: ['slug'],\n },\n} as const satisfies TableSyncMagazineType\n\nexport type TableSyncMagazine = typeof TABLE_SYNC_MAGAZINE\nexport type TableSyncMagazineModelNameKey = keyof TableSyncMagazine\n","import { createHash } from 'node:crypto'\nimport type { FormatEnum } from 'sharp'\nimport sharp from 'sharp'\nimport type { ParseAssetParams, ParseAssetReturn } from './assetRestController'\n\n/**\n * Extract image dimensions from a buffer using sharp\n */\nexport async function getImageDimensions(\n buffer: Buffer,\n): Promise<{ width?: number; height?: number }> {\n try {\n const metadata = await sharp(buffer).metadata()\n return {\n width: metadata.width,\n height: metadata.height,\n }\n } catch (error) {\n console.error('Error extracting image dimensions:', error)\n return { width: undefined, height: undefined }\n }\n}\n\n/**\n * Resize an image buffer to the specified dimensions\n * @param buffer - The image buffer to resize\n * @param width - Target width (optional)\n * @param height - Target height (optional)\n * @param format - Output format ('png', 'jpeg', 'webp'), auto-detected if not provided\n */\nexport async function resizeImage(\n buffer: Buffer,\n width?: number,\n height?: number,\n format?: 'png' | 'jpeg' | 'webp',\n): Promise<Buffer> {\n let pipeline = sharp(buffer)\n\n // Apply resize if dimensions provided\n if (width || height) {\n pipeline = pipeline.resize({\n width,\n height,\n fit: 'inside',\n withoutEnlargement: true,\n })\n }\n\n // Apply format conversion if specified\n if (format === 'png') {\n pipeline = pipeline.png()\n } else if (format === 'webp') {\n pipeline = pipeline.webp()\n } else if (format === 'jpeg') {\n pipeline = pipeline.jpeg()\n }\n\n return pipeline.toBuffer()\n}\n\n/**\n * Generate SHA-256 checksum for a buffer\n */\nexport function generateChecksum(buffer: Buffer): string {\n return createHash('sha256').update(buffer).digest('hex')\n}\n\n/**\n * Detect image format from mime type\n */\nexport function getImageFormat(\n mimeType: string,\n): 'png' | 'webp' | 'jpeg' | null {\n if (mimeType.includes('png')) return 'png'\n if (mimeType.includes('webp')) return 'webp'\n if (mimeType.includes('jpeg') || mimeType.includes('jpg')) return 'jpeg'\n return null\n}\n\n/**\n * Check if a mime type represents a raster image (not SVG)\n */\nexport function isRasterImage(mimeType: string): boolean {\n return mimeType.startsWith('image/') && !mimeType.includes('svg')\n}\n\nexport async function parseAssetMeta(\n p: ParseAssetParams,\n): Promise<ParseAssetReturn> {\n // Get image dimensions using our utility\n const { width, height, format, size } = await sharp(p.buffer).metadata()\n\n const formatToMime: Partial<Record<keyof FormatEnum, string>> = {\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n webp: 'image/webp',\n avif: 'image/avif',\n tiff: 'image/tiff',\n gif: 'image/gif',\n heif: 'image/heif',\n raw: 'application/octet-stream',\n }\n\n return {\n checksum: generateChecksum(p.buffer),\n width,\n height,\n mimeType: format\n ? (formatToMime[format] ?? `image/${format}`)\n : 'application/octet-stream',\n fileSize: size || 0,\n }\n}\n","import { parseAssetMeta } from './assetUtils'\nimport type { AssetType, PrismaClient } from '../../db/prisma'\n\nexport interface UpsertAssetParams {\n prisma: PrismaClient\n buffer: Buffer\n name: string\n originalFilename: string\n assetType: AssetType\n}\n\nexport async function upsertAsset({\n prisma,\n buffer,\n name,\n originalFilename,\n assetType,\n}: UpsertAssetParams) {\n const { checksum, fileSize, width, height, mimeType } = await parseAssetMeta({\n buffer,\n originalFilename,\n })\n\n // If an asset with the same checksum already exists, reuse it instead of storing duplicate binary.\n const existing = await prisma.dbAsset.findUnique({\n where: { name },\n })\n\n if (existing) {\n return existing.id\n }\n\n const asset = await prisma.dbAsset.create({\n data: {\n name,\n checksum,\n assetType,\n content: new Uint8Array(buffer),\n mimeType,\n fileSize,\n width,\n height,\n },\n })\n return asset.id\n}\n","import type {\n AppForCatalog,\n GroupingTagDefinition,\n} from '../types/common/appCatalogTypes'\nimport { getDbClient } from './client'\nimport { TABLE_SYNC_MAGAZINE } from './tableSyncMagazine'\nimport { tableSyncPrisma } from './tableSyncPrismaAdapter'\nimport { readFile, readdir, stat } from 'node:fs/promises'\nimport { group } from 'radashi'\nimport { upsertAsset } from '../modules/assets/upsertAsset'\nimport type { ApprovalMethod } from '../types'\nimport type { PrismaClient } from './prisma'\n\nexport interface SyncAppCatalogResult {\n created: number\n updated: number\n deleted: number\n total: number\n}\n\ninterface AssetSyncResult {\n screenshotIds: Array<string>\n iconName: string | null\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return (\n error instanceof Error &&\n 'code' in error &&\n (error as NodeJS.ErrnoException).code === 'ENOENT'\n )\n}\n\nasync function processAssetDirectory(\n dirPath: string,\n appSlug: string,\n assetType: 'screenshot' | 'icon',\n prisma: PrismaClient,\n): Promise<Array<string>> {\n try {\n const files = await readdir(dirPath)\n const assetIds: Array<string> = []\n\n for (let i = 0; i < files.length; i++) {\n const fileName = files[i]\n if (!fileName) continue\n\n const assetName =\n assetType === 'screenshot'\n ? `${appSlug}-screenshot-${i + 1}`\n : `${appSlug}-icon`\n\n const id = await upsertAsset({\n prisma,\n buffer: await readFile(`${dirPath}/${fileName}`),\n originalFilename: fileName,\n name: assetName,\n assetType,\n })\n assetIds.push(id)\n\n // For icons, only process the first file\n if (assetType === 'icon') {\n break\n }\n }\n\n return assetIds\n } catch (error: unknown) {\n if (isFileNotFoundError(error)) {\n return []\n }\n throw error\n }\n}\n\nasync function syncAppAssets(\n appSlug: string,\n appPath: string,\n prisma: PrismaClient,\n): Promise<AssetSyncResult> {\n const screenshotIds = await processAssetDirectory(\n `${appPath}/screenshots`,\n appSlug,\n 'screenshot',\n prisma,\n )\n\n const iconIds = await processAssetDirectory(\n `${appPath}/icons`,\n appSlug,\n 'icon',\n prisma,\n )\n\n return {\n screenshotIds,\n iconName: iconIds.length > 0 ? `${appSlug}-icon` : null,\n }\n}\n\nasync function syncAssetsFromFileSystem(\n apps: Array<AppForCatalog>,\n allAppsAssetsPath: string,\n) {\n const appDirectories = await readdir(allAppsAssetsPath)\n const prisma = getDbClient()\n const bySlug = group(apps, (a) => a.slug)\n\n for (const appDirName of appDirectories) {\n try {\n const stats = await stat(`${allAppsAssetsPath}/${appDirName}`)\n if (!stats.isDirectory()) {\n continue\n }\n } catch (error: unknown) {\n if (isFileNotFoundError(error)) {\n continue\n }\n throw error\n }\n\n const appSlug = appDirName\n if (!bySlug[appSlug]) {\n throw new Error(\n `App '${appSlug}' does not exist in the app catalog. Existing apps: ${Object.keys(bySlug).join(', ')}`,\n )\n }\n\n try {\n const { screenshotIds, iconName } = await syncAppAssets(\n appSlug,\n `${allAppsAssetsPath}/${appDirName}`,\n prisma,\n )\n\n const updateData: {\n screenshotIds?: Array<string>\n iconName?: string | null\n } = {}\n\n if (screenshotIds.length > 0) {\n updateData.screenshotIds = screenshotIds\n }\n if (iconName !== null) {\n updateData.iconName = iconName\n }\n\n if (Object.keys(updateData).length > 0) {\n await prisma.dbAppForCatalog.update({\n where: { slug: appSlug },\n data: updateData,\n })\n }\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n throw new Error(\n `Error while upserting assets for app '${appSlug}': ${errorMessage}`,\n )\n }\n }\n // private async syncScreenshots(apps: AppForCatalog[], screenshotsPath: string): Promise<void> {\n // const db = getDbClient();\n //\n // for (const app of apps) {\n // const dirPath = join(screenshotsPath, `${app.slug}-screenshots`);\n //\n // try {\n // const files = await readdir(dirPath);\n // const imageFiles = files.filter(f => /\\.(png|jpg|jpeg|gif|webp)$/i.test(f)).sort();\n //\n // if (imageFiles.length === 0) continue;\n //\n // const screenshotIds: string[] = [];\n //\n // for (const filename of imageFiles) {\n // const filePath = join(dirPath, filename);\n // const content = await readFile(filePath);\n // const buffer = Buffer.from(content);\n // const checksum = generateChecksum(buffer);\n // const { width, height } = await getImageDimensions(buffer);\n //\n // const ext = filename.split('.').pop()?.toLowerCase();\n // const mimeType = {\n // png: 'image/png',\n // jpg: 'image/jpeg',\n // jpeg: 'image/jpeg',\n // gif: 'image/gif',\n // webp: 'image/webp',\n // }[ext || ''] || 'application/octet-stream';\n //\n // const asset = await db.dbAsset.upsert({\n // where: { checksum },\n // create: {\n // name: `${app.slug}/${filename}`,\n // assetType: 'screenshot',\n // content: new Uint8Array(buffer),\n // checksum,\n // mimeType,\n // fileSize: buffer.length,\n // width,\n // height,\n // },\n // update: {\n // name: `${app.slug}/${filename}`,\n // content: new Uint8Array(buffer),\n // mimeType,\n // fileSize: buffer.length,\n // width,\n // height,\n // },\n // });\n //\n // screenshotIds.push(asset.id);\n // }\n //\n // await db.dbAppForCatalog.update({\n // where: { slug: app.slug },\n // data: { screenshotIds },\n // });\n //\n // logger.info(`Synced ${screenshotIds.length} screenshots for ${app.slug}`);\n // } catch (error: any) {\n // if (error.code === 'ENOENT') continue; // Skip if directory doesn't exist\n // throw error;\n // }\n // }\n // }\n}\n\n/**\n * Syncs app catalog data to the database using table sync.\n * This will create new apps, update existing ones, and delete any that are no longer in the input.\n *\n * Note: Call connectDb() before and disconnectDb() after if running in a script.\n */\nexport async function syncAppCatalog(\n apps: Array<AppForCatalog>,\n tagsDefinitions: Array<GroupingTagDefinition>,\n approvalMethods: Array<ApprovalMethod>,\n sreenshotsPath?: string,\n): Promise<SyncAppCatalogResult> {\n try {\n const prisma = getDbClient()\n\n await tableSyncPrisma({\n prisma,\n ...TABLE_SYNC_MAGAZINE.DbApprovalMethod,\n }).sync(approvalMethods)\n\n const sync = tableSyncPrisma({\n prisma,\n ...TABLE_SYNC_MAGAZINE.DbAppForCatalog,\n })\n\n await tableSyncPrisma({\n prisma,\n ...TABLE_SYNC_MAGAZINE.DbAppTagDefinition,\n }).sync(tagsDefinitions)\n\n // Transform AppForCatalog to DbAppForCatalog format\n const dbApps = apps.map((app) => {\n const slug =\n app.slug ||\n app.displayName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n\n return {\n slug,\n displayName: app.displayName,\n description: app.description,\n teams: app.teams ?? [],\n accessRequest: app.accessRequest ?? null,\n notes: app.notes ?? null,\n tags: app.tags ?? [],\n appUrl: app.appUrl ?? null,\n links: app.links ?? null,\n iconName: app.iconName ?? null,\n screenshotIds: app.screenshotIds ?? [],\n sources: app.sources ?? [],\n deprecated: app.deprecated ?? null,\n }\n })\n\n const result = await sync.sync(dbApps)\n\n // Get actual synced data to calculate stats\n const actual = result.getActual()\n\n if (sreenshotsPath) {\n await syncAssetsFromFileSystem(apps, sreenshotsPath)\n } else {\n console.warn('Do not sync screenhots')\n }\n\n return {\n created: actual.length - apps.length + (apps.length - actual.length),\n updated: 0, // TableSync doesn't expose this directly\n deleted: 0, // TableSync doesn't expose this directly\n total: actual.length,\n }\n } catch (error) {\n // Wrap error with context\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n throw new Error(\n `Error syncing app catalog: ${errorMessage}\\n\\nDetails:\\n${errorStack || 'No stack trace available'}`,\n )\n }\n}\n","import type { BetterAuthOptions, BetterAuthPlugin } from 'better-auth'\nimport { betterAuth } from 'better-auth'\nimport { prismaAdapter } from 'better-auth/adapters/prisma'\nimport { getDbClient } from '../../db'\n\nexport interface AuthConfig {\n appName?: string\n baseURL: string\n secret: string\n providers?: BetterAuthOptions['socialProviders']\n plugins?: Array<BetterAuthPlugin>\n /** Session expiration in seconds. Default: 7 days (604800) */\n sessionExpiresIn?: number\n /** Session update age in seconds. Default: 1 day (86400) */\n sessionUpdateAge?: number\n}\n\nexport function createAuth(config: AuthConfig) {\n const prisma = getDbClient()\n const isProduction = process.env.NODE_ENV === 'production'\n\n const auth = betterAuth({\n appName: config.appName || 'EnvHopper',\n baseURL: config.baseURL,\n basePath: '/api/auth',\n secret: config.secret,\n database: prismaAdapter(prisma, {\n provider: 'postgresql',\n }),\n socialProviders: config.providers || {},\n plugins: config.plugins || [],\n emailAndPassword: {\n enabled: true,\n },\n session: {\n expiresIn: config.sessionExpiresIn ?? 60 * 60 * 24 * 30,\n updateAge: config.sessionUpdateAge ?? 60 * 60 * 24,\n cookieCache: {\n enabled: true,\n maxAge: 300,\n },\n },\n advanced: {\n useSecureCookies: isProduction,\n },\n })\n\n return auth\n}\n\nexport type BetterAuth = ReturnType<typeof createAuth>\n","import { toNodeHandler } from 'better-auth/node'\nimport type { Express, Request, Response } from 'express'\nimport type { BetterAuth } from './auth'\n\n/**\n * Register Better Auth routes with Express\n * @param app - Express application instance\n * @param auth - Better Auth instance\n */\nexport function registerAuthRoutes(app: Express, auth: BetterAuth) {\n // Explicit session endpoint handler\n // Better Auth's toNodeHandler doesn't expose a direct /session endpoint\n app.get('/api/auth/session', async (req: Request, res: Response) => {\n try {\n const session = await auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n res.json(session)\n } else {\n res.status(401).json({ error: 'Not authenticated' })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n })\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n // Express v5 wildcard syntax: /{*any} (also works with Express v4)\n const authHandler = toNodeHandler(auth)\n app.all('/api/auth/{*any}', authHandler)\n}\n","/**\n * Get file extension from MIME type\n */\nexport function getExtensionFromMimeType(mimeType: string): string {\n const mimeMap: Record<string, string> = {\n 'image/svg+xml': 'svg',\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/jpg': 'jpg',\n 'image/webp': 'webp',\n 'image/gif': 'gif',\n 'image/bmp': 'bmp',\n 'image/tiff': 'tiff',\n 'image/x-icon': 'ico',\n 'image/vnd.microsoft.icon': 'ico',\n }\n\n return mimeMap[mimeType.toLowerCase()] || 'bin'\n}\n\n/**\n * Get file extension from filename\n */\nexport function getExtensionFromFilename(filename: string): string {\n const match = filename.match(/\\.([^.]+)$/)\n return match?.[1]?.toLowerCase() || ''\n}\n\n/**\n * Get MIME type from extension\n */\nexport function getMimeTypeFromExtension(extension: string): string {\n const extMap: Record<string, string> = {\n svg: 'image/svg+xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tiff: 'image/tiff',\n ico: 'image/x-icon',\n }\n\n return extMap[extension.toLowerCase()] || 'application/octet-stream'\n}\n","import type { Request, Response, Router } from 'express'\nimport multer from 'multer'\nimport { createHash } from 'node:crypto'\nimport { getDbClient } from '../../db'\nimport { getExtensionFromFilename, getExtensionFromMimeType } from './iconUtils'\n\n// Configure multer for memory storage\nconst upload = multer({\n storage: multer.memoryStorage(),\n limits: {\n fileSize: 10 * 1024 * 1024, // 10MB limit\n },\n fileFilter: (_req, file, cb) => {\n // Accept images only\n if (!file.mimetype.startsWith('image/')) {\n cb(new Error('Only image files are allowed'))\n return\n }\n cb(null, true)\n },\n})\n\nexport interface IconRestControllerConfig {\n /**\n * Base path for icon endpoints (e.g., '/api/icons')\n */\n basePath: string\n}\n\n/**\n * Registers REST endpoints for icon upload and retrieval\n *\n * Endpoints:\n * - POST {basePath}/upload - Upload a new icon (multipart/form-data with 'icon' field and 'name' field)\n * - GET {basePath}/:id - Get icon binary by ID\n * - GET {basePath}/:id/metadata - Get icon metadata only\n */\nexport function registerIconRestController(\n router: Router,\n config: IconRestControllerConfig,\n): void {\n const { basePath } = config\n\n // Upload endpoint - accepts multipart/form-data\n router.post(\n `${basePath}/upload`,\n upload.single('icon'),\n async (req: Request, res: Response) => {\n try {\n if (!req.file) {\n res.status(400).json({ error: 'No file uploaded' })\n return\n }\n\n let name = req.body['name'] as string\n if (!name) {\n res.status(400).json({ error: 'Name is required' })\n return\n }\n\n // Extract extension from original filename or derive from MIME type\n const extension =\n getExtensionFromFilename(req.file.originalname) ||\n getExtensionFromMimeType(req.file.mimetype)\n\n // Add extension to name if not already present\n if (!name.includes('.')) {\n name = `${name}.${extension}`\n }\n\n const prisma = getDbClient()\n const checksum = createHash('sha256')\n .update(req.file.buffer)\n .digest('hex')\n const icon = await prisma.dbAsset.create({\n data: {\n name,\n assetType: 'icon',\n content: new Uint8Array(req.file.buffer),\n mimeType: req.file.mimetype,\n fileSize: req.file.size,\n checksum,\n },\n })\n\n res.status(201).json({\n id: icon.id,\n name: icon.name,\n mimeType: icon.mimeType,\n fileSize: icon.fileSize,\n createdAt: icon.createdAt,\n })\n } catch (error) {\n console.error('Error uploading icon:', error)\n res.status(500).json({ error: 'Failed to upload icon' })\n }\n },\n )\n\n // Get icon binary by name (e.g., /api/icons/jira.svg)\n router.get(`${basePath}/:name`, async (req: Request, res: Response) => {\n try {\n const { name } = req.params\n\n const prisma = getDbClient()\n const icon = await prisma.dbAsset.findFirst({\n where: {\n name,\n assetType: 'icon',\n },\n select: {\n content: true,\n mimeType: true,\n name: true,\n },\n })\n\n if (!icon) {\n res.status(404).json({ error: 'Icon not found' })\n return\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', icon.mimeType)\n res.setHeader('Content-Disposition', `inline; filename=\"${icon.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content\n res.send(icon.content)\n } catch (error) {\n console.error('Error fetching icon:', error)\n res.status(500).json({ error: 'Failed to fetch icon' })\n }\n })\n\n // Get icon metadata only (no binary content)\n router.get(\n `${basePath}/:name/metadata`,\n async (req: Request, res: Response) => {\n try {\n const { name } = req.params\n\n const prisma = getDbClient()\n const icon = await prisma.dbAsset.findFirst({\n where: {\n name,\n assetType: 'icon',\n },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n\n if (!icon) {\n res.status(404).json({ error: 'Icon not found' })\n return\n }\n\n res.json(icon)\n } catch (error) {\n console.error('Error fetching icon metadata:', error)\n res.status(500).json({ error: 'Failed to fetch icon metadata' })\n }\n },\n )\n}\n","import { getDbClient } from '../../db'\nimport { generateChecksum, getImageDimensions } from '../assets/assetUtils'\n\nexport interface UpsertIconInput {\n name: string\n content: Buffer\n mimeType: string\n fileSize: number\n}\n\n/**\n * Upsert an icon to the database.\n * If an icon with the same name exists, it will be updated.\n * Otherwise, a new icon will be created.\n */\nexport async function upsertIcon(input: UpsertIconInput) {\n const prisma = getDbClient()\n \n const checksum = generateChecksum(input.content)\n const { width, height } = await getImageDimensions(input.content)\n \n return prisma.dbAsset.upsert({\n where: { name: input.name },\n update: {\n content: new Uint8Array(input.content),\n checksum,\n mimeType: input.mimeType,\n fileSize: input.fileSize,\n width,\n height,\n },\n create: {\n name: input.name,\n assetType: 'icon',\n content: new Uint8Array(input.content),\n checksum,\n mimeType: input.mimeType,\n fileSize: input.fileSize,\n width,\n height,\n },\n })\n}\n\n/**\n * Upsert multiple icons to the database.\n * This is more efficient than calling upsertIcon multiple times.\n */\nexport async function upsertIcons(icons: Array<UpsertIconInput>) {\n const results: Array<Awaited<ReturnType<typeof upsertIcon>>> = []\n for (const icon of icons) {\n const result = await upsertIcon(icon)\n results.push(result)\n }\n return results\n}\n\n/**\n * Get an asset (icon or screenshot) by name from the database.\n * Returns the asset content, mimeType, and name if found.\n */\nexport async function getAssetByName(name: string) {\n const prisma = getDbClient()\n \n return prisma.dbAsset.findUnique({\n where: { name },\n select: {\n content: true,\n mimeType: true,\n name: true,\n },\n })\n}\n","import type { Request, Response, Router } from 'express'\nimport multer from 'multer'\nimport sharp from 'sharp'\nimport { getDbClient } from '../../db'\nimport { getImageFormat, isRasterImage, resizeImage } from './assetUtils'\nimport { upsertAsset } from './upsertAsset'\n\n// Configure multer for memory storage\nconst upload = multer({\n storage: multer.memoryStorage(),\n limits: {\n fileSize: 10 * 1024 * 1024, // 10MB limit\n },\n fileFilter: (_req, file, cb) => {\n // Accept images only\n if (!file.mimetype.startsWith('image/')) {\n cb(new Error('Only image files are allowed'))\n return\n }\n cb(null, true)\n },\n})\n\nexport interface AssetRestControllerConfig {\n /**\n * Base path for asset endpoints (e.g., '/api/assets')\n */\n basePath: string\n}\n\nexport interface ParseAssetParams {\n buffer: Buffer\n originalFilename: string\n fileSize?: number\n}\n\nexport interface ParseAssetReturn {\n checksum: string\n fileSize: number\n mimeType: string\n width?: number\n height?: number\n}\n\n/**\n * Registers REST endpoints for universal asset upload and retrieval\n *\n * Endpoints:\n * - POST {basePath}/upload - Upload a new asset (multipart/form-data)\n * - GET {basePath}/:id - Get asset binary by ID\n * - GET {basePath}/:id/metadata - Get asset metadata only\n * - GET {basePath}/by-name/:name - Get asset binary by name\n */\nexport function registerAssetRestController(\n router: Router,\n config: AssetRestControllerConfig,\n): void {\n const { basePath } = config\n const prisma = getDbClient()\n\n // Upload endpoint - accepts multipart/form-data\n router.post(\n `${basePath}/upload`,\n upload.single('asset'),\n async (req: Request, res: Response) => {\n try {\n if (!req.file) {\n res.status(400).json({ error: 'No file uploaded' })\n return\n }\n\n const name = req.body['name'] as string\n const assetType = req.body['assetType']\n\n if (!name) {\n res.status(400).json({ error: 'Name is required' })\n return\n }\n\n const id = await upsertAsset({\n prisma,\n buffer: req.file.buffer,\n name,\n originalFilename: req.file.filename,\n assetType,\n })\n\n res.status(201).json({ id })\n } catch (error) {\n console.error('Error uploading asset:', error)\n res.status(500).json({ error: 'Failed to upload asset' })\n }\n },\n )\n\n // Get asset binary by ID\n router.get(`${basePath}/:id`, async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n\n const asset = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n content: true,\n mimeType: true,\n name: true,\n width: true,\n height: true,\n },\n })\n\n if (!asset) {\n res.status(404).json({ error: 'Asset not found' })\n return\n }\n\n const resizeEnabled =\n String(process.env.EH_ASSETS_RESIZE_ENABLED || 'true') === 'true'\n const wParam = req.query['w'] as string | undefined\n const width = wParam ? Number.parseInt(wParam, 10) : undefined\n\n let outBuffer: Uint8Array = asset.content\n let outMime = asset.mimeType\n\n const shouldResize =\n resizeEnabled &&\n isRasterImage(asset.mimeType) &&\n !!width &&\n Number.isFinite(width) &&\n width > 0\n\n if (shouldResize) {\n const fmt = getImageFormat(asset.mimeType) || 'jpeg'\n const buf = await resizeImage(\n Buffer.from(asset.content),\n width,\n undefined,\n fmt,\n )\n outBuffer = new Uint8Array(buf)\n outMime = `image/${fmt}`\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', outMime)\n res.setHeader('Content-Disposition', `inline; filename=\"${asset.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content (resized if requested)\n res.send(outBuffer)\n } catch (error) {\n console.error('Error fetching asset:', error)\n res.status(500).json({ error: 'Failed to fetch asset' })\n }\n })\n\n // Get asset metadata only (no binary content)\n router.get(\n `${basePath}/:id/metadata`,\n async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n\n const asset = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n assetType: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n\n if (!asset) {\n res.status(404).json({ error: 'Asset not found' })\n return\n }\n\n res.json(asset)\n } catch (error) {\n console.error('Error fetching asset metadata:', error)\n res.status(500).json({ error: 'Failed to fetch asset metadata' })\n }\n },\n )\n\n // Get asset binary by name\n router.get(\n `${basePath}/by-name/:name`,\n async (req: Request, res: Response) => {\n try {\n const { name } = req.params\n\n const asset = await prisma.dbAsset.findUnique({\n where: { name },\n select: {\n content: true,\n mimeType: true,\n name: true,\n width: true,\n height: true,\n },\n })\n\n if (!asset) {\n res.status(404).json({ error: 'Asset not found' })\n return\n }\n\n const resizeEnabled =\n String(process.env.EH_ASSETS_RESIZE_ENABLED || 'true') === 'true'\n const wParam = req.query['w'] as string | undefined\n const width = wParam ? Number.parseInt(wParam, 10) : undefined\n\n let outBuffer: Uint8Array = asset.content\n let outMime = asset.mimeType\n\n const isRaster =\n asset.mimeType.startsWith('image/') && !asset.mimeType.includes('svg')\n const shouldResize =\n resizeEnabled &&\n isRaster &&\n !!width &&\n Number.isFinite(width) &&\n width > 0\n\n if (shouldResize) {\n const fmt = asset.mimeType.includes('png')\n ? 'png'\n : asset.mimeType.includes('webp')\n ? 'webp'\n : 'jpeg'\n\n let buf: Buffer\n const pipeline = sharp(Buffer.from(asset.content)).resize({\n width,\n fit: 'inside',\n withoutEnlargement: true,\n })\n if (fmt === 'png') {\n buf = await pipeline.png().toBuffer()\n outMime = 'image/png'\n } else if (fmt === 'webp') {\n buf = await pipeline.webp().toBuffer()\n outMime = 'image/webp'\n } else {\n buf = await pipeline.jpeg().toBuffer()\n outMime = 'image/jpeg'\n }\n outBuffer = new Uint8Array(buf)\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', outMime)\n res.setHeader('Content-Disposition', `inline; filename=\"${asset.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content (resized if requested)\n res.send(outBuffer)\n } catch (error) {\n console.error('Error fetching asset by name:', error)\n res.status(500).json({ error: 'Failed to fetch asset' })\n }\n },\n )\n}\n","import type { Request, Response, Router } from 'express'\nimport sharp from 'sharp'\nimport { getDbClient } from '../../db'\n\nexport interface ScreenshotRestControllerConfig {\n /**\n * Base path for screenshot endpoints (e.g., '/api/screenshots')\n */\n basePath: string\n}\n\n/**\n * Registers REST endpoints for screenshot retrieval\n * \n * Endpoints:\n * - GET {basePath}/app/:appId - Get all screenshots for an app\n * - GET {basePath}/:id - Get screenshot binary by ID\n * - GET {basePath}/:id/metadata - Get screenshot metadata only\n */\nexport function registerScreenshotRestController(\n router: Router,\n config: ScreenshotRestControllerConfig,\n): void {\n const { basePath } = config\n\n // Get all screenshots for an app\n router.get(`${basePath}/app/:appSlug`, async (req: Request, res: Response) => {\n try {\n const { appSlug } = req.params\n\n const prisma = getDbClient()\n \n // Find app by slug\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appSlug },\n select: { screenshotIds: true },\n })\n\n if (!app) {\n res.status(404).json({ error: 'App not found' })\n return\n }\n\n // Fetch all screenshots for the app\n const screenshots = await prisma.dbAsset.findMany({\n where: {\n id: { in: app.screenshotIds },\n assetType: 'screenshot',\n },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n },\n })\n\n res.json(screenshots)\n } catch (error) {\n console.error('Error fetching app screenshots:', error)\n res.status(500).json({ error: 'Failed to fetch screenshots' })\n }\n })\n\n // Get first screenshot for an app (convenience endpoint)\n router.get(`${basePath}/app/:appSlug/first`, async (req: Request, res: Response) => {\n try {\n const { appSlug } = req.params\n\n const prisma = getDbClient()\n \n // Find app by slug\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appSlug },\n select: { screenshotIds: true },\n })\n\n if (!app || app.screenshotIds.length === 0) {\n res.status(404).json({ error: 'No screenshots found' })\n return\n }\n\n // Fetch first screenshot\n const screenshot = await prisma.dbAsset.findUnique({\n where: { id: app.screenshotIds[0] },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n },\n })\n\n if (!screenshot) {\n res.status(404).json({ error: 'Screenshot not found' })\n return\n }\n\n res.json(screenshot)\n } catch (error) {\n console.error('Error fetching first screenshot:', error)\n res.status(500).json({ error: 'Failed to fetch screenshot' })\n }\n })\n\n // Get screenshot binary by ID\n router.get(`${basePath}/:id`, async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n const sizeParam = req.query.size as string | undefined\n const targetSize = sizeParam ? parseInt(sizeParam, 10) : undefined\n\n const prisma = getDbClient()\n const screenshot = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n content: true,\n mimeType: true,\n name: true,\n },\n })\n\n if (!screenshot) {\n res.status(404).json({ error: 'Screenshot not found' })\n return\n }\n\n let content: Uint8Array | Buffer = screenshot.content\n\n // Resize if size parameter provided\n if (targetSize && targetSize > 0) {\n try {\n content = await sharp(screenshot.content)\n .resize(targetSize, targetSize, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .toBuffer()\n } catch (resizeError) {\n console.error('Error resizing screenshot:', resizeError)\n // Fall back to original if resize fails\n }\n }\n\n // Set appropriate headers\n res.setHeader('Content-Type', screenshot.mimeType)\n res.setHeader('Content-Disposition', `inline; filename=\"${screenshot.name}\"`)\n res.setHeader('Cache-Control', 'public, max-age=86400') // Cache for 1 day\n\n // Send binary content\n res.send(content)\n } catch (error) {\n console.error('Error fetching screenshot:', error)\n res.status(500).json({ error: 'Failed to fetch screenshot' })\n }\n })\n\n // Get screenshot metadata only (no binary content)\n router.get(`${basePath}/:id/metadata`, async (req: Request, res: Response) => {\n try {\n const { id } = req.params\n\n const prisma = getDbClient()\n const screenshot = await prisma.dbAsset.findUnique({\n where: { id },\n select: {\n id: true,\n name: true,\n mimeType: true,\n fileSize: true,\n width: true,\n height: true,\n createdAt: true,\n updatedAt: true,\n },\n })\n\n if (!screenshot) {\n res.status(404).json({ error: 'Screenshot not found' })\n return\n }\n\n res.json(screenshot)\n } catch (error) {\n console.error('Error fetching screenshot metadata:', error)\n res.status(500).json({ error: 'Failed to fetch screenshot metadata' })\n }\n })\n}\n","import { readFileSync, readdirSync } from 'node:fs'\nimport { extname, join } from 'node:path'\nimport { getDbClient } from '../../db'\nimport { generateChecksum, getImageDimensions } from './assetUtils'\n\nexport interface SyncAssetsConfig {\n /**\n * Directory containing icon files to sync\n */\n iconsDir?: string\n\n /**\n * Directory containing screenshot files to sync\n */\n screenshotsDir?: string\n}\n\n/**\n * Sync local asset files (icons and screenshots) from directories into the database.\n *\n * This function allows consuming applications to sync asset files without directly\n * exposing the Prisma client. It handles:\n * - Icon files: Assigned to apps by matching filename to icon name patterns\n * - Screenshot files: Assigned to apps by matching filename to app ID (format: <app-id>_screenshot_<no>.<ext>)\n *\n * @param config Configuration with paths to icon and screenshot directories\n */\nexport async function syncAssets(config: SyncAssetsConfig): Promise<{\n iconsUpserted: number\n screenshotsUpserted: number\n}> {\n const prisma = getDbClient()\n let iconsUpserted = 0\n let screenshotsUpserted = 0\n\n // Sync icons from local/icons directory\n if (config.iconsDir) {\n console.log(`📁 Syncing icons from ${config.iconsDir}...`)\n iconsUpserted = await syncIconsFromDirectory(prisma, config.iconsDir)\n console.log(` ✓ Upserted ${iconsUpserted} icons`)\n }\n\n // Sync screenshots from local/screenshots directory\n if (config.screenshotsDir) {\n console.log(`📷 Syncing screenshots from ${config.screenshotsDir}...`)\n screenshotsUpserted = await syncScreenshotsFromDirectory(\n prisma,\n config.screenshotsDir,\n )\n console.log(\n ` ✓ Upserted ${screenshotsUpserted} screenshots and assigned to apps`,\n )\n }\n\n return {\n iconsUpserted,\n screenshotsUpserted,\n }\n}\n\n/**\n * Sync icon files from a directory\n */\nasync function syncIconsFromDirectory(\n prisma: ReturnType<typeof getDbClient>,\n iconsDir: string,\n): Promise<number> {\n let count = 0\n\n try {\n const files = readdirSync(iconsDir)\n\n for (const file of files) {\n const filePath = join(iconsDir, file)\n const ext = extname(file).toLowerCase().slice(1) // Remove leading dot\n\n // Skip non-image files\n if (!['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(ext)) {\n continue\n }\n\n try {\n const content = readFileSync(filePath)\n const buffer = Buffer.from(content)\n const checksum = generateChecksum(buffer)\n const iconName = file.replace(/\\.[^/.]+$/, '') // Remove extension\n\n // Check if asset with same checksum already exists\n const existing = await prisma.dbAsset.findFirst({\n where: { checksum, assetType: 'icon' },\n })\n\n if (existing) {\n continue // Already synced\n }\n\n // Extract dimensions for raster images\n let width: number | null = null\n let height: number | null = null\n if (!ext.includes('svg')) {\n const { width: w, height: h } = await getImageDimensions(buffer)\n width = w ?? null\n height = h ?? null\n }\n\n // Determine MIME type\n const mimeType =\n {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n }[ext] || 'application/octet-stream'\n\n await prisma.dbAsset.create({\n data: {\n name: iconName,\n assetType: 'icon',\n content: new Uint8Array(buffer),\n checksum,\n mimeType,\n fileSize: buffer.length,\n width,\n height,\n },\n })\n\n count++\n } catch (error) {\n console.warn(` ⚠ Failed to sync icon ${file}:`, error)\n }\n }\n } catch (error) {\n console.error(` ❌ Error reading icons directory:`, error)\n }\n\n return count\n}\n\n/**\n * Sync screenshot files from a directory and assign to apps\n */\nasync function syncScreenshotsFromDirectory(\n prisma: ReturnType<typeof getDbClient>,\n screenshotsDir: string,\n): Promise<number> {\n let count = 0\n\n try {\n const files = readdirSync(screenshotsDir)\n\n // Group screenshots by app ID\n const screenshotsByApp = new Map<\n string,\n Array<{ path: string; ext: string }>\n >()\n\n for (const file of files) {\n // Parse filename: <app-id>_screenshot_<no>.<ext>\n const match = file.match(/^(.+?)_screenshot_(\\d+)\\.([^.]+)$/)\n if (!match || !match[1] || !match[3]) {\n continue\n }\n\n const appId = match[1]\n const ext = match[3]\n if (!screenshotsByApp.has(appId)) {\n screenshotsByApp.set(appId, [])\n }\n screenshotsByApp.get(appId)!.push({\n path: join(screenshotsDir, file),\n ext,\n })\n }\n\n // Process each app's screenshots\n for (const [appId, screenshots] of screenshotsByApp) {\n try {\n // Check if app exists\n const app = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appId },\n select: { id: true },\n })\n\n if (!app) {\n console.warn(` ⚠ App not found: ${appId}`)\n continue\n }\n\n // Sync screenshots for this app\n for (const screenshot of screenshots) {\n try {\n const content = readFileSync(screenshot.path)\n const buffer = Buffer.from(content)\n const checksum = generateChecksum(buffer)\n\n // Check if screenshot with same checksum already exists\n const existing = await prisma.dbAsset.findFirst({\n where: { checksum, assetType: 'screenshot' },\n })\n\n if (existing) {\n // Link to app via screenshotIds array if not already linked\n const existingApp = await prisma.dbAppForCatalog.findUnique({\n where: { slug: appId },\n })\n if (\n existingApp &&\n !existingApp.screenshotIds.includes(existing.id)\n ) {\n await prisma.dbAppForCatalog.update({\n where: { slug: appId },\n data: {\n screenshotIds: [...existingApp.screenshotIds, existing.id],\n },\n })\n }\n continue\n }\n\n // Extract dimensions\n const { width, height } = await getImageDimensions(buffer)\n\n // Determine MIME type\n const mimeType =\n {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n }[screenshot.ext.toLowerCase()] || 'application/octet-stream'\n\n // Create screenshot asset\n const asset = await prisma.dbAsset.create({\n data: {\n name: `${appId}-screenshot-${Date.now()}`,\n assetType: 'screenshot',\n content: new Uint8Array(buffer),\n checksum,\n mimeType,\n fileSize: buffer.length,\n width: width ?? null,\n height: height ?? null,\n },\n })\n\n // Link screenshot to app via screenshotIds array\n await prisma.dbAppForCatalog.update({\n where: { slug: appId },\n data: {\n screenshotIds: {\n push: asset.id,\n },\n },\n })\n\n count++\n } catch (error) {\n console.warn(\n ` ⚠ Failed to sync screenshot ${screenshot.path}:`,\n error,\n )\n }\n }\n } catch (error) {\n console.warn(` ⚠ Failed to process app ${appId}:`, error)\n }\n }\n } catch (error) {\n console.error(` ❌ Error reading screenshots directory:`, error)\n }\n\n return count\n}\n","import type { AppForCatalog } from '../../types/common/appCatalogTypes'\nimport { getDbClient } from '../../db/client'\n\ninterface LinkCheck {\n url: string\n status: number | null\n error?: string\n appSlug: string\n linkType: 'appUrl' | 'sources' | 'accessRequest.urls'\n}\n\ninterface CheckLinksOptions {\n maxConcurrent?: number\n timeout?: number\n maxRetries?: number\n onProgress?: (result: LinkCheck) => void\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function checkUrlWithRetry(\n url: string,\n options: {\n timeout: number\n maxRetries: number\n },\n): Promise<{ status: number | null; error?: string }> {\n let lastError: string | undefined\n\n for (let attempt = 0; attempt <= options.maxRetries; attempt++) {\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n redirect: 'manual', // Don't follow redirects\n signal: AbortSignal.timeout(options.timeout),\n })\n return { status: response.status }\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n lastError = errorMessage\n\n // Check if it's a retryable error (timeout or fetch failed)\n const isRetryable =\n errorMessage.includes('aborted') ||\n errorMessage.includes('timeout') ||\n errorMessage.includes('fetch failed')\n\n if (isRetryable && attempt < options.maxRetries) {\n // Exponential backoff: 1s, 2s, 4s\n const backoffMs = 1000 * 2 ** attempt\n await sleep(backoffMs)\n continue\n }\n\n break\n }\n }\n\n return { status: null, error: lastError }\n}\n\nfunction getStatusEmoji(status: number | null): string {\n if (status === null) return '❌'\n if (status >= 200 && status < 300) return '✅'\n if (status >= 300 && status < 400) return '🔀'\n if (status === 403) return '🔒' // 403 is not an error, just forbidden\n if (status && status >= 400 && status < 500) return '⚠️'\n return '❌'\n}\n\nfunction isWorkingLink(status: number | null): boolean {\n if (status === null) return false\n // 2xx, 3xx, and 403 are considered working\n if (status >= 200 && status < 400) return true\n if (status === 403) return true\n return false\n}\n\nfunction isBrokenLink(status: number | null): boolean {\n if (status === null) return true\n // 403 is not broken\n if (status === 403) return false\n // 4xx (except 403) and 5xx are broken\n return status >= 400\n}\n\nfunction formatStatus(status: number | null, error?: string): string {\n if (status === null) {\n return `ERROR: ${error || 'Unknown error'}`\n }\n return `${status}`\n}\n\nasync function getAppsFromDb(): Promise<Array<AppForCatalog>> {\n const prisma = getDbClient()\n const rows = await prisma.dbAppForCatalog.findMany()\n\n return rows.map((row) => {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as Array<string> | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = (row.sources as unknown as Array<string> | null) ?? []\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n }\n })\n}\n\n/**\n * Check all links in the app catalog and return a report\n */\nexport async function checkAllLinks(options: CheckLinksOptions = {}): Promise<{\n total: number\n working: number\n broken: number\n redirects: number\n checks: Array<LinkCheck>\n}> {\n const {\n maxConcurrent = 10,\n timeout = 60000,\n maxRetries = 3,\n onProgress,\n } = options\n\n const apps = await getAppsFromDb()\n const checks: Array<Omit<LinkCheck, 'status' | 'error'>> = []\n\n // Collect all links\n for (const app of apps) {\n // Check appUrl\n if (app.appUrl) {\n checks.push({\n url: app.appUrl,\n appSlug: app.slug,\n linkType: 'appUrl',\n })\n }\n\n // Check sources\n if (app.sources && app.sources.length > 0) {\n for (const source of app.sources) {\n checks.push({\n url: source,\n appSlug: app.slug,\n linkType: 'sources',\n })\n }\n }\n\n // Check accessRequest.urls\n if (app.accessRequest?.urls && app.accessRequest.urls.length > 0) {\n for (const link of app.accessRequest.urls) {\n checks.push({\n url: link.url,\n appSlug: app.slug,\n linkType: 'accessRequest.urls',\n })\n }\n }\n }\n\n // Check all links with concurrency control\n const results: Array<LinkCheck> = []\n const queue = [...checks]\n const inProgress = new Set<Promise<void>>()\n\n while (queue.length > 0 || inProgress.size > 0) {\n // Start new requests up to maxConcurrent\n while (queue.length > 0 && inProgress.size < maxConcurrent) {\n const check = queue.shift()!\n\n const promise = (async () => {\n const result = await checkUrlWithRetry(check.url, {\n timeout,\n maxRetries,\n })\n\n const linkCheck: LinkCheck = {\n ...check,\n status: result.status,\n error: result.error,\n }\n results.push(linkCheck)\n\n // Stream result if callback provided\n if (onProgress) {\n onProgress(linkCheck)\n }\n })()\n\n inProgress.add(promise)\n\n // Clean up when promise completes\n void promise.finally(() => {\n inProgress.delete(promise)\n })\n }\n\n // Wait for at least one to complete before continuing\n if (inProgress.size > 0) {\n await Promise.race(inProgress)\n }\n }\n\n const working = results.filter((r) => isWorkingLink(r.status))\n const broken = results.filter((r) => isBrokenLink(r.status))\n const redirects = results.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n return {\n total: results.length,\n working: working.length,\n broken: broken.length,\n redirects: redirects.length,\n checks: results,\n }\n}\n\n/**\n * Print a formatted report of link check results\n */\nexport function printLinkCheckReport(report: {\n total: number\n working: number\n broken: number\n redirects: number\n checks: Array<LinkCheck>\n}): void {\n console.log('📊 Results:\\n')\n console.log(`✅ Working links: ${report.working}`)\n console.log(`❌ Broken links: ${report.broken}`)\n console.log(`🔀 Redirects: ${report.redirects}`)\n console.log()\n\n const broken = report.checks.filter((r) => isBrokenLink(r.status))\n const redirects = report.checks.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n // Show broken links\n if (broken.length > 0) {\n console.log('❌ Broken Links:\\n')\n for (const link of broken) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Show redirects\n if (redirects.length > 0) {\n console.log('🔀 Redirects:\\n')\n for (const link of redirects) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Summary by app\n const appStats = new Map<\n string,\n { working: number; broken: number; total: number }\n >()\n for (const result of report.checks) {\n const stats = appStats.get(result.appSlug) || {\n working: 0,\n broken: 0,\n total: 0,\n }\n stats.total++\n if (isWorkingLink(result.status)) {\n stats.working++\n } else {\n stats.broken++\n }\n appStats.set(result.appSlug, stats)\n }\n\n const appsWithBrokenLinks = Array.from(appStats.entries())\n .filter(([_, stats]) => stats.broken > 0)\n .sort((a, b) => b[1].broken - a[1].broken)\n\n if (appsWithBrokenLinks.length > 0) {\n console.log('📱 Apps with broken links:\\n')\n for (const [appSlug, stats] of appsWithBrokenLinks) {\n console.log(` ${appSlug}: ${stats.broken}/${stats.total} broken`)\n }\n console.log()\n }\n\n if (broken.length > 0) {\n console.log(`\\n❌ Found ${broken.length} broken link(s)`)\n } else {\n console.log('\\n✅ All links are working!')\n }\n}\n","import { PrismaClient } from '../db/prisma'\nimport { PrismaPg } from '@prisma/adapter-pg'\nimport pg from 'pg'\nimport type { EhDatabaseConfig } from './types'\nimport { setDbClient } from '../db/client'\n\n/**\n * Formats a database connection URL from structured config.\n */\nfunction formatConnectionUrl(config: EhDatabaseConfig): string {\n if ('url' in config) {\n return config.url\n }\n\n const { host, port, database, username, password, schema = 'public' } = config\n return `postgresql://${username}:${encodeURIComponent(password)}@${host}:${port}/${database}?schema=${schema}`\n}\n\n/**\n * Internal database manager used by the middleware.\n * Handles connection URL formatting and lifecycle.\n */\nexport class EhDatabaseManager {\n private client: PrismaClient | null = null\n private pool: pg.Pool | null = null\n private config: EhDatabaseConfig\n\n constructor(config: EhDatabaseConfig) {\n this.config = config\n }\n\n /**\n * Get or create the Prisma client instance.\n * Uses lazy initialization for flexibility.\n */\n getClient(): PrismaClient {\n if (!this.client) {\n const datasourceUrl = formatConnectionUrl(this.config)\n\n // Prisma 7 with adapter: Create pg pool and wrap with adapter\n this.pool = new pg.Pool({ connectionString: datasourceUrl })\n const adapter = new PrismaPg(this.pool)\n\n this.client = new PrismaClient({\n adapter,\n log:\n process.env.NODE_ENV === 'development'\n ? ['warn', 'error']\n : ['warn', 'error'],\n })\n\n // Bridge with existing backend-core getDbClient() usage\n setDbClient(this.client)\n }\n return this.client\n }\n\n async connect(): Promise<void> {\n const client = this.getClient()\n await client.$connect()\n }\n\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.$disconnect()\n this.client = null\n }\n if (this.pool) {\n await this.pool.end()\n this.pool = null\n }\n }\n}\n","import type { AppCatalogCompanySpecificBackend } from '../types/backend/companySpecificBackend'\nimport type { EhBackendProvider } from './types'\n\n/**\n * Type guard to check if an object implements AppCatalogCompanySpecificBackend.\n */\nfunction isBackendInstance(\n obj: unknown,\n): obj is AppCatalogCompanySpecificBackend {\n return typeof obj === 'object' && obj !== null\n}\n\n/**\n * Normalizes different backend provider types into a consistent async factory function.\n * Supports:\n * - Direct object implementing AppCatalogCompanySpecificBackend\n * - Sync factory function that returns the backend\n * - Async factory function that returns the backend\n */\nexport function createBackendResolver(\n provider: EhBackendProvider,\n): () => Promise<AppCatalogCompanySpecificBackend> {\n // If it's already an object with the required methods, wrap it\n if (isBackendInstance(provider)) {\n return async () => provider\n }\n\n // If it's a function, call it and handle both sync and async results\n if (typeof provider === 'function') {\n return async () => {\n const result = (\n provider as () =>\n | AppCatalogCompanySpecificBackend\n | Promise<AppCatalogCompanySpecificBackend>\n )()\n return result instanceof Promise ? await result : result\n }\n }\n\n throw new Error(\n 'Invalid backend provider: must be an object implementing AppCatalogCompanySpecificBackend or a factory function',\n )\n}\n","import type { EhDevMockUser } from '../../middleware/types'\nimport type { User } from 'better-auth/types'\n\n/**\n * Extended User type with app-catalog specific fields\n */\ntype EhUser = User & {\n env_hopper_groups?: Array<string>\n}\n\n/**\n * Creates a complete User object from basic dev mock user details\n */\nexport function createMockUserFromDevConfig(devUser: EhDevMockUser): EhUser {\n return {\n id: devUser.id,\n email: devUser.email,\n name: devUser.name,\n emailVerified: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n env_hopper_groups: devUser.groups,\n }\n}\n\n/**\n * Creates a mock session response for /api/auth/session endpoint\n */\nexport function createMockSessionResponse(devUser: EhDevMockUser) {\n return {\n user: {\n id: devUser.id,\n email: devUser.email,\n name: devUser.name,\n emailVerified: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n env_hopper_groups: devUser.groups,\n },\n session: {\n id: `${devUser.id}-session`,\n userId: devUser.id,\n expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30).toISOString(), // 30 days\n token: `${devUser.id}-token`,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n }\n}\n","import type { Router } from 'express'\nimport { toNodeHandler } from 'better-auth/node'\nimport type {\n EhFeatureToggles,\n EhMiddlewareOptions,\n MiddlewareContext,\n} from './types'\nimport { registerIconRestController } from '../modules/icons/iconRestController'\nimport { registerAssetRestController } from '../modules/assets/assetRestController'\nimport { registerScreenshotRestController } from '../modules/assets/screenshotRestController'\nimport { getAssetByName } from '../modules/icons/iconService'\nimport { createMockSessionResponse } from '../modules/auth/devMockUserUtils'\n\ninterface FeatureRegistration {\n name: keyof EhFeatureToggles\n defaultEnabled: boolean\n register: (\n router: Router,\n options: Required<Pick<EhMiddlewareOptions, 'basePath'>> &\n EhMiddlewareOptions,\n context: MiddlewareContext,\n ) => void\n}\n\n// Optional features that can be toggled\nconst FEATURES: Array<FeatureRegistration> = [\n {\n name: 'auth',\n defaultEnabled: true,\n register: (router, options, ctx) => {\n const basePath = options.basePath\n\n // Explicit session endpoint handler\n router.get(\n `${basePath}/auth/session`,\n async (req, res): Promise<void> => {\n try {\n // Check if dev mock user is configured\n if (ctx.authConfig.devMockUser) {\n res.json(createMockSessionResponse(ctx.authConfig.devMockUser))\n return\n }\n\n const session = await ctx.auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n res.json(session)\n } else {\n res.status(401).json({ error: 'Not authenticated' })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n },\n )\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n const authHandler = toNodeHandler(ctx.auth)\n router.all(`${basePath}/auth/{*any}`, authHandler)\n },\n },\n {\n name: 'legacyIconEndpoint',\n defaultEnabled: false,\n register: (router) => {\n // Legacy endpoint at /static/icon/:icon for backwards compatibility\n router.get('/static/icon/:icon', async (req, res) => {\n const { icon } = req.params\n\n if (!icon || !/^[a-z0-9-]+$/i.test(icon)) {\n res.status(400).send('Invalid icon name')\n return\n }\n\n try {\n const dbIcon = await getAssetByName(icon)\n\n if (!dbIcon) {\n res.status(404).send('Icon not found')\n return\n }\n\n res.setHeader('Content-Type', dbIcon.mimeType)\n res.setHeader('Cache-Control', 'public, max-age=86400')\n res.send(dbIcon.content)\n } catch (error) {\n console.error('Error fetching icon:', error)\n res.status(404).send('Icon not found')\n }\n })\n },\n },\n]\n\n/**\n * Registers all enabled features on the router.\n */\nexport function registerFeatures(\n router: Router,\n options: Required<Pick<EhMiddlewareOptions, 'basePath'>> &\n EhMiddlewareOptions,\n context: MiddlewareContext,\n): void {\n const basePath = options.basePath\n\n // Always-on features (required for core functionality)\n\n // Icons\n registerIconRestController(router, {\n basePath: `${basePath}/icons`,\n })\n\n // Assets\n registerAssetRestController(router, {\n basePath: `${basePath}/assets`,\n })\n\n // Screenshots\n registerScreenshotRestController(router, {\n basePath: `${basePath}/screenshots`,\n })\n\n // Optional toggleable features\n const toggles = options.features || {}\n\n for (const feature of FEATURES) {\n const isEnabled = toggles[feature.name] ?? feature.defaultEnabled\n\n if (isEnabled) {\n feature.register(router, options, context)\n }\n }\n}\n","import express, { Router } from 'express'\nimport * as trpcExpress from '@trpc/server/adapters/express'\nimport type {\n EhMiddlewareOptions,\n EhMiddlewareResult,\n MiddlewareContext,\n} from './types'\nimport { EhDatabaseManager } from './database'\nimport { createBackendResolver } from './backendResolver'\nimport { registerFeatures } from './featureRegistry'\nimport { createTrpcRouter } from '../server/controller'\nimport { createEhTrpcContext } from '../server/ehTrpcContext'\nimport { createAuth } from '../modules/auth/auth'\nimport { createMockUserFromDevConfig } from '../modules/auth/devMockUserUtils'\n\nexport async function createEhMiddleware(\n options: EhMiddlewareOptions,\n): Promise<EhMiddlewareResult> {\n // Normalize options with defaults\n const basePath = options.basePath ?? '/api'\n const normalizedOptions = { ...options, basePath }\n\n // Initialize database manager\n const dbManager = new EhDatabaseManager(options.database)\n // Initialize the client (which also sets the global singleton)\n dbManager.getClient()\n\n // Create auth instance\n const auth = createAuth({\n appName: options.auth.appName,\n baseURL: options.auth.baseURL,\n secret: options.auth.secret,\n providers: options.auth.providers,\n plugins: options.auth.plugins,\n sessionExpiresIn: options.auth.sessionExpiresIn,\n sessionUpdateAge: options.auth.sessionUpdateAge,\n })\n\n // Create tRPC router\n const trpcRouter = createTrpcRouter(auth)\n\n // Normalize backend provider to async factory function\n const resolveBackend = createBackendResolver(options.backend)\n\n // Get admin groups from config with default\n const adminGroups = options.auth.adminGroups ?? ['env_hopper_ui_super_admins']\n\n // Create tRPC context factory\n const createContext = async ({\n req,\n }: trpcExpress.CreateExpressContextOptions) => {\n const companySpecificBackend = await resolveBackend()\n\n let user = null\n let userGroups: Array<string> = []\n\n // Check if dev mock user is configured\n if (options.auth.devMockUser) {\n user = createMockUserFromDevConfig(options.auth.devMockUser)\n userGroups = options.auth.devMockUser.groups\n } else {\n // Extract user from session\n try {\n const session = await auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n user = session?.user ?? null\n\n // If user is authenticated and Okta is configured, decode groups from access token\n if (user && options.auth.oktaGroupsClaim) {\n try {\n // Get the current access token (auto-refreshes if expired)\n // Note: better-auth requires providerId, but we use 'okta' as default\n const tokenResult = await auth.api.getAccessToken({\n body: {\n providerId: 'okta',\n },\n headers: req.headers as HeadersInit,\n })\n\n if (tokenResult.accessToken) {\n // Decode JWT to extract groups claim\n const parts = tokenResult.accessToken.split('.')\n if (parts.length === 3 && parts[1]) {\n const payload = JSON.parse(\n Buffer.from(parts[1], 'base64').toString(),\n )\n const groups = payload[options.auth.oktaGroupsClaim]\n userGroups = Array.isArray(groups) ? groups : []\n }\n }\n } catch (error) {\n console.error('[tRPC Context] Failed to get access token:', error)\n }\n }\n } catch (error) {\n console.error('[tRPC Context] Failed to get session:', error)\n }\n }\n\n // Attach groups to user object for authorization checks\n const userWithGroups = user ? { ...user, groups: userGroups } : null\n\n return createEhTrpcContext({\n companySpecificBackend,\n user: userWithGroups,\n adminGroups,\n })\n }\n\n // Create Express router\n const router = Router()\n router.use(express.json())\n\n // Build middleware context for feature registration\n const middlewareContext: MiddlewareContext = {\n auth,\n trpcRouter,\n createContext: async () => {\n const companySpecificBackend = await resolveBackend()\n return createEhTrpcContext({\n companySpecificBackend,\n adminGroups,\n })\n },\n authConfig: options.auth,\n }\n\n // Register tRPC middleware (if enabled)\n if (normalizedOptions.features?.trpc !== false) {\n router.use(\n `${basePath}/trpc`,\n trpcExpress.createExpressMiddleware({\n router: trpcRouter,\n createContext,\n }),\n )\n }\n\n // Register all enabled features\n registerFeatures(router, normalizedOptions, middlewareContext)\n\n // Call onRoutesRegistered hook if provided\n if (options.hooks?.onRoutesRegistered) {\n await options.hooks.onRoutesRegistered(router)\n }\n\n return {\n router,\n auth,\n trpcRouter,\n\n async connect(): Promise<void> {\n await dbManager.connect()\n if (options.hooks?.onDatabaseConnected) {\n await options.hooks.onDatabaseConnected()\n }\n },\n\n async disconnect(): Promise<void> {\n if (options.hooks?.onDatabaseDisconnecting) {\n await options.hooks.onDatabaseDisconnecting()\n }\n await dbManager.disconnect()\n },\n\n addRoutes(callback: (router: Router) => void): void {\n callback(router)\n },\n }\n}\n","/**\n * Injects custom script tags into HTML content.\n *\n * Inserts script tags at the end of the body tag (before </body>).\n * This is useful for analytics, monitoring, or other third-party scripts.\n *\n * @param html - The HTML content to modify\n * @param scriptUrls - Array of script URLs to inject\n * @returns Modified HTML with injected scripts\n */\nexport function injectCustomScripts(\n html: string,\n scriptUrls: Array<string>,\n): string {\n if (scriptUrls.length === 0) {\n return html\n }\n\n const scriptTags = scriptUrls\n .map((url) => ` <script src=\"${url}\"></script>`)\n .join('\\n')\n\n // Insert scripts before the closing </body> tag\n return html.replace('</body>', `${scriptTags}\\n </body>`)\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAMA,SAAwC;CAC5C,mBAAmB,EAAE;CACrB,iBAAiB;CACjB,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,oBAAoB;EAClB,UAAU,EAAE;EACZ,SAAS,EAAE;EACX,SAAS,EAAE;EACZ;CACD,0BAA0B;EACxB,WAAW,EAAE;EACb,SAAS;EACV;CACF;AAED,OAAO,mBAAmB,KAAK,MAAM,uiLAAuiL;AAC5kL,OAAO,yBAAyB;CAC9B,SAAS,KAAK,MAAM,s4JAAs4J;CAC15J,OAAO;CACR;AAED,eAAe,mBAAmB,YAAiD;CACjF,MAAM,EAAE,qBAAW,MAAM,OAAO;CAChC,MAAM,YAAYC,SAAO,KAAK,YAAY,SAAS;AACnD,QAAO,IAAI,YAAY,OAAO,UAAU;;AAG1C,OAAO,eAAe;CACpB,YAAY,YAAY,MAAM,OAAO;CAErC,4BAA4B,YAAY;EACtC,MAAM,EAAE,SAAS,MAAM,OAAO;AAC9B,SAAO,MAAM,mBAAmB,KAAK;;CAGvC,YAAY;CACb;AAwND,SAAgB,uBAAgD;AAC9D,QAAO,QAAQ,gBAAgB,OAAO;;;;;ACjQxC,WAAW,eAAeC,OAAK,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;AAwBtE,MAAa,eAAeC,sBAA6B;;;;;ACrCzD,SAAQ,QAAQ,SAAU,QAAQ,aAAW;AAC3C,SAAO,IAAI,YAAY,QAAQC,YAAU,CAAC,OAAO;;CAGnD,IAAM,cAAN,MAAM,YAAY;EAChB,YAAa,QAAQ,aAAW;AAC9B,QAAK,SAAS;AACd,QAAK,YAAYA,eAAa;AAC9B,QAAK,WAAW;AAChB,QAAK,UAAU,EAAE;AACjB,QAAK,WAAW,EAAE;AAClB,QAAK,YAAY;;EAGnB,QAAS;AACP,UAAO,KAAK,YAAY,KAAK,OAAO;;EAGtC,gBAAiB;GACf,IAAI,YAAY,KAAK,OAAO,KAAK;AACjC,OAAI,cAAc,KAChB,QAAO;IACL,OAAO,KAAK,OAAO,KAAK;IACxB,SAAS;IACV;AAEH,UAAO;IACL,OAAO;IACP,SAAS;IACV;;EAGH,OAAQ,WAAW;AACjB,QAAK,SAAS,KAAK,UAAU;;EAG/B,SAAU,cAAc;GACtB,IAAI;AACJ,OAAI,KAAK,SAAS,SAAS,KAAK,cAAc;AAC5C,YAAQ,KAAK,SAAS,KAAK,GAAG;AAC9B,QAAI,UAAU,UAAU,CAAC,aACvB,SAAQ;AAEV,QAAI,UAAU,KAAM,SAAQ,KAAK,UAAU,MAAM;AACjD,SAAK,QAAQ,KAAK,MAAM;AACxB,SAAK,WAAW,EAAE;;;EAItB,oBAAqB;AACnB,OAAI,KAAK,OAAO,OAAO,KACrB;WAAO,CAAC,KAAK,OAAO,CAElB,KADW,KAAK,eAAe,CACtB,UAAU,IAAK;;;EAK9B,MAAO,QAAQ;GACb,IAAI,WAAW,QAAQ;AACvB,QAAK,mBAAmB;AACxB,UAAO,CAAC,KAAK,OAAO,EAAE;AACpB,gBAAY,KAAK,eAAe;AAChC,QAAI,UAAU,UAAU,OAAO,CAAC,OAAO;AACrC,UAAK;AACL,SAAI,KAAK,YAAY,GAAG;AACtB,eAAS,IAAI,YAAY,KAAK,OAAO,OAAO,KAAK,WAAW,EAAE,EAAE,KAAK,UAAU;AAC/E,WAAK,QAAQ,KAAK,OAAO,MAAM,KAAK,CAAC;AACrC,WAAK,YAAY,OAAO,WAAW;;eAE5B,UAAU,UAAU,OAAO,CAAC,OAAO;AAC5C,UAAK;AACL,SAAI,CAAC,KAAK,WAAW;AACnB,WAAK,UAAU;AACf,UAAI,OAAQ,QAAO,KAAK;;eAEjB,UAAU,UAAU,QAAO,CAAC,UAAU,SAAS;AACxD,SAAI,MAAO,MAAK,SAAS,KAAK;AAC9B,aAAQ,CAAC;eACA,UAAU,UAAU,OAAO,CAAC,MACrC,MAAK,UAAU;QAEf,MAAK,OAAO,UAAU,MAAM;;AAGhC,OAAI,KAAK,cAAc,EACrB,OAAM,IAAI,MAAM,+BAA+B;AAEjD,UAAO,KAAK;;;CAIhB,SAAS,SAAU,OAAO;AACxB,SAAO;;;;;;;CC/FT,IAAIC;AAEJ,QAAO,UAAU,EACf,QAAQ,SAAU,QAAQ,aAAW;AACnC,SAAO,EACL,OAAO,WAAW;AAChB,UAAOA,QAAM,MAAM,QAAQC,YAAU;KAExC;IAEJ;;;;;;CCRD,IAAI,YAAY;CAChB,IAAI,OAAO;CACX,IAAI,YAAY;CAChB,IAAI,WAAW;AAEf,QAAO,UAAU,SAASC,YAAW,SAAS;AAC5C,MAAI,SAAS,KAAK,QAAQ,CAExB,QAAO,OAAO,QAAQ,QAAQ,KAAK,IAAI,CAAC;EAE1C,IAAI,UAAU,UAAU,KAAK,QAAQ;AAErC,MAAI,CAAC,QAEH,QAAO,QAAQ,QAAQ,IAAI;EAG7B,IAAI,OAAO,CAAC,CAAC,QAAQ;EACrB,IAAI,OAAO,SAAS,QAAQ,IAAI,GAAG;AACnC,MAAI,KACF,QAAO,qBAAqB,KAAK;EAGnC,IAAI,QAAQ,SAAS,QAAQ,IAAI,GAAG,GAAG;EACvC,IAAI,MAAM,QAAQ;EAClB,IAAI,OAAO,SAAS,QAAQ,IAAI,GAAG;EACnC,IAAI,SAAS,SAAS,QAAQ,IAAI,GAAG;EACrC,IAAI,SAAS,SAAS,QAAQ,IAAI,GAAG;EAErC,IAAI,KAAK,QAAQ;AACjB,OAAK,KAAK,MAAO,WAAW,GAAG,GAAG;EAElC,IAAI;EACJ,IAAI,SAAS,eAAe,QAAQ;AACpC,MAAI,UAAU,MAAM;AAClB,UAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,GAAG,CAAC;AAIrE,OAAI,QAAQ,KAAK,CACf,MAAK,eAAe,KAAK;AAG3B,OAAI,WAAW,EACb,MAAK,QAAQ,KAAK,SAAS,GAAG,OAAO;SAElC;AACL,UAAO,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,GAAG;AAE3D,OAAI,QAAQ,KAAK,CACf,MAAK,YAAY,KAAK;;AAI1B,SAAO;;CAGT,SAAS,QAAS,SAAS;EACzB,IAAI,UAAU,KAAK,KAAK,QAAQ;AAChC,MAAI,CAAC,QACH;EAGF,IAAI,OAAO,SAAS,QAAQ,IAAI,GAAG;AAEnC,MADW,CAAC,CAAC,QAAQ,GAEnB,QAAO,qBAAqB,KAAK;EAGnC,IAAI,QAAQ,SAAS,QAAQ,IAAI,GAAG,GAAG;EACvC,IAAI,MAAM,QAAQ;EAElB,IAAI,OAAO,IAAI,KAAK,MAAM,OAAO,IAAI;AAErC,MAAI,QAAQ,KAAK,CACf,MAAK,YAAY,KAAK;AAGxB,SAAO;;CAOT,SAAS,eAAgB,SAAS;AAChC,MAAI,QAAQ,SAAS,MAAM,CACzB,QAAO;EAGT,IAAI,OAAO,UAAU,KAAK,QAAQ,MAAM,IAAI,CAAC,GAAG;AAChD,MAAI,CAAC,KAAM;EACX,IAAI,OAAO,KAAK;AAEhB,MAAI,SAAS,IACX,QAAO;EAET,IAAI,OAAO,SAAS,MAAM,KAAK;AAK/B,UAJa,SAAS,KAAK,IAAI,GAAG,GAAG,OACnC,SAAS,KAAK,MAAM,GAAG,GAAG,GAAG,KAC7B,SAAS,KAAK,MAAM,GAAG,GAAG,IAEZ,OAAO;;CAGzB,SAAS,qBAAsB,MAAM;AAGnC,SAAO,EAAE,OAAO;;CAGlB,SAAS,QAAS,KAAK;AACrB,SAAO,OAAO,KAAK,MAAM;;;;;;;AClH3B,QAAO,UAAUC;CAEjB,IAAI,iBAAiB,OAAO,UAAU;CAEtC,SAASA,SAAO,QAAQ;AACpB,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;GACvC,IAAI,SAAS,UAAU;AAEvB,QAAK,IAAI,OAAO,OACZ,KAAI,eAAe,KAAK,QAAQ,IAAI,CAChC,QAAO,OAAO,OAAO;;AAKjC,SAAO;;;;;;;CCbX,IAAI;AAEJ,QAAO,UAAU;CAEjB,SAAS,iBAAkB,KAAK;AAC9B,MAAI,EAAE,gBAAgB,kBACpB,QAAO,IAAI,iBAAiB,IAAI;AAElC,SAAO,MAAMC,QAAM,IAAI,CAAC;;CAE1B,IAAI,aAAa;EAAC;EAAW;EAAW;EAAS;EAAQ;EAAU;EAAQ;AAC3E,kBAAiB,UAAU,aAAa,WAAY;EAClD,IAAI,WAAW,WAAW,OAAO,KAAK,gBAAgB,KAAK;AAG3D,MAAI,KAAK,gBAAgB,SAAS,QAAQ,UAAU,GAAG,EACrD,UAAS,KAAK,UAAU;AAG1B,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,SACJ,IAAI,SAAU,UAAU;GACvB,IAAI,QAAQ,KAAK,aAAa;AAI9B,OAAI,aAAa,aAAa,KAAK,aACjC,UAAS,QAAQ,KAAK,eAAe,KAAM,QAAQ,EAAE,CAAC,QAAQ,UAAU,GAAG;AAG7E,UAAO,QAAQ,MAAM;KACpB,KAAK,CACP,KAAK,IAAI;;CAGd,IAAI,0BAA0B;EAC5B,OAAO;EACP,QAAQ;EACR,MAAM;EACN,OAAO;EACP,SAAS;EACT,SAAS;EACV;CACD,IAAI,iBAAiB;EAAC;EAAS;EAAU;EAAO;CAChD,IAAI,iBAAiB;EAAC;EAAS;EAAW;EAAU;AAEpD,kBAAiB,UAAU,cAAc,iBAAiB,UAAU,QAAQ,WAAY;EACtF,IAAI,WAAW,eACZ,IAAI,eAAe,KAAK,CACxB,KAAK,GAAG;EAEX,IAAI,WAAW,eACZ,IAAI,eAAe,KAAK,CACxB,KAAK,GAAG;AAEX,SAAO,MAAM,WAAW,MAAM;EAE9B,SAAS,cAAe,UAAU;GAChC,IAAI,QAAQ,KAAK,aAAa;AAI9B,OAAI,aAAa,aAAa,KAAK,aACjC,UAAS,QAAQ,KAAK,eAAe,KAAM,QAAQ,EAAE,CAAC,QAAQ,OAAO,GAAG;AAG1E,UAAO,QAAQ,wBAAwB;;;CAI3C,IAAI,SAAS;CACb,IAAI,OAAO,SAAS;CACpB,IAAI,QAAQ,SAAS;CACrB,IAAI,MAAM,SAAS;CAEnB,IAAI,WAAW,IAAI,OAAO;EAAC;EAAM;EAAO;EAD7B;EACuC,CAAC,IAAI,SAAU,aAAa;AAC5E,SAAO,MAAM,cAAc;GAC3B,CACC,KAAK,OAAO,CAAC;CAGhB,IAAI,YAAY;EACd,OAAO;EACP,QAAQ;EACR,MAAM;EACN,OAAO;EACP,SAAS;EACT,SAAS;EACT,cAAc;EACf;CAED,IAAI,YAAY;EAAC;EAAS;EAAW;EAAW;EAAe;CAE/D,SAAS,kBAAmB,UAAU;EAEpC,IAAI,eAAe,WAAW,SAAS,MAAM,SAAS,OAAO;AAC7D,SAAO,SAAS,cAAc,GAAG,GAAG;;CAGtC,SAASA,QAAO,UAAU;AACxB,MAAI,CAAC,SAAU,QAAO,EAAE;EACxB,IAAI,UAAU,SAAS,KAAK,SAAS;EACrC,IAAI,aAAa,QAAQ,OAAO;AAChC,SAAO,OAAO,KAAK,UAAU,CAC1B,OAAO,SAAU,QAAQ,UAAU;GAElC,IAAI,QAAQ,QADG,UAAU;AAGzB,OAAI,CAAC,MAAO,QAAO;AAGnB,WAAQ,aAAa,iBACjB,kBAAkB,MAAM,GACxB,SAAS,OAAO,GAAG;AAEvB,OAAI,CAAC,MAAO,QAAO;AACnB,OAAI,cAAc,CAAC,UAAU,QAAQ,SAAS,CAC5C,UAAS;AAEX,UAAO,YAAY;AACnB,UAAO;KACN,EAAE,CAAC;;;;;;;CCzHV,IAAI,aAAa,OAAO,QAAQ;AAEhC,QAAO,UAAU,SAAS,WAAY,OAAO;AAC3C,MAAI,OAAO,KAAK,MAAM,CAEpB,QAAO,WAAW,MAAM,OAAO,EAAE,EAAE,MAAM;EAE3C,IAAI,SAAS;EACb,IAAI,IAAI;AACR,SAAO,IAAI,MAAM,OACf,KAAI,MAAM,OAAO,MAAM;AACrB,aAAU,MAAM;AAChB,KAAE;aAEE,WAAW,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC,EAAE;AAC3C,aAAU,OAAO,aAAa,SAAS,MAAM,OAAO,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC;AAClE,QAAK;SACA;GACL,IAAI,cAAc;AAClB,UAAO,IAAI,cAAc,MAAM,UAAU,MAAM,IAAI,iBAAiB,KAClE;AAEF,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,cAAc,EAAE,EAAE,EAAE,EACjD,WAAU;AAEZ,QAAK,KAAK,MAAM,cAAc,EAAE,GAAG;;AAIzC,SAAO,WAAW,QAAQ,SAAS;;;;;;;CC/BrC,IAAI;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAI;CACJ,IAAI;CAEJ,SAAS,UAAW,IAAI;AACtB,SAAO,SAAS,YAAa,OAAO;AAClC,OAAI,UAAU,KAAM,QAAO;AAC3B,UAAO,GAAG,MAAM;;;CAIpB,SAASC,YAAW,OAAO;AACzB,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,UAAU,UACf,UAAU,OACV,UAAU,UACV,UAAU,OACV,UAAU,SACV,UAAU,QACV,UAAU;;CAGd,SAAS,eAAgB,OAAO;AAC9B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,MAAM,OAAOA,YAAU;;CAGtC,SAAS,gBAAiB,QAAQ;AAChC,SAAO,SAAS,QAAQ,GAAG;;CAG7B,SAAS,kBAAmB,OAAO;AACjC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,MAAM,OAAO,UAAU,gBAAgB,CAAC;;CAGvD,SAASC,uBAAsB,OAAO;AACpC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,MAAM,OAAO,UAAU,SAAU,OAAO;AACnD,UAAOC,kBAAgB,MAAM,CAAC,MAAM;IACpC,CAAC;;CAGL,IAAI,kBAAkB,SAAS,OAAO;AACpC,MAAG,CAAC,MAAS,QAAO;AAQpB,SAPQJ,cAAY,OAAO,OAAO,SAAS,OAAO;AAChD,OAAG,UAAU,KACX,SAAQ,WAAW,MAAM;AAE3B,UAAO;IACP,CAEO,OAAO;;CAGlB,IAAI,kBAAkB,SAAS,OAAO;AACpC,MAAG,CAAC,MAAS,QAAO;AAQpB,SAPQA,cAAY,OAAO,OAAO,SAAS,OAAO;AAChD,OAAG,UAAU,KACX,SAAQ,WAAW,MAAM;AAE3B,UAAO;IACP,CAEO,OAAO;;CAGlB,IAAI,mBAAmB,SAAS,OAAO;AACrC,MAAG,CAAC,MAAS,QAAO;AAGpB,SADQA,cAAY,OAAO,MAAM,CACxB,OAAO;;CAGlB,IAAI,iBAAiB,SAAS,OAAO;AACnC,MAAI,CAAC,MAAS,QAAO;AASrB,SAPQA,cAAY,OAAO,OAAO,SAAS,OAAO;AAChD,OAAI,UAAU,KACZ,SAAQC,YAAU,MAAM;AAE1B,UAAO;IACP,CAEO,OAAO;;CAGlB,IAAI,qBAAqB,SAAS,OAAO;AACvC,MAAI,CAAC,MAAS,QAAO;AASrB,SAPQD,cAAY,OAAO,OAAO,SAAS,OAAO;AAChD,OAAI,UAAU,KACZ,SAAQ,cAAc,MAAM;AAE9B,UAAO;IACP,CAEO,OAAO;;CAGlB,IAAI,kBAAkB,SAAS,OAAO;AACpC,MAAI,CAAC,MAAS,QAAO;AAErB,SAAO,MAAM,MAAM,OAAO,UAAU,WAAW,CAAC;;CAGlD,IAAI,eAAe,SAAS,OAAO;AACjC,SAAO,SAAS,OAAO,GAAG;;CAG5B,IAAII,oBAAkB,SAAS,OAAO;EACpC,IAAI,SAAS,OAAO,MAAM;AAC1B,MAAI,QAAQ,KAAK,OAAO,CAAI,QAAO;AACnC,SAAO;;CAGT,IAAI,iBAAiB,SAAS,OAAO;AACnC,MAAI,CAAC,MAAS,QAAO;AAErB,SAAO,MAAM,MAAM,OAAO,UAAU,KAAK,MAAM,CAAC;;CAGlD,IAAI,aAAa,SAAS,OAAO;AAC/B,MAAI,MAAM,OAAO,IAAO,QAAO;AAE/B,UAAQ,MAAM,UAAW,GAAG,MAAM,SAAS,EAAG,CAAC,MAAM,IAAI;AAEzD,SAAO;GACL,GAAG,WAAW,MAAM,GAAG;GACvB,GAAG,WAAW,MAAM,GAAG;GACxB;;CAGH,IAAI,cAAc,SAAS,OAAO;AAChC,MAAI,MAAM,OAAO,OAAO,MAAM,OAAO,IAAO,QAAO;EAEnD,IAAI,QAAQ;EACZ,IAAI,SAAS;EACb,IAAI,cAAc;AAClB,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAI;AACxC,OAAI,CAAC,YACH,UAAS,MAAM;AAGjB,OAAI,MAAM,OAAO,KAAK;AACpB,kBAAc;AACd;cACS,CAAC,YACV;AAGF,OAAI,MAAM,OAAO,IACf;AAGF,aAAU,MAAM;;EAElB,IAAI,SAAS,WAAW,MAAM;AAC9B,SAAO,SAAS,WAAW,OAAO;AAElC,SAAO;;CAGT,IAAIC,SAAO,SAAS,UAAU;AAC5B,WAAS,IAAID,kBAAgB;AAC7B,WAAS,IAAI,aAAa;AAC1B,WAAS,IAAI,aAAa;AAC1B,WAAS,IAAI,aAAa;AAC1B,WAAS,KAAK,WAAW;AACzB,WAAS,KAAK,WAAW;AACzB,WAAS,IAAIF,YAAU;AACvB,WAAS,MAAMD,YAAU;AACzB,WAAS,MAAMA,YAAU;AACzB,WAAS,MAAMA,YAAU;AACzB,WAAS,KAAK,WAAW;AACzB,WAAS,KAAK,iBAAiB;AAC/B,WAAS,KAAK,YAAY;AAC1B,WAAS,KAAM,eAAe;AAC9B,WAAS,MAAM,gBAAgB;AAC/B,WAAS,MAAM,kBAAkB;AACjC,WAAS,MAAM,kBAAkB;AACjC,WAAS,MAAM,kBAAkB;AACjC,WAAS,MAAME,uBAAqB;AACpC,WAAS,MAAM,gBAAgB;AAC/B,WAAS,MAAM,gBAAgB;AAC/B,WAAS,MAAM,gBAAgB;AAC/B,WAAS,MAAM,gBAAgB;AAC/B,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,eAAe;AAC9B,WAAS,MAAM,eAAe;AAC9B,WAAS,MAAM,eAAe;AAC9B,WAAS,MAAM,cAAc;AAC7B,WAAS,MAAM,mBAAmB;AAClC,WAAS,IAAI,WAAW;AACxB,WAAS,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC;AACpC,WAAS,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC;AACrC,WAAS,KAAK,eAAe;AAC7B,WAAS,MAAM,eAAe;AAC9B,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,iBAAiB;AAChC,WAAS,KAAK,iBAAiB;AAC/B,WAAS,MAAM,iBAAiB;AAChC,WAAS,MAAM,iBAAiB;;AAGlC,QAAO,UAAU,EACf,MAAME,QACP;;;;;;CCnND,IAAI,OAAO;CAEX,SAAS,SAAS,QAAQ;EACzB,IAAI,OAAO,OAAO,YAAY,EAAE;EAChC,IAAI,MAAM,OAAO,aAAa,EAAE;EAChC,IAAI,OAAO;AAEX,MAAI,OAAO,GAAG;AACb,UAAO,CAAC,QAAQ,QAAQ;AACxB,SAAO,CAAC,MAAM,MAAO;AACrB,UAAO;;EAGR,IAAI,SAAS;EACb,IAAI;EACJ,IAAIC;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;AAGH,UAAQ,OAAO;AACf,SAAO,OAAO,SAAS;AAEvB,QAAI,aAAc,QAAQ;AAC1B,QAAMA,MAAI,SAAS;AACnB,WAAS,MAAMA,MAAI,OAAO;AAE1B,MAAI,QAAQ,KAAK,SAAS,EACzB,QAAO,OAAO,SAAS;AAGxB,QAAM;AACN,MAAI,IAAI,OAAO;AAEf,OAAK,IAAI,GAAG,IAAI,GAAG,IAClB,QAAO;AAGR,WAAS,MAAM,SAAS;AAIxB,UAAQ,OAAO;AACf,SAAO,OAAO,SAAS;AAEvB,QAAI,aAAc,QAAQ;AAC1B,QAAMA,MAAI,SAAS;AACnB,WAAS,MAAMA,MAAI,OAAO;AAE1B,MAAI,QAAQ,KAAK,SAAS,EACzB,QAAO,OAAO,SAAS;AAGxB,QAAM;AACN,MAAI,IAAI,OAAO;AAEf,OAAK,IAAI,GAAG,IAAI,GAAG,IAClB,QAAO;AAGR,WAAS,MAAM,SAAS;AAIxB,UAAQ,OAAO;AACf,SAAO,OAAO,SAAS;AAEvB,QAAI,aAAc,QAAQ;AAC1B,QAAMA,MAAI,SAAS;AACnB,WAAS,MAAMA,MAAI,OAAO;AAE1B,MAAI,QAAQ,KAAK,SAAS,EACzB,QAAO,OAAO,SAAS;AAGxB,QAAM;AACN,MAAI,IAAI,OAAO;AAEf,OAAK,IAAI,GAAG,IAAI,GAAG,IAClB,QAAO;AAGR,WAAS,MAAM,SAAS;AAIxB,UAAQ,OAAO;AACf,QAAI,aAAc,QAAQ;AAC1B,WAAS,KAAKA,MAAI;AAElB,SAAO,OAAO,SAAS;;AAIzB,QAAO,UAAU;;;;;;CCnGjB,IAAI;CAEJ,IAAI,YAAY,SAAS,MAAM,MAAM,QAAQ,QAAQ,UAAU;AAC7D,WAAS,UAAU;AACnB,WAAS,UAAU;AACnB,aAAW,YAAY,SAAS,WAAW,UAAU,QAAM;AAAE,UAAQ,YAAY,KAAK,IAAI,GAAGC,OAAK,GAAI;;EACtG,IAAI,cAAc,UAAU;EAE5B,IAAI,MAAM,SAAS,OAAO;AACxB,OAAI,OACF,QAAO,CAAC,QAAQ;AAGlB,UAAO;;EAIT,IAAI,OAAO;EACX,IAAI,YAAY,IAAK,SAAS;AAC9B,MAAI,OAAO,WAAW;AACpB,UAAQ,OAAS,IAAI,OAAS;AAC9B,eAAY;;AAGd,MAAI,OACF,QAAO,QAAS,SAAS;EAG3B,IAAI,SAAS;AACb,MAAK,SAAS,IAAK,QAAQ,EACzB,UAAS,SAAS,GAAG,IAAI,KAAK,aAAa,GAAG,MAAM,UAAU;EAIhE,IAAI,QAAS,OAAO,UAAW;AAC/B,OAAK,IAAI,IAAI,cAAc,GAAG,IAAI,OAAO,IACvC,UAAS,SAAS,QAAQ,IAAI,KAAK,GAAG,EAAE,EAAE;EAI5C,IAAI,YAAY,OAAO,UAAU;AACjC,MAAI,WAAW,EACb,UAAS,SAAS,QAAQ,IAAI,KAAK,OAAO,IAAK,IAAI,UAAW,SAAS;AAGzE,SAAO;;CAGT,IAAI,qBAAqB,SAAS,MAAM,eAAe,cAAc;EACnE,IAAI,OAAO,KAAK,IAAI,GAAG,eAAe,EAAE,GAAG;EAC3C,IAAI,OAAO,UAAU,MAAM,EAAE;EAC7B,IAAI,WAAW,UAAU,MAAM,cAAc,EAAE;AAE/C,MAAI,aAAa,EACf,QAAO;EAIT,IAAI,uBAAuB;EAC3B,IAAI,qBAAqB,SAAS,WAAW,UAAU,MAAM;AAC3D,OAAI,cAAc,EAChB,aAAY;AAGd,QAAK,IAAI,IAAI,GAAG,KAAK,MAAM,KAAK;AAC9B,4BAAwB;AACxB,SAAK,WAAY,KAAQ,OAAO,KAAO,EACrC,cAAa;;AAIjB,UAAO;;EAGT,IAAI,WAAW,UAAU,MAAM,eAAe,eAAe,GAAG,OAAO,mBAAmB;AAG1F,MAAI,YAAa,KAAK,IAAI,GAAG,eAAe,EAAE,GAAG,GAAI;AACnD,OAAI,aAAa,EACf,QAAQ,SAAS,IAAK,WAAW;AAGnC,UAAO;;AAIT,UAAS,SAAS,IAAK,IAAI,MAAM,KAAK,IAAI,GAAG,WAAW,KAAK,GAAG;;CAGlE,IAAI,aAAa,SAAS,OAAO;AAC/B,MAAI,UAAU,OAAO,EAAE,IAAI,EACzB,QAAO,MAAM,UAAU,OAAO,IAAI,GAAG,KAAK,GAAG;AAG/C,SAAO,UAAU,OAAO,IAAI,EAAE;;CAGhC,IAAI,aAAa,SAAS,OAAO;AAC/B,MAAI,UAAU,OAAO,EAAE,IAAI,EACzB,QAAO,MAAM,UAAU,OAAO,IAAI,GAAG,KAAK,GAAG;AAG/C,SAAO,UAAU,OAAO,IAAI,EAAE;;CAGhC,IAAI,eAAe,SAAS,OAAO;AACjC,SAAO,mBAAmB,OAAO,IAAI,EAAE;;CAGzC,IAAI,eAAe,SAAS,OAAO;AACjC,SAAO,mBAAmB,OAAO,IAAI,GAAG;;CAG1C,IAAI,eAAe,SAAS,OAAO;EACjC,IAAI,OAAO,UAAU,OAAO,IAAI,GAAG;AACnC,MAAI,QAAQ,MACV,QAAO;EAGT,IAAI,SAAS,KAAK,IAAI,KAAO,UAAU,OAAO,IAAI,GAAG,CAAC;EACtD,IAAI,SAAS;EAGb,IAAI,UAAU,UAAU,OAAO,GAAG;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,aAAU,UAAU,OAAO,IAAI,KAAM,KAAK,EAAG,GAAG;AAChD,aAAU;;EAGZ,IAAI,QAAQ,KAAK,IAAI,IAAI,UAAU,OAAO,IAAI,GAAG,CAAC;AAClD,UAAS,SAAS,IAAK,IAAI,MAAM,KAAK,MAAM,SAAS,MAAM,GAAG;;CAGhE,IAAI,YAAY,SAAS,OAAO,OAAO;EACrC,IAAI,OAAO,UAAU,OAAO,EAAE;EAC9B,IAAI,WAAW,UAAU,OAAO,IAAI,EAAE;EAGtC,IAAI,yBAAS,IAAI,MAAQ,SAAS,IAAK,IAAI,MAAM,WAAW,MAAQ,UAAa;AAEjF,MAAI,CAAC,MACH,QAAO,QAAQ,OAAO,SAAS,GAAG,OAAO,mBAAmB,GAAG,IAAM;AAIvE,SAAO,OAAO,WAAW;AACzB,SAAO,kBAAkB,WAAW;AAClC,UAAO,KAAK;;AAEd,SAAO,kBAAkB,SAAS,SAAO;AACvC,QAAK,OAAOC;;AAEd,SAAO,qBAAqB,WAAW;AACrC,UAAO,KAAK;;AAGd,SAAO;;CAGT,IAAI,aAAa,SAAS,OAAO;EAC/B,IAAI,MAAM,UAAU,OAAO,GAAG;AAElB,YAAU,OAAO,IAAI,GAAG;EACpC,IAAI,cAAc,UAAU,OAAO,IAAI,GAAG;EAE1C,IAAI,SAAS;EACb,IAAI,OAAO,EAAE;AACb,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;AAE5B,QAAK,KAAK,UAAU,OAAO,IAAI,OAAO;AACtC,aAAU;AAGV,aAAU;;EAGZ,IAAI,eAAe,SAAS,eAAa;GAEvC,IAAI,SAAS,UAAU,OAAO,IAAI,OAAO;AACzC,aAAU;AAGV,OAAI,UAAU,WACZ,QAAO;GAGT,IAAI;AACJ,OAAKC,iBAAe,MAAUA,iBAAe,IAAO;AAElD,aAAS,UAAU,OAAO,SAAS,GAAG,OAAO;AAC7C,cAAU,SAAS;AACnB,WAAO;cAEAA,iBAAe,IAAM;AAE5B,aAAS,MAAM,SAAS,KAAK,UAAU,UAAU,IAAI,UAAW,UAAU,MAAO,EAAE;AACnF,WAAO;SAGP,SAAQ,IAAI,yCAAyCA,cAAY;;EAIrE,IAAIC,UAAQ,SAAS,WAAW,eAAa;GAC3C,IAAIC,UAAQ,EAAE;GACd,IAAIC;AAEJ,OAAI,UAAU,SAAS,GAAG;IACxB,IAAI,QAAQ,UAAU,OAAO;AAC7B,SAAK,MAAI,GAAGA,MAAI,OAAO,MACrB,SAAMA,OAAKF,QAAM,WAAWD,cAAY;AAE1C,cAAU,QAAQ,MAAM;SAGxB,MAAK,MAAI,GAAGG,MAAI,UAAU,IAAI,MAC5B,SAAMA,OAAK,aAAaH,cAAY;AAIxC,UAAOE;;AAGT,SAAOD,QAAM,MAAM,YAAY;;CAGjC,IAAI,YAAY,SAAS,OAAO;AAC9B,SAAO,MAAM,SAAS,OAAO;;CAG/B,IAAI,YAAY,SAAS,OAAO;AAC9B,MAAG,UAAU,KAAM,QAAO;AAC1B,SAAQ,UAAU,OAAO,EAAE,GAAG;;CAGhC,IAAI,OAAO,SAAS,UAAU;AAC5B,WAAS,IAAI,WAAW;AACxB,WAAS,IAAI,WAAW;AACxB,WAAS,IAAI,WAAW;AACxB,WAAS,IAAI,WAAW;AACxB,WAAS,MAAM,aAAa;AAC5B,WAAS,KAAK,aAAa;AAC3B,WAAS,KAAK,aAAa;AAC3B,WAAS,IAAI,UAAU;AACvB,WAAS,MAAM,UAAU,KAAK,MAAM,MAAM,CAAC;AAC3C,WAAS,MAAM,UAAU,KAAK,MAAM,KAAK,CAAC;AAC1C,WAAS,KAAM,WAAW;AAC1B,WAAS,MAAM,WAAW;AAC1B,WAAS,MAAM,WAAW;AAC1B,WAAS,MAAM,WAAW;AAC1B,WAAS,MAAM,WAAW;AAC1B,WAAS,IAAI,UAAU;;AAGzB,QAAO,UAAU,EACT,MACP;;;;;;;;;;;;;;;;ACrPD,QAAO,UAAU;EACb,MAAM;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,SAAS;EACT,MAAM;EACN,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,MAAM;EACN,KAAK;EACL,cAAc;EACd,MAAM;EACN,MAAM;EACN,SAAS;EACT,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,SAAS;EACT,WAAW;EACX,QAAQ;EACR,UAAU;EACV,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;EACT,QAAQ;EACR,SAAS;EACT,MAAM;EACN,MAAM;EACN,WAAW;EACX,aAAa;EACb,UAAU;EACV,QAAQ;EACR,KAAK;EACL,QAAQ;EACR,SAAS;EACT,WAAW;EACX,cAAc;EACd,SAAS;EACT,aAAa;EACb,UAAU;EACV,SAAS;EACT,MAAM;EACN,eAAe;EACf,QAAQ;EACR,cAAc;EACd,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,WAAW;EACX,WAAW;EACX,eAAe;EACf,OAAO;EACP,cAAc;EACd,SAAS;EACZ;;;;;;CCxED,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AAEJ,SAAQ,gBAAgB;AACxB,SAAQ,gBAAgB;AACxB,SAAQ,cAAc;AACtB,SAAQ,WAAW;CAEnB,IAAI,cAAc;EAChB,MAAM,EAAE;EACR,QAAQ,EAAE;EACX;CAGD,SAAS,QAAS,OAAK;AACrB,SAAO,OAAOG,MAAI;;CAOpB,SAAS,cAAe,KAAK,QAAQ;AACnC,WAAS,UAAU;AACnB,MAAI,CAAC,YAAY,QACf,QAAO;AAET,SAAO,YAAY,QAAQ,QAAQ;;CAGrC,SAAS,cAAe,KAAK,QAAQ,SAAS;AAC5C,MAAG,OAAO,UAAU,YAAY;AAC9B,aAAU;AACV,YAAS;;AAEX,cAAY,QAAQ,OAAO;;AAG7B,aAAY,KAAK,SAAS,KAAK,WAAW;AACxC,cAAY,KAAK,OAAO;GACxB;AAEF,eAAc,KAAK,SAAS,KAAK,WAAW;AAC1C,cAAY,OAAO,OAAO;GAC1B;;;;;;CC5CF,IAAI;AACJ,KAAI;AACF,SAAO,QAAQ,aAAa,UAAU,QAAQ,IAAI,WAAW,QAAQ,IAAI;SACnE;AAIR,QAAO,UAAU;EAEf,MAAM;EAGN;EAGA,UAAU;EAGV,UAAU;EAKV,kBAAkB;EAGlB,MAAM;EAIN,MAAM;EAGN,QAAQ;EAMR,KAAK;EAIL,mBAAmB;EAEnB,iBAAiB;EAEjB,KAAK;EAEL,kBAAkB;EAElB,2BAA2B;EAE3B,SAAS;EAET,sBAAsB;EAItB,mBAAmB;EAInB,cAAc;EAId,qCAAqC;EAGrC,eAAe;EAEf,iBAAiB;EAEjB,YAAY;EAEZ,iBAAiB;EAClB;CAED,MAAM;CAEN,MAAM,kBAAkB,QAAQ,cAAc,IAAI,OAAO;CACzD,MAAM,uBAAuB,QAAQ,cAAc,MAAM,OAAO;AAGhE,QAAO,QAAQ,iBAAiB,aAAa,SAAU,OAAK;AAC1D,UAAQ,cAAc,IAAI,QAAQC,QAAM,QAAQ,cAAc,IAAI,OAAO,GAAG,gBAAgB;AAC5F,UAAQ,cAAc,MAAM,QAAQA,QAAM,QAAQ,cAAc,MAAM,OAAO,GAAG,qBAAqB;GACrG;;;;;;CCxFF,MAAMC;CAEN,MAAMC,mBAAe,OAAO;CAC5B,MAAM,EAAE,WAAWA,OAAK,SAASA;CAEjC,SAAS,cAAc,uBAAuB;AAG5C,SAAO,OAFS,sBAAsB,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,OAAM,GAE1D;;CAMzB,SAAS,YAAY,OAAK;EACxB,IAAI,SAAS;AACb,OAAK,IAAI,IAAI,GAAG,IAAIC,MAAI,QAAQ,KAAK;AACnC,OAAI,IAAI,EACN,UAAS,SAAS;AAEpB,OAAIA,MAAI,OAAO,QAAQ,OAAOA,MAAI,OAAO,YACvC,UAAS,SAAS;YACT,MAAM,QAAQA,MAAI,GAAG,CAC9B,UAAS,SAAS,YAAYA,MAAI,GAAG;YAC5B,YAAY,OAAOA,MAAI,GAAG,EAAE;IACrC,IAAI,OAAOA,MAAI;AACf,QAAI,EAAE,gBAAgB,SAAS;KAC7B,MAAM,MAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,KAAK,WAAW;AACtE,SAAI,IAAI,WAAW,KAAK,WACtB,QAAO;SAEP,QAAO,IAAI,MAAM,KAAK,YAAY,KAAK,aAAa,KAAK,WAAW;;AAGxE,cAAU,UAAU,KAAK,SAAS,MAAM;SAExC,WAAU,cAAc,aAAaA,MAAI,GAAG,CAAC;;AAGjD,WAAS,SAAS;AAClB,SAAO;;CAOT,MAAM,eAAe,SAAU,OAAK,MAAM;AAExC,MAAIA,SAAO,KACT,QAAO;AAET,MAAI,OAAOA,UAAQ,UAAU;AAC3B,OAAIA,iBAAe,OACjB,QAAOA;AAET,OAAI,YAAY,OAAOA,MAAI,EAAE;IAC3B,MAAM,MAAM,OAAO,KAAKA,MAAI,QAAQA,MAAI,YAAYA,MAAI,WAAW;AACnE,QAAI,IAAI,WAAWA,MAAI,WACrB,QAAO;AAET,WAAO,IAAI,MAAMA,MAAI,YAAYA,MAAI,aAAaA,MAAI,WAAW;;AAEnE,OAAI,OAAOA,MAAI,CACb,KAAIF,WAAS,qBACX,QAAO,gBAAgBE,MAAI;OAE3B,QAAO,aAAaA,MAAI;AAG5B,OAAI,MAAM,QAAQA,MAAI,CACpB,QAAO,YAAYA,MAAI;AAGzB,UAAO,cAAcA,OAAK,KAAK;;AAEjC,SAAOA,MAAI,UAAU;;CAGvB,SAAS,cAAc,OAAK,MAAM;AAChC,MAAIA,SAAO,OAAOA,MAAI,eAAe,YAAY;AAC/C,UAAO,QAAQ,EAAE;AACjB,OAAI,KAAK,QAAQA,MAAI,KAAK,GACxB,OAAM,IAAI,MAAM,mDAAkDA,QAAM,eAAc;AAExF,QAAK,KAAKA,MAAI;AAEd,UAAO,aAAaA,MAAI,WAAW,aAAa,EAAE,KAAK;;AAEzD,SAAO,KAAK,UAAUA,MAAI;;CAG5B,SAAS,aAAa,MAAM;EAC1B,IAAI,SAAS,CAAC,KAAK,mBAAmB;EAEtC,IAAI,OAAO,KAAK,aAAa;EAC7B,MAAM,WAAW,OAAO;AACxB,MAAI,SAAU,QAAO,KAAK,IAAI,KAAK,GAAG;EAEtC,IAAI,MACF,OAAO,KAAK,CAAC,SAAS,GAAG,IAAI,GAC7B,MACA,OAAO,KAAK,UAAU,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,GAC5C,MACA,OAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,GACvC,MACA,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,GACxC,MACA,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI,GAC1C,MACA,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI,GAC1C,MACA,OAAO,KAAK,iBAAiB,CAAC,CAAC,SAAS,GAAG,IAAI;AAEjD,MAAI,SAAS,GAAG;AACd,UAAO;AACP,aAAU;QAEV,QAAO;AAGT,SAAO,OAAO,KAAK,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,GAAG,MAAM,OAAO,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI;AACpG,MAAI,SAAU,QAAO;AACrB,SAAO;;CAGT,SAAS,gBAAgB,MAAM;EAC7B,IAAI,OAAO,KAAK,gBAAgB;EAChC,MAAM,WAAW,OAAO;AACxB,MAAI,SAAU,QAAO,KAAK,IAAI,KAAK,GAAG;EAEtC,IAAI,MACF,OAAO,KAAK,CAAC,SAAS,GAAG,IAAI,GAC7B,MACA,OAAO,KAAK,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,GAC/C,MACA,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,GAAG,IAAI,GAC1C,MACA,OAAO,KAAK,aAAa,CAAC,CAAC,SAAS,GAAG,IAAI,GAC3C,MACA,OAAO,KAAK,eAAe,CAAC,CAAC,SAAS,GAAG,IAAI,GAC7C,MACA,OAAO,KAAK,eAAe,CAAC,CAAC,SAAS,GAAG,IAAI,GAC7C,MACA,OAAO,KAAK,oBAAoB,CAAC,CAAC,SAAS,GAAG,IAAI;AAEpD,SAAO;AACP,MAAI,SAAU,QAAO;AACrB,SAAO;;CAGT,SAAS,qBAAqB,UAAQ,QAAQ,UAAU;AAEtD,aAAS,OAAOC,aAAW,WAAW,EAAE,MAAMA,UAAQ,GAAGA;AACzD,MAAI,OACF,KAAI,OAAO,WAAW,WACpB,UAAO,WAAW;MAElB,UAAO,SAAS;AAGpB,MAAI,SACF,UAAO,WAAW;AAEpB,SAAOA;;CAIT,MAAMC,qBAAmB,SAAU,KAAK;AACtC,SAAO,OAAM,IAAI,QAAQ,MAAM,OAAK,GAAG;;CAGzC,MAAMC,kBAAgB,SAAU,KAAK;EACnC,IAAI,eAAe;EACnB,IAAI,UAAU;AAEd,MAAI,OAAO,KACT,QAAO;AAGT,MAAI,OAAO,QAAQ,SACjB,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;GACnC,MAAM,IAAI,IAAI;AACd,OAAI,MAAM,IACR,YAAW,IAAI;YACN,MAAM,MAAM;AACrB,eAAW,IAAI;AACf,mBAAe;SAEf,YAAW;;AAIf,aAAW;AAEX,MAAI,iBAAiB,KACnB,WAAU,OAAO;AAGnB,SAAO;;AAGT,QAAO,UAAU;EACf,cAAc,SAAS,oBAAoB,OAAO;AAGhD,UAAO,aAAa,MAAM;;EAE5B;EACA;EACA;EACD;;;;;;CCpND,MAAMC,yBAAqB,SAAS;CAEpC,SAASC,MAAI,QAAQ;AACnB,SAAOD,aAAW,WAAW,MAAM,CAAC,OAAO,QAAQ,QAAQ,CAAC,OAAO,MAAM;;CAI3E,SAASE,0BAAwB,QAAM,YAAU,MAAM;EACrD,MAAM,QAAQD,MAAIE,aAAWC,OAAK;AAElC,SAAO,QADOH,MAAI,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC;;CAI9D,SAASI,SAAO,MAAM;AACpB,SAAOL,aAAW,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,QAAQ;;CAG9D,SAASM,aAAW,UAAU,MAAM;AAClC,aAAW,SAAS,QAAQ,SAAS,KAAK;AAC1C,SAAON,aAAW,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,QAAQ;;CAG9D,SAASO,aAAW,KAAK,KAAK;AAC5B,SAAOP,aAAW,WAAW,UAAU,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;;CAGlE,eAAeQ,YAAU,YAAU,MAAM,YAAY;AACnD,SAAOR,aAAW,WAAWG,YAAU,MAAM,YAAY,IAAI,SAAS;;AAGxE,QAAO,UAAU;EACf;EACA,aAAaH,aAAW;EACxB;EACA;EACA;EACA;EACA;EACD;;;;;;CC1CD,MAAM,uBAAqB,SAAS;AAEpC,QAAO,UAAU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;CAOD,MAAM,YAAY,WAAW,aAAa,WAAW;;;;;CAKrD,MAAM,eAAe,UAAU;CAC/B,MAAM,cAAc,IAAI,aAAa;;;;;;CAOrC,SAAS,YAAY,QAAQ;AAC3B,SAAO,UAAU,gBAAgB,OAAO,MAAM,OAAO,CAAC;;CAGxD,eAAe,IAAI,QAAQ;AACzB,MAAI;AACF,UAAO,WAAW,WAAW,MAAM,CAAC,OAAO,QAAQ,QAAQ,CAAC,OAAO,MAAM;WAClE,GAAG;GAIV,MAAM,OAAO,OAAO,WAAW,WAAW,YAAY,OAAO,OAAO,GAAG;GACvE,MAAM,OAAO,MAAM,aAAa,OAAO,OAAO,KAAK;AACnD,UAAO,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC,CACpC,KAAK,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAC3C,KAAK,GAAG;;;CAKf,eAAe,wBAAwB,QAAM,YAAU,MAAM;EAC3D,MAAM,QAAQ,MAAM,IAAIS,aAAWC,OAAK;AAExC,SAAO,QADO,MAAM,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC;;;;;;CAQpE,eAAe,OAAO,MAAM;AAC1B,SAAO,MAAM,aAAa,OAAO,WAAW,KAAK;;CAGnD,eAAe,WAAW,UAAU,MAAM;AACxC,SAAO,MAAM,aAAa,OAAO,UAAU,KAAK;;;;;;;CAQlD,eAAe,WAAW,WAAW,KAAK;EACxC,MAAM,MAAM,MAAM,aAAa,UAAU,OAAO,WAAW;GAAE,MAAM;GAAQ,MAAM;GAAW,EAAE,OAAO,CAAC,OAAO,CAAC;AAC9G,SAAO,MAAM,aAAa,KAAK,QAAQ,KAAK,YAAY,OAAO,IAAI,CAAC;;;;;;;;CAStE,eAAe,UAAU,YAAU,MAAM,YAAY;EACnD,MAAM,MAAM,MAAM,aAAa,UAAU,OAAO,YAAY,OAAOD,WAAS,EAAE,UAAU,OAAO,CAAC,aAAa,CAAC;EAC9G,MAAM,SAAS;GAAE,MAAM;GAAU,MAAM;GAAiB;GAAkB;GAAY;AACtF,SAAO,MAAM,aAAa,WAAW,QAAQ,KAAK,KAAQ,CAAC,aAAa,CAAC;;;;;;;ACpF3E,KADwB,SAAS,QAAQ,YAAY,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK,MAAM,IAAI,CAAC,GAAG,GAAG,GAGnH,QAAO;KAEP,QAAO;;;;;;CCPT,SAAS,UAAU,KAAK,MAAM;AAC5B,yBAAO,IAAI,MAAM,2BAA2B,MAAM,sCAAsC,KAAK,SAAS,SAAS,CAAC;;CAGlH,SAAS,eAAe,MAAM,OAAO;EACnC,IAAI,SAAS,KAAK;AAClB,MAAI,SAAS,IAAM,QAAO;GAAE;GAAQ;GAAO;EAE3C,MAAM,cAAc,SAAS;AAC7B,MAAI,cAAc,EAAG,OAAM,UAAU,cAAc,KAAK;AAExD,WAAS;AACT,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,IAC/B,UAAU,UAAU,IAAK,KAAK;AAGhC,SAAO;GAAE;GAAQ;GAAO;;CAG1B,SAAS,YAAY,MAAM,OAAO;AAChC,MAAI,KAAK,aAAa,EAAK,OAAM,UAAU,gBAAgB,KAAK;EAEhE,MAAM,EAAE,QAAQ,WAAW,OAAO,wBAAwB,eAAe,MAAM,MAAM;AACrF,UAAQ;EACR,MAAM,YAAY,QAAQ;EAE1B,MAAM,QAAQ,KAAK;EACnB,IAAI,OAAQ,QAAQ,MAAO,KAAK,MAAO,QAAQ;AAE/C,SAAO,QAAQ,WAAW;GAExB,IAAI,QAAQ;AACZ,UAAO,QAAQ,WAAW;IAExB,MAAM,WAAW,KAAK;AACtB,YAAS,SAAS,IAAM,WAAW;AACnC,QAAI,WAAW,IAAM;;AAEvB,UAAO,MAAM;;AAGf,SAAO;GAAE;GAAK;GAAO;;CAGvB,SAAS,cAAc,MAAM,OAAO;AAClC,MAAI,KAAK,aAAa,GAAM,OAAM,UAAU,qBAAqB,KAAK;AACtE,SAAO,eAAe,MAAM,MAAM;;CAGpC,SAASE,wCAAsC,MAAM,OAAO;AAE1D,MAAI,UAAU,OAAW,SAAQ;AACjC,UAAQ,cAAc,MAAM,MAAM,CAAC;EACnC,MAAM,EAAE,QAAQ,gBAAgB,OAAO,6BAA6B,cAAc,MAAM,MAAM;AAC9F,UAAQ,2BAA2B;AACnC,UAAQ,cAAc,MAAM,MAAM,CAAC;EACnC,MAAM,EAAE,KAAK,OAAO,kBAAkB,YAAY,MAAM,MAAM;AAC9D,UAAQ,KAAR;GAEE,KAAK,uBACH,QAAO;GACT,KAAK,uBACH,QAAO;GACT,KAAK,wBACH,QAAO;GACT,KAAK,wBACH,QAAO;GACT,KAAK,wBACH,QAAO;GACT,KAAK,wBACH,QAAO;GACT,KAAK,wBACH,QAAO;GACT,KAAK,wBACH,QAAO;GAET,KAAK,oBACH,QAAO;GACT,KAAK,sBACH,QAAO;GACT,KAAK,sBACH,QAAO;GACT,KAAK,sBACH,QAAO;GACT,KAAK,sBACH,QAAO;GAET,KAAK,yBAAyB;AAC5B,YAAQ;AACR,YAAQ,cAAc,MAAM,MAAM,CAAC;AACnC,QAAI,KAAK,aAAa,IAAM,OAAM,UAAU,gBAAgB,KAAK;AACjE,YAAQ,eAAe,MAAM,MAAM,CAAC;AACpC,YAAQ,cAAc,MAAM,MAAM,CAAC;IACnC,MAAM,EAAE,KAAK,YAAY,YAAY,MAAM,MAAM;AACjD,YAAQ,SAAR;KAEE,KAAK,qBACH,QAAO;KACT,KAAK,gBACH,QAAO;KACT,KAAK,yBACH,QAAO;KACT,KAAK,yBACH,QAAO;KACT,KAAK,yBACH,QAAO;;AAEX,UAAM,UAAU,sBAAsB,SAAS,KAAK;;GAGtD,KAAK;GACL,KAAK,cACH,QAAO;GAET,KAAK;GACL,KAAK,cACH,OAAM,UAAU,2EAA2E;;AAE/F,QAAM,UAAU,iBAAiB,KAAK,KAAK;;AAG7C,QAAO,UAAU,EAAE,gFAAuC;;;;;;CCxH1D,MAAMC;CACN,MAAM,EAAE;CAER,SAAS,aAAa,YAAY,QAAQ;EACxC,MAAM,aAAa,CAAC,gBAAgB;AACpC,MAAI,OAAQ,YAAW,QAAQ,qBAAqB;EAEpD,MAAM,YAAY,WAAW,MAAM,cAAc,WAAW,SAAS,UAAU,CAAC;AAEhF,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,6BAA6B,WAAW,KAAK,QAAQ,GAAG,iBAAiB;AAG3F,MAAI,cAAc,wBAAwB,OAAO,OAAO,uBAAuB,WAE7E,OAAM,IAAI,MAAM,4DAA4D;EAG9E,MAAM,cAAcA,SAAO,YAAY,GAAG,CAAC,SAAS,SAAS;AAG7D,SAAO;GACL;GACA;GACA,WALgB,cAAc,uBAAuB,2BAA2B,SAAS,MAAM,OAKzE,aAAa;GACnC,SAAS;GACV;;CAGH,eAAe,gBAAgB,SAAS,YAAU,YAAY,QAAQ;AACpE,MAAI,QAAQ,YAAY,sBACtB,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,OAAOC,eAAa,SACtB,OAAM,IAAI,MAAM,qEAAqE;AAEvF,MAAIA,eAAa,GACf,OAAM,IAAI,MAAM,+EAA+E;AAEjG,MAAI,OAAO,eAAe,SACxB,OAAM,IAAI,MAAM,gEAAgE;EAGlF,MAAM,KAAK,wBAAwB,WAAW;AAE9C,MAAI,CAAC,GAAG,MAAM,WAAW,QAAQ,YAAY,CAC3C,OAAM,IAAI,MAAM,kFAAkF;WACzF,GAAG,MAAM,WAAW,QAAQ,YAAY,OACjD,OAAM,IAAI,MAAM,8DAA8D;EAGhF,MAAM,yBAAyB,WAAW,QAAQ;EAClD,MAAM,qBAAqB,OAAO,GAAG,QAAQ,QAAQ,GAAG,OAAO,QAAQ,GAAG;EAG1E,IAAI,iBAAiB,SAAS,SAAS;AAGvC,MAAI,QAAQ,cAAc,sBAAsB;GAC9C,MAAM,WAAW,OAAO,oBAAoB,CAAC;GAC7C,IAAI,WAAW,sCAAsC,SAAS;AAC9D,OAAI,aAAa,SAAS,aAAa,QAAS,YAAW;GAC3D,MAAM,WAAW,MAAMD,SAAO,WAAW,UAAU,SAAS;AAE5D,oBADoB,OAAO,OAAO,CAAC,OAAO,KAAK,2BAA2B,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CACtE,SAAS,SAAS;;EAGjD,MAAM,iCAAiC,OAAO,iBAAiB,QAAQ,GAAG;EAC1E,MAAM,cAAc,yBAAyB,MAAM,qBAAqB,MAAM;EAE9E,MAAM,YAAY,OAAO,KAAK,GAAG,MAAM,SAAS;EAChD,MAAM,iBAAiB,MAAMA,SAAO,UAAUC,YAAU,WAAW,GAAG,UAAU;EAChF,MAAM,YAAY,MAAMD,SAAO,WAAW,gBAAgB,aAAa;EACvE,MAAM,YAAY,MAAMA,SAAO,OAAO,UAAU;EAChD,MAAM,kBAAkB,MAAMA,SAAO,WAAW,WAAW,YAAY;EACvE,MAAM,cAAc,WAAW,OAAO,KAAK,UAAU,EAAE,OAAO,KAAK,gBAAgB,CAAC,CAAC,SAAS,SAAS;EACvG,MAAM,YAAY,MAAMA,SAAO,WAAW,gBAAgB,aAAa;EACvE,MAAM,uBAAuB,MAAMA,SAAO,WAAW,WAAW,YAAY;AAE5E,UAAQ,UAAU;AAClB,UAAQ,kBAAkB,OAAO,KAAK,qBAAqB,CAAC,SAAS,SAAS;AAC9E,UAAQ,WAAW,iCAAiC,QAAQ;;CAG9D,SAAS,gBAAgB,SAAS,YAAY;AAC5C,MAAI,QAAQ,YAAY,eACtB,OAAM,IAAI,MAAM,0CAA0C;AAE5D,MAAI,OAAO,eAAe,SACxB,OAAM,IAAI,MAAM,gEAAgE;EAGlF,MAAM,EAAE,oBAAoB,wBAAwB,WAAW;AAE/D,MAAI,oBAAoB,QAAQ,gBAC9B,OAAM,IAAI,MAAM,oEAAoE;;;;;;;;CAUxF,SAAS,iBAAiB,MAAM;AAC9B,MAAI,OAAO,SAAS,SAClB,OAAM,IAAI,UAAU,8BAA8B;AAEpD,SAAO,KACJ,MAAM,GAAG,CACT,KAAK,GAAG,MAAM,KAAK,WAAW,EAAE,CAAC,CACjC,OAAO,MAAO,KAAK,MAAQ,KAAK,MAAU,KAAK,MAAQ,KAAK,IAAM;;;;;;;;;;;;;CAcvE,SAAS,SAAS,MAAM;AACtB,SAAO,mEAAmE,KAAK,KAAK;;CAGtF,SAAS,oBAAoB,MAAM;AACjC,MAAI,OAAO,SAAS,SAClB,OAAM,IAAI,UAAU,8CAA8C;AAGpE,SAAO,IAAI,IACT,KAAK,MAAM,IAAI,CAAC,KAAK,cAAc;AACjC,OAAI,CAAC,MAAM,KAAK,UAAU,CACxB,OAAM,IAAI,MAAM,qCAAqC;AAIvD,UAAO,CAFM,UAAU,IACT,UAAU,UAAU,EAAE,CAChB;IACpB,CACH;;CAGH,SAAS,wBAAwB,MAAM;EACrC,MAAM,YAAY,oBAAoB,KAAK;EAE3C,MAAM,QAAQ,UAAU,IAAI,IAAI;AAChC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,kDAAkD;WACzD,CAAC,iBAAiB,MAAM,CACjC,OAAM,IAAI,MAAM,iFAAiF;EAEnG,MAAM,OAAO,UAAU,IAAI,IAAI;AAC/B,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,iDAAiD;WACxD,CAAC,SAAS,KAAK,CACxB,OAAM,IAAI,MAAM,wDAAwD;EAE1E,MAAM,gBAAgB,UAAU,IAAI,IAAI;AACxC,MAAI,CAAC,cACH,OAAM,IAAI,MAAM,sDAAsD;WAC7D,CAAC,gBAAgB,KAAK,cAAc,CAC7C,OAAM,IAAI,MAAM,4DAA4D;AAI9E,SAAO;GACL;GACA;GACA,WALgB,SAAS,eAAe,GAAG;GAM5C;;CAGH,SAAS,wBAAwB,YAAY;EAE3C,MAAM,kBADY,oBAAoB,WAAW,CACf,IAAI,IAAI;AAC1C,MAAI,CAAC,gBACH,OAAM,IAAI,MAAM,gEAAgE;WACvE,CAAC,SAAS,gBAAgB,CACnC,OAAM,IAAI,MAAM,oEAAoE;AAEtF,SAAO,EACL,iBACD;;CAGH,SAAS,WAAW,GAAG,GAAG;AACxB,MAAI,CAAC,OAAO,SAAS,EAAE,CACrB,OAAM,IAAI,UAAU,kCAAkC;AAExD,MAAI,CAAC,OAAO,SAAS,EAAE,CACrB,OAAM,IAAI,UAAU,mCAAmC;AAEzD,MAAI,EAAE,WAAW,EAAE,OACjB,OAAM,IAAI,MAAM,4BAA4B;AAE9C,MAAI,EAAE,WAAW,EACf,OAAM,IAAI,MAAM,0BAA0B;AAE5C,SAAO,OAAO,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC;;AAGlD,QAAO,UAAU;EACf;EACA;EACA;EACD;;;;;;CCjND,MAAME;CAEN,SAASC,gBAAc,WAAW;AAChC,OAAK,SAAS,aAAaD;AAC3B,OAAK,OAAO,EAAE;AACd,OAAK,SAAS,EAAE;;AAGlB,iBAAc,UAAU,eAAe,SAAU,QAAQ;AACvD,UAAQ,QAAR;GACE,KAAK,OACH,QAAO,KAAK;GACd,KAAK,SACH,QAAO,KAAK;GACd,QACE,QAAO,EAAE;;;AAIf,iBAAc,UAAU,gBAAgB,SAAU,KAAK,QAAQ,SAAS;AACtE,MAAI,OAAO,WAAW,YAAY;AAChC,aAAU;AACV,YAAS;;AAEX,OAAK,aAAa,OAAO,CAAC,OAAO;;AAGnC,iBAAc,UAAU,gBAAgB,SAAU,KAAK,QAAQ;AAC7D,WAAS,UAAU;AACnB,SAAO,KAAK,aAAa,OAAO,CAAC,QAAQ,KAAK,OAAO,cAAc,KAAK,OAAO;;AAGjF,QAAO,UAAUC;;;;;;CC3BjB,SAASC,QAAM,KAAK,UAAU,EAAE,EAAE;AAEhC,MAAI,IAAI,OAAO,EAAE,KAAK,KAAK;GACzB,MAAMC,WAAS,IAAI,MAAM,IAAI;AAC7B,UAAO;IAAE,MAAMA,SAAO;IAAI,UAAUA,SAAO;IAAI;;EAKjD,MAAMA,WAAS,EAAE;EACjB,IAAI;EACJ,IAAI,YAAY;AAChB,MAAI,mCAAmC,KAAK,IAAI,CAE9C,OAAM,UAAU,IAAI,CAAC,QAAQ,cAAc,MAAM;AAGnD,MAAI;AACF,OAAI;AACF,aAAS,IAAI,IAAI,KAAK,kBAAkB;YACjC,GAAG;AAEV,aAAS,IAAI,IAAI,IAAI,QAAQ,MAAM,gBAAgB,EAAE,kBAAkB;AACvE,gBAAY;;WAEP,KAAK;AAEZ,OAAI,UAAU,IAAI,QAAQ;AAC1B,SAAM;;AAIR,OAAK,MAAM,SAAS,OAAO,aAAa,SAAS,CAC/C,UAAO,MAAM,MAAM,MAAM;AAG3B,WAAO,OAAOA,SAAO,QAAQ,mBAAmB,OAAO,SAAS;AAChE,WAAO,WAAWA,SAAO,YAAY,mBAAmB,OAAO,SAAS;AAExE,MAAI,OAAO,YAAY,WAAW;AAChC,YAAO,OAAO,UAAU,OAAO,SAAS;AACxC,YAAO,WAAW,OAAO,aAAa,IAAI,KAAK;AAC/C,YAAO,kBAAkB,OAAO,aAAa,IAAI,WAAW;AAC5D,UAAOA;;EAET,MAAM,WAAW,YAAY,KAAK,OAAO;AACzC,MAAI,CAACA,SAAO,KAEV,UAAO,OAAO,mBAAmB,SAAS;WACjC,YAAY,QAAQ,KAAK,SAAS,CAE3C,QAAO,WAAW,WAAW,OAAO;AAEtC,MAAI,CAACA,SAAO,KAEV,UAAO,OAAO,OAAO;EAGvB,MAAM,WAAW,OAAO,SAAS,MAAM,EAAE,IAAI;AAC7C,WAAO,WAAW,WAAW,UAAU,SAAS,GAAG;AAEnD,MAAIA,SAAO,QAAQ,UAAUA,SAAO,QAAQ,IAC1C,UAAO,MAAM;AAGf,MAAIA,SAAO,QAAQ,IACjB,UAAO,MAAM;AAGf,MAAIA,SAAO,WAAWA,SAAO,UAAUA,SAAO,eAAeA,SAAO,QAClE,UAAO,MAAM,EAAE;EAIjB,MAAMC,OAAKD,SAAO,WAAWA,SAAO,UAAUA,SAAO,wBAAsB,KAAK,GAAG;AAEnF,MAAIA,SAAO,QACT,UAAO,IAAI,OAAOC,KAAG,aAAaD,SAAO,QAAQ,CAAC,UAAU;AAG9D,MAAIA,SAAO,OACT,UAAO,IAAI,MAAMC,KAAG,aAAaD,SAAO,OAAO,CAAC,UAAU;AAG5D,MAAIA,SAAO,YACT,UAAO,IAAI,KAAKC,KAAG,aAAaD,SAAO,YAAY,CAAC,UAAU;AAGhE,MAAI,QAAQ,kBAAkBA,SAAO,eACnC,OAAM,IAAI,MAAM,+EAA+E;AAGjG,MAAIA,SAAO,mBAAmB,UAAU,QAAQ,eAC9C,SAAQA,SAAO,SAAf;GACE,KAAK;AACH,aAAO,MAAM;AACb;GAEF,KAAK;AACH,aAAO,IAAI,qBAAqB;AAChC;GAEF,KAAK;AACH,QAAIA,SAAO,YAET,UAAO,IAAI,sBAAsB,WAAY;QAE7C,UAAO,IAAI,qBAAqB;AAElC;GAEF,KAAK;AACH,QAAI,CAACA,SAAO,IAAI,GACd,OAAM,IAAI,MACR,kXACD;AAEH,aAAO,IAAI,sBAAsB,WAAY;AAC7C;GAEF,KAAK,cACH;;MAIJ,SAAQA,SAAO,SAAf;GACE,KAAK;AACH,aAAO,MAAM;AACb;GAEF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACH,QAAIA,SAAO,YAAY,cACrB,0BAAyBA,SAAO,QAAQ;AAE1C;GAEF,KAAK;AACH,aAAO,IAAI,qBAAqB;AAChC;;AAKN,SAAOA;;CAIT,SAAS,oBAAoB,WAAW;AAWtC,SAV0B,OAAO,QAAQ,UAAU,CAAC,QAAQ,GAAG,CAAC,KAAK,WAAW;AAG9E,OAAI,UAAU,UAAa,UAAU,KACnC,GAAE,OAAO;AAGX,UAAO;KACN,EAAE,CAAC;;CAMR,SAAS,eAAe,UAAQ;AAgC9B,SA/BmB,OAAO,QAAQA,SAAO,CAAC,QAAQ,GAAG,CAAC,KAAK,WAAW;AACpE,OAAI,QAAQ,OAAO;IACjB,MAAM,YAAY;AAElB,QAAI,OAAO,cAAc,UACvB,GAAE,OAAO;AAGX,QAAI,OAAO,cAAc,SACvB,GAAE,OAAO,oBAAoB,UAAU;cAEhC,UAAU,UAAa,UAAU,KAC1C,KAAI,QAAQ,QAGV;QAAI,UAAU,IAAI;KAChB,MAAM,IAAI,SAAS,OAAO,GAAG;AAC7B,SAAI,MAAM,EAAE,CACV,OAAM,IAAI,MAAM,WAAW,IAAI,IAAI,QAAQ;AAG7C,OAAE,OAAO;;SAGX,GAAE,OAAO;AAIb,UAAO;KACN,EAAE,CAAC;;CAMR,SAAS,sBAAsB,KAAK;AAClC,SAAO,eAAeD,QAAM,IAAI,CAAC;;CAGnC,SAAS,yBAAyB,SAAS;AACzC,MAAI,CAAC,yBAAyB,UAAU,OAAO,YAAY,eAAe,QAAQ,aAAa;AAC7F,4BAAyB,SAAS;AAClC,WAAQ,YAAY;;;;;0EAKkD,QAAQ;;4FAEU;;;AAI5F,QAAO,UAAUA;AAEjB,SAAM,QAAQA;AACd,SAAM,iBAAiB;AACvB,SAAM,wBAAwB;;;;;;CCpO9B,MAAM,gBAAc,MAAM;CAE1B,MAAMG;CAEN,MAAMC,yCAAwC;CAE9C,MAAM,MAAM,SAAU,KAAK,UAAQ,QAAQ;AACzC,MAAIC,SAAO,KACT,QAAOA,SAAO;AAGhB,MAAI,WAAW,OACb,UAAS,QAAQ,IAAI,OAAO,IAAI,aAAa;WACpC,WAAW,OAAO,OAG3B,UAAS,QAAQ,IAAI;AAGvB,SAAO,UAAUF,WAAS;;CAG5B,MAAM,+BAA+B,WAAY;AAC/C,UAAQ,QAAQ,IAAI,WAApB;GACE,KAAK,UACH,QAAO;GACT,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,cACH,QAAO;GACT,KAAK,YACH,QAAO,EAAE,oBAAoB,OAAO;;AAExC,SAAOA,WAAS;;CAIlB,MAAM,kBAAkB,SAAU,OAAO;AACvC,SAAO,OAAO,KAAK,OAAO,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM,GAAG;;CAG1E,MAAM,MAAM,SAAU,QAAQ,UAAQ,WAAW;EAC/C,MAAM,QAAQE,SAAO;AACrB,MAAI,UAAU,UAAa,UAAU,KACnC,QAAO,KAAK,YAAY,MAAM,gBAAgB,MAAM,CAAC;;CAIzD,IAAMC,yBAAN,MAA2B;EACzB,YAAY,UAAQ;AAElB,cAAS,OAAOD,aAAW,WAAWD,QAAMC,SAAO,GAAGA,YAAU,EAAE;AAIlE,OAAIA,SAAO,iBACT,YAAS,OAAO,OAAO,EAAE,EAAEA,UAAQD,QAAMC,SAAO,iBAAiB,CAAC;AAGpE,QAAK,OAAO,IAAI,QAAQA,SAAO;AAC/B,QAAK,WAAW,IAAI,YAAYA,SAAO;AAEvC,OAAI,KAAK,aAAa,OACpB,MAAK,WAAW,KAAK;AAGvB,QAAK,OAAO,SAAS,IAAI,QAAQA,SAAO,EAAE,GAAG;AAC7C,QAAK,OAAO,IAAI,QAAQA,SAAO;AAI/B,UAAO,eAAe,MAAM,YAAY;IACtC,cAAc;IACd,YAAY;IACZ,UAAU;IACV,OAAO,IAAI,YAAYA,SAAO;IAC/B,CAAC;AAEF,QAAK,SAAS,IAAI,UAAUA,SAAO;AACnC,QAAK,UAAU,IAAI,WAAWA,SAAO;AAErC,QAAK,MAAM,OAAOA,SAAO,QAAQ,cAAc,8BAA8B,GAAGA,SAAO;AAEvF,OAAI,OAAO,KAAK,QAAQ,UACtB;QAAI,KAAK,QAAQ,OACf,MAAK,MAAM;;AAIf,OAAI,KAAK,QAAQ,YACf,MAAK,MAAM,EAAE,oBAAoB,OAAO;AAE1C,OAAI,KAAK,OAAO,KAAK,IAAI,IACvB,QAAO,eAAe,KAAK,KAAK,OAAO,EACrC,YAAY,OACb,CAAC;AAGJ,QAAK,kBAAkB,IAAI,mBAAmBA,SAAO;AACrD,QAAK,cAAc,IAAI,eAAeA,SAAO;AAE7C,QAAK,iBAAiB,EAAE,KAAK,QAAQ,IAAI,QAAQ,IAAI;AAErD,QAAK,mBAAmB,IAAI,oBAAoBA,UAAQ,YAAY;AACpE,QAAK,4BAA4B,IAAI,6BAA6BA,UAAQ,MAAM;AAChF,QAAK,oBAAoB,IAAI,qBAAqBA,UAAQ,MAAM;AAChE,QAAK,eAAe,IAAI,gBAAgBA,UAAQ,MAAM;AACtD,QAAK,sCAAsC,IAAI,uCAAuCA,UAAQ,MAAM;AACpG,QAAK,gBAAgB,IAAI,iBAAiBA,UAAQ,MAAM;AAExD,OAAIA,SAAO,4BAA4B,OACrC,MAAK,kBAAkB,QAAQ,IAAI,qBAAqB;OAExD,MAAK,kBAAkB,KAAK,MAAMA,SAAO,0BAA0B,IAAK;AAG1E,OAAIA,SAAO,cAAc,MACvB,MAAK,aAAa;YACTA,SAAO,cAAc,KAC9B,MAAK,aAAa;AAGpB,OAAI,OAAOA,SAAO,gCAAgC,SAChD,MAAK,kBAAkB,KAAK,MAAMA,SAAO,8BAA8B,IAAK;;EAIhF,yBAAyB,IAAI;GAC3B,MAAM,SAAS,EAAE;AACjB,OAAI,QAAQ,MAAM,OAAO;AACzB,OAAI,QAAQ,MAAM,WAAW;AAC7B,OAAI,QAAQ,MAAM,OAAO;AACzB,OAAI,QAAQ,MAAM,mBAAmB;AACrC,OAAI,QAAQ,MAAM,4BAA4B;AAC9C,OAAI,QAAQ,MAAM,kBAAkB;AACpC,OAAI,QAAQ,MAAM,UAAU;GAE5B,MAAM,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,MAAM,EAAE,SAAS,KAAK,KAAK,GAAG,EAAE;AAC3F,OAAI,QAAQ,KAAK,UAAU;AAC3B,OAAI,QAAQ,KAAK,QAAQ;AACzB,OAAI,QAAQ,KAAK,SAAS;AAC1B,OAAI,QAAQ,KAAK,UAAU;AAC3B,OAAI,QAAQ,KAAK,cAAc;AAE/B,OAAI,KAAK,SACP,QAAO,KAAK,YAAY,gBAAgB,KAAK,SAAS,CAAC;AAEzD,OAAI,KAAK,YACP,QAAO,KAAK,iBAAiB,gBAAgB,KAAK,YAAY,CAAC;AAEjE,OAAI,KAAK,KACP,QAAO,KAAK,UAAU,gBAAgB,KAAK,KAAK,CAAC;AAEnD,OAAI,KAAK,eACP,QAAO,GAAG,MAAM,OAAO,KAAK,IAAI,CAAC;AAEnC,OAAI,KAAK,gBACP,QAAO,KAAK,qBAAqB,gBAAgB,KAAK,gBAAgB,CAAC;AAEzE,OAAI,OAAO,KAAK,MAAM,SAAU,KAAK,SAAS;AAC5C,QAAI,IAAK,QAAO,GAAG,KAAK,KAAK;AAC7B,WAAO,KAAK,cAAc,gBAAgB,QAAQ,CAAC;AACnD,WAAO,GAAG,MAAM,OAAO,KAAK,IAAI,CAAC;KACjC;;;AAIN,QAAO,UAAUC;;;;;;CCxKjB,MAAMC;CAEN,MAAM,cAAc;CAKpB,IAAMC,WAAN,MAAa;EACX,YAAY,SAAS,SAAO;AAC1B,QAAK,UAAU;AACf,QAAK,WAAW;AAChB,QAAK,MAAM;AACX,QAAK,OAAO,EAAE;AACd,QAAK,SAAS,EAAE;AAChB,QAAK,WAAW;AAChB,QAAK,SAASD;AACd,QAAK,UAAU;AACf,QAAK,aAAa,YAAY;AAC9B,OAAI,KAAK,WACP,MAAK,WAAW,KAAK;AAEvB,QAAK,6BAA6B;;EAIpC,mBAAmB,KAAK;GACtB,IAAI;AACJ,OAAI,IAAI,KAEN,SAAQ,YAAY,KAAK,IAAI,KAAK;OAGlC,SAAQ,YAAY,KAAK,IAAI,QAAQ;AAEvC,OAAI,OAAO;AACT,SAAK,UAAU,MAAM;AACrB,QAAI,MAAM,IAAI;AAEZ,UAAK,MAAM,SAAS,MAAM,IAAI,GAAG;AACjC,UAAK,WAAW,SAAS,MAAM,IAAI,GAAG;eAC7B,MAAM,GAEf,MAAK,WAAW,SAAS,MAAM,IAAI,GAAG;;;EAK5C,iBAAiB,SAAS;GACxB,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO;AACrC,QAAK,IAAI,IAAI,GAAG,MAAM,QAAQ,QAAQ,IAAI,KAAK,KAAK;IAClD,MAAM,WAAW,QAAQ;AACzB,QAAI,aAAa,KACf,KAAI,KAAK,KAAK,SAAS,GAAG,SAAS;QAEnC,KAAI,KAAK;;AAGb,UAAO;;EAGT,SAAS,SAAS;GAChB,MAAM,MAAM,EAAE,GAAG,KAAK,4BAA4B;AAClD,QAAK,IAAI,IAAI,GAAG,MAAM,QAAQ,QAAQ,IAAI,KAAK,KAAK;IAClD,MAAM,WAAW,QAAQ;IACzB,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC7B,QAAI,aAAa,MAAM;KACrB,MAAM,IAAI,KAAK,OAAO,GAAG,WAAW,WAAW,OAAO,KAAK,SAAS,GAAG;AACvE,SAAI,SAAS,KAAK,SAAS,GAAG,EAAE;UAEhC,KAAI,SAAS;;AAGjB,UAAO;;EAGT,OAAO,KAAK;AACV,QAAK,KAAK,KAAK,IAAI;;EAGrB,UAAU,mBAAmB;AAK3B,QAAK,SAAS;AACd,OAAI,KAAK,OAAO,OACd,MAAK,WAAW,IAAI,MAAM,kBAAkB,OAAO;GAGrD,MAAM,MAAM,EAAE;AAEd,QAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;IACjD,MAAM,OAAO,kBAAkB;AAC/B,QAAI,KAAK,QAAQ;AAEjB,QAAI,KAAK,OACP,MAAK,SAAS,KAAK,KAAK,OAAO,cAAc,KAAK,YAAY,KAAK,UAAU,OAAO;QAEpF,MAAK,SAAS,KAAKA,QAAM,cAAc,KAAK,YAAY,KAAK,UAAU,OAAO;;AAIlF,QAAK,6BAA6B,EAAE,GAAG,KAAK;;;AAIhD,QAAO,UAAUC;;;;;;CC1GjB,MAAM,EAAE,2CAAyB,SAAS;CAE1C,MAAMC;CACN,MAAMC;CAEN,IAAMC,UAAN,cAAoBC,eAAa;EAC/B,YAAY,UAAQ,QAAQ,UAAU;AACpC,UAAO;AAEP,cAASF,QAAM,qBAAqBG,UAAQ,QAAQ,SAAS;AAE7D,QAAK,OAAOA,SAAO;AACnB,QAAK,SAASA,SAAO;AACrB,QAAK,OAAOA,SAAO;AACnB,QAAK,QAAQA,SAAO;AACpB,QAAK,OAAOA,SAAO;AACnB,QAAK,YAAYA,SAAO;AACxB,QAAK,SAASA,SAAO;AAErB,QAAK,SAASA,SAAO,UAAU;AAC/B,QAAK,WAAWA,SAAO;AACvB,QAAK,WAAWA,SAAO;AACvB,OAAI,QAAQ,UAAUA,SAAO,SAC3B,MAAK,WAAW,QAAQ,OAAO,KAAKA,SAAO,SAAS;AAEtD,QAAK,UAAU,IAAIJ,SAAO,KAAK,UAAU,KAAK,MAAM;AAGpD,QAAK,WAAW,KAAK;AACrB,QAAK,sBAAsB;;EAG7B,sBAAsB;AACpB,OAAI,KAAK,cAAc,WACrB,QAAO;AAIT,OAAI,KAAK,KACP,QAAO;AAIT,OAAI,KAAK,KACP,QAAO;AAGT,OAAI,CAAC,KAAK,KACR,QAAO;AAGT,OAAI,CAAC,KAAK,OACR,QAAO;AAET,UAAO,KAAK,OAAO,SAAS;;EAG9B,oBAAoB;AAIlB,OAAI,KAAK,QAAQ,SAAS;AACxB,QAAI,CAAC,MAAM,QAAQ,KAAK,SAAS,CAC/B,MAAK,WAAW,CAAC,KAAK,QAAQ;AAEhC,SAAK,UAAU,IAAIA,SAAO,KAAK,UAAU,KAAK,QAAQ,OAAO;AAC7D,SAAK,SAAS,KAAK,KAAK,QAAQ;;;EAOpC,qBAAqB,KAAK;AACxB,QAAK,mBAAmB;AACxB,QAAK,QAAQ,UAAU,IAAI,OAAO;AAClC,QAAK,kBAAkB,KAAK,YAAY,CAAC,KAAK,UAAU,MAAM,CAAC;;EAGjE,cAAc,KAAK;GACjB,IAAI;AAEJ,OAAI,KAAK,oBACP;AAGF,OAAI;AACF,UAAM,KAAK,QAAQ,SAAS,IAAI,OAAO;YAChC,KAAK;AACZ,SAAK,sBAAsB;AAC3B;;AAGF,QAAK,KAAK,OAAO,KAAK,KAAK,QAAQ;AACnC,OAAI,KAAK,gBACP,MAAK,QAAQ,OAAO,IAAI;;EAI5B,sBAAsB,KAAK,YAAY;AACrC,QAAK,mBAAmB;AACxB,QAAK,QAAQ,mBAAmB,IAAI;AAGpC,OAAI,KAAK,KACP,YAAW,MAAM;;EAQrB,iBAAiB,YAAY;AAC3B,OAAI,KAAK,KACP,YAAW,MAAM;;EAIrB,YAAY,KAAK,YAAY;AAE3B,OAAI,KAAK,qBAAqB;AAC5B,UAAM,KAAK;AACX,SAAK,sBAAsB;;AAI7B,OAAI,KAAK,SACP,QAAO,KAAK,SAAS,IAAI;AAE3B,QAAK,KAAK,SAAS,IAAI;;EAGzB,oBAAoB,KAAK;AACvB,OAAI,KAAK,oBACP,QAAO,KAAK,YAAY,KAAK,qBAAqB,IAAI;AAExD,OAAI,KAAK,SACP,KAAI;AACF,SAAK,SAAS,MAAM,KAAK,SAAS;YAC3B,KAAK;AACZ,YAAQ,eAAe;AACrB,WAAM;MACN;;AAGN,QAAK,KAAK,OAAO,KAAK,SAAS;;EAGjC,OAAO,YAAY;AACjB,OAAI,OAAO,KAAK,SAAS,YAAY,OAAO,KAAK,SAAS,SACxD,wBAAO,IAAI,MAAM,6EAA6E;GAEhG,MAAM,WAAW,WAAW,iBAAiB,KAAK;AAClD,OAAI,KAAK,QAAQ,YAAY,KAAK,SAAS,SACzC,wBAAO,IAAI,MAAM,yCAAyC,KAAK,KAAK,sCAAsC;AAE5G,OAAI,KAAK,UAAU,CAAC,MAAM,QAAQ,KAAK,OAAO,CAC5C,wBAAO,IAAI,MAAM,gCAAgC;AAEnD,OAAI,KAAK,qBAAqB,EAAE;AAQ9B,eAAW,OAAO,QAAQ,WAAW,OAAO,MAAM;AAClD,QAAI;AACF,UAAK,QAAQ,WAAW;cAChB;AAGR,gBAAW,OAAO,UAAU,WAAW,OAAO,QAAQ;;SAGxD,YAAW,MAAM,KAAK,KAAK;AAE7B,UAAO;;EAGT,cAAc,YAAY;AACxB,UAAO,KAAK,QAAQ,WAAW,iBAAiB,KAAK;;EAGvD,sBAAsB,YAAY;AAChC,QAAK,SAAS,YAAY,KAAK,KAAK;;EAGtC,SAAS,YAAY,MAAM;AACzB,cAAW,QAAQ;IACjB,QAAQ,KAAK;IACP;IACP,CAAC;AAGF,OAAI,CAAC,KACH,YAAW,MAAM;OAGjB,YAAW,OAAO;;EAKtB,QAAQ,YAAY;AAElB,OAAI,CAAC,KAAK,cAAc,WAAW,CACjC,YAAW,MAAM;IACf,MAAM,KAAK;IACX,MAAM,KAAK;IACX,OAAO,KAAK;IACb,CAAC;AAMJ,OAAI;AACF,eAAW,KAAK;KACd,QAAQ,KAAK;KACb,WAAW,KAAK;KAChB,QAAQ,KAAK;KACb,QAAQ,KAAK;KACb,aAAaC,QAAM;KACpB,CAAC;YACK,KAAK;AACZ,SAAK,YAAY,KAAK,WAAW;AACjC;;AAGF,cAAW,SAAS;IAClB,MAAM;IACN,MAAM,KAAK,UAAU;IACtB,CAAC;AAEF,QAAK,SAAS,YAAY,KAAK,KAAK;;EAGtC,qBAAqB,YAAY;AAC/B,cAAW,aAAa,2BAA2B;;EAGrD,eAAe,KAAK,YAAY;;AAKlC,QAAO,UAAUC;;;;;;AC1PjB,QAAO,eAAe,SAAS,cAAc,EAAE,OAAO,MAAM,CAAC;AAC7D,SAAQ,gBAAgB,QAAQ,iBAAiB,QAAQ,yBAAyB,QAAQ,uBAAuB,QAAQ,8BAA8B,QAAQ,wBAAwB,QAAQ,4BAA4B,QAAQ,yBAAyB,QAAQ,8BAA8B,QAAQ,wBAAwB,QAAQ,QAAQ,QAAQ,eAAe,QAAQ,kBAAkB,QAAQ,gBAAgB,QAAQ,WAAW,QAAQ,aAAa,QAAQ,mBAAmB,QAAQ,kBAAkB,QAAQ,SAAS,QAAQ,gBAAgB,QAAQ,eAAe,QAAQ,gBAAgB,KAAK;AACrlB,SAAQ,gBAAgB;EACpB,MAAM;EACN,QAAQ;EACX;AACD,SAAQ,eAAe;EACnB,MAAM;EACN,QAAQ;EACX;AACD,SAAQ,gBAAgB;EACpB,MAAM;EACN,QAAQ;EACX;AACD,SAAQ,SAAS;EACb,MAAM;EACN,QAAQ;EACX;AACD,SAAQ,kBAAkB;EACtB,MAAM;EACN,QAAQ;EACX;AACD,SAAQ,mBAAmB;EACvB,MAAM;EACN,QAAQ;EACX;AACD,SAAQ,aAAa;EACjB,MAAM;EACN,QAAQ;EACX;AACD,SAAQ,WAAW;EACf,MAAM;EACN,QAAQ;EACX;CACD,IAAMG,kBAAN,cAA4B,MAAM;EAC9B,YAAY,SAAS,QAAQ,MAAM;AAC/B,SAAM,QAAQ;AACd,QAAK,SAAS;AACd,QAAK,OAAO;;;AAGpB,SAAQ,gBAAgBA;CACxB,IAAM,kBAAN,MAAsB;EAClB,YAAY,QAAQ,OAAO;AACvB,QAAK,SAAS;AACd,QAAK,QAAQ;AACb,QAAK,OAAO;;;AAGpB,SAAQ,kBAAkB;CAC1B,IAAM,eAAN,MAAmB;EACf,YAAY,QAAQ,MAAM,QAAQ,aAAa;AAC3C,QAAK,SAAS;AACd,QAAK,OAAO;AACZ,QAAK,SAAS;AACd,QAAK,cAAc,IAAI,MAAM,YAAY;;;AAGjD,SAAQ,eAAe;CACvB,IAAM,QAAN,MAAY;EACR,YAAY,MAAM,SAAS,UAAU,YAAY,cAAc,kBAAkB,QAAQ;AACrF,QAAK,OAAO;AACZ,QAAK,UAAU;AACf,QAAK,WAAW;AAChB,QAAK,aAAa;AAClB,QAAK,eAAe;AACpB,QAAK,mBAAmB;AACxB,QAAK,SAAS;;;AAGtB,SAAQ,QAAQ;CAChB,IAAM,wBAAN,MAA4B;EACxB,YAAY,QAAQ,YAAY;AAC5B,QAAK,SAAS;AACd,QAAK,aAAa;AAClB,QAAK,OAAO;AACZ,QAAK,SAAS,IAAI,MAAM,KAAK,WAAW;;;AAGhD,SAAQ,wBAAwB;CAChC,IAAM,8BAAN,MAAkC;EAC9B,YAAY,QAAQ,gBAAgB;AAChC,QAAK,SAAS;AACd,QAAK,iBAAiB;AACtB,QAAK,OAAO;AACZ,QAAK,cAAc,IAAI,MAAM,KAAK,eAAe;;;AAGzD,SAAQ,8BAA8B;CACtC,IAAM,yBAAN,MAA6B;EACzB,YAAY,QAAQ,eAAe,gBAAgB;AAC/C,QAAK,SAAS;AACd,QAAK,gBAAgB;AACrB,QAAK,iBAAiB;AACtB,QAAK,OAAO;;;AAGpB,SAAQ,yBAAyB;CACjC,IAAM,4BAAN,MAAgC;EAC5B,YAAY,QAAQ,MAAM;AACtB,QAAK,SAAS;AACd,QAAK,OAAO;AACZ,QAAK,OAAO;;;AAGpB,SAAQ,4BAA4B;CACpC,IAAM,wBAAN,MAA4B;EACxB,YAAY,QAAQ,WAAW,WAAW;AACtC,QAAK,SAAS;AACd,QAAK,YAAY;AACjB,QAAK,YAAY;AACjB,QAAK,OAAO;;;AAGpB,SAAQ,wBAAwB;CAChC,IAAM,8BAAN,MAAkC;EAC9B,YAAY,QAAQ,WAAW,SAAS,SAAS;AAC7C,QAAK,SAAS;AACd,QAAK,YAAY;AACjB,QAAK,UAAU;AACf,QAAK,UAAU;AACf,QAAK,OAAO;;;AAGpB,SAAQ,8BAA8B;CACtC,IAAM,uBAAN,MAA2B;EACvB,YAAY,QAAQ,QAAQ;AACxB,QAAK,SAAS;AACd,QAAK,SAAS;AACd,QAAK,OAAO;;;AAGpB,SAAQ,uBAAuB;CAC/B,IAAM,yBAAN,MAA6B;EACzB,YAAY,QAAQ,MAAM;AACtB,QAAK,SAAS;AACd,QAAK,OAAO;AACZ,QAAK,OAAO;;;AAGpB,SAAQ,yBAAyB;CACjC,IAAM,iBAAN,MAAqB;EACjB,YAAY,QAAQ,QAAQ;AACxB,QAAK,SAAS;AACd,QAAK,SAAS;AACd,QAAK,OAAO;AACZ,QAAK,aAAa,OAAO;;;AAGjC,SAAQ,iBAAiB;CACzB,IAAM,gBAAN,MAAoB;EAChB,YAAY,QAAQ,SAAS;AACzB,QAAK,SAAS;AACd,QAAK,UAAU;AACf,QAAK,OAAO;;;AAGpB,SAAQ,gBAAgB;;;;;;AC5JxB,QAAO,eAAe,SAAS,cAAc,EAAE,OAAO,MAAM,CAAC;AAC7D,SAAQ,SAAS,KAAK;CACtB,IAAM,SAAN,MAAa;EACT,YAAY,OAAO,KAAK;AACpB,QAAK,OAAO;AACZ,QAAK,SAAS;AACd,QAAK,iBAAiB;AACtB,QAAK,SAAS,OAAO,YAAY,KAAK;;EAE1C,OAAO,MAAM;AAET,OADkB,KAAK,OAAO,SAAS,KAAK,SAC5B,MAAM;IAClB,MAAM,YAAY,KAAK;IAGvB,MAAM,UAAU,UAAU,UAAU,UAAU,UAAU,KAAK;AAC7D,SAAK,SAAS,OAAO,YAAY,QAAQ;AACzC,cAAU,KAAK,KAAK,OAAO;;;EAGnC,SAAS,KAAK;AACV,QAAK,OAAO,EAAE;AACd,QAAK,OAAO,KAAK,YAAa,QAAQ,KAAM;AAC5C,QAAK,OAAO,KAAK,YAAa,QAAQ,KAAM;AAC5C,QAAK,OAAO,KAAK,YAAa,QAAQ,IAAK;AAC3C,QAAK,OAAO,KAAK,YAAa,QAAQ,IAAK;AAC3C,UAAO;;EAEX,SAAS,KAAK;AACV,QAAK,OAAO,EAAE;AACd,QAAK,OAAO,KAAK,YAAa,QAAQ,IAAK;AAC3C,QAAK,OAAO,KAAK,YAAa,QAAQ,IAAK;AAC3C,UAAO;;EAEX,WAAW,QAAQ;AACf,OAAI,CAAC,OACD,MAAK,OAAO,EAAE;QAEb;IACD,MAAM,MAAM,OAAO,WAAW,OAAO;AACrC,SAAK,OAAO,MAAM,EAAE;AACpB,SAAK,OAAO,MAAM,QAAQ,KAAK,QAAQ,QAAQ;AAC/C,SAAK,UAAU;;AAEnB,QAAK,OAAO,KAAK,YAAY;AAC7B,UAAO;;EAEX,UAAU,SAAS,IAAI;GACnB,MAAM,MAAM,OAAO,WAAW,OAAO;AACrC,QAAK,OAAO,IAAI;AAChB,QAAK,OAAO,MAAM,QAAQ,KAAK,OAAO;AACtC,QAAK,UAAU;AACf,UAAO;;EAEX,IAAI,aAAa;AACb,QAAK,OAAO,YAAY,OAAO;AAC/B,eAAY,KAAK,KAAK,QAAQ,KAAK,OAAO;AAC1C,QAAK,UAAU,YAAY;AAC3B,UAAO;;EAEX,KAAK,MAAM;AACP,OAAI,MAAM;AACN,SAAK,OAAO,KAAK,kBAAkB;IAEnC,MAAM,SAAS,KAAK,UAAU,KAAK,iBAAiB;AACpD,SAAK,OAAO,aAAa,QAAQ,KAAK,iBAAiB,EAAE;;AAE7D,UAAO,KAAK,OAAO,MAAM,OAAO,IAAI,GAAG,KAAK,OAAO;;EAEvD,MAAM,MAAM;GACR,MAAM,SAAS,KAAK,KAAK,KAAK;AAC9B,QAAK,SAAS;AACd,QAAK,iBAAiB;AACtB,QAAK,SAAS,OAAO,YAAY,KAAK,KAAK;AAC3C,UAAO;;;AAGf,SAAQ,SAAS;;;;;;AC9EjB,QAAO,eAAe,SAAS,cAAc,EAAE,OAAO,MAAM,CAAC;AAC7D,SAAQ,YAAY,KAAK;CACzB,MAAM;CACN,MAAM,SAAS,IAAI,gBAAgB,QAAQ;CAC3C,MAAM,WAAW,SAAS;AAEtB,SAAO,SAAS,EAAE,CAAC,SAAS,EAAE;AAC9B,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,CAC/B,QAAO,WAAW,IAAI,CAAC,WAAW,KAAK,KAAK;AAEhD,SAAO,WAAW,kBAAkB,CAAC,WAAW,OAAO;EACvD,MAAM,aAAa,OAAO,WAAW,GAAG,CAAC,OAAO;EAEhD,MAAM,SAAS,WAAW,SAAS;AACnC,SAAO,IAAI,gBAAgB,QAAQ,CAAC,SAAS,OAAO,CAAC,IAAI,WAAW,CAAC,OAAO;;CAEhF,MAAM,mBAAmB;EACrB,MAAM,WAAW,OAAO,YAAY,EAAE;AACtC,WAAS,aAAa,GAAG,EAAE;AAC3B,WAAS,aAAa,UAAU,EAAE;AAClC,SAAO;;CAEX,MAAM,YAAY,eAAa;AAC3B,SAAO,OAAO,WAAWC,WAAS,CAAC,MAAM,IAAuB;;CAEpE,MAAM,iCAAiC,SAAU,WAAW,iBAAiB;AAEzE,SAAO,WAAW,UAAU,CAAC,SAAS,OAAO,WAAW,gBAAgB,CAAC,CAAC,UAAU,gBAAgB;AACpG,SAAO,OAAO,MAAM,IAAuB;;CAE/C,MAAM,8BAA8B,SAAU,gBAAgB;AAC1D,SAAO,OAAO,UAAU,eAAe,CAAC,MAAM,IAAuB;;CAEzE,MAAM,SAAS,SAAS;AACpB,SAAO,OAAO,WAAW,KAAK,CAAC,MAAM,GAAoB;;CAE7D,MAAM,aAAa,EAAE;CACrB,MAAMC,WAAS,YAAU;EAMrB,MAAM,OAAOC,QAAM,QAAQ;AAC3B,MAAI,KAAK,SAAS,IAAI;AAClB,WAAQ,MAAM,iEAAiE;AAC/E,WAAQ,MAAM,wBAAwB,MAAM,KAAK,OAAO;AACxD,WAAQ,MAAM,+DAA+D;;EAEjF,MAAMC,UAAQD,QAAM,SAAS;EAC7B,MAAM,MAAMC,QAAM;EAClB,MAAM,SAAS,OACV,WAAW,KAAK,CAChB,WAAWD,QAAM,KAAK,CACtB,SAAS,IAAI;AAClB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IACrB,QAAO,SAASC,QAAM,GAAG;AAE7B,SAAO,OAAO,MAAM,GAAoB;;CAE5C,MAAM,cAAc,IAAI,gBAAgB,QAAQ;CAChD,MAAM,cAAc,SAAU,QAAQ,aAAa;AAC/C,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACpC,MAAM,YAAY,cAAc,YAAY,OAAO,IAAI,EAAE,GAAG,OAAO;AACnE,OAAI,aAAa,MAAM;AAEnB,WAAO,SAAS,EAAyB;AAEzC,gBAAY,SAAS,GAAG;cAEnB,qBAAqB,QAAQ;AAElC,WAAO,SAAS,EAAyB;AAEzC,gBAAY,SAAS,UAAU,OAAO;AACtC,gBAAY,IAAI,UAAU;UAEzB;AAED,WAAO,SAAS,EAAyB;AACzC,gBAAY,SAAS,OAAO,WAAW,UAAU,CAAC;AAClD,gBAAY,UAAU,UAAU;;;;CAI5C,MAAM,QAAQ,WAAS,EAAE,KAAK;EAE1B,MAAM,SAASC,SAAO,UAAU;EAChC,MAAM,YAAYA,SAAO,aAAa;EACtC,MAAM,SAASA,SAAO,UAAU;EAChC,MAAM,SAASA,SAAO,UAAU;EAChC,MAAM,MAAM,OAAO;AACnB,SAAO,WAAW,OAAO,CAAC,WAAW,UAAU;AAC/C,SAAO,SAAS,IAAI;AACpB,cAAY,QAAQA,SAAO,YAAY;AACvC,SAAO,SAAS,IAAI;AACpB,SAAO,IAAI,YAAY,OAAO,CAAC;AAE/B,SAAO,SAAS,EAAE;AAElB,SAAO,SAAS,SAAS,IAA2B,EAAyB;AAC7E,SAAO,OAAO,MAAM,GAAmB;;CAE3C,MAAM,eAAe,OAAO,KAAK;EAAC;EAAuB;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAK,CAAC;CAC/G,MAAM,WAAW,aAAW;AAExB,MAAI,CAACA,YAAW,CAACA,SAAO,UAAU,CAACA,SAAO,KACtC,QAAO;EAEX,MAAM,SAASA,SAAO,UAAU;EAChC,MAAM,OAAOA,SAAO,QAAQ;EAC5B,MAAM,eAAe,OAAO,WAAW,OAAO;EAC9C,MAAM,MAAM,IAAI,eAAe,IAAI;EAEnC,MAAM,OAAO,OAAO,YAAY,IAAI,IAAI;AACxC,OAAK,KAAK;AACV,OAAK,aAAa,KAAK,EAAE;AACzB,OAAK,MAAM,QAAQ,GAAG,QAAQ;AAC9B,OAAK,eAAe,KAAK;AACzB,OAAK,cAAc,MAAM,KAAK,SAAS,EAAE;AACzC,SAAO;;CAEX,MAAM,UAAU,WAAW,cAAc;EACrC,MAAM,SAAS,OAAO,YAAY,GAAG;AACrC,SAAO,aAAa,IAAI,EAAE;AAC1B,SAAO,aAAa,MAAM,EAAE;AAC5B,SAAO,aAAa,MAAM,EAAE;AAC5B,SAAO,aAAa,WAAW,EAAE;AACjC,SAAO,aAAa,WAAW,GAAG;AAClC,SAAO;;CAEX,MAAM,kBAAkB,MAAM,WAAW;EAErC,MAAM,MAAM,IADM,OAAO,WAAW,OAAO,GACf;EAE5B,MAAM,SAAS,OAAO,YAAY,IAAI,IAAI;AAC1C,SAAO,KAAK;AACZ,SAAO,aAAa,KAAK,EAAE;AAC3B,SAAO,MAAM,QAAQ,GAAG,QAAQ;AAChC,SAAO,OAAO;AACd,SAAO;;CAEX,MAAM,sBAAsB,OAAO,WAAW,IAAI,CAAC,MAAM,GAAuB;CAChF,MAAM,yBAAyB,OAAO,WAAW,IAAI,CAAC,MAAM,GAAuB;CACnF,MAAM,YAAY,QAAQ;AACtB,SAAO,IAAI,OACL,eAAe,IAAwB,GAAG,IAAI,OAAO,IAAI,QAAQ,KAAK,GACtE,IAAI,SAAS,MACT,sBACA;;CAEd,MAAM,SAAS,QAAQ;AAEnB,SAAO,eAAe,IADT,GAAG,IAAI,OAAO,IAAI,QAAQ,KACS;;CAEpD,MAAM,YAAY,UAAU;AACxB,SAAO,OAAO,IAAI,MAAM,CAAC,MAAM,IAA6B;;CAEhE,MAAM,YAAY,YAAY;AAC1B,SAAO,eAAe,KAAyB,QAAQ;;CAE3D,MAAM,kBAAkB,SAAS,OAAO,KAAK;EAAC;EAAM;EAAM;EAAM;EAAM;EAAK,CAAC;CAC5E,MAAMC,gBAAc,eAAe,GAAoB;CACvD,MAAMC,eAAa,eAAe,GAAmB;CACrD,MAAMC,cAAY,eAAe,GAAkB;CACnD,MAAM,iBAAiB,eAAe,GAAuB;CAC7D,MAAMC,cAAY;EACd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAAaH;EACb,YAAYC;EACZ,WAAWC;EACX;EACA,gBAAgB;EAChB;EACA;EACH;AACD,SAAQ,YAAYC;;;;;;AC1LpB,QAAO,eAAe,SAAS,cAAc,EAAE,OAAO,MAAM,CAAC;AAC7D,SAAQ,eAAe,KAAK;CAC5B,IAAM,eAAN,MAAmB;EACf,YAAY,SAAS,GAAG;AACpB,QAAK,SAAS;AACd,QAAK,SAAS,OAAO,YAAY,EAAE;AAEnC,QAAK,WAAW;;EAEpB,UAAU,QAAQ,QAAQ;AACtB,QAAK,SAAS;AACd,QAAK,SAAS;;EAElB,QAAQ;GACJ,MAAM,SAAS,KAAK,OAAO,YAAY,KAAK,OAAO;AACnD,QAAK,UAAU;AACf,UAAO;;EAEX,OAAO;GACH,MAAM,SAAS,KAAK,OAAO,KAAK;AAChC,QAAK;AACL,UAAO;;EAEX,QAAQ;GACJ,MAAM,SAAS,KAAK,OAAO,YAAY,KAAK,OAAO;AACnD,QAAK,UAAU;AACf,UAAO;;EAEX,SAAS;GACL,MAAM,SAAS,KAAK,OAAO,aAAa,KAAK,OAAO;AACpD,QAAK,UAAU;AACf,UAAO;;EAEX,OAAO,QAAQ;GACX,MAAM,SAAS,KAAK,OAAO,SAAS,KAAK,UAAU,KAAK,QAAQ,KAAK,SAAS,OAAO;AACrF,QAAK,UAAU;AACf,UAAO;;EAEX,UAAU;GACN,MAAM,QAAQ,KAAK;GACnB,IAAI,MAAM;AAEV,UAAO,KAAK,OAAO,WAAW;AAC9B,QAAK,SAAS;AACd,UAAO,KAAK,OAAO,SAAS,KAAK,UAAU,OAAO,MAAM,EAAE;;EAE9D,MAAM,QAAQ;GACV,MAAM,SAAS,KAAK,OAAO,MAAM,KAAK,QAAQ,KAAK,SAAS,OAAO;AACnE,QAAK,UAAU;AACf,UAAO;;;AAGf,SAAQ,eAAe;;;;;;ACpDvB,QAAO,eAAe,SAAS,cAAc,EAAE,OAAO,MAAM,CAAC;AAC7D,SAAQ,SAAS,KAAK;CACtB,MAAMC;CACN,MAAM;CAEN,MAAM,cAAc;CAIpB,MAAM,gBAAgB,cADH;CAGnB,MAAM,kBAAkB;CACxB,MAAM,cAAc,OAAO,YAAY,EAAE;CACzC,IAAM,SAAN,MAAa;EACT,YAAY,MAAM;AACd,QAAK,SAAS;AACd,QAAK,eAAe;AACpB,QAAK,eAAe;AACpB,QAAK,SAAS,IAAI,gBAAgB,cAAc;AAChD,QAAK,SAAS,QAAQ,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,UAAU,SAC5D,OAAM,IAAI,MAAM,gCAAgC;AAEpD,QAAK,QAAQ,SAAS,QAAQ,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,SAAS;;EAE3E,MAAM,QAAQ,UAAU;AACpB,QAAK,YAAY,OAAO;GACxB,MAAM,mBAAmB,KAAK,eAAe,KAAK;GAClD,IAAI,SAAS,KAAK;AAClB,UAAO,SAAS,iBAAiB,kBAAkB;IAE/C,MAAM,OAAO,KAAK,OAAO;IAEzB,MAAM,SAAS,KAAK,OAAO,aAAa,SAAS,YAAY;IAC7D,MAAM,oBAAoB,cAAc;AACxC,QAAI,oBAAoB,UAAU,kBAAkB;AAEhD,cADgB,KAAK,aAAa,SAAS,eAAe,MAAM,QAAQ,KAAK,OAAO,CACnE;AACjB,eAAU;UAGV;;AAGR,OAAI,WAAW,kBAAkB;AAE7B,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,eAAe;UAEnB;AAED,SAAK,eAAe,mBAAmB;AACvC,SAAK,eAAe;;;EAG5B,YAAY,QAAQ;AAChB,OAAI,KAAK,eAAe,GAAG;IACvB,MAAM,YAAY,KAAK,eAAe,OAAO;AAE7C,QADsB,YAAY,KAAK,eACnB,KAAK,OAAO,YAAY;KAExC,IAAI;AACJ,SAAI,aAAa,KAAK,OAAO,cAAc,KAAK,gBAAgB,KAAK,aAEjE,aAAY,KAAK;UAEhB;MAED,IAAI,kBAAkB,KAAK,OAAO,aAAa;AAC/C,aAAO,aAAa,gBAChB,oBAAmB;AAEvB,kBAAY,OAAO,YAAY,gBAAgB;;AAGnD,UAAK,OAAO,KAAK,WAAW,GAAG,KAAK,cAAc,KAAK,eAAe,KAAK,aAAa;AACxF,UAAK,SAAS;AACd,UAAK,eAAe;;AAGxB,WAAO,KAAK,KAAK,QAAQ,KAAK,eAAe,KAAK,aAAa;AAC/D,SAAK,eAAe;UAEnB;AACD,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,eAAe,OAAO;;;EAGnC,aAAa,QAAQ,MAAM,QAAQ,OAAO;GACtC,MAAM,EAAE,WAAW;AAEnB,UAAO,UAAU,QAAQ,MAAM;GAC/B,IAAI;AACJ,WAAQ,MAAR;IACI,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAUA,aAAW;AACrB;IACJ,KAAK;AACD,eAAU,oBAAoB,OAAO;AACrC;IACJ,KAAK;AACD,eAAU,4BAA4B,OAAO;AAC7C;IACJ,KAAK;AACD,eAAU,0BAA0B,OAAO;AAC3C;IACJ,KAAK;AACD,eAAU,yBAAyB,OAAO;AAC1C;IACJ,KAAK;AACD,eAAU,4BAA4B,QAAQ,OAAO;AACrD;IACJ,KAAK;AACD,eAAU,4BAA4B,OAAO;AAC7C;IACJ,KAAK;AACD,eAAU,oBAAoB,OAAO;AACrC;IACJ,KAAK;AACD,eAAU,kBAAkB,QAAQ,QAAQ;AAC5C;IACJ,KAAK;AACD,eAAU,kBAAkB,QAAQ,SAAS;AAC7C;IACJ,KAAK;AACD,eAAU,2BAA2B,OAAO;AAC5C;IACJ,KAAK;AACD,eAAU,iCAAiC,OAAO;AAClD;IACJ,KAAK;AACD,eAAU,mBAAmB,OAAO;AACpC;IACJ,KAAK;AACD,eAAU,oBAAoB,OAAO;AACrC;IACJ,KAAK;AACD,eAAU,cAAc,QAAQ,OAAO;AACvC;IACJ,QACI,QAAO,IAAIA,aAAW,cAAc,gCAAgC,KAAK,SAAS,GAAG,EAAE,QAAQ,QAAQ;;AAE/G,UAAO,UAAU,GAAG,YAAY;AAChC,WAAQ,SAAS;AACjB,UAAO;;;AAGf,SAAQ,SAAS;CACjB,MAAM,6BAA6B,WAAW;EAC1C,MAAM,SAAS,OAAO,OAAO,EAAE;AAC/B,SAAO,IAAIA,aAAW,qBAAqB,iBAAiB,OAAO;;CAEvE,MAAM,+BAA+B,WAAW;EAC5C,MAAM,OAAO,OAAO,SAAS;AAC7B,SAAO,IAAIA,aAAW,uBAAuB,iBAAiB,KAAK;;CAEvE,MAAM,iBAAiB,QAAQ,WAAW;EACtC,MAAM,QAAQ,OAAO,MAAM,SAAS,EAAE;AACtC,SAAO,IAAIA,aAAW,gBAAgB,iBAAiB,MAAM;;CAEjE,MAAM,sBAAsB,WAAW,iBAAiB,QAAQ,iBAAiB;CACjF,MAAM,uBAAuB,WAAW,iBAAiB,QAAQ,kBAAkB;CACnF,MAAM,oBAAoB,QAAQ,gBAAgB;EAC9C,MAAM,WAAW,OAAO,MAAM,KAAK;EACnC,MAAM,cAAc,OAAO,OAAO;EAClC,MAAM,UAAU,IAAIA,aAAW,aAAa,iBAAiB,aAAa,UAAU,YAAY;AAChG,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,IAC7B,SAAQ,YAAY,KAAK,OAAO,OAAO;AAE3C,SAAO;;CAEX,MAAM,4BAA4B,WAAW;EACzC,MAAM,YAAY,OAAO,OAAO;EAChC,MAAM,UAAU,OAAO,SAAS;EAChC,MAAM,UAAU,OAAO,SAAS;AAChC,SAAO,IAAIA,aAAW,4BAA4B,iBAAiB,WAAW,SAAS,QAAQ;;CAEnG,MAAM,8BAA8B,WAAW;EAC3C,MAAM,aAAa,OAAO,OAAO;EACjC,MAAM,UAAU,IAAIA,aAAW,sBAAsB,iBAAiB,WAAW;AACjF,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAC5B,SAAQ,OAAO,KAAK,WAAW,OAAO;AAE1C,SAAO;;CAEX,MAAM,cAAc,WAAW;EAC3B,MAAM,OAAO,OAAO,SAAS;EAC7B,MAAM,UAAU,OAAO,QAAQ;EAC/B,MAAM,WAAW,OAAO,OAAO;EAC/B,MAAM,aAAa,OAAO,QAAQ;EAClC,MAAM,eAAe,OAAO,OAAO;EACnC,MAAM,mBAAmB,OAAO,OAAO;EACvC,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI,SAAS;AAC7C,SAAO,IAAIA,aAAW,MAAM,MAAM,SAAS,UAAU,YAAY,cAAc,kBAAkB,KAAK;;CAE1G,MAAM,oCAAoC,WAAW;EACjD,MAAM,iBAAiB,OAAO,OAAO;EACrC,MAAM,UAAU,IAAIA,aAAW,4BAA4B,iBAAiB,eAAe;AAC3F,OAAK,IAAI,IAAI,GAAG,IAAI,gBAAgB,IAChC,SAAQ,YAAY,KAAK,OAAO,OAAO;AAE3C,SAAO;;CAEX,MAAM,uBAAuB,WAAW;EACpC,MAAM,aAAa,OAAO,OAAO;EACjC,MAAM,SAAS,IAAI,MAAM,WAAW;AACpC,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;GACjC,MAAM,MAAM,OAAO,OAAO;AAE1B,UAAO,KAAK,QAAQ,KAAK,OAAO,OAAO,OAAO,IAAI;;AAEtD,SAAO,IAAIA,aAAW,eAAe,iBAAiB,OAAO;;CAEjE,MAAM,+BAA+B,WAAW;EAC5C,MAAM,OAAO,OAAO,SAAS;EAC7B,MAAM,QAAQ,OAAO,SAAS;AAC9B,SAAO,IAAIA,aAAW,uBAAuB,iBAAiB,MAAM,MAAM;;CAE9E,MAAM,uBAAuB,WAAW;EACpC,MAAM,YAAY,OAAO,OAAO;EAChC,MAAM,YAAY,OAAO,OAAO;AAChC,SAAO,IAAIA,aAAW,sBAAsB,iBAAiB,WAAW,UAAU;;CAEtF,MAAM,+BAA+B,QAAQ,WAAW;EACpD,MAAM,OAAO,OAAO,OAAO;EAE3B,MAAM,UAAU;GACZ,MAAM;GACN;GACH;AACD,UAAQ,MAAR;GACI,KAAK,EACD;GACJ,KAAK;AACD,QAAI,QAAQ,WAAW,EACnB,SAAQ,OAAO;AAEnB;GACJ,KAAK;AACD,QAAI,QAAQ,WAAW,IAAI;AACvB,aAAQ,OAAO;KACf,MAAM,OAAO,OAAO,MAAM,EAAE;AAC5B,YAAO,IAAIA,aAAW,0BAA0B,iBAAiB,KAAK;;AAE1E;GACJ,KAAK;IACD;AACI,aAAQ,OAAO;AACf,aAAQ,aAAa,EAAE;KACvB,IAAI;AACJ,QAAG;AACC,kBAAY,OAAO,SAAS;AAC5B,UAAI,UACA,SAAQ,WAAW,KAAK,UAAU;cAEjC;;AAEb;GACJ,KAAK;AACD,YAAQ,OAAO;AACf,YAAQ,OAAO,OAAO,OAAO,SAAS,EAAE;AACxC;GACJ,KAAK;AACD,YAAQ,OAAO;AACf,YAAQ,OAAO,OAAO,OAAO,SAAS,EAAE;AACxC;GACJ,QACI,OAAM,IAAI,MAAM,2CAA2C,KAAK;;AAExE,SAAO;;CAEX,MAAM,qBAAqB,QAAQ,SAAS;EACxC,MAAM,SAAS,EAAE;EACjB,IAAI,YAAY,OAAO,OAAO,EAAE;AAChC,SAAO,cAAc,MAAM;AACvB,UAAO,aAAa,OAAO,SAAS;AACpC,eAAY,OAAO,OAAO,EAAE;;EAEhC,MAAM,eAAe,OAAO;EAC5B,MAAM,UAAU,SAAS,WACnB,IAAIA,aAAW,cAAc,iBAAiB,aAAa,GAC3D,IAAIA,aAAW,cAAc,cAAc,iBAAiB,KAAK;AACvE,UAAQ,WAAW,OAAO;AAC1B,UAAQ,OAAO,OAAO;AACtB,UAAQ,SAAS,OAAO;AACxB,UAAQ,OAAO,OAAO;AACtB,UAAQ,WAAW,OAAO;AAC1B,UAAQ,mBAAmB,OAAO;AAClC,UAAQ,gBAAgB,OAAO;AAC/B,UAAQ,QAAQ,OAAO;AACvB,UAAQ,SAAS,OAAO;AACxB,UAAQ,QAAQ,OAAO;AACvB,UAAQ,SAAS,OAAO;AACxB,UAAQ,WAAW,OAAO;AAC1B,UAAQ,aAAa,OAAO;AAC5B,UAAQ,OAAO,OAAO;AACtB,UAAQ,OAAO,OAAO;AACtB,UAAQ,UAAU,OAAO;AACzB,SAAO;;;;;;;AChUX,QAAO,eAAe,SAAS,cAAc,EAAE,OAAO,MAAM,CAAC;AAC7D,SAAQ,gBAAgB,QAAQ,YAAY,QAAQ,QAAQ,KAAK;CACjE,MAAM;AACN,QAAO,eAAe,SAAS,iBAAiB;EAAE,YAAY;EAAM,KAAK,WAAY;AAAE,UAAO,WAAW;;EAAkB,CAAC;CAC5H,MAAM;AACN,QAAO,eAAe,SAAS,aAAa;EAAE,YAAY;EAAM,KAAK,WAAY;AAAE,UAAO,aAAa;;EAAc,CAAC;CACtH,MAAM;CACN,SAASC,QAAM,QAAQ,UAAU;EAC7B,MAAM,SAAS,IAAI,SAAS,QAAQ;AACpC,SAAO,GAAG,SAAS,WAAW,OAAO,MAAM,QAAQ,SAAS,CAAC;AAC7D,SAAO,IAAI,SAAS,YAAY,OAAO,GAAG,aAAa,SAAS,CAAC,CAAC;;AAEtE,SAAQ,QAAQA;;;;;;ACZhB,QAAO,eAAe,SAAS,cAAc,EAAE,OAAO,MAAM,CAAC;AAG7D,SAAQ,UAAU,EAAE;;;;;;CCJpB,MAAM,EAAE,wBAAW,uCAAoB,gBAAgB;AAEvD,QAAO,UAAU;EAKf;EAMA;EACD;;;;CAKD,SAAS,uBAAuB;EAC9B,SAASC,YAAU,KAAK;AAEtB,UAAO,eADa,MAAM,EACX,QAAQ;;EAGzB,SAASC,kBAAgB,SAAS;AAEhC,oBADoB,MAAM,CACf,QAAQ,QAAQ;;AAE7B,SAAO;GACL;GACA;GACD;;;;;CAMH,SAAS,2BAA2B;EAClC,SAASD,YAAU,KAAK;GACtB,MAAM,EAAE;AACR,UAAO,IAAI,iBAAiB,IAAI;;EAGlC,SAASC,kBAAgB,SAAS;AAChC,WAAQ,OAAO,SAAS,QAAQ;AAChC,UAAO,QAAQ;;AAEjB,SAAO;GACL;GACA;GACD;;;;;;;CAQH,SAAS,sBAAsB;AAI7B,MAAI,OAAO,cAAc,YAAY,cAAc,QAAQ,OAAO,UAAU,cAAc,SAExF,QAAO,UAAU,cAAc;AAGjC,MAAI,OAAO,aAAa,YAAY;GAClC,MAAM,OAAO,IAAI,SAAS,MAAM,EAAE,IAAI,EAAE,OAAO,MAAM,EAAE,CAAC;AACxD,OAAI,OAAO,KAAK,OAAO,YAAY,KAAK,OAAO,QAAQ,KAAK,GAAG,MAC7D,QAAO;;AAGX,SAAO;;CAGT,SAAS,iBAAiB;AACxB,MAAI,qBAAqB,CACvB,QAAO,0BAA0B;AAEnC,SAAO,sBAAsB;;;;;;;CC/E/B,MAAMC,2BAAuB,SAAS,CAAC;CAEvC,MAAM,EAAE,OAAO;CACf,MAAM,EAAE,WAAW;CAEnB,MAAM,cAAc,UAAU,OAAO;CACrC,MAAM,aAAa,UAAU,MAAM;CACnC,MAAM,YAAY,UAAU,KAAK;CAGjC,IAAMC,eAAN,cAAyBD,eAAa;EACpC,YAAY,UAAQ;AAClB,UAAO;AACP,cAASE,YAAU,EAAE;AAErB,QAAK,SAASA,SAAO,UAAU,UAAUA,SAAO,IAAI;AACpD,OAAI,OAAO,KAAK,WAAW,WACzB,MAAK,SAAS,KAAK,OAAOA,SAAO;AAGnC,QAAK,aAAaA,SAAO;AACzB,QAAK,+BAA+BA,SAAO;AAC3C,QAAK,mBAAmB,EAAE;AAC1B,QAAK,MAAMA,SAAO,OAAO;AACzB,QAAK,UAAU;AACf,QAAK,eAAe;GACpB,MAAM,OAAO;AACb,QAAK,GAAG,eAAe,SAAU,WAAW;AAC1C,QAAI,cAAc,UAChB,MAAK,eAAe;KAEtB;;EAGJ,QAAQ,MAAM,MAAM;GAClB,MAAM,OAAO;AAEb,QAAK,cAAc;AACnB,QAAK,OAAO,WAAW,KAAK;AAC5B,QAAK,OAAO,QAAQ,MAAM,KAAK;AAE/B,QAAK,OAAO,KAAK,WAAW,WAAY;AACtC,QAAI,KAAK,WACP,MAAK,OAAO,aAAa,MAAM,KAAK,6BAA6B;AAEnE,SAAK,KAAK,UAAU;KACpB;GAEF,MAAM,oBAAoB,SAAU,OAAO;AAEzC,QAAI,KAAK,YAAY,MAAM,SAAS,gBAAgB,MAAM,SAAS,SACjE;AAEF,SAAK,KAAK,SAAS,MAAM;;AAE3B,QAAK,OAAO,GAAG,SAAS,kBAAkB;AAE1C,QAAK,OAAO,GAAG,SAAS,WAAY;AAClC,SAAK,KAAK,MAAM;KAChB;AAEF,OAAI,CAAC,KAAK,IACR,QAAO,KAAK,gBAAgB,KAAK,OAAO;AAG1C,QAAK,OAAO,KAAK,QAAQ,SAAU,QAAQ;AAEzC,YADqB,OAAO,SAAS,OAAO,EAC5C;KACE,KAAK,IACH;KACF,KAAK;AACH,WAAK,OAAO,KAAK;AACjB,aAAO,KAAK,KAAK,yBAAS,IAAI,MAAM,8CAA8C,CAAC;KACrF;AAEE,WAAK,OAAO,KAAK;AACjB,aAAO,KAAK,KAAK,yBAAS,IAAI,MAAM,oDAAoD,CAAC;;IAE7F,MAAM,UAAU,EACd,QAAQ,KAAK,QACd;AAED,QAAI,KAAK,QAAQ,MAAM;AACrB,YAAO,OAAO,SAAS,KAAK,IAAI;AAEhC,SAAI,SAAS,KAAK,IAChB,SAAQ,MAAM,KAAK,IAAI;;IAI3B,MAAM,gBAAc,MAAM;AAC1B,QAAI,IAAI,QAAQ,IAAI,KAAK,KAAK,KAAK,EACjC,SAAQ,aAAa;AAEvB,QAAI;AACF,UAAK,SAAS,gBAAgB,QAAQ;aAC/B,KAAK;AACZ,YAAO,KAAK,KAAK,SAAS,IAAI;;AAEhC,SAAK,gBAAgB,KAAK,OAAO;AACjC,SAAK,OAAO,GAAG,SAAS,kBAAkB;AAE1C,SAAK,KAAK,aAAa;KACvB;;EAGJ,gBAAgB,QAAQ;AACtB,SAAM,SAAS,QAAQ;IACrB,MAAM,YAAY,IAAI,SAAS,UAAU,iBAAiB,IAAI;AAC9D,QAAI,KAAK,aACP,MAAK,KAAK,WAAW,IAAI;AAE3B,SAAK,KAAK,WAAW,IAAI;KACzB;;EAGJ,aAAa;AACX,QAAK,OAAO,MAAM,UAAU,YAAY,CAAC;;EAG3C,QAAQ,UAAQ;AACd,QAAK,OAAO,MAAM,UAAU,QAAQA,SAAO,CAAC;;EAG9C,OAAO,WAAW,WAAW;AAC3B,QAAK,MAAM,UAAU,OAAO,WAAW,UAAU,CAAC;;EAGpD,SAAS,YAAU;AACjB,QAAK,MAAM,UAAU,SAASC,WAAS,CAAC;;EAG1C,+BAA+B,WAAW,iBAAiB;AACzD,QAAK,MAAM,UAAU,+BAA+B,WAAW,gBAAgB,CAAC;;EAGlF,4BAA4B,gBAAgB;AAC1C,QAAK,MAAM,UAAU,4BAA4B,eAAe,CAAC;;EAGnE,MAAM,QAAQ;AACZ,OAAI,CAAC,KAAK,OAAO,SACf,QAAO;AAET,UAAO,KAAK,OAAO,MAAM,OAAO;;EAGlC,MAAM,MAAM;AACV,QAAK,MAAM,UAAU,MAAM,KAAK,CAAC;;EAInC,MAAM,SAAO;AACX,QAAK,MAAM,UAAU,MAAMC,QAAM,CAAC;;EAIpC,KAAK,UAAQ;AACX,QAAK,MAAM,UAAU,KAAKF,SAAO,CAAC;;EAIpC,QAAQ,UAAQ;AACd,QAAK,MAAM,UAAU,QAAQA,SAAO,CAAC;;EAGvC,QAAQ;AACN,OAAI,KAAK,OAAO,SACd,MAAK,OAAO,MAAM,YAAY;;EAIlC,OAAO;AACL,QAAK,UAAU;AACf,QAAK,MAAM,WAAW;;EAGxB,MAAM;AACJ,QAAK,OAAO,KAAK;;EAGnB,QAAQ;AACN,QAAK,OAAO,OAAO;;EAGrB,MAAM;AAEJ,QAAK,UAAU;AACf,OAAI,CAAC,KAAK,eAAe,CAAC,KAAK,OAAO,UAAU;AAC9C,SAAK,OAAO,KAAK;AACjB;;AAEF,UAAO,KAAK,OAAO,MAAM,iBAAiB;AACxC,SAAK,OAAO,KAAK;KACjB;;EAGJ,MAAM,KAAK;AACT,QAAK,MAAM,UAAU,MAAM,IAAI,CAAC;;EAGlC,SAAS,KAAK;AACZ,QAAK,MAAM,UAAU,SAAS,IAAI,CAAC;;EAGrC,kBAAkB,OAAO;AACvB,QAAK,MAAM,UAAU,SAAS,MAAM,CAAC;;EAGvC,cAAc;AACZ,QAAK,MAAM,UAAU,UAAU,CAAC;;EAGlC,aAAa,KAAK;AAChB,QAAK,MAAM,UAAU,SAAS,IAAI,CAAC;;;AAIvC,QAAO,UAAUD;;;;;;CC1MjB,MAAM,EAAE,wBAAsB,SAAS;CACvC,MAAM,EAAE,4BAA0B,iBAAiB;CACnD,MAAM,QAAQ,OAAO,OAAO;CAC5B,MAAM,WAAW,OAAO,UAAU;CAElC,SAAS,UAAW,OAAO,KAAK,IAAI;EAClC,IAAI;AACJ,MAAI,KAAK,UAAU;AAEjB,UADY,KAAK,UAAU,MAAM,MAAM,CAC5B,MAAM,KAAK,QAAQ;AAE9B,OAAI,KAAK,WAAW,EAAG,QAAO,IAAI;AAGlC,QAAK,OAAO;AACZ,QAAK,WAAW;SACX;AACL,QAAK,UAAU,KAAK,UAAU,MAAM,MAAM;AAC1C,UAAO,KAAK,OAAO,MAAM,KAAK,QAAQ;;AAGxC,OAAK,SAAS,KAAK,KAAK;AAExB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI;AACF,QAAK,MAAM,KAAK,OAAO,KAAK,GAAG,CAAC;WACzB,OAAO;AACd,UAAO,GAAG,MAAM;;AAIpB,OAAK,WAAW,KAAK,OAAO,SAAS,KAAK;AAC1C,MAAI,KAAK,YAAY,CAAC,KAAK,cAAc;AACvC,sBAAG,IAAI,MAAM,yBAAyB,CAAC;AACvC;;AAGF,MAAI;;CAGN,SAAS,MAAO,IAAI;AAElB,OAAK,UAAU,KAAK,UAAU,KAAK;AAEnC,MAAI,KAAK,OACP,KAAI;AACF,QAAK,MAAM,KAAK,OAAO,KAAK,OAAO,CAAC;WAC7B,OAAO;AACd,UAAO,GAAG,MAAM;;AAIpB,MAAI;;CAGN,SAAS,KAAM,MAAM,OAAK;AACxB,MAAII,UAAQ,OACV,MAAK,KAAKA,MAAI;;CAIlB,SAAS,KAAM,UAAU;AACvB,SAAO;;CAGT,SAASC,QAAO,WAAS,QAAQ,SAAS;AAExC,cAAUC,aAAW;AACrB,WAAS,UAAU;AACnB,YAAU,WAAW,EAAE;AAGvB,UAAQ,UAAU,QAAlB;GACE,KAAK;AAEH,QAAI,OAAOA,cAAY,YAAY;AACjC,cAASA;AACT,iBAAU;eAED,OAAOA,cAAY,YAAY,EAAEA,qBAAmB,WAAW,CAACA,UAAQ,OAAO,QAAQ;AAChG,eAAUA;AACV,iBAAU;;AAEZ;GAEF,KAAK,EAEH,KAAI,OAAOA,cAAY,YAAY;AACjC,cAAU;AACV,aAASA;AACT,gBAAU;cAED,OAAO,WAAW,UAAU;AACrC,cAAU;AACV,aAAS;;;AAIf,YAAU,OAAO,OAAO,EAAE,EAAE,QAAQ;AACpC,UAAQ,cAAc;AACtB,UAAQ,YAAY;AACpB,UAAQ,QAAQ;AAChB,UAAQ,qBAAqB;EAE7B,MAAM,SAAS,IAAI,UAAU,QAAQ;AAErC,SAAO,SAAS;AAChB,SAAO,YAAY,IAAI,cAAc,OAAO;AAC5C,SAAO,UAAUA;AACjB,SAAO,SAAS;AAChB,SAAO,YAAY,QAAQ;AAC3B,SAAO,eAAe,QAAQ,gBAAgB;AAC9C,SAAO,WAAW;AAClB,SAAO,WAAW,SAAU,KAAK,IAAI;AAEnC,QAAK,eAAe,eAAe;AACnC,MAAG,IAAI;;AAGT,SAAO;;AAGT,QAAO,UAAUD;;;;;;CC1IjB,IAAI,iBAAe,OAAO,EACtB,mBAAiB,SAAS,CAAC,QAC3B,0BACAE,mBAAe,OAAO,EACtB,cAAc,MACd,QAAS,QAAQ,aAAa,SAC9B,aAAa,QAAQ;CAIzB,IAAI,UAAU,IACV,UAAU,GACV,SAAU,OACV,UAAU;CAEd,SAAS,UAAU,MAAM;AACrB,UAAS,OAAO,WAAW;;CAG/B,IAAI,aAAa;EAAE;EAAQ;EAAQ;EAAY;EAAQ;EAAY;CACnE,IAAI,aAAa,WAAW;CAC5B,IAAI,UAAU,WAAY,aAAY;CAGtC,SAAS,OAAO;AAMZ,MAJI,sBAAsB,UACpB,SAAS,WAAW,UAGV;GACZ,IAAI,OAAO,MAAM,UAAU,MAAM,KAAK,UAAU,CAAC,OAAO,KAAK;AAC7D,cAAW,MAAOA,OAAK,OAAO,MAAMA,QAAM,KAAK,CAAE;;;AAKzD,QAAO,eAAe,OAAO,SAAS,SAAS;EAC3C,KAAM,WAAW;AACb,UAAO;;EAEX,KAAM,SAAS,OAAK;AAChB,WAAQC;;EAEf,CAAC;AAGF,QAAO,QAAQ,SAAS,SAAS,QAAQ;EACrC,IAAI,MAAM;AACV,eAAa;AACb,SAAO;;AAGX,QAAO,QAAQ,cAAc,SAAS,QAAO;EACzC,IAAI,MAAM,UAAU,QAAQ;AAM5B,SALW,IAAI,eACX,QACE,KAAK,KAAM,IAAI,WAAW,MAAO,cAAc,cAAe,GAC9D,KAAK,KAAM,IAAI,QAAQ,MAAM,UAAW;;AAKlD,QAAO,QAAQ,YAAY,SAAS,OAAO,OAAO;AAC9C,MAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,KAAK,aAAa,CAC/D,QAAO;AAGX,MAAI,MACA,QAAO;AAGX,UAAQ,SAAS;AAEjB,MAAI,CAAE,UAAU,MAAM,KAAK,EAAE;AACzB,QAAK,qDAAmD,MAAM;AAC9D,UAAO;;AAGX,MAAI,MAAM,QAAQ,UAAU,UAAU;AAElC,QAAK,sGAAoG,MAAM;AAC/G,UAAO;;AAGX,SAAO;;CAIX,IAAI,UAAU,OAAO,QAAQ,QAAQ,SAAS,UAAU,OAAO;AAC3D,SAAO,WAAW,MAAM,GAAG,GAAG,CAAC,OAAO,SAAS,MAAM,OAAO,KAAI;AAC5D,OAAI,OAAO,GAEP;QAAK,OAAQ,SAAS,UAAU,YAAa,KAAK,OAAQ,MAAM,OAAQ,CACpE,QAAO,QAAQ;;AAGvB,UAAO,SACH,MAAM,WAAW,OACf,MAAM,WAAW,SAAS;KAEjC,KAAK;;AAIZ,QAAO,QAAQ,cAAc,SAAS,UAAU,QAAQ,IAAI;EACxD,IAAI;EACJ,IAAI,aAAa,OAAO,KAAK,OAAO,CAAC;EAErC,SAAS,OAAO,MAAM;GAClB,IAAI,QAAQ,UAAU,KAAK;AAC3B,OAAI,SAAS,aAAa,MAAM,IAAI,QAAQ,UAAU,MAAM,EAAE;AAC1D,WAAO,MAAM;AACb,eAAW,KAAK;;;EAIxB,IAAI,QAAQ,WAAW;AACnB,UAAO,SAAS;AAChB,MAAG,KAAK;;EAGZ,IAAI,QAAQ,SAAS,KAAK;AACtB,UAAO,SAAS;AAChB,QAAK,sCAAsC,IAAI;AAC/C,MAAG,OAAU;;AAGjB,SAAO,GAAG,SAAS,MAAM;AACzB,aACK,GAAG,QAAQ,OAAO,CAClB,GAAG,OAAO,MAAM,CAChB,GAAG,SAAS,MAAM;;CAM3B,IAAI,YAAY,OAAO,QAAQ,YAAY,SAAS,MAAM;AACtD,MAAI,KAAK,SAAS,MAAM,KAAK,MAAM,QAAQ,CACvC,QAAO;EAGX,IAAI,UAAU;EACd,IAAI,WAAW;EACf,IAAI,WAAW;EACf,IAAI,WAAW;EAEf,IAAI,MAAM,EAAE;EACZ,IAAI,cAAc;EAClB,IAAI,WAAW,SAAS,KAAK,IAAI,IAAI;GACjC,IAAI,QAAQ,KAAK,UAAU,IAAI,GAAG;AAElC,OAAI,CAAE,OAAO,eAAe,KAAK,QAAQ,KAAK,qBAAqB,CAC/D,SAAQ,MAAM,QAAQ,cAAc,KAAK;AAG7C,OAAK,WAAW,QAAS;;AAG7B,OAAK,IAAI,IAAI,GAAI,IAAI,KAAK,SAAO,GAAI,KAAK,GAAG;AACzC,aAAU,KAAK,OAAO,IAAE,EAAE;AAC1B,cAAW,KAAK,OAAO,EAAE;AAEzB,iBAAe,YAAY,aAAW;AAEtC,OAAI,aAAa;AACb,aAAS,UAAU,SAAS;AAC5B;;AAGJ,OAAI,KAAK,KAAK,WAAW,OAAO,aAAa,MAAM;AAC/C,aAAS,UAAU,UAAU,IAAE,EAAE;AAEjC,eAAW,IAAE;AACb,gBAAY;;;AAIpB,QAAQ,OAAO,KAAK,IAAI,CAAC,WAAW,aAAe,MAAM;AAEzD,SAAO;;CAIX,IAAI,eAAe,OAAO,QAAQ,eAAe,SAAS,OAAM;EAC5D,IAAI,QAAQ;GAER,GAAI,SAAS,GAAE;AACX,WAAO,EAAE,SAAS;;GAGtB,GAAI,SAAS,GAAE;AACX,QAAI,MAAM,IACN,QAAO;AAEX,QAAI,OAAO,EAAE;AACb,WACI,SAAS,EAAE,IACT,IAAI,KACJ,IAAI,oBACJ,KAAK,MAAM,EAAE,KAAK;;GAI5B,GAAI,SAAS,GAAE;AACX,WAAO,EAAE,SAAS;;GAGtB,GAAI,SAAS,GAAE;AACX,WAAO,EAAE,SAAS;;GAGtB,GAAI,SAAS,GAAE;AACX,WAAO,EAAE,SAAS;;GAEzB;AAED,OAAK,IAAI,MAAM,GAAI,MAAM,WAAW,QAAS,OAAO,GAAG;GACnD,IAAI,OAAO,MAAM;AAIjB,OAAI,CADM,KAFE,MAAO,WAAW,SAAU,GAEnB,CAEjB,QAAO;;AAIf,SAAO;;;;;;;ACpOA,WAAQ,OAAO;CAA1B,IACI,eAAa,KAAK,EAClB;AAIJ,QAAO,UAAU,SAAS,UAAU,IAAI;EACpC,IAAI,OAAO,OAAO,aAAa;AAE/B,KAAG,KAAK,MAAM,SAAS,KAAK,QAAK;AAC7B,OAAI,OAAO,CAAC,OAAO,UAAUC,QAAM,KAAK,CACpC,QAAO,GAAG,OAAU;GAGxB,IAAI,KAAK,GAAG,iBAAiB,KAAK;AAElC,UAAO,YAAY,UAAU,IAAI,GAAG;IACtC;;AAGN,QAAO,QAAQ,SAAS,OAAO;;;;;;CCtB/B,MAAMC,2BAAuB,SAAS,CAAC;CACvC,MAAMC;CACN,MAAMC,wBAAoB,OAAO;CACjC,MAAM;CACN,MAAMC;CAEN,MAAMC;CACN,MAAMC;CACN,MAAMC;CACN,MAAMC;CACN,MAAM;CAEN,MAAM,+BAA+BL,YAAU,gBACvC,IACN,iEACD;CAED,MAAM,8BAA8BA,YAAU,gBACtC,IACN,iEACD;CAED,MAAM,0BAA0BA,YAAU,gBAClC,IACN,+PAED;CAED,MAAM,8BAA8BA,YAAU,gBACtC,IACN,sHACD;CAED,MAAMM,sCAAoCN,YAAU,gBAC5C,IACN,wLACD;CAED,IAAMO,WAAN,cAAqBT,eAAa;EAChC,YAAY,UAAQ;AAClB,UAAO;AAEP,QAAK,uBAAuB,IAAII,uBAAqBM,SAAO;AAC5D,QAAK,OAAO,KAAK,qBAAqB;AACtC,QAAK,WAAW,KAAK,qBAAqB;AAC1C,QAAK,OAAO,KAAK,qBAAqB;AACtC,QAAK,OAAO,KAAK,qBAAqB;AAItC,UAAO,eAAe,MAAM,YAAY;IACtC,cAAc;IACd,YAAY;IACZ,UAAU;IACV,OAAO,KAAK,qBAAqB;IAClC,CAAC;AAEF,QAAK,cAAc,KAAK,qBAAqB;GAE7C,MAAM,IAAIA,YAAU,EAAE;AAEtB,OAAI,EAAE,QACJ,8BAA6B;AAE/B,QAAK,WAAW,EAAE,WAAW,OAAO;AACpC,QAAK,SAAS,IAAIP,gBAAc,EAAE,MAAM;AACxC,QAAK,UAAU;AACf,QAAK,SAAS;AACd,QAAK,cAAc;AACnB,QAAK,aAAa;AAClB,QAAK,mBAAmB;AACxB,QAAK,aAAa;AAClB,QAAK,eAAe;AAEpB,QAAK,uBAAuB,QAAQ,EAAE,qBAAqB;AAC3D,QAAK,aACH,EAAE,cACF,IAAII,aAAW;IACb,QAAQ,EAAE;IACV,KAAK,KAAK,qBAAqB;IAC/B,WAAW,EAAE,aAAa;IAC1B,6BAA6B,EAAE,+BAA+B;IAC9D,UAAU,KAAK,qBAAqB,mBAAmB;IACxD,CAAC;AACJ,QAAK,cAAc,EAAE;AACrB,QAAK,SAAS,EAAE,UAAUD,WAAS;AACnC,QAAK,YAAY;AACjB,QAAK,YAAY;AACjB,QAAK,MAAM,KAAK,qBAAqB,OAAO;AAI5C,OAAI,KAAK,OAAO,KAAK,IAAI,IACvB,QAAO,eAAe,KAAK,KAAK,OAAO,EACrC,YAAY,OACb,CAAC;AAGJ,QAAK,2BAA2B,EAAE,2BAA2B;;EAG/D,IAAI,cAAc;AAChB,iCAA8B;AAC9B,UAAO,KAAK;;EAGd,IAAI,YAAY,OAAK;AACnB,iCAA8B;AAC9B,QAAK,eAAeK;;EAGtB,kBAAkB;AAChB,UAAO,KAAK;;EAGd,iBAAiB,KAAK;GACpB,MAAM,gBAAgB,YAAU;AAC9B,YAAQ,eAAe;AACrB,aAAM,YAAY,KAAK,KAAK,WAAW;MACvC;;GAGJ,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,aAAa;AACf,iBAAa,YAAY;AACzB,SAAK,eAAe;;AAGtB,QAAK,YAAY,QAAQ,aAAa;AACtC,QAAK,YAAY,SAAS;;EAG5B,SAAS,UAAU;GACjB,MAAM,OAAO;GACb,MAAM,MAAM,KAAK;AACjB,QAAK,sBAAsB;AAE3B,OAAI,KAAK,eAAe,KAAK,YAAY;IACvC,MAAM,sBAAM,IAAI,MAAM,gEAAgE;AACtF,YAAQ,eAAe;AACrB,cAAS,IAAI;MACb;AACF;;AAEF,QAAK,cAAc;AAEnB,OAAI,KAAK,2BAA2B,GAAG;AACrC,SAAK,0BAA0B,iBAAiB;AAC9C,SAAI,UAAU;AACd,SAAI,OAAO,wBAAQ,IAAI,MAAM,kBAAkB,CAAC;OAC/C,KAAK,yBAAyB;AAEjC,QAAI,KAAK,wBAAwB,MAC/B,MAAK,wBAAwB,OAAO;;AAIxC,OAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,KAAK,EAC1C,KAAI,QAAQ,KAAK,OAAO,eAAe,KAAK,KAAK;OAEjD,KAAI,QAAQ,KAAK,MAAM,KAAK,KAAK;AAInC,OAAI,GAAG,WAAW,WAAY;AAC5B,QAAI,KAAK,IACP,KAAI,YAAY;QAEhB,KAAI,QAAQ,KAAK,gBAAgB,CAAC;KAEpC;AAEF,OAAI,GAAG,cAAc,WAAY;AAC/B,QAAI,QAAQ,KAAK,gBAAgB,CAAC;KAClC;AAEF,QAAK,iBAAiB,IAAI;AAE1B,OAAI,KAAK,aAAa;IACpB,MAAM,QAAQ,KAAK,0BAAU,IAAI,MAAM,wBAAwB,mBAAG,IAAI,MAAM,qCAAqC;AAEjH,iBAAa,KAAK,wBAAwB;AAC1C,SAAK,iBAAiB,MAAM;AAC5B,SAAK,SAAS;AAEd,QAAI,CAAC,KAAK,SAKR;SAAI,KAAK,eAAe,CAAC,KAAK,iBAC5B,KAAI,KAAK,oBACP,MAAK,oBAAoB,MAAM;SAE/B,MAAK,kBAAkB,MAAM;cAEtB,CAAC,KAAK,iBACf,MAAK,kBAAkB,MAAM;;AAIjC,YAAQ,eAAe;AACrB,UAAK,KAAK,MAAM;MAChB;KACF;;EAGJ,QAAQ,UAAU;AAChB,OAAI,UAAU;AACZ,SAAK,SAAS,SAAS;AACvB;;AAGF,UAAO,IAAI,KAAK,UAAU,SAAS,WAAW;AAC5C,SAAK,UAAU,UAAU;AACvB,SAAI,MACF,QAAO,MAAM;SAEb,SAAQ,KAAK;MAEf;KACF;;EAGJ,iBAAiB,KAAK;AAEpB,OAAI,GAAG,mCAAmC,KAAK,6BAA6B,KAAK,KAAK,CAAC;AAEvF,OAAI,GAAG,6BAA6B,KAAK,uBAAuB,KAAK,KAAK,CAAC;AAE3E,OAAI,GAAG,sBAAsB,KAAK,gBAAgB,KAAK,KAAK,CAAC;AAC7D,OAAI,GAAG,8BAA8B,KAAK,wBAAwB,KAAK,KAAK,CAAC;AAC7E,OAAI,GAAG,2BAA2B,KAAK,qBAAqB,KAAK,KAAK,CAAC;AACvE,OAAI,GAAG,kBAAkB,KAAK,sBAAsB,KAAK,KAAK,CAAC;AAC/D,OAAI,GAAG,SAAS,KAAK,kBAAkB,KAAK,KAAK,CAAC;AAClD,OAAI,GAAG,gBAAgB,KAAK,oBAAoB,KAAK,KAAK,CAAC;AAC3D,OAAI,GAAG,iBAAiB,KAAK,qBAAqB,KAAK,KAAK,CAAC;AAC7D,OAAI,GAAG,UAAU,KAAK,cAAc,KAAK,KAAK,CAAC;AAC/C,OAAI,GAAG,kBAAkB,KAAK,sBAAsB,KAAK,KAAK,CAAC;AAC/D,OAAI,GAAG,WAAW,KAAK,eAAe,KAAK,KAAK,CAAC;AACjD,OAAI,GAAG,mBAAmB,KAAK,uBAAuB,KAAK,KAAK,CAAC;AACjE,OAAI,GAAG,cAAc,KAAK,kBAAkB,KAAK,KAAK,CAAC;AACvD,OAAI,GAAG,mBAAmB,KAAK,uBAAuB,KAAK,KAAK,CAAC;AACjE,OAAI,GAAG,iBAAiB,KAAK,qBAAqB,KAAK,KAAK,CAAC;AAC7D,OAAI,GAAG,kBAAkB,KAAK,sBAAsB,KAAK,KAAK,CAAC;AAC/D,OAAI,GAAG,YAAY,KAAK,gBAAgB,KAAK,KAAK,CAAC;AACnD,OAAI,GAAG,gBAAgB,KAAK,oBAAoB,KAAK,KAAK,CAAC;;EAG7D,aAAa,IAAI;GACf,MAAM,MAAM,KAAK;AACjB,OAAI,OAAO,KAAK,aAAa,WAC3B,MAAK,SACF,SAAS,CACT,WAAW,KAAK,SAAS,KAAK,qBAAqB,CAAC,CACpD,MAAM,SAAS;AACd,QAAI,SAAS,QAAW;AACtB,SAAI,OAAO,SAAS,UAAU;AAC5B,UAAI,KAAK,yBAAS,IAAI,UAAU,4BAA4B,CAAC;AAC7D;;AAEF,UAAK,qBAAqB,WAAW,KAAK,WAAW;UAErD,MAAK,qBAAqB,WAAW,KAAK,WAAW;AAEvD,QAAI;KACJ,CACD,OAAO,QAAQ;AACd,QAAI,KAAK,SAAS,IAAI;KACtB;YACK,KAAK,aAAa,KAC3B,KAAI;OAEJ,KAAI;AAEF,oBAAO,KAAK,uBAAuB,SAAS;AAC1C,SAAI,WAAc,MAAM;AACtB,+BAAyB;AACzB,WAAK,qBAAqB,WAAW,KAAK,WAAW;;AAEvD,SAAI;MACJ;YACK,GAAG;AACV,SAAK,KAAK,SAAS,EAAE;;;EAK3B,6BAA6B,KAAK;AAChC,QAAK,mBAAmB;AACtB,SAAK,WAAW,SAAS,KAAK,SAAS;KACvC;;EAGJ,uBAAuB,KAAK;AAC1B,QAAK,aAAa,YAAY;AAC5B,QAAI;KACF,MAAM,iBAAiB,MAAM,OAAO,wBAAwB,KAAK,MAAM,KAAK,UAAU,IAAI,KAAK;AAC/F,UAAK,WAAW,SAAS,eAAe;aACjC,GAAG;AACV,UAAK,KAAK,SAAS,EAAE;;KAEvB;;EAGJ,gBAAgB,KAAK;AACnB,QAAK,mBAAmB;AACtB,QAAI;AACF,UAAK,cAAc,KAAK,aAAa,IAAI,YAAY,KAAK,wBAAwB,KAAK,WAAW,OAAO;AACzG,UAAK,WAAW,+BAA+B,KAAK,YAAY,WAAW,KAAK,YAAY,SAAS;aAC9F,KAAK;AACZ,UAAK,WAAW,KAAK,SAAS,IAAI;;KAEpC;;EAGJ,MAAM,wBAAwB,KAAK;AACjC,OAAI;AACF,UAAM,KAAK,gBACT,KAAK,aACL,KAAK,UACL,IAAI,MACJ,KAAK,wBAAwB,KAAK,WAAW,OAC9C;AACD,SAAK,WAAW,4BAA4B,KAAK,YAAY,SAAS;YAC/D,KAAK;AACZ,SAAK,WAAW,KAAK,SAAS,IAAI;;;EAItC,qBAAqB,KAAK;AACxB,OAAI;AACF,SAAK,gBAAgB,KAAK,aAAa,IAAI,KAAK;AAChD,SAAK,cAAc;YACZ,KAAK;AACZ,SAAK,WAAW,KAAK,SAAS,IAAI;;;EAItC,sBAAsB,KAAK;AACzB,QAAK,YAAY,IAAI;AACrB,QAAK,YAAY,IAAI;;EAGvB,qBAAqB,KAAK;AACxB,OAAI,KAAK,aAAa;AACpB,SAAK,cAAc;AACnB,SAAK,aAAa;AAClB,iBAAa,KAAK,wBAAwB;AAG1C,QAAI,KAAK,qBAAqB;AAC5B,UAAK,oBAAoB,MAAM,KAAK;AAGpC,UAAK,sBAAsB;;AAE7B,SAAK,KAAK,UAAU;;GAEtB,MAAM,cAAc,KAAK,iBAAiB;AAC1C,QAAK,eAAe;AACpB,QAAK,gBAAgB;AACrB,OAAI,YACF,aAAY,oBAAoB,KAAK,WAAW;AAElD,QAAK,kBAAkB;;EAKzB,4BAA4B,KAAK;AAC/B,OAAI,KAAK,iBAEP;AAEF,QAAK,mBAAmB;AACxB,gBAAa,KAAK,wBAAwB;AAC1C,OAAI,KAAK,oBACP,QAAO,KAAK,oBAAoB,IAAI;AAEtC,QAAK,KAAK,SAAS,IAAI;;EAMzB,kBAAkB,KAAK;AACrB,OAAI,KAAK,YACP,QAAO,KAAK,4BAA4B,IAAI;AAE9C,QAAK,aAAa;AAClB,QAAK,iBAAiB,IAAI;AAC1B,QAAK,KAAK,SAAS,IAAI;;EAIzB,oBAAoB,KAAK;AACvB,OAAI,KAAK,YACP,QAAO,KAAK,4BAA4B,IAAI;GAE9C,MAAM,cAAc,KAAK,iBAAiB;AAE1C,OAAI,CAAC,aAAa;AAChB,SAAK,kBAAkB,IAAI;AAC3B;;AAGF,QAAK,eAAe;AACpB,eAAY,YAAY,KAAK,KAAK,WAAW;;EAG/C,sBAAsB,KAAK;GACzB,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,2DAA2D;AACnF,SAAK,kBAAkB,MAAM;AAC7B;;AAGF,eAAY,qBAAqB,IAAI;;EAGvC,eAAe,KAAK;GAClB,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,oDAAoD;AAC5E,SAAK,kBAAkB,MAAM;AAC7B;;AAGF,eAAY,cAAc,IAAI;;EAGhC,uBAAuB,KAAK;GAC1B,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,4DAA4D;AACpF,SAAK,kBAAkB,MAAM;AAC7B;;AAGF,eAAY,sBAAsB,KAAK,WAAW;;EAGpD,kBAAkB,KAAK;GACrB,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,uDAAuD;AAC/E,SAAK,kBAAkB,MAAM;AAC7B;;AAGF,eAAY,iBAAiB,KAAK,WAAW;;EAG/C,uBAAuB,KAAK;GAC1B,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,4DAA4D;AACpF,SAAK,kBAAkB,MAAM;AAC7B;;AAGF,eAAY,sBAAsB,KAAK,KAAK,WAAW;;EAGzD,uBAAuB;GACrB,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,0DAA0D;AAClF,SAAK,kBAAkB,MAAM;AAC7B;;AAKF,OAAI,YAAY,KACd,MAAK,WAAW,iBAAiB,YAAY,QAAQ,YAAY;;EAIrE,sBAAsB,KAAK;GACzB,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,2DAA2D;AACnF,SAAK,kBAAkB,MAAM;AAC7B;;AAEF,eAAY,qBAAqB,KAAK,WAAW;;EAGnD,gBAAgB,KAAK;GACnB,MAAM,cAAc,KAAK,iBAAiB;AAC1C,OAAI,eAAe,MAAM;IACvB,MAAM,wBAAQ,IAAI,MAAM,qDAAqD;AAC7E,SAAK,kBAAkB,MAAM;AAC7B;;AAEF,eAAY,eAAe,KAAK,KAAK,WAAW;;EAGlD,oBAAoB,KAAK;AACvB,QAAK,KAAK,gBAAgB,IAAI;;EAGhC,cAAc,KAAK;AACjB,QAAK,KAAK,UAAU,IAAI;;EAG1B,iBAAiB;GACf,MAAM,SAAS,KAAK;GAEpB,MAAM,OAAO;IACX,MAAM,OAAO;IACb,UAAU,OAAO;IAClB;GAED,MAAM,UAAU,OAAO,oBAAoB,OAAO;AAClD,OAAI,QACF,MAAK,mBAAmB;AAE1B,OAAI,OAAO,YACT,MAAK,cAAc,KAAK,OAAO;AAEjC,OAAI,OAAO,kBACT,MAAK,oBAAoB,OAAO,SAAS,OAAO,mBAAmB,GAAG,CAAC;AAEzE,OAAI,OAAO,aACT,MAAK,eAAe,OAAO,SAAS,OAAO,cAAc,GAAG,CAAC;AAE/D,OAAI,OAAO,oCACT,MAAK,sCAAsC,OAAO,SAAS,OAAO,qCAAqC,GAAG,CAAC;AAE7G,OAAI,OAAO,QACT,MAAK,UAAU,OAAO;AAGxB,UAAO;;EAGT,OAAO,QAAQ,SAAO;AACpB,OAAI,OAAO,gBAAgBC,SAAO;IAChC,MAAM,MAAM,KAAK;AAEjB,QAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI,KAAK,EAC1C,KAAI,QAAQ,KAAK,OAAO,eAAe,KAAK,KAAK;QAEjD,KAAI,QAAQ,KAAK,MAAM,KAAK,KAAK;AAInC,QAAI,GAAG,WAAW,WAAY;AAC5B,SAAI,OAAO,OAAO,WAAW,OAAO,UAAU;MAC9C;cACO,OAAO,YAAY,QAAQA,QAAM,KAAK,GAC/C,QAAO,YAAY,OAAO,OAAO,YAAY,QAAQA,QAAM,EAAE,EAAE;;EAInE,cAAc,KAAK,QAAQ,SAAS;AAClC,UAAO,KAAK,OAAO,cAAc,KAAK,QAAQ,QAAQ;;EAGxD,cAAc,KAAK,QAAQ;AACzB,UAAO,KAAK,OAAO,cAAc,KAAK,OAAO;;EAM/C,iBAAiB,KAAK;AACpB,UAAOX,QAAM,iBAAiB,IAAI;;EAGpC,cAAc,KAAK;AACjB,UAAOA,QAAM,cAAc,IAAI;;EAGjC,mBAAmB;AACjB,OAAI,KAAK,kBAAkB,MAAM;AAC/B,SAAK,eAAe,KAAK,YAAY,OAAO;IAC5C,MAAM,cAAc,KAAK,iBAAiB;AAC1C,QAAI,aAAa;AACf,UAAK,gBAAgB;AACrB,UAAK,cAAc;KAEnB,MAAM,aAAa,YAAY,OAAO,KAAK,WAAW;AACtD,SAAI,WACF,SAAQ,eAAe;AACrB,kBAAY,YAAY,YAAY,KAAK,WAAW;AACpD,WAAK,gBAAgB;AACrB,WAAK,kBAAkB;OACvB;eAEK,KAAK,aAAa;AAC3B,UAAK,eAAe;AACpB,UAAK,KAAK,QAAQ;;;;EAKxB,MAAM,UAAQ,QAAQ,UAAU;GAE9B,IAAIW;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;AAEJ,OAAIF,aAAW,QAAQA,aAAW,OAChC,OAAM,IAAI,UAAU,8CAA8C;YACzD,OAAOA,SAAO,WAAW,YAAY;AAC9C,kBAAcA,SAAO,iBAAiB,KAAK,qBAAqB;AAChE,aAAS,UAAQA;AACjB,QAAI,CAACE,QAAM,UACT;SAAI,OAAO,WAAW,WACpB,SAAM,WAAW;cACR,SACT,SAAM,WAAW;;UAGhB;AACL,kBAAcF,SAAO,iBAAiB,KAAK,qBAAqB;AAChE,cAAQ,IAAIL,QAAMK,UAAQ,QAAQ,SAAS;AAC3C,QAAI,CAACE,QAAM,SACT,UAAS,IAAI,KAAK,UAAU,SAAS,WAAW;AAC9C,aAAM,YAAY,KAAK,QAAS,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI;MAChE,CAAC,OAAO,QAAQ;AAGhB,WAAM,kBAAkB,IAAI;AAC5B,WAAM;MACN;;AAIN,OAAI,aAAa;AACf,oBAAgBA,QAAM,mBAAmB;AAEzC,uBAAmB,iBAAiB;KAClC,MAAM,wBAAQ,IAAI,MAAM,qBAAqB;AAE7C,aAAQ,eAAe;AACrB,cAAM,YAAY,OAAO,KAAK,WAAW;OACzC;AAEF,mBAAc,MAAM;AAIpB,aAAM,iBAAiB;KAGvB,MAAM,QAAQ,KAAK,YAAY,QAAQA,QAAM;AAC7C,SAAI,QAAQ,GACV,MAAK,YAAY,OAAO,OAAO,EAAE;AAGnC,UAAK,kBAAkB;OACtB,YAAY;AAEf,YAAM,YAAY,KAAK,QAAQ;AAC7B,kBAAa,iBAAiB;AAC9B,mBAAc,KAAK,IAAI;;;AAI3B,OAAI,KAAK,UAAU,CAACA,QAAM,OACxB,SAAM,SAAS;AAGjB,OAAIA,QAAM,WAAW,CAACA,QAAM,QAAQ,OAClC,SAAM,QAAQ,SAAS,KAAK;AAG9B,OAAI,CAAC,KAAK,YAAY;AACpB,YAAQ,eAAe;AACrB,aAAM,4BAAY,IAAI,MAAM,iEAAiE,EAAE,KAAK,WAAW;MAC/G;AACF,WAAO;;AAGT,OAAI,KAAK,SAAS;AAChB,YAAQ,eAAe;AACrB,aAAM,4BAAY,IAAI,MAAM,yCAAyC,EAAE,KAAK,WAAW;MACvF;AACF,WAAO;;AAGT,OAAI,KAAK,YAAY,SAAS,EAC5B,sCAAmC;AAErC,QAAK,YAAY,KAAKA,QAAM;AAC5B,QAAK,kBAAkB;AACvB,UAAO;;EAGT,MAAM;AACJ,QAAK,WAAW,KAAK;;EAGvB,QAAQ;AACN,QAAK,WAAW,OAAO;;EAGzB,IAAI,IAAI;AACN,QAAK,UAAU;AAGf,OAAI,CAAC,KAAK,WAAW,eAAe,KAAK,OACvC,KAAI,GACF,KAAI;OAEJ,QAAO,KAAK,SAAS,SAAS;AAIlC,OAAI,KAAK,iBAAiB,IAAI,CAAC,KAAK,WAGlC,MAAK,WAAW,OAAO,SAAS;OAEhC,MAAK,WAAW,KAAK;AAGvB,OAAI,GACF,MAAK,WAAW,KAAK,OAAO,GAAG;OAE/B,QAAO,IAAI,KAAK,UAAU,YAAY;AACpC,SAAK,WAAW,KAAK,OAAO,QAAQ;KACpC;;EAGN,IAAI,aAAa;AACf,gCAA6B;AAC7B,UAAO,KAAK;;;AAKhB,UAAO,QAAQP;AAEf,QAAO,UAAUI;;;;;;CCruBjB,MAAMI,2BAAuB,SAAS,CAAC;CAEvC,MAAM,OAAO,WAAY;CAEzB,MAAM,eAAe,MAAM,cAAc;EACvC,MAAM,IAAI,KAAK,UAAU,UAAU;AAEnC,SAAO,MAAM,KAAK,SAAY,KAAK,OAAO,GAAG,EAAE,CAAC;;CAGlD,IAAM,WAAN,MAAe;EACb,YAAY,QAAQ,cAAc,WAAW;AAC3C,QAAK,SAAS;AACd,QAAK,eAAe;AACpB,QAAK,YAAY;;;CAIrB,IAAM,cAAN,MAAkB;EAChB,YAAY,UAAU;AACpB,QAAK,WAAW;;;CAIpB,SAAS,uBAAuB;AAC9B,QAAM,IAAI,MAAM,wEAAwE;;CAG1F,SAAS,UAAU,WAAS,UAAU;AACpC,MAAI,SACF,QAAO;GAAY;GAAU,QAAQ;GAAW;EAElD,IAAI;EACJ,IAAI;EACJ,MAAM,KAAK,SAAU,KAAK,QAAQ;AAChC,SAAM,IAAI,IAAI,GAAG,IAAI,OAAO;;AAW9B,SAAO;GAAE,UAAU;GAAI,QATR,IAAIC,UAAQ,SAAU,SAAS,QAAQ;AACpD,UAAM;AACN,UAAM;KACN,CAAC,OAAO,QAAQ;AAGhB,UAAM,kBAAkB,IAAI;AAC5B,UAAM;KACN;GACqC;;CAGzC,SAAS,iBAAiB,QAAM,QAAQ;AACtC,SAAO,SAAS,aAAa,KAAK;AAChC,OAAI,SAAS;AAEb,UAAO,eAAe,SAAS,aAAa;AAC5C,UAAO,GAAG,eAAe;AACvB,WAAK,IAAI,4DAA4D,IAAI;KACzE;AACF,UAAK,QAAQ,OAAO;AAGpB,UAAK,KAAK,SAAS,KAAK,OAAO;;;CAInC,IAAMC,SAAN,cAAmBF,eAAa;EAC9B,YAAY,SAAS,UAAQ;AAC3B,UAAO;AACP,QAAK,UAAU,OAAO,OAAO,EAAE,EAAE,QAAQ;AAEzC,OAAI,WAAW,QAAQ,cAAc,QAGnC,QAAO,eAAe,KAAK,SAAS,YAAY;IAC9C,cAAc;IACd,YAAY;IACZ,UAAU;IACV,OAAO,QAAQ;IAChB,CAAC;AAEJ,OAAI,WAAW,QAAQ,QAAQ,OAAO,QAAQ,IAAI,IAGhD,QAAO,eAAe,KAAK,QAAQ,KAAK,OAAO,EAC7C,YAAY,OACb,CAAC;AAGJ,QAAK,QAAQ,MAAM,KAAK,QAAQ,OAAO,KAAK,QAAQ,YAAY;AAChE,QAAK,QAAQ,MAAM,KAAK,QAAQ,OAAO;AACvC,QAAK,QAAQ,UAAU,KAAK,QAAQ,WAAW;AAC/C,QAAK,QAAQ,kBAAkB,KAAK,QAAQ,mBAAmB;AAC/D,QAAK,QAAQ,qBAAqB,KAAK,QAAQ,sBAAsB;AACrE,QAAK,MAAM,KAAK,QAAQ,OAAO,WAAY;AAC3C,QAAK,SAAS,KAAK,QAAQ,UAAUG,0BAAwB;AAC7D,QAAK,UAAU,KAAK,QAAQ,WAAW,OAAO;AAE9C,OAAI,OAAO,KAAK,QAAQ,sBAAsB,YAC5C,MAAK,QAAQ,oBAAoB;AAGnC,QAAK,WAAW,EAAE;AAClB,QAAK,QAAQ,EAAE;AACf,QAAK,2BAAW,IAAI,SAAS;AAC7B,QAAK,gBAAgB,EAAE;AACvB,QAAK,eAAe;AACpB,QAAK,SAAS;AACd,QAAK,QAAQ;;EAGf,YAAY,GAAG;GACb,MAAMF,YAAU,KAAK;AACrB,OAAI,OAAOA,UAAQ,QAAQ,WACzB,QAAOA,UAAQ,IAAI,EAAE;AAEvB,UAAO,IAAIA,WAAS,YAAY,QAAQ,GAAG,CAAC,CAAC;;EAG/C,UAAU;AACR,UAAO,KAAK,SAAS,UAAU,KAAK,QAAQ;;EAG9C,cAAc;AACZ,UAAO,KAAK,SAAS,SAAS,KAAK,QAAQ;;EAG7C,cAAc;AACZ,QAAK,IAAI,cAAc;AACvB,OAAI,KAAK,OAAO;AACd,SAAK,IAAI,oBAAoB;AAC7B;;AAEF,OAAI,KAAK,QAAQ;AACf,SAAK,IAAI,wBAAwB;AACjC,QAAI,KAAK,MAAM,OACb,MAAK,MAAM,OAAO,CAAC,KAAK,SAAS;AAC/B,UAAK,QAAQ,KAAK,OAAO;MACzB;AAEJ,QAAI,CAAC,KAAK,SAAS,QAAQ;AACzB,UAAK,QAAQ;AACb,UAAK,cAAc;;AAErB;;AAIF,OAAI,CAAC,KAAK,cAAc,QAAQ;AAC9B,SAAK,IAAI,qBAAqB;AAC9B;;AAGF,OAAI,CAAC,KAAK,MAAM,UAAU,KAAK,SAAS,CACtC;GAEF,MAAM,cAAc,KAAK,cAAc,OAAO;AAC9C,OAAI,KAAK,MAAM,QAAQ;IACrB,MAAM,WAAW,KAAK,MAAM,KAAK;AACjC,iBAAa,SAAS,UAAU;IAChC,MAAM,SAAS,SAAS;AACxB,WAAO,OAAO,OAAO,KAAK;IAC1B,MAAM,eAAe,SAAS;AAE9B,WAAO,KAAK,eAAe,QAAQ,aAAa,cAAc,MAAM;;AAEtE,OAAI,CAAC,KAAK,SAAS,CACjB,QAAO,KAAK,UAAU,YAAY;AAEpC,SAAM,IAAI,MAAM,uBAAuB;;EAGzC,QAAQ,QAAQ,UAAU;GACxB,MAAM,UAAU,YAAY,KAAK,QAAQ,SAAS,KAAK,WAAW,OAAO;AAEzE,OAAI,YAAY,OACd,cAAa,QAAQ,UAAU;AAGjC,QAAK,WAAW,KAAK,SAAS,QAAQ,MAAM,MAAM,OAAO;GACzD,MAAM,UAAU;AAChB,UAAO,UAAU;AACf,YAAQ,KAAK,UAAU,OAAO;AAE9B,QAAI,OAAO,aAAa,WACtB,WAAU;KAEZ;;EAGJ,QAAQ,IAAI;AACV,OAAI,KAAK,QAAQ;IACf,MAAM,sBAAM,IAAI,MAAM,kDAAkD;AACxE,WAAO,KAAK,GAAG,IAAI,GAAG,KAAK,QAAQ,OAAO,IAAI;;GAGhD,MAAM,WAAW,UAAU,KAAK,SAAS,GAAG;GAC5C,MAAM,SAAS,SAAS;AAGxB,OAAI,KAAK,SAAS,IAAI,KAAK,MAAM,QAAQ;AAEvC,QAAI,KAAK,MAAM,OACb,SAAQ,eAAe,KAAK,aAAa,CAAC;AAG5C,QAAI,CAAC,KAAK,QAAQ,yBAAyB;AACzC,UAAK,cAAc,KAAK,IAAI,YAAY,SAAS,SAAS,CAAC;AAC3D,YAAO;;IAGT,MAAM,iBAAiB,KAAK,KAAK,SAAS;AACxC,kBAAa,IAAI;AACjB,cAAS,SAAS,KAAK,KAAK,KAAK;;IAGnC,MAAM,cAAc,IAAI,YAAY,cAAc;IAGlD,MAAM,MAAM,iBAAiB;AAG3B,iBAAY,KAAK,gBAAgB,MAAM,EAAE,aAAa,cAAc;AACpE,iBAAY,WAAW;AACvB,cAAS,yBAAS,IAAI,MAAM,0CAA0C,CAAC;OACtE,KAAK,QAAQ,wBAAwB;AAExC,QAAI,IAAI,MACN,KAAI,OAAO;AAGb,SAAK,cAAc,KAAK,YAAY;AACpC,WAAO;;AAGT,QAAK,UAAU,IAAI,YAAY,SAAS,SAAS,CAAC;AAElD,UAAO;;EAGT,UAAU,aAAa;GACrB,MAAM,SAAS,IAAI,KAAK,OAAO,KAAK,QAAQ;AAC5C,QAAK,SAAS,KAAK,OAAO;GAC1B,MAAM,eAAe,iBAAiB,MAAM,OAAO;AAEnD,QAAK,IAAI,0BAA0B;GAGnC,IAAI;GACJ,IAAI,aAAa;AACjB,OAAI,KAAK,QAAQ,wBACf,OAAM,iBAAiB;AACrB,QAAI,OAAO,YAAY;AACrB,UAAK,IAAI,+BAA+B;AACxC,kBAAa;AACb,YAAO,WAAW,OAAO,SAAS;eACzB,CAAC,OAAO,aAAa,EAAE;AAChC,UAAK,IAAI,+BAA+B;AACxC,kBAAa;AAEb,YAAO,KAAK;;MAEb,KAAK,QAAQ,wBAAwB;AAG1C,QAAK,IAAI,wBAAwB;AACjC,UAAO,SAAS,QAAQ;AACtB,QAAI,IACF,cAAa,IAAI;AAEnB,WAAO,GAAG,SAAS,aAAa;AAChC,QAAI,KAAK;AACP,UAAK,IAAI,4BAA4B,IAAI;AAEzC,UAAK,WAAW,KAAK,SAAS,QAAQ,MAAM,MAAM,OAAO;AACzD,SAAI,WACF,OAAM,IAAI,MAAM,mDAAmD,EAAE,OAAO,KAAK,CAAC;AAIpF,UAAK,aAAa;AAElB,SAAI,CAAC,YAAY,SACf,aAAY,SAAS,KAAK,QAAW,KAAK;WAEvC;AACL,UAAK,IAAI,uBAAuB;AAEhC,SAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,kBAAkB,KAAK,QAAQ,UAAU,OAAO,CAAC,CAAC,WAC/C;AACJ,YAAK,cAAc,QAAQ,aAAa,aAAa;UAEtD,YAAY;AACX,YAAK,WAAW,KAAK,SAAS,QAAQ,MAAM,MAAM,OAAO;AACzD,cAAO,UAAU;AACf,aAAK,aAAa;AAClB,YAAI,CAAC,YAAY,SACf,aAAY,SAAS,SAAS,QAAW,KAAK;SAEhD;QAEL;AACD;;AAGF,YAAO,KAAK,cAAc,QAAQ,aAAa,aAAa;;KAE9D;;EAGJ,cAAc,QAAQ,aAAa,cAAc;AAC/C,OAAI,KAAK,QAAQ,uBAAuB,GAAG;IACzC,MAAM,qBAAqB,iBAAiB;AAC1C,UAAK,IAAI,wCAAwC;AACjD,UAAK,SAAS,IAAI,OAAO;AAEzB,SADkB,KAAK,MAAM,WAAW,aAAa,SAAS,WAAW,OAAO,KAC9D,GAChB,MAAK,eACH,QACA,IAAI,aAAa,KAAK,UAAQ,kBAAkB,eAAe,CAAC,EAChE,cACA,MACD;OAEF,KAAK,QAAQ,qBAAqB,IAAK;AAE1C,uBAAmB,OAAO;AAC1B,WAAO,KAAK,aAAa,aAAa,mBAAmB,CAAC;;AAG5D,UAAO,KAAK,eAAe,QAAQ,aAAa,cAAc,KAAK;;EAIrE,eAAe,QAAQ,aAAa,cAAc,OAAO;AACvD,OAAI,MACF,MAAK,KAAK,WAAW,OAAO;AAG9B,QAAK,KAAK,WAAW,OAAO;AAE5B,UAAO,UAAU,KAAK,aAAa,QAAQ,aAAa;AAExD,UAAO,eAAe,SAAS,aAAa;AAE5C,OAAI,CAAC,YAAY,SACf,KAAI,SAAS,KAAK,QAAQ,OACxB,MAAK,QAAQ,OAAO,SAAS,QAAQ;AACnC,QAAI,KAAK;AACP,YAAO,QAAQ,IAAI;AACnB,YAAO,YAAY,SAAS,KAAK,QAAW,KAAK;;AAGnD,gBAAY,SAAS,QAAW,QAAQ,OAAO,QAAQ;KACvD;OAEF,aAAY,SAAS,QAAW,QAAQ,OAAO,QAAQ;YAGrD,SAAS,KAAK,QAAQ,OACxB,MAAK,QAAQ,OAAO,QAAQ,OAAO,QAAQ;OAE3C,QAAO,SAAS;;EAMtB,aAAa,QAAQ,cAAc;GACjC,IAAI,WAAW;AAEf,WAAQ,QAAQ;AACd,QAAI,SACF,uBAAsB;AAGxB,eAAW;AACX,SAAK,SAAS,QAAQ,cAAc,IAAI;;;EAM5C,SAAS,QAAQ,cAAc,KAAK;AAClC,UAAO,GAAG,SAAS,aAAa;AAEhC,UAAO,iBAAiB,OAAO,iBAAiB,KAAK;AAErD,QAAK,KAAK,WAAW,KAAK,OAAO;AAGjC,OAAI,OAAO,KAAK,UAAU,CAAC,OAAO,cAAc,OAAO,WAAW,OAAO,iBAAiB,KAAK,QAAQ,SAAS;AAC9G,QAAI,OAAO,iBAAiB,KAAK,QAAQ,QACvC,MAAK,IAAI,yBAAyB;AAGpC,WAAO,KAAK,QAAQ,QAAQ,KAAK,YAAY,KAAK,KAAK,CAAC;;AAI1D,OADkB,KAAK,SAAS,IAAI,OAAO,EAC5B;AACb,SAAK,IAAI,wBAAwB;AACjC,SAAK,SAAS,OAAO,OAAO;AAC5B,WAAO,KAAK,QAAQ,QAAQ,KAAK,YAAY,KAAK,KAAK,CAAC;;GAI1D,IAAI;AACJ,OAAI,KAAK,QAAQ,qBAAqB,KAAK,aAAa,EAAE;AACxD,UAAM,iBAAiB;AACrB,SAAI,KAAK,aAAa,EAAE;AACtB,WAAK,IAAI,qBAAqB;AAC9B,WAAK,QAAQ,QAAQ,KAAK,YAAY,KAAK,KAAK,CAAC;;OAElD,KAAK,QAAQ,kBAAkB;AAElC,QAAI,KAAK,QAAQ,gBAEf,KAAI,OAAO;;AAIf,OAAI,KAAK,QAAQ,gBACf,QAAO,OAAO;AAGhB,QAAK,MAAM,KAAK,IAAI,SAAS,QAAQ,cAAc,IAAI,CAAC;AACxD,QAAK,aAAa;;EAGpB,MAAM,MAAM,QAAQ,IAAI;AAEtB,OAAI,OAAO,SAAS,YAAY;IAC9B,MAAMG,aAAW,UAAU,KAAK,SAAS,KAAK;AAC9C,iBAAa,WAAY;AACvB,YAAOA,WAAS,yBAAS,IAAI,MAAM,2EAA2E,CAAC;MAC/G;AACF,WAAOA,WAAS;;AAIlB,OAAI,OAAO,WAAW,YAAY;AAChC,SAAK;AACL,aAAS;;GAEX,MAAM,WAAW,UAAU,KAAK,SAAS,GAAG;AAC5C,QAAK,SAAS;AAEd,QAAK,SAAS,KAAK,WAAW;AAC5B,QAAI,IACF,QAAO,GAAG,IAAI;IAGhB,IAAI,iBAAiB;IACrB,MAAM,WAAW,UAAQ;AACvB,SAAI,eACF;AAEF,sBAAiB;AACjB,YAAO,QAAQC,MAAI;AACnB,QAAGA,MAAI;;AAGT,WAAO,KAAK,SAAS,QAAQ;AAC7B,SAAK,IAAI,oBAAoB;AAC7B,QAAI;AACF,YAAO,MAAM,MAAM,SAAS,OAAK,QAAQ;AACvC,WAAK,IAAI,mBAAmB;AAC5B,aAAO,eAAe,SAAS,QAAQ;AACvC,UAAI,eACF;AAEF,uBAAiB;AACjB,aAAO,QAAQA,MAAI;AACnB,UAAIA,MACF,QAAO,GAAGA,MAAI;AAEhB,aAAO,GAAG,QAAW,IAAI;OACzB;aACKA,OAAK;AACZ,YAAO,QAAQA,MAAI;AACnB,YAAO,GAAGA,MAAI;;KAEhB;AACF,UAAO,SAAS;;EAGlB,IAAI,IAAI;AACN,QAAK,IAAI,SAAS;AAClB,OAAI,KAAK,QAAQ;IACf,MAAM,sBAAM,IAAI,MAAM,oCAAoC;AAC1D,WAAO,KAAK,GAAG,IAAI,GAAG,KAAK,QAAQ,OAAO,IAAI;;AAEhD,QAAK,SAAS;GACd,MAAM,WAAW,UAAU,KAAK,SAAS,GAAG;AAC5C,QAAK,eAAe,SAAS;AAC7B,QAAK,aAAa;AAClB,UAAO,SAAS;;EAGlB,IAAI,eAAe;AACjB,UAAO,KAAK,cAAc;;EAG5B,IAAI,YAAY;AACd,UAAO,KAAK,MAAM;;EAGpB,IAAI,eAAe;AACjB,UAAO,KAAK,SAAS,QAAQ,KAAK,WAAW,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,IAAI,IAAI,EAAE;;EAG5F,IAAI,aAAa;AACf,UAAO,KAAK,SAAS;;;AAGzB,QAAO,UAAUH;;;;;;CClgBjB,MAAMI,2BAAuB,SAAS,CAAC;CACvC,MAAMC,mBAAe,OAAO;CAC5B,MAAMC;CAEN,MAAMC,gBAAe,OAAO,UAAU,SAAU,UAAQ,QAAQ,UAAU;AACxE,iBAAa,KAAK,KAAK;AACvB,aAASD,QAAM,qBAAqBE,UAAQ,QAAQ,SAAS;AAC7D,OAAK,OAAOA,SAAO;AACnB,OAAK,SAASA,SAAO;AACrB,OAAK,OAAOA,SAAO;AACnB,OAAK,YAAYA,SAAO;AACxB,OAAK,WAAWA,SAAO;AACvB,OAAK,QAAQ;AACb,OAAK,aAAaA,SAAO,YAAY;AAOrC,OAAK,iBAAiB;AACtB,OAAK,GACH,eACA,SAAU,OAAO;AACf,OAAI,UAAU,MAAO,MAAK,iBAAiB;IAC3C,KAAK,KAAK,CACb;;AAGH,QAAK,SAASD,eAAaH,eAAa;CAExC,MAAM,gBAAgB;EACpB,UAAU;EACV,mBAAmB;EACnB,gBAAgB;EAChB,SAAS;EACT,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,cAAc;EACd,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,gBAAgB;EACjB;AAED,eAAY,UAAU,cAAc,SAAU,KAAK;EAEjD,MAAM,SAAS,KAAK,OAAO,GAAG,mBAAmB;AACjD,MAAI,OACF,MAAK,MAAM,OAAO,QAAQ;GACxB,MAAM,sBAAsB,cAAc,QAAQ;AAClD,OAAI,uBAAuB,OAAO;;AAGtC,MAAI,KAAK,SACP,MAAK,SAAS,IAAI;MAElB,MAAK,KAAK,SAAS,IAAI;AAEzB,OAAK,QAAQ;;AAGf,eAAY,UAAU,OAAO,SAAU,WAAW,WAAW;AAC3D,SAAO,KAAK,aAAa,CAAC,KAAK,WAAW,UAAU;;AAGtD,eAAY,UAAU,QAAQ,SAAU,UAAU;AAChD,SAAO,KAAK,aAAa,CAAC,MAAM,SAAS;;AAG3C,eAAY,UAAU,cAAc,WAAY;AAC9C,MAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,OAAK,WAAW,IAAI,QAClB,SAAU,SAAS,QAAQ;AACzB,QAAK,MAAM,OAAO,QAAQ;AAC1B,QAAK,MAAM,SAAS,OAAO;IAC3B,KAAK,KAAK,CACb;AACD,SAAO,KAAK;;AAGd,eAAY,UAAU,SAAS,SAAU,QAAQ;AAC/C,OAAK,QAAQ;EACb,MAAM,OAAO;AACb,OAAK,SAAS,OAAO;AACrB,SAAO,OAAO,YAAY,KAAK;EAE/B,IAAI,QAAQ,SAAU,KAAK,MAAM,SAAS;AACxC,UAAO,OAAO,YAAY;AAC1B,gBAAa,WAAY;AACvB,SAAK,KAAK,QAAQ;KAClB;AAGF,OAAI,IACF,QAAO,KAAK,YAAY,IAAI;AAI9B,OAAI,KAAK,eACP,KAAI,QAAQ,SAAS,EACnB,MAAK,SAAS,WAAW,MAAM;AAC7B,cAAU,SAAS,QAAQ;AACzB,UAAK,KAAK,OAAO,KAAK,QAAQ,GAAG;MACjC;KACF;OAEF,MAAK,QAAQ,SAAU,KAAK;AAC1B,SAAK,KAAK,OAAO,KAAK,QAAQ;KAC9B;AAKN,QAAK,QAAQ;AACb,QAAK,KAAK,OAAO,QAAQ;AACzB,OAAI,KAAK,SACP,MAAK,SAAS,MAAM,QAAQ;;AAIhC,MAAI,QAAQ,OACV,SAAQ,QAAQ,OAAO,KAAK,MAAM;AAIpC,MAAI,KAAK,MAAM;AACb,OAAI,KAAK,KAAK,SAAS,IAAI;AACzB,YAAQ,MAAM,iEAAiE;AAC/E,YAAQ,MAAM,wBAAwB,KAAK,MAAM,KAAK,KAAK,OAAO;AAClE,YAAQ,MAAM,+DAA+D;;GAE/E,MAAM,UAAU,KAAK,UAAU,EAAE,EAAE,IAAIE,QAAM,aAAa;AAI1D,OAAI,OAAO,aAAa,KAAK,OAAO;AAClC,QAAI,KAAK,QAAQ,OAAO,aAAa,KAAK,UAAU,KAAK,MAAM;KAC7D,MAAM,sBAAM,IAAI,MAAM,yCAAyC,KAAK,KAAK,sCAAsC;AAC/G,YAAO,MAAM,IAAI;;AAEnB,WAAO,OAAO,OAAO,QAAQ,KAAK,MAAM,QAAQ,MAAM;;AAGxD,UAAO,OAAO,OAAO,QAAQ,KAAK,MAAM,KAAK,MAAM,OAAO,QAAQ,SAAU,KAAK;AAC/E,QAAI,IAAK,QAAO,MAAM,IAAI;AAC1B,WAAO,aAAa,KAAK,QAAQ,KAAK;AACtC,WAAO,KAAK,OAAO,QAAQ,KAAK,MAAM,QAAQ,MAAM;KACpD;aACO,KAAK,QAAQ;AACtB,OAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,CAE7B,QAAO,sBADK,IAAI,MAAM,gCAAgC,CACrC;GAEnB,MAAM,OAAO,KAAK,OAAO,IAAIA,QAAM,aAAa;AAChD,UAAO,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM;aAClC,KAAK,cAAc,WAC5B,QAAO,OAAO,MAAM,KAAK,MAAM,EAAE,EAAE,MAAM;MAEzC,QAAO,OAAO,MAAM,KAAK,MAAM,MAAM;;;;;;;CClKzC,MAAM,sBAAoB,OAAO;CAEjC,IAAI;AAEJ,KAAI;AAEF,qBAAiB,YAAY;UACtB,GAAG;AACV,QAAM;;CAER,MAAMG;CACN,MAAM,yBAAuB,SAAS,CAAC;CACvC,MAAM,iBAAe,OAAO;CAC5B,MAAM;CAEN,MAAM;CAEN,MAAM,oCAAoC,UAAU,gBAC5C,IACN,wLACD;CAED,MAAMC,WAAU,OAAO,UAAU,SAAU,UAAQ;AACjD,eAAa,KAAK,KAAK;AACvB,aAASC,YAAU,EAAE;AAErB,OAAK,WAAWA,SAAO,WAAW,OAAO;AACzC,OAAK,SAAS,IAAIF,gBAAcE,SAAO,MAAM;AAE7C,OAAK,SAAS,IAAI,OAAO,EACvB,OAAO,KAAK,QACb,CAAC;AAEF,OAAK,cAAc,EAAE;AACrB,OAAK,UAAU;AACf,OAAK,cAAc;AACnB,OAAK,aAAa;AAClB,OAAK,aAAa;EAIlB,MAAM,KAAM,KAAK,uBAAuB,IAAI,qBAAqBA,SAAO;AACxE,MAAIA,SAAO,uBAAwB,IAAG,yBAAyBA,SAAO;AACtE,OAAK,OAAO,GAAG;AAIf,SAAO,eAAe,MAAM,YAAY;GACtC,cAAc;GACd,YAAY;GACZ,UAAU;GACV,OAAO,GAAG;GACX,CAAC;AACF,OAAK,WAAW,GAAG;AACnB,OAAK,OAAO,GAAG;AACf,OAAK,OAAO,GAAG;AAGf,OAAK,eAAe,EAAE;;AAGxB,UAAO,QAAQ;AAEf,MAAK,SAASD,UAAQ,aAAa;AAEnC,UAAO,UAAU,mBAAmB,SAAU,KAAK;EACjD,MAAM,gBAAgB,YAAU;AAC9B,WAAQ,eAAe;AACrB,YAAM,SAAS,KAAK;AACpB,YAAM,YAAY,IAAI;KACtB;;AAGJ,MAAI,KAAK,iBAAiB,EAAE;AAC1B,gBAAa,KAAK,aAAa;AAC/B,QAAK,eAAe;;AAGtB,OAAK,YAAY,QAAQ,aAAa;AACtC,OAAK,YAAY,SAAS;;AAM5B,UAAO,UAAU,WAAW,SAAU,IAAI;EACxC,MAAM,OAAO;AAEb,MAAI,KAAK,aAAa;AACpB,WAAQ,eAAe,mBAAG,IAAI,MAAM,gEAAgE,CAAC,CAAC;AACtG;;AAGF,OAAK,cAAc;AAEnB,OAAK,qBAAqB,yBAAyB,SAAU,KAAK,WAAW;AAC3E,OAAI,KAAK,qBAAqB,uBAAwB,aAAY,KAAK,qBAAqB;AAC5F,OAAI,IAAK,QAAO,GAAG,IAAI;AACvB,QAAK,OAAO,QAAQ,WAAW,SAAU,OAAK;AAC5C,QAAIE,OAAK;AACP,UAAK,OAAO,KAAK;AACjB,YAAO,GAAGA,MAAI;;AAIhB,SAAK,aAAa;AAGlB,SAAK,OAAO,GAAG,SAAS,SAAU,OAAK;AACrC,UAAK,aAAa;AAClB,UAAK,iBAAiBA,MAAI;AAC1B,UAAK,KAAK,SAASA,MAAI;MACvB;AAEF,SAAK,OAAO,GAAG,gBAAgB,SAAU,KAAK;AAC5C,UAAK,KAAK,gBAAgB;MACxB,SAAS,IAAI;MACb,SAAS,IAAI;MACd,CAAC;MACF;AAGF,SAAK,KAAK,UAAU;AACpB,SAAK,iBAAiB,KAAK;AAE3B,OAAG,MAAM,KAAK;KACd;IACF;;AAGJ,UAAO,UAAU,UAAU,SAAU,UAAU;AAC7C,MAAI,UAAU;AACZ,QAAK,SAAS,SAAS;AACvB;;AAGF,SAAO,IAAI,KAAK,UAAU,SAAS,WAAW;AAC5C,QAAK,UAAU,UAAU;AACvB,QAAI,MACF,QAAO,MAAM;QAEb,SAAQ,KAAK;KAEf;IACF;;AAaJ,UAAO,UAAU,QAAQ,SAAU,UAAQ,QAAQ,UAAU;EAC3D,IAAIC;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,MAAIF,aAAW,QAAQA,aAAW,OAChC,OAAM,IAAI,UAAU,8CAA8C;WACzD,OAAOA,SAAO,WAAW,YAAY;AAC9C,iBAAcA,SAAO,iBAAiB,KAAK,qBAAqB;AAChE,YAAS,UAAQA;AAEjB,OAAI,OAAO,WAAW,WACpB,UAAO,WAAW;SAEf;AACL,iBAAcA,SAAO,iBAAiB,KAAK,qBAAqB;AAChE,aAAQ,IAAI,YAAYA,UAAQ,QAAQ,SAAS;AACjD,OAAI,CAACE,QAAM,UAAU;IACnB,IAAI,YAAY;AAChB,aAAS,IAAI,KAAK,UAAU,SAAS,WAAW;AAC9C,kBAAa;AACb,iBAAY;MACZ,CAAC,OAAO,QAAQ;AAChB,WAAM,kBAAkB,IAAI;AAC5B,WAAM;MACN;AACF,YAAM,YAAY,KAAK,QAAS,MAAM,UAAU,IAAI,GAAG,WAAW,IAAI;;;AAI1E,MAAI,aAAa;AACf,mBAAgBA,QAAM,mBAAmB;AAEzC,sBAAmB,iBAAiB;IAClC,MAAM,wBAAQ,IAAI,MAAM,qBAAqB;AAE7C,YAAQ,eAAe;AACrB,aAAM,YAAY,OAAO,KAAK,WAAW;MACzC;AAEF,kBAAc,MAAM;AAIpB,YAAM,iBAAiB;IAGvB,MAAM,QAAQ,KAAK,YAAY,QAAQA,QAAM;AAC7C,QAAI,QAAQ,GACV,MAAK,YAAY,OAAO,OAAO,EAAE;AAGnC,SAAK,kBAAkB;MACtB,YAAY;AAEf,WAAM,YAAY,KAAK,QAAQ;AAC7B,iBAAa,iBAAiB;AAC9B,kBAAc,KAAK,IAAI;;;AAI3B,MAAI,CAAC,KAAK,YAAY;AACpB,WAAM,SAAS,KAAK;AACpB,WAAQ,eAAe;AACrB,YAAM,4BAAY,IAAI,MAAM,iEAAiE,CAAC;KAC9F;AACF,UAAO;;AAGT,MAAI,KAAK,SAAS;AAChB,WAAM,SAAS,KAAK;AACpB,WAAQ,eAAe;AACrB,YAAM,4BAAY,IAAI,MAAM,yCAAyC,CAAC;KACtE;AACF,UAAO;;AAGT,MAAI,KAAK,YAAY,SAAS,EAC5B,oCAAmC;AAGrC,OAAK,YAAY,KAAKA,QAAM;AAC5B,OAAK,kBAAkB;AACvB,SAAO;;AAIT,UAAO,UAAU,MAAM,SAAU,IAAI;EACnC,MAAM,OAAO;AAEb,OAAK,UAAU;AAEf,MAAI,CAAC,KAAK,WACR,MAAK,KAAK,WAAW,KAAK,IAAI,KAAK,MAAM,GAAG,CAAC;EAE/C,IAAI;AACJ,MAAI,CAAC,GACH,UAAS,IAAI,KAAK,SAAS,SAAU,SAAS,QAAQ;AACpD,SAAM,QAAS,MAAM,OAAO,IAAI,GAAG,SAAS;IAC5C;AAGJ,OAAK,OAAO,IAAI,WAAY;AAC1B,QAAK,aAAa;AAElB,QAAK,iCAAiB,IAAI,MAAM,wBAAwB,CAAC;AAEzD,WAAQ,eAAe;AACrB,SAAK,KAAK,MAAM;AAChB,QAAI,GAAI,KAAI;KACZ;IACF;AACF,SAAO;;AAGT,UAAO,UAAU,kBAAkB,WAAY;AAC7C,SAAO,KAAK,gBAAgB,KAAK,aAAa,UAAU,WAAW,KAAK,aAAa,UAAU;;AAGjG,UAAO,UAAU,mBAAmB,SAAU,mBAAmB;AAC/D,MAAI,CAAC,KAAK,WACR;AAEF,MAAI,KAAK,iBAAiB,CACxB;EAEF,MAAMA,UAAQ,KAAK,YAAY,OAAO;AACtC,MAAI,CAACA,SAAO;AACV,OAAI,CAAC,kBACH,MAAK,KAAK,QAAQ;AAEpB;;AAEF,OAAK,eAAeA;AACpB,UAAM,OAAO,KAAK;EAClB,MAAM,OAAO;AACb,UAAM,KAAK,SAAS,WAAY;AAC9B,QAAK,kBAAkB;IACvB;;AAIJ,UAAO,UAAU,SAAS,SAAU,SAAO;AACzC,MAAI,KAAK,iBAAiBA,QACxB,MAAK,OAAO,OAAO,WAAY,GAAG;WACzB,KAAK,YAAY,QAAQA,QAAM,KAAK,GAC7C,MAAK,YAAY,OAAO,KAAK,YAAY,QAAQA,QAAM,EAAE,EAAE;;AAI/D,UAAO,UAAU,MAAM,WAAY;AACnC,UAAO,UAAU,QAAQ,WAAY;AAErC,UAAO,UAAU,gBAAgB,SAAU,KAAK,QAAQ,SAAS;AAC/D,SAAO,KAAK,OAAO,cAAc,KAAK,QAAQ,QAAQ;;AAGxD,UAAO,UAAU,gBAAgB,SAAU,KAAK,QAAQ;AACtD,SAAO,KAAK,OAAO,cAAc,KAAK,OAAO;;AAG/C,UAAO,UAAU,cAAc,WAAY;AACzC,SAAO,KAAK;;;;;;;AChUd,QAAO;;;;;;CCCP,MAAMC;CACN,MAAMC;CACN,MAAMC;CACN,MAAMC;CACN,MAAM;CACN,MAAMC;CACN,MAAMC;CACN,MAAM,EAAE;CACR,MAAM,EAAE,sCAAkB;CAE1B,MAAM,eAAe,aAAW;AAC9B,SAAO,MAAM,kBAAkBD,OAAK;GAClC,YAAY,SAAS;AACnB,UAAM,SAASJ,SAAO;;;;CAK5B,MAAM,KAAK,SAAU,qBAAmB;AACtC,OAAK,WAAWC;AAChB,OAAK,SAASK;AACd,OAAK,QAAQ,KAAK,OAAO;AACzB,OAAK,OAAO,YAAY,KAAK,OAAO;AACpC,OAAK,SAAS,EAAE;AAChB,OAAK,aAAaJ;AAClB,OAAK;AACL,OAAK,gBAAgBK;AACrB,OAAK,gBAAgBF;AACrB,OAAK,mBAAmBG;AACxB,OAAK,gBAAgBC;AACrB,OAAK,SAASN;AACd,OAAK,QAAQ;;CAGf,IAAI,oBAAoBH;CAExB,IAAI,cAAc;AAClB,KAAI;AACF,gBAAc,CAAC,CAAC,QAAQ,IAAI;SACtB;AAIR,KAAI,YACF;AAGF,QAAO,UAAU,IAAI,GAAG,kBAAkB;AAG1C,QAAO,eAAe,OAAO,SAAS,UAAU;EAC9C,cAAc;EACd,YAAY;EACZ,MAAM;GACJ,IAAI,SAAS;AACb,OAAI;AACF,aAAS,IAAI,oBAAuB;YAC7B,KAAK;AACZ,QAAI,IAAI,SAAS,mBACf,OAAM;;AAKV,UAAO,eAAe,OAAO,SAAS,UAAU,EAC9C,OAAO,QACR,CAAC;AAEF,UAAO;;EAEV,CAAC;;;;;;ACpEF,MAAa,SAASU,mBAAG;AACzB,MAAa,OAAOA,mBAAG;AACvB,MAAa,aAAaA,mBAAG;AAC7B,MAAa,QAAQA,mBAAG;AACxB,MAAa,QAAQA,mBAAG;AACxB,MAAa,gBAAgBA,mBAAG;AAChC,MAAa,mBAAmBA,mBAAG;AACnC,MAAa,gBAAgBA,mBAAG;AAChC,MAAa,SAASA,mBAAG;AACzB,MAAa,gBAAgBA,mBAAG;AAGhC,MAAa,WAAWA,mBAAG;AAG3B,kBAAeA;;;;ACff,IAAIC,eAAoC;AACxC,IAAIC,OAAuB;;;;;AAM3B,SAAgB,cAA4B;AAC1C,KAAI,CAAC,cAAc;EACjB,MAAM,cAAc,QAAQ,IAAI;AAChC,MAAI,CAAC,YACH,OAAM,IAAI,MACR,wFACD;AAIH,SAAO,IAAIC,YAAG,KAAK,EAAE,kBAAkB,aAAa,CAAC;AAGrD,iBAAe,IAAI,aAAa,EAAE,SAFlB,IAAI,SAAS,KAAK,EAES,CAAC;;AAE9C,QAAO;;;;;;AAOT,SAAgB,YAAY,QAA4B;AACtD,gBAAe;;;;;;AAOjB,eAAsB,YAA2B;AAE/C,OADe,aAAa,CACf,UAAU;;;;;;AAOzB,eAAsB,eAA8B;AAClD,KAAI,cAAc;AAChB,QAAM,aAAa,aAAa;AAChC,iBAAe;;AAEjB,KAAI,MAAM;AACR,QAAM,KAAK,KAAK;AAChB,SAAO;;;;;;ACrCX,eAAsB,sCAEpB;CACA,MAAM,SAAS,aAAa;CAG5B,MAAM,OAAO,MAAM,OAAO,mBAAmB,UAAU;CAGvD,MAAM,OAAO,MAAM,OAAO,gBAAgB,SAAS,EACjD,QAAQ,EAAE,MAAM,MAAM,EACvB,CAAC;CAGF,MAAM,4BAAY,IAAI,KAAkC;AAExD,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,OAAQ,IAAI,QAA4C,EAAE;AAChE,OAAK,MAAM,OAAO,MAAM;GACtB,MAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,IAAI;AACtC,OAAI,UAAU,OAAO;AACnB,QAAI,CAAC,UAAU,IAAI,OAAO,CACxB,WAAU,IAAI,wBAAQ,IAAI,KAAK,CAAC;IAElC,MAAM,eAAe,UAAU,IAAI,OAAO;AAC1C,iBAAa,IAAI,QAAQ,aAAa,IAAI,MAAM,IAAI,KAAK,EAAE;;;;AAMjE,QAAO,KAAK,KAAK,QAAQ;EACvB,MAAM,aAAa,KAAK,KAAK;GAAC;GAAM;GAAa;GAAY,CAAC;EAC9D,MAAM,SAAS,UAAU,IAAI,WAAW,OAAO,oBAAI,IAAI,KAAK;EAG5D,MAAM,eAAe,CAAC,GAAG,WAAW,OAAO,CAAC,MAAM,GAAG,MAAM;GACzD,MAAM,SAAS,OAAO,IAAI,EAAE,MAAM,IAAI;AAEtC,WADe,OAAO,IAAI,EAAE,MAAM,IAAI,KACtB;IAChB;AAEF,SAAO;GACL,GAAG;GACH,QAAQ;GACT;GACD;;AAGJ,eAAsB,+BAEpB;AAMA,SAFa,MAHE,aAAa,CAGF,iBAAiB,UAAU,EAEzC,KAAK,QAAQ;EAEvB,MAAM,aAAa;GACjB,MAAM,IAAI;GACV,aAAa,IAAI;GAClB;EAGD,MAAMC,WAAS,IAAI,UAAU,EAAE;AAE/B,UAAQ,IAAI,MAAZ;GACE,KAAK,UACH,QAAO;IACL,GAAG;IACH,MAAM;IACN,QAAQA;IACT;GACH,KAAK,aACH,QAAO;IACL,GAAG;IACH,MAAM;IACN,QAAQA;IACT;GACH,KAAK,SACH,QAAO;IAAE,GAAG;IAAY,MAAM;IAAU,QAAQA;IAAwB;;GAE5E;;AAGJ,eAAsB,oBAAmD;AAMvE,SAFa,MAHE,aAAa,CAGF,gBAAgB,UAAU,EAExC,KAAK,QAAQ;EACvB,MAAM,gBACJ,IAAI;EACN,MAAM,QAAS,IAAI,SAA6C,EAAE;EAClE,MAAM,OAAQ,IAAI,QAA6C,EAAE;EACjE,MAAM,gBACH,IAAI,iBAA+D,EAAE;EACxE,MAAM,UAAW,IAAI,WAA+C,EAAE;EACtE,MAAM,QAAQ,IAAI,SAAS,OAAO,SAAY,IAAI;EAClD,MAAM,SAAS,IAAI,UAAU,OAAO,SAAY,IAAI;EACpD,MAAM,WAAW,IAAI,YAAY,OAAO,SAAY,IAAI;EACxD,MAAM,aACJ,IAAI,cAAc,OACd,SACC,IAAI;AAEX,SAAO;GACL,IAAI,IAAI;GACR,MAAM,IAAI;GACV,aAAa,IAAI;GACjB,aAAa,IAAI;GACjB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;GACD;;AAoBJ,eAAsB,kBACpB,iBACyB;AAKzB,QAAO;EACL,MALW,kBACT,MAAM,iBAAiB,GACvB,MAAM,mBAAmB;EAI3B,iBAAiB,MAAM,qCAAqC;EAC5D,iBAAiB,MAAM,8BAA8B;EACtD;;;;;;;;;;;ACnKH,SAAgB,iBACd,KACA,MACA;CACA,MAAMC,WAASC,IAAE;CACjB,MAAMC,oBAAkBD,IAAE;AAE1B,QAAOD,SAAO;EACZ,YAAYE,kBAAgB,MAAM,OAAO,EAAE,UAAU;AAEnD,UAAO;IACL,MAAM,IAAI,QAAQ;IAClB,iBAAiB,CAAC,CAAC,IAAI;IACxB;IACD;EACF,cAAcA,kBAAgB,YAAY;GAExC,MAAMC,YAA2B,EAAE;GACnC,MAAM,0DAAc,KAAM;AAG1B,iEAAI,YAAa,iBAAiB;IAChC,MAAM,kBAAkB,YAAY;AAIpC,WAAO,KAAK,gBAAgB,CAAC,SAAS,QAAQ;AAC5C,SAAI,gBAAgB,KAClB,WAAU,KAAK,IAAI;MAErB;;AAIJ,iEAAI,YAAa,QAEf,CADgB,YAAY,QACpB,SAAS,WAAW;;IAC1B,MAAM,mBAAmB;AAKzB,QACE,iBAAiB,OAAO,6CACxB,iBAAiB,uFAAS,QAK1B,EAHgB,MAAM,QAAQ,iBAAiB,QAAQ,OAAO,GAC1D,iBAAiB,QAAQ,SACzB,CAAC,iBAAiB,QAAQ,OAAO,EAC7B,SAAS,aAAW;AAC1B,SAAIC,SAAO,WACT,WAAU,KAAKA,SAAO,WAAW;MAEnC;KAEJ;AAGJ,UAAO,EAAE,WAAW;IACpB;EACH,CAAC;;;;;;;;;ACxCJ,SAAgB,cACd,QACe;AACf,KAAI,CAACC,QAAM;AACT,UAAQ,IAAI,mCAAmC;AAC/C,SAAO,EAAE;;AAIX,SAAQ,IAAI,4CAA4C;AACxD,SAAQ,IAAI,4BAA4BA,OAAK,GAAG;AAChD,SAAQ,IAAI,+BAA+BA,OAAK,MAAM;AACtD,SAAQ,IACN,2CACCA,OAAa,kBACf;AACD,SAAQ,IAAI,gCAAgCA,OAAK,OAAO;AACxD,SAAQ,IAAI,oCAAqCA,OAAa,WAAW;AACzE,SAAQ,IAAI,+BAAgCA,OAAa,MAAM;AAC/D,SAAQ,IAAI,kCAAkC,OAAO,KAAKA,OAAK,CAAC;AAChE,SAAQ,IACN,qCACA,KAAK,UAAUA,QAAM,MAAM,EAAE,CAC9B;CAID,MAAM,SACHA,OAAa,qBACdA,OAAK,UACJA,OAAa,cACbA,OAAa,SACd,EAAE;CAEJ,MAAM,SAAS,MAAM,QAAQ,OAAO,GAAG,SAAS,EAAE;AAClD,SAAQ,IAAI,wCAAwC,OAAO;AAE3D,QAAO;;;;;AAMT,SAAgB,mBACd,QACA,eACS;CACT,MAAM,aAAa,cAAcA,OAAK;AACtC,QAAO,cAAc,MAAM,YAAU,WAAW,SAASC,QAAM,CAAC;;;;;AAMlE,SAAgB,oBACd,QACA,gBACS;CACT,MAAM,aAAa,cAAcD,OAAK;AACtC,QAAO,eAAe,OAAO,YAAU,WAAW,SAASC,QAAM,CAAC;;;;;;;AAQpE,SAAgB,QACd,QACA,cAA6B,CAAC,6BAA6B,EAClD;AACT,QAAO,mBAAmBD,QAAM,YAAY;;;;;;;AAQ9C,SAAgB,aACd,QACA,cAA6B,CAAC,6BAA6B,EACrD;AACN,KAAI,CAAC,QAAQA,QAAM,YAAY,CAC7B,OAAM,IAAI,MAAM,mCAAmC;;;;;AAOvD,SAAgB,cACd,QACA,QACM;AACN,KAAI,CAAC,mBAAmBA,QAAM,OAAO,CACnC,OAAM,IAAI,MACR,0DAA0D,OAAO,KAAK,KAAK,GAC5E;;;;;;;;;ACzHL,MAAa,IAAI,SAAS,SAAwB,CAAC,OAAO,EACxD,eAAe,EAAE,OAAO,SAA6C;;AAEnE,SAAQ,MAAM,gBAAgB;EAC5B,eAAO,MAAuC,oDAAM;EACpD,MAAO,MAA4B;EACnC,SAAU,MAA+B;EACzC,OAAQ,MAA8B;EACtC,OAAQ,MAA6B;EACtC,CAAC;AACF,QAAO;GAEV,CAAC;;;;AAKF,MAAa,SAAS,EAAE;AACxB,MAAa,kBAAkB,EAAE;;;;AAKjC,MAAM,kBAAkB,EAAE,YAAY,EAAE,KAAK,WAAW;AACtD,KAAI,CAAC,IAAI,KACP,OAAM,IAAI,UAAU;EAClB,MAAM;EACN,SAAS;EACV,CAAC;AAEJ,QAAO,KAAK,EACV,KAAK;EACH,GAAG;EACH,MAAM,IAAI;EACX,EACF,CAAC;EACF;;;;AAKF,MAAM,oBAAoB,EAAE,YAAY,EAAE,KAAK,WAAW;AACxD,KAAI,CAAC,IAAI,KACP,OAAM,IAAI,UAAU;EAClB,MAAM;EACN,SAAS;EACV,CAAC;AAGJ,SAAQ,IAAI,gDAAgD;AAC5D,SAAQ,IAAI,6BAA6B,IAAI,KAAK,MAAM;AACxD,SAAQ,IAAI,8CAA8C,IAAI,YAAY;AAC1E,SAAQ,IAAI,2CAA2C;CAEvD,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,YAAY;AACzD,SAAQ,IAAI,yCAAyC,eAAe;AAEpE,KAAI,CAAC,eACH,OAAM,IAAI,UAAU;EAClB,MAAM;EACN,SAAS,kEAAkE,IAAI,YAAY,KAAK,KAAK,IAAI;EAC1G,CAAC;AAGJ,QAAO,KAAK,EACV,KAAK;EACH,GAAG;EACH,MAAM,IAAI;EACX,EACF,CAAC;EACF;;;;AAKF,MAAa,iBAAiB,EAAE,UAAU,IAAI,kBAAkB;;;;AAKhE,MAAa,qBAAqB,EAAE,UAAU,IAAI,gBAAgB;;;;;;;;AC7ElE,SAAgB,iBAAiB,MAAmB;AAClD,QAAO,OAAO;EACZ,YAAY,gBAAgB,MAAM,OAAO,EAAE,UAAU;AACnD,UAAO,EACL,aAAa,IAAI,aAClB;IACD;EAEF,YAAY,gBAAgB,MAC1B,OAAO,EAAE,UAAmC;;GAC1C,MAAM,WAAW,MAAM,mBAAmB;GAC1C,MAAM,gEAAa,IAAI,wBAAuB,yHAAiB;AAC/D,UAAO;IACL,GAAG;IACH,GAAI,cAAc,EAAE,YAAY;IACjC;IAEJ;EAGD,MAAM,iBAAiB,GAAG,KAAK;EAChC,CAAC;;;;;ACjBJ,SAAgB,oBAAoB,EAClC,wBACA,eAAO,MACP,eACsC;AACtC,QAAO;EACL;EACA;EACA;EACD;;;;;ACjBH,MAAaE,2BAAuD,EAClE,SAAS;CACP,SAAS;EACP,QAAQ;EACR,KAAK;EACN;CACD,eAAe;EACb,QAAQ;EACR,KAAK;EACN;CACF,EACF;;;;ACkBD,SAAS,yBAGP,QAAuB,iBAAmC;AAG1D,QAAO,OAFM,gBAAgB,MAAM,GAAG,EAAE,CAAC,aAAa,GACpD,gBAAgB,MAAM,EAAE;;AAS5B,SAAgB,gBAOd,QAMA;CACA,MAAM,EACJ,QACA,iBACA,aACA,OAAO,aACP,eACE;CACJ,MAAM,kBAAkB,yBAAyB,QAAQ,gBAAgB;CAEzE,MAAM,WAAY,OAAO,MAAM;AAE/B,QAAO,UAAqE;EAC1E,IAAI;EACJ;EACA,SAAS,YAAY;GACnB,MAAM,eAAe,cACjB,EACE,OAAO,aACR,GACD,EAAE;AACN,UAAQ,MAAM,gBAAgB,SAAS,aAAa;;EAItD,UAAU,OAAO,YAAY,QAAQ,cAAc;GACjD,MAAM,gBAAgB,OAAO,YAAY,KAAK,IAAI;GAClD,MAAM,qBACJ,OAAO,mBAAoB,EAAE;AAE/B,UAAO,OAAO,aAAa,OAAO,OAAO;IACvC,MAAM,QAAQ,yBAAyB,IAAI,gBAAgB;AAC3D,SAAK,MAAM,EAAE,MAAM,WAAW,QAAQ;KACpC,MAAM,eACJ,OAAO,KAAK,MAAM,CAAC,SAAS,IACxB,GACG,gBAAgB,OAClB,GACD;KAEN,MAAM,aAAa,KAAK,MAAM,mBAAmB;KACjD,MAAM,gBAAgB,UACpB,KAAK,MAAM,mBAAmB,GAC7B,UAAU;AACT,aAAO,EACL,KAAK,OACN;OAEJ;AAGD,WAAM,MAAM,OAAO;MACjB,MAAM;OAAE,GAAG;OAAY,GAAG;OAAe;MACzC,OAAO,EAAE,GAAG,cAAc;MAC3B,CAAC;;AAGJ,QAAI,eAAe,KACjB,OAAM,MAAM,WAAW,EACrB,OAAO,GACJ,WAAW,EACV,IAAI,WACL,EACF,EACF,CAAC;IAIJ,MAAM,mBAAmB,WAAW,KAAK,SAAS;KAEhD,MAAM,aAAa,KAAK,MAAM,mBAAmB;KAIjD,MAAM,gBAAgB,UADM,KAAK,MAAM,mBAAmB,GACJ,UAAU;AAC9D,aAAO,EACL,SAAS,OACV;OACD;AAEF,YAAO;MAAE,GAAG;MAAY,GAAG;MAAe;MAC1C;AAGF,QAAI,iBAAiB,SAAS,GAAG;KAC/B,MAAM,mCAAmB,IAAI,KAAa;KAC1C,MAAMC,gBAA+B,EAAE;AAEvC,UAAK,MAAM,QAAQ,kBAAkB;MAQnC,MAAM,MAPW,OAAO,YAAY,KAAK,QAAQ;OAC/C,MAAM,QAAQ,KAAK;AAEnB,cAAO,UAAU,QAAQ,UAAU,SAC/B,SACA,OAAO,MAAM;QACjB,CACmB,KAAK,IAAI;AAE9B,UAAI,iBAAiB,IAAI,IAAI,CAC3B,eAAc,KAAK,IAAI;UAEvB,kBAAiB,IAAI,IAAI;;AAI7B,SAAI,cAAc,SAAS,GAAG;MAC5B,MAAM,iBAAiB,OAAO,YAAY,KAAK,KAAK;AACpD,YAAM,IAAI,MACR,mEACY,gBAAgB,qBAAqB,eAAe,sBAC1C,cAAc,KAAK,KAAK,CAAC,GAChD;;;IAIL,MAAMC,UAAyD,EAAE;AAEjE,QAAI,mBAAmB,WAAW,GAAG;KAEnC,MAAM,cAAc,MAAM,MAAM,oBAAoB,EAClD,MAAM,kBACP,CAAC;AAEF,aAAQ,KAAK,GAAG,YAAY;UAE5B,MAAK,MAAM,qBAAqB,kBAAkB;KAEhD,MAAM,SAAS,MAAM,MAAM,OAAO,EAChC,MAAM,mBACP,CAAC;AACF,aAAQ,KAAK,OAAiD;;AAIlE,WAAO;KACP;;EAEL,CAAC;;;;;AC1LJ,MAAa,sBAAsB;CACjC,iBAAiB;EACf,iBAAiB;EACjB,aAAa,CAAC,OAAO;EACtB;CACD,oBAAoB;EAClB,iBAAiB;EACjB,aAAa,CAAC,SAAS;EACxB;CACD,kBAAkB;EAChB,IAAI;EACJ,iBAAiB;EACjB,aAAa,CAAC,OAAO;EACtB;CACF;;;;;;;ACpBD,eAAsB,mBACpB,QAC8C;AAC9C,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,OAAO,CAAC,UAAU;AAC/C,SAAO;GACL,OAAO,SAAS;GAChB,QAAQ,SAAS;GAClB;UACM,OAAO;AACd,UAAQ,MAAM,sCAAsC,MAAM;AAC1D,SAAO;GAAE,OAAO;GAAW,QAAQ;GAAW;;;;;;;;;;AAWlD,eAAsB,YACpB,QACA,OACA,QACA,QACiB;CACjB,IAAI,WAAW,MAAM,OAAO;AAG5B,KAAI,SAAS,OACX,YAAW,SAAS,OAAO;EACzB;EACA;EACA,KAAK;EACL,oBAAoB;EACrB,CAAC;AAIJ,KAAI,WAAW,MACb,YAAW,SAAS,KAAK;UAChB,WAAW,OACpB,YAAW,SAAS,MAAM;UACjB,WAAW,OACpB,YAAW,SAAS,MAAM;AAG5B,QAAO,SAAS,UAAU;;;;;AAM5B,SAAgB,iBAAiB,QAAwB;AACvD,QAAO,WAAW,SAAS,CAAC,OAAO,OAAO,CAAC,OAAO,MAAM;;;;;AAM1D,SAAgB,eACd,UACgC;AAChC,KAAI,SAAS,SAAS,MAAM,CAAE,QAAO;AACrC,KAAI,SAAS,SAAS,OAAO,CAAE,QAAO;AACtC,KAAI,SAAS,SAAS,OAAO,IAAI,SAAS,SAAS,MAAM,CAAE,QAAO;AAClE,QAAO;;;;;AAMT,SAAgB,cAAc,UAA2B;AACvD,QAAO,SAAS,WAAW,SAAS,IAAI,CAAC,SAAS,SAAS,MAAM;;AAGnE,eAAsB,eACpB,GAC2B;CAE3B,MAAM,EAAE,OAAO,QAAQ,QAAQ,SAAS,MAAM,MAAM,EAAE,OAAO,CAAC,UAAU;AAcxE,QAAO;EACL,UAAU,iBAAiB,EAAE,OAAO;EACpC;EACA;EACA,UAAU,SAhBoD;GAC9D,MAAM;GACN,KAAK;GACL,KAAK;GACL,MAAM;GACN,MAAM;GACN,MAAM;GACN,KAAK;GACL,MAAM;GACN,KAAK;GACN,CAOmB,WAAW,SAAS,WAClC;EACJ,UAAU,QAAQ;EACnB;;;;;ACrGH,eAAsB,YAAY,EAChC,QACA,QACA,MACA,kBACA,aACoB;CACpB,MAAM,EAAE,UAAU,UAAU,OAAO,QAAQ,aAAa,MAAM,eAAe;EAC3E;EACA;EACD,CAAC;CAGF,MAAM,WAAW,MAAM,OAAO,QAAQ,WAAW,EAC/C,OAAO,EAAE,MAAM,EAChB,CAAC;AAEF,KAAI,SACF,QAAO,SAAS;AAelB,SAZc,MAAM,OAAO,QAAQ,OAAO,EACxC,MAAM;EACJ;EACA;EACA;EACA,SAAS,IAAI,WAAW,OAAO;EAC/B;EACA;EACA;EACA;EACD,EACF,CAAC,EACW;;;;;ACnBf,SAAS,oBAAoB,OAAyB;AACpD,QACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;;AAI9C,eAAe,sBACb,SACA,SACA,WACA,QACwB;AACxB,KAAI;EACF,MAAM,QAAQ,MAAM,QAAQ,QAAQ;EACpC,MAAMC,WAA0B,EAAE;AAElC,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,WAAW,MAAM;AACvB,OAAI,CAAC,SAAU;GAEf,MAAM,YACJ,cAAc,eACV,GAAG,QAAQ,cAAc,IAAI,MAC7B,GAAG,QAAQ;GAEjB,MAAM,KAAK,MAAM,YAAY;IAC3B;IACA,QAAQ,MAAM,SAAS,GAAG,QAAQ,GAAG,WAAW;IAChD,kBAAkB;IAClB,MAAM;IACN;IACD,CAAC;AACF,YAAS,KAAK,GAAG;AAGjB,OAAI,cAAc,OAChB;;AAIJ,SAAO;UACAC,OAAgB;AACvB,MAAI,oBAAoB,MAAM,CAC5B,QAAO,EAAE;AAEX,QAAM;;;AAIV,eAAe,cACb,SACA,SACA,QAC0B;AAe1B,QAAO;EACL,eAfoB,MAAM,sBAC1B,GAAG,QAAQ,eACX,SACA,cACA,OACD;EAWC,WATc,MAAM,sBACpB,GAAG,QAAQ,SACX,SACA,QACA,OACD,EAImB,SAAS,IAAI,GAAG,QAAQ,SAAS;EACpD;;AAGH,eAAe,yBACb,MACA,mBACA;CACA,MAAM,iBAAiB,MAAM,QAAQ,kBAAkB;CACvD,MAAM,SAAS,aAAa;CAC5B,MAAM,SAAS,MAAM,OAAO,MAAM,EAAE,KAAK;AAEzC,MAAK,MAAM,cAAc,gBAAgB;AACvC,MAAI;AAEF,OAAI,EADU,MAAM,KAAK,GAAG,kBAAkB,GAAG,aAAa,EACnD,aAAa,CACtB;WAEKA,OAAgB;AACvB,OAAI,oBAAoB,MAAM,CAC5B;AAEF,SAAM;;EAGR,MAAM,UAAU;AAChB,MAAI,CAAC,OAAO,SACV,OAAM,IAAI,MACR,QAAQ,QAAQ,sDAAsD,OAAO,KAAK,OAAO,CAAC,KAAK,KAAK,GACrG;AAGH,MAAI;GACF,MAAM,EAAE,eAAe,aAAa,MAAM,cACxC,SACA,GAAG,kBAAkB,GAAG,cACxB,OACD;GAED,MAAMC,aAGF,EAAE;AAEN,OAAI,cAAc,SAAS,EACzB,YAAW,gBAAgB;AAE7B,OAAI,aAAa,KACf,YAAW,WAAW;AAGxB,OAAI,OAAO,KAAK,WAAW,CAAC,SAAS,EACnC,OAAM,OAAO,gBAAgB,OAAO;IAClC,OAAO,EAAE,MAAM,SAAS;IACxB,MAAM;IACP,CAAC;WAEGD,OAAgB;GACvB,MAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACxD,SAAM,IAAI,MACR,yCAAyC,QAAQ,KAAK,eACvD;;;;;;;;;;AA8EP,eAAsB,eACpB,MACA,iBACA,iBACA,gBAC+B;AAC/B,KAAI;EACF,MAAM,SAAS,aAAa;AAE5B,QAAM,gBAAgB;GACpB;GACA,GAAG,oBAAoB;GACxB,CAAC,CAAC,KAAK,gBAAgB;EAExB,MAAM,OAAO,gBAAgB;GAC3B;GACA,GAAG,oBAAoB;GACxB,CAAC;AAEF,QAAM,gBAAgB;GACpB;GACA,GAAG,oBAAoB;GACxB,CAAC,CAAC,KAAK,gBAAgB;EAGxB,MAAM,SAAS,KAAK,KAAK,QAAQ;AAQ/B,UAAO;IACL,MAPA,IAAI,QACJ,IAAI,YACD,aAAa,CACb,QAAQ,eAAe,IAAI,CAC3B,QAAQ,YAAY,GAAG;IAI1B,aAAa,IAAI;IACjB,aAAa,IAAI;IACjB,OAAO,IAAI,SAAS,EAAE;IACtB,eAAe,IAAI,iBAAiB;IACpC,OAAO,IAAI,SAAS;IACpB,MAAM,IAAI,QAAQ,EAAE;IACpB,QAAQ,IAAI,UAAU;IACtB,OAAO,IAAI,SAAS;IACpB,UAAU,IAAI,YAAY;IAC1B,eAAe,IAAI,iBAAiB,EAAE;IACtC,SAAS,IAAI,WAAW,EAAE;IAC1B,YAAY,IAAI,cAAc;IAC/B;IACD;EAKF,MAAM,UAHS,MAAM,KAAK,KAAK,OAAO,EAGhB,WAAW;AAEjC,MAAI,eACF,OAAM,yBAAyB,MAAM,eAAe;MAEpD,SAAQ,KAAK,yBAAyB;AAGxC,SAAO;GACL,SAAS,OAAO,SAAS,KAAK,UAAU,KAAK,SAAS,OAAO;GAC7D,SAAS;GACT,SAAS;GACT,OAAO,OAAO;GACf;UACM,OAAO;EAEd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;EAC3E,MAAM,aAAa,iBAAiB,QAAQ,MAAM,QAAQ;AAE1D,QAAM,IAAI,MACR,8BAA8B,aAAa,gBAAgB,cAAc,6BAC1E;;;;;;ACtSL,SAAgB,WAAW,UAAoB;CAC7C,MAAM,SAAS,aAAa;CAC5B,MAAM,eAAe,QAAQ,IAAI,aAAa;AA4B9C,QA1Ba,WAAW;EACtB,SAASE,SAAO,WAAW;EAC3B,SAASA,SAAO;EAChB,UAAU;EACV,QAAQA,SAAO;EACf,UAAU,cAAc,QAAQ,EAC9B,UAAU,cACX,CAAC;EACF,iBAAiBA,SAAO,aAAa,EAAE;EACvC,SAASA,SAAO,WAAW,EAAE;EAC7B,kBAAkB,EAChB,SAAS,MACV;EACD,SAAS;GACP,WAAWA,SAAO,oBAAoB,OAAU,KAAK;GACrD,WAAWA,SAAO,oBAAoB,OAAU;GAChD,aAAa;IACX,SAAS;IACT,QAAQ;IACT;GACF;EACD,UAAU,EACR,kBAAkB,cACnB;EACF,CAAC;;;;;;;;;;ACpCJ,SAAgB,mBAAmB,KAAc,MAAkB;AAGjE,KAAI,IAAI,qBAAqB,OAAO,KAAc,QAAkB;AAClE,MAAI;GACF,MAAM,UAAU,MAAM,KAAK,IAAI,WAAW,EACxC,SAAS,IAAI,SACd,CAAC;AACF,OAAI,QACF,KAAI,KAAK,QAAQ;OAEjB,KAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,qBAAqB,CAAC;WAE/C,OAAO;AACd,WAAQ,MAAM,wBAAwB,MAAM;AAC5C,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;GAE1D;CAIF,MAAM,cAAc,cAAc,KAAK;AACvC,KAAI,IAAI,oBAAoB,YAAY;;;;;;;;AC5B1C,SAAgB,yBAAyB,UAA0B;AAcjE,QAbwC;EACtC,iBAAiB;EACjB,aAAa;EACb,cAAc;EACd,aAAa;EACb,cAAc;EACd,aAAa;EACb,aAAa;EACb,cAAc;EACd,gBAAgB;EAChB,4BAA4B;EAC7B,CAEc,SAAS,aAAa,KAAK;;;;;AAM5C,SAAgB,yBAAyB,UAA0B;;CACjE,MAAM,QAAQ,SAAS,MAAM,aAAa;AAC1C,0DAAO,MAAQ,sDAAI,aAAa,KAAI;;;;;AClBtC,MAAMC,WAAS,OAAO;CACpB,SAAS,OAAO,eAAe;CAC/B,QAAQ,EACN,UAAU,KAAK,OAAO,MACvB;CACD,aAAa,MAAM,MAAM,OAAO;AAE9B,MAAI,CAAC,KAAK,SAAS,WAAW,SAAS,EAAE;AACvC,sBAAG,IAAI,MAAM,+BAA+B,CAAC;AAC7C;;AAEF,KAAG,MAAM,KAAK;;CAEjB,CAAC;;;;;;;;;AAiBF,SAAgB,2BACd,UACA,UACM;CACN,MAAM,EAAE,aAAaC;AAGrB,UAAO,KACL,GAAG,SAAS,UACZD,SAAO,OAAO,OAAO,EACrB,OAAO,KAAc,QAAkB;AACrC,MAAI;AACF,OAAI,CAAC,IAAI,MAAM;AACb,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;;GAGF,IAAI,OAAO,IAAI,KAAK;AACpB,OAAI,CAAC,MAAM;AACT,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;;GAIF,MAAM,YACJ,yBAAyB,IAAI,KAAK,aAAa,IAC/C,yBAAyB,IAAI,KAAK,SAAS;AAG7C,OAAI,CAAC,KAAK,SAAS,IAAI,CACrB,QAAO,GAAG,KAAK,GAAG;GAGpB,MAAM,SAAS,aAAa;GAC5B,MAAM,WAAW,WAAW,SAAS,CAClC,OAAO,IAAI,KAAK,OAAO,CACvB,OAAO,MAAM;GAChB,MAAM,OAAO,MAAM,OAAO,QAAQ,OAAO,EACvC,MAAM;IACJ;IACA,WAAW;IACX,SAAS,IAAI,WAAW,IAAI,KAAK,OAAO;IACxC,UAAU,IAAI,KAAK;IACnB,UAAU,IAAI,KAAK;IACnB;IACD,EACF,CAAC;AAEF,OAAI,OAAO,IAAI,CAAC,KAAK;IACnB,IAAI,KAAK;IACT,MAAM,KAAK;IACX,UAAU,KAAK;IACf,UAAU,KAAK;IACf,WAAW,KAAK;IACjB,CAAC;WACK,OAAO;AACd,WAAQ,MAAM,yBAAyB,MAAM;AAC7C,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;GAG7D;AAGD,UAAO,IAAI,GAAG,SAAS,SAAS,OAAO,KAAc,QAAkB;AACrE,MAAI;GACF,MAAM,EAAE,SAAS,IAAI;GAGrB,MAAM,OAAO,MADE,aAAa,CACF,QAAQ,UAAU;IAC1C,OAAO;KACL;KACA,WAAW;KACZ;IACD,QAAQ;KACN,SAAS;KACT,UAAU;KACV,MAAM;KACP;IACF,CAAC;AAEF,OAAI,CAAC,MAAM;AACT,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;;AAIF,OAAI,UAAU,gBAAgB,KAAK,SAAS;AAC5C,OAAI,UAAU,uBAAuB,qBAAqB,KAAK,KAAK,GAAG;AACvE,OAAI,UAAU,iBAAiB,wBAAwB;AAGvD,OAAI,KAAK,KAAK,QAAQ;WACf,OAAO;AACd,WAAQ,MAAM,wBAAwB,MAAM;AAC5C,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,wBAAwB,CAAC;;GAEzD;AAGF,UAAO,IACL,GAAG,SAAS,kBACZ,OAAO,KAAc,QAAkB;AACrC,MAAI;GACF,MAAM,EAAE,SAAS,IAAI;GAGrB,MAAM,OAAO,MADE,aAAa,CACF,QAAQ,UAAU;IAC1C,OAAO;KACL;KACA,WAAW;KACZ;IACD,QAAQ;KACN,IAAI;KACJ,MAAM;KACN,UAAU;KACV,UAAU;KACV,WAAW;KACX,WAAW;KACZ;IACF,CAAC;AAEF,OAAI,CAAC,MAAM;AACT,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,kBAAkB,CAAC;AACjD;;AAGF,OAAI,KAAK,KAAK;WACP,OAAO;AACd,WAAQ,MAAM,iCAAiC,MAAM;AACrD,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,iCAAiC,CAAC;;GAGrE;;;;;;;;;;AC1JH,eAAsB,WAAW,OAAwB;CACvD,MAAM,SAAS,aAAa;CAE5B,MAAM,WAAW,iBAAiB,MAAM,QAAQ;CAChD,MAAM,EAAE,OAAO,WAAW,MAAM,mBAAmB,MAAM,QAAQ;AAEjE,QAAO,OAAO,QAAQ,OAAO;EAC3B,OAAO,EAAE,MAAM,MAAM,MAAM;EAC3B,QAAQ;GACN,SAAS,IAAI,WAAW,MAAM,QAAQ;GACtC;GACA,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB;GACA;GACD;EACD,QAAQ;GACN,MAAM,MAAM;GACZ,WAAW;GACX,SAAS,IAAI,WAAW,MAAM,QAAQ;GACtC;GACA,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB;GACA;GACD;EACF,CAAC;;;;;;AAOJ,eAAsB,YAAY,OAA+B;CAC/D,MAAME,UAAyD,EAAE;AACjE,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,MAAM,WAAW,KAAK;AACrC,UAAQ,KAAK,OAAO;;AAEtB,QAAO;;;;;;AAOT,eAAsB,eAAe,MAAc;AAGjD,QAFe,aAAa,CAEd,QAAQ,WAAW;EAC/B,OAAO,EAAE,MAAM;EACf,QAAQ;GACN,SAAS;GACT,UAAU;GACV,MAAM;GACP;EACF,CAAC;;;;;AC/DJ,MAAM,SAAS,OAAO;CACpB,SAAS,OAAO,eAAe;CAC/B,QAAQ,EACN,UAAU,KAAK,OAAO,MACvB;CACD,aAAa,MAAM,MAAM,OAAO;AAE9B,MAAI,CAAC,KAAK,SAAS,WAAW,SAAS,EAAE;AACvC,sBAAG,IAAI,MAAM,+BAA+B,CAAC;AAC7C;;AAEF,KAAG,MAAM,KAAK;;CAEjB,CAAC;;;;;;;;;;AAgCF,SAAgB,4BACd,UACA,UACM;CACN,MAAM,EAAE,aAAaC;CACrB,MAAM,SAAS,aAAa;AAG5B,UAAO,KACL,GAAG,SAAS,UACZ,OAAO,OAAO,QAAQ,EACtB,OAAO,KAAc,QAAkB;AACrC,MAAI;AACF,OAAI,CAAC,IAAI,MAAM;AACb,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;;GAGF,MAAM,OAAO,IAAI,KAAK;GACtB,MAAM,YAAY,IAAI,KAAK;AAE3B,OAAI,CAAC,MAAM;AACT,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACnD;;GAGF,MAAM,KAAK,MAAM,YAAY;IAC3B;IACA,QAAQ,IAAI,KAAK;IACjB;IACA,kBAAkB,IAAI,KAAK;IAC3B;IACD,CAAC;AAEF,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;WACrB,OAAO;AACd,WAAQ,MAAM,0BAA0B,MAAM;AAC9C,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,0BAA0B,CAAC;;GAG9D;AAGD,UAAO,IAAI,GAAG,SAAS,OAAO,OAAO,KAAc,QAAkB;AACnE,MAAI;GACF,MAAM,EAAE,OAAO,IAAI;GAEnB,MAAM,QAAQ,MAAM,OAAO,QAAQ,WAAW;IAC5C,OAAO,EAAE,IAAI;IACb,QAAQ;KACN,SAAS;KACT,UAAU;KACV,MAAM;KACN,OAAO;KACP,QAAQ;KACT;IACF,CAAC;AAEF,OAAI,CAAC,OAAO;AACV,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;;GAGF,MAAM,gBACJ,OAAO,QAAQ,IAAI,4BAA4B,OAAO,KAAK;GAC7D,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,QAAQ,SAAS,OAAO,SAAS,QAAQ,GAAG,GAAG;GAErD,IAAIC,YAAwB,MAAM;GAClC,IAAI,UAAU,MAAM;AASpB,OANE,iBACA,cAAc,MAAM,SAAS,IAC7B,CAAC,CAAC,SACF,OAAO,SAAS,MAAM,IACtB,QAAQ,GAEQ;IAChB,MAAM,MAAM,eAAe,MAAM,SAAS,IAAI;IAC9C,MAAM,MAAM,MAAM,YAChB,OAAO,KAAK,MAAM,QAAQ,EAC1B,OACA,QACA,IACD;AACD,gBAAY,IAAI,WAAW,IAAI;AAC/B,cAAU,SAAS;;AAIrB,OAAI,UAAU,gBAAgB,QAAQ;AACtC,OAAI,UAAU,uBAAuB,qBAAqB,MAAM,KAAK,GAAG;AACxE,OAAI,UAAU,iBAAiB,wBAAwB;AAGvD,OAAI,KAAK,UAAU;WACZ,OAAO;AACd,WAAQ,MAAM,yBAAyB,MAAM;AAC7C,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;GAE1D;AAGF,UAAO,IACL,GAAG,SAAS,gBACZ,OAAO,KAAc,QAAkB;AACrC,MAAI;GACF,MAAM,EAAE,OAAO,IAAI;GAEnB,MAAM,QAAQ,MAAM,OAAO,QAAQ,WAAW;IAC5C,OAAO,EAAE,IAAI;IACb,QAAQ;KACN,IAAI;KACJ,MAAM;KACN,WAAW;KACX,UAAU;KACV,UAAU;KACV,OAAO;KACP,QAAQ;KACR,WAAW;KACX,WAAW;KACZ;IACF,CAAC;AAEF,OAAI,CAAC,OAAO;AACV,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;;AAGF,OAAI,KAAK,MAAM;WACR,OAAO;AACd,WAAQ,MAAM,kCAAkC,MAAM;AACtD,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,kCAAkC,CAAC;;GAGtE;AAGD,UAAO,IACL,GAAG,SAAS,iBACZ,OAAO,KAAc,QAAkB;AACrC,MAAI;GACF,MAAM,EAAE,SAAS,IAAI;GAErB,MAAM,QAAQ,MAAM,OAAO,QAAQ,WAAW;IAC5C,OAAO,EAAE,MAAM;IACf,QAAQ;KACN,SAAS;KACT,UAAU;KACV,MAAM;KACN,OAAO;KACP,QAAQ;KACT;IACF,CAAC;AAEF,OAAI,CAAC,OAAO;AACV,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;;GAGF,MAAM,gBACJ,OAAO,QAAQ,IAAI,4BAA4B,OAAO,KAAK;GAC7D,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,QAAQ,SAAS,OAAO,SAAS,QAAQ,GAAG,GAAG;GAErD,IAAIA,YAAwB,MAAM;GAClC,IAAI,UAAU,MAAM;GAEpB,MAAM,WACJ,MAAM,SAAS,WAAW,SAAS,IAAI,CAAC,MAAM,SAAS,SAAS,MAAM;AAQxE,OANE,iBACA,YACA,CAAC,CAAC,SACF,OAAO,SAAS,MAAM,IACtB,QAAQ,GAEQ;IAChB,MAAM,MAAM,MAAM,SAAS,SAAS,MAAM,GACtC,QACA,MAAM,SAAS,SAAS,OAAO,GAC7B,SACA;IAEN,IAAIC;IACJ,MAAM,WAAW,MAAM,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC,OAAO;KACxD;KACA,KAAK;KACL,oBAAoB;KACrB,CAAC;AACF,QAAI,QAAQ,OAAO;AACjB,WAAM,MAAM,SAAS,KAAK,CAAC,UAAU;AACrC,eAAU;eACD,QAAQ,QAAQ;AACzB,WAAM,MAAM,SAAS,MAAM,CAAC,UAAU;AACtC,eAAU;WACL;AACL,WAAM,MAAM,SAAS,MAAM,CAAC,UAAU;AACtC,eAAU;;AAEZ,gBAAY,IAAI,WAAW,IAAI;;AAIjC,OAAI,UAAU,gBAAgB,QAAQ;AACtC,OAAI,UAAU,uBAAuB,qBAAqB,MAAM,KAAK,GAAG;AACxE,OAAI,UAAU,iBAAiB,wBAAwB;AAGvD,OAAI,KAAK,UAAU;WACZ,OAAO;AACd,WAAQ,MAAM,iCAAiC,MAAM;AACrD,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;GAG7D;;;;;;;;;;;;;AC1PH,SAAgB,iCACd,UACA,UACM;CACN,MAAM,EAAE,aAAaC;AAGrB,UAAO,IAAI,GAAG,SAAS,gBAAgB,OAAO,KAAc,QAAkB;AAC5E,MAAI;GACF,MAAM,EAAE,YAAY,IAAI;GAExB,MAAM,SAAS,aAAa;GAG5B,MAAM,MAAM,MAAM,OAAO,gBAAgB,WAAW;IAClD,OAAO,EAAE,MAAM,SAAS;IACxB,QAAQ,EAAE,eAAe,MAAM;IAChC,CAAC;AAEF,OAAI,CAAC,KAAK;AACR,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAChD;;GAIF,MAAM,cAAc,MAAM,OAAO,QAAQ,SAAS;IAChD,OAAO;KACL,IAAI,EAAE,IAAI,IAAI,eAAe;KAC7B,WAAW;KACZ;IACD,QAAQ;KACN,IAAI;KACJ,MAAM;KACN,UAAU;KACV,UAAU;KACV,OAAO;KACP,QAAQ;KACR,WAAW;KACZ;IACF,CAAC;AAEF,OAAI,KAAK,YAAY;WACd,OAAO;AACd,WAAQ,MAAM,mCAAmC,MAAM;AACvD,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,+BAA+B,CAAC;;GAEhE;AAGF,UAAO,IAAI,GAAG,SAAS,sBAAsB,OAAO,KAAc,QAAkB;AAClF,MAAI;GACF,MAAM,EAAE,YAAY,IAAI;GAExB,MAAM,SAAS,aAAa;GAG5B,MAAM,MAAM,MAAM,OAAO,gBAAgB,WAAW;IAClD,OAAO,EAAE,MAAM,SAAS;IACxB,QAAQ,EAAE,eAAe,MAAM;IAChC,CAAC;AAEF,OAAI,CAAC,OAAO,IAAI,cAAc,WAAW,GAAG;AAC1C,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;;GAIF,MAAM,aAAa,MAAM,OAAO,QAAQ,WAAW;IACjD,OAAO,EAAE,IAAI,IAAI,cAAc,IAAI;IACnC,QAAQ;KACN,IAAI;KACJ,MAAM;KACN,UAAU;KACV,UAAU;KACV,OAAO;KACP,QAAQ;KACR,WAAW;KACZ;IACF,CAAC;AAEF,OAAI,CAAC,YAAY;AACf,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;;AAGF,OAAI,KAAK,WAAW;WACb,OAAO;AACd,WAAQ,MAAM,oCAAoC,MAAM;AACxD,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,8BAA8B,CAAC;;GAE/D;AAGF,UAAO,IAAI,GAAG,SAAS,OAAO,OAAO,KAAc,QAAkB;AACnE,MAAI;GACF,MAAM,EAAE,OAAO,IAAI;GACnB,MAAM,YAAY,IAAI,MAAM;GAC5B,MAAM,aAAa,YAAY,SAAS,WAAW,GAAG,GAAG;GAGzD,MAAM,aAAa,MADJ,aAAa,CACI,QAAQ,WAAW;IACjD,OAAO,EAAE,IAAI;IACb,QAAQ;KACN,SAAS;KACT,UAAU;KACV,MAAM;KACP;IACF,CAAC;AAEF,OAAI,CAAC,YAAY;AACf,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;;GAGF,IAAIC,UAA+B,WAAW;AAG9C,OAAI,cAAc,aAAa,EAC7B,KAAI;AACF,cAAU,MAAM,MAAM,WAAW,QAAQ,CACtC,OAAO,YAAY,YAAY;KAC9B,KAAK;KACL,oBAAoB;KACrB,CAAC,CACD,UAAU;YACN,aAAa;AACpB,YAAQ,MAAM,8BAA8B,YAAY;;AAM5D,OAAI,UAAU,gBAAgB,WAAW,SAAS;AAClD,OAAI,UAAU,uBAAuB,qBAAqB,WAAW,KAAK,GAAG;AAC7E,OAAI,UAAU,iBAAiB,wBAAwB;AAGvD,OAAI,KAAK,QAAQ;WACV,OAAO;AACd,WAAQ,MAAM,8BAA8B,MAAM;AAClD,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,8BAA8B,CAAC;;GAE/D;AAGF,UAAO,IAAI,GAAG,SAAS,gBAAgB,OAAO,KAAc,QAAkB;AAC5E,MAAI;GACF,MAAM,EAAE,OAAO,IAAI;GAGnB,MAAM,aAAa,MADJ,aAAa,CACI,QAAQ,WAAW;IACjD,OAAO,EAAE,IAAI;IACb,QAAQ;KACN,IAAI;KACJ,MAAM;KACN,UAAU;KACV,UAAU;KACV,OAAO;KACP,QAAQ;KACR,WAAW;KACX,WAAW;KACZ;IACF,CAAC;AAEF,OAAI,CAAC,YAAY;AACf,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACvD;;AAGF,OAAI,KAAK,WAAW;WACb,OAAO;AACd,WAAQ,MAAM,uCAAuC,MAAM;AAC3D,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,uCAAuC,CAAC;;GAExE;;;;;;;;;;;;;;;ACtKJ,eAAsB,WAAW,UAG9B;CACD,MAAM,SAAS,aAAa;CAC5B,IAAI,gBAAgB;CACpB,IAAI,sBAAsB;AAG1B,KAAIC,SAAO,UAAU;AACnB,UAAQ,IAAI,yBAAyBA,SAAO,SAAS,KAAK;AAC1D,kBAAgB,MAAM,uBAAuB,QAAQA,SAAO,SAAS;AACrE,UAAQ,IAAI,iBAAiB,cAAc,QAAQ;;AAIrD,KAAIA,SAAO,gBAAgB;AACzB,UAAQ,IAAI,+BAA+BA,SAAO,eAAe,KAAK;AACtE,wBAAsB,MAAM,6BAC1B,QACAA,SAAO,eACR;AACD,UAAQ,IACN,iBAAiB,oBAAoB,mCACtC;;AAGH,QAAO;EACL;EACA;EACD;;;;;AAMH,eAAe,uBACb,QACA,UACiB;CACjB,IAAI,QAAQ;AAEZ,KAAI;EACF,MAAM,QAAQ,YAAY,SAAS;AAEnC,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,WAAW,KAAK,UAAU,KAAK;GACrC,MAAM,MAAM,QAAQ,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE;AAGhD,OAAI,CAAC;IAAC;IAAO;IAAO;IAAQ;IAAO;IAAQ;IAAM,CAAC,SAAS,IAAI,CAC7D;AAGF,OAAI;IACF,MAAM,UAAU,aAAa,SAAS;IACtC,MAAM,SAAS,OAAO,KAAK,QAAQ;IACnC,MAAM,WAAW,iBAAiB,OAAO;IACzC,MAAM,WAAW,KAAK,QAAQ,aAAa,GAAG;AAO9C,QAJiB,MAAM,OAAO,QAAQ,UAAU,EAC9C,OAAO;KAAE;KAAU,WAAW;KAAQ,EACvC,CAAC,CAGA;IAIF,IAAIC,QAAuB;IAC3B,IAAIC,SAAwB;AAC5B,QAAI,CAAC,IAAI,SAAS,MAAM,EAAE;KACxB,MAAM,EAAE,OAAO,GAAG,QAAQ,MAAM,MAAM,mBAAmB,OAAO;AAChE,aAAQ,KAAK;AACb,cAAS,KAAK;;IAIhB,MAAM,WACJ;KACE,KAAK;KACL,KAAK;KACL,MAAM;KACN,KAAK;KACL,MAAM;KACN,KAAK;KACN,CAAC,QAAQ;AAEZ,UAAM,OAAO,QAAQ,OAAO,EAC1B,MAAM;KACJ,MAAM;KACN,WAAW;KACX,SAAS,IAAI,WAAW,OAAO;KAC/B;KACA;KACA,UAAU,OAAO;KACjB;KACA;KACD,EACF,CAAC;AAEF;YACO,OAAO;AACd,YAAQ,KAAK,2BAA2B,KAAK,IAAI,MAAM;;;UAGpD,OAAO;AACd,UAAQ,MAAM,sCAAsC,MAAM;;AAG5D,QAAO;;;;;AAMT,eAAe,6BACb,QACA,gBACiB;CACjB,IAAI,QAAQ;AAEZ,KAAI;EACF,MAAM,QAAQ,YAAY,eAAe;EAGzC,MAAM,mCAAmB,IAAI,KAG1B;AAEH,OAAK,MAAM,QAAQ,OAAO;GAExB,MAAM,QAAQ,KAAK,MAAM,oCAAoC;AAC7D,OAAI,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,MAAM,GAChC;GAGF,MAAM,QAAQ,MAAM;GACpB,MAAM,MAAM,MAAM;AAClB,OAAI,CAAC,iBAAiB,IAAI,MAAM,CAC9B,kBAAiB,IAAI,OAAO,EAAE,CAAC;AAEjC,oBAAiB,IAAI,MAAM,CAAE,KAAK;IAChC,MAAM,KAAK,gBAAgB,KAAK;IAChC;IACD,CAAC;;AAIJ,OAAK,MAAM,CAAC,OAAO,gBAAgB,iBACjC,KAAI;AAOF,OAAI,CALQ,MAAM,OAAO,gBAAgB,WAAW;IAClD,OAAO,EAAE,MAAM,OAAO;IACtB,QAAQ,EAAE,IAAI,MAAM;IACrB,CAAC,EAEQ;AACR,YAAQ,KAAK,sBAAsB,QAAQ;AAC3C;;AAIF,QAAK,MAAM,cAAc,YACvB,KAAI;IACF,MAAM,UAAU,aAAa,WAAW,KAAK;IAC7C,MAAM,SAAS,OAAO,KAAK,QAAQ;IACnC,MAAM,WAAW,iBAAiB,OAAO;IAGzC,MAAM,WAAW,MAAM,OAAO,QAAQ,UAAU,EAC9C,OAAO;KAAE;KAAU,WAAW;KAAc,EAC7C,CAAC;AAEF,QAAI,UAAU;KAEZ,MAAM,cAAc,MAAM,OAAO,gBAAgB,WAAW,EAC1D,OAAO,EAAE,MAAM,OAAO,EACvB,CAAC;AACF,SACE,eACA,CAAC,YAAY,cAAc,SAAS,SAAS,GAAG,CAEhD,OAAM,OAAO,gBAAgB,OAAO;MAClC,OAAO,EAAE,MAAM,OAAO;MACtB,MAAM,EACJ,eAAe,CAAC,GAAG,YAAY,eAAe,SAAS,GAAG,EAC3D;MACF,CAAC;AAEJ;;IAIF,MAAM,EAAE,OAAO,WAAW,MAAM,mBAAmB,OAAO;IAG1D,MAAM,WACJ;KACE,KAAK;KACL,KAAK;KACL,MAAM;KACN,KAAK;KACL,MAAM;KACP,CAAC,WAAW,IAAI,aAAa,KAAK;IAGrC,MAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO,EACxC,MAAM;KACJ,MAAM,GAAG,MAAM,cAAc,KAAK,KAAK;KACvC,WAAW;KACX,SAAS,IAAI,WAAW,OAAO;KAC/B;KACA;KACA,UAAU,OAAO;KACjB,OAAO,SAAS;KAChB,QAAQ,UAAU;KACnB,EACF,CAAC;AAGF,UAAM,OAAO,gBAAgB,OAAO;KAClC,OAAO,EAAE,MAAM,OAAO;KACtB,MAAM,EACJ,eAAe,EACb,MAAM,MAAM,IACb,EACF;KACF,CAAC;AAEF;YACO,OAAO;AACd,YAAQ,KACN,iCAAiC,WAAW,KAAK,IACjD,MACD;;WAGE,OAAO;AACd,WAAQ,KAAK,6BAA6B,MAAM,IAAI,MAAM;;UAGvD,OAAO;AACd,UAAQ,MAAM,4CAA4C,MAAM;;AAGlE,QAAO;;;;;ACjQT,eAAe,MAAM,IAA2B;AAC9C,QAAO,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;;AAG1D,eAAe,kBACb,KACA,SAIoD;CACpD,IAAIC;AAEJ,MAAK,IAAI,UAAU,GAAG,WAAW,QAAQ,YAAY,UACnD,KAAI;AAMF,SAAO,EAAE,SALQ,MAAM,MAAM,KAAK;GAChC,QAAQ;GACR,UAAU;GACV,QAAQ,YAAY,QAAQ,QAAQ,QAAQ;GAC7C,CAAC,EACwB,QAAQ;UAC3BC,OAAgB;EACvB,MAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACxD,cAAY;AAQZ,OAJE,aAAa,SAAS,UAAU,IAChC,aAAa,SAAS,UAAU,IAChC,aAAa,SAAS,eAAe,KAEpB,UAAU,QAAQ,YAAY;AAG/C,SAAM,MADY,MAAO,KAAK,QACR;AACtB;;AAGF;;AAIJ,QAAO;EAAE,QAAQ;EAAM,OAAO;EAAW;;AAG3C,SAAS,eAAe,QAA+B;AACrD,KAAI,WAAW,KAAM,QAAO;AAC5B,KAAI,UAAU,OAAO,SAAS,IAAK,QAAO;AAC1C,KAAI,UAAU,OAAO,SAAS,IAAK,QAAO;AAC1C,KAAI,WAAW,IAAK,QAAO;AAC3B,KAAI,UAAU,UAAU,OAAO,SAAS,IAAK,QAAO;AACpD,QAAO;;AAGT,SAAS,cAAc,QAAgC;AACrD,KAAI,WAAW,KAAM,QAAO;AAE5B,KAAI,UAAU,OAAO,SAAS,IAAK,QAAO;AAC1C,KAAI,WAAW,IAAK,QAAO;AAC3B,QAAO;;AAGT,SAAS,aAAa,QAAgC;AACpD,KAAI,WAAW,KAAM,QAAO;AAE5B,KAAI,WAAW,IAAK,QAAO;AAE3B,QAAO,UAAU;;AAGnB,SAAS,aAAa,QAAuB,OAAwB;AACnE,KAAI,WAAW,KACb,QAAO,UAAU,SAAS;AAE5B,QAAO,GAAG;;AAGZ,eAAe,gBAA+C;AAI5D,SAFa,MADE,aAAa,CACF,gBAAgB,UAAU,EAExC,KAAK,QAAQ;EACvB,MAAM,gBACJ,IAAI;EACN,MAAM,QAAS,IAAI,SAA6C,EAAE;EAClE,MAAM,OAAQ,IAAI,QAA6C,EAAE;EACjE,MAAM,gBACH,IAAI,iBAA+D,EAAE;EACxE,MAAM,UAAW,IAAI,WAA+C,EAAE;EACtE,MAAM,QAAQ,IAAI,SAAS,OAAO,SAAY,IAAI;EAClD,MAAM,SAAS,IAAI,UAAU,OAAO,SAAY,IAAI;EACpD,MAAM,WAAW,IAAI,YAAY,OAAO,SAAY,IAAI;EACxD,MAAM,aACJ,IAAI,cAAc,OACd,SACC,IAAI;AAEX,SAAO;GACL,IAAI,IAAI;GACR,MAAM,IAAI;GACV,aAAa,IAAI;GACjB,aAAa,IAAI;GACjB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;GACD;;;;;AAMJ,eAAsB,cAAc,UAA6B,EAAE,EAMhE;CACD,MAAM,EACJ,gBAAgB,IAChB,UAAU,KACV,aAAa,GACb,eACE;CAEJ,MAAM,OAAO,MAAM,eAAe;CAClC,MAAMC,SAAqD,EAAE;AAG7D,MAAK,MAAM,OAAO,MAAM;;AAEtB,MAAI,IAAI,OACN,QAAO,KAAK;GACV,KAAK,IAAI;GACT,SAAS,IAAI;GACb,UAAU;GACX,CAAC;AAIJ,MAAI,IAAI,WAAW,IAAI,QAAQ,SAAS,EACtC,MAAK,MAAM,UAAU,IAAI,QACvB,QAAO,KAAK;GACV,KAAK;GACL,SAAS,IAAI;GACb,UAAU;GACX,CAAC;AAKN,6BAAI,IAAI,uFAAe,SAAQ,IAAI,cAAc,KAAK,SAAS,EAC7D,MAAK,MAAM,QAAQ,IAAI,cAAc,KACnC,QAAO,KAAK;GACV,KAAK,KAAK;GACV,SAAS,IAAI;GACb,UAAU;GACX,CAAC;;CAMR,MAAMC,UAA4B,EAAE;CACpC,MAAM,QAAQ,CAAC,GAAG,OAAO;CACzB,MAAM,6BAAa,IAAI,KAAoB;AAE3C,QAAO,MAAM,SAAS,KAAK,WAAW,OAAO,GAAG;AAE9C,SAAO,MAAM,SAAS,KAAK,WAAW,OAAO,eAAe;GAC1D,MAAM,QAAQ,MAAM,OAAO;GAE3B,MAAM,WAAW,YAAY;IAC3B,MAAM,SAAS,MAAM,kBAAkB,MAAM,KAAK;KAChD;KACA;KACD,CAAC;IAEF,MAAMC,YAAuB;KAC3B,GAAG;KACH,QAAQ,OAAO;KACf,OAAO,OAAO;KACf;AACD,YAAQ,KAAK,UAAU;AAGvB,QAAI,WACF,YAAW,UAAU;OAErB;AAEJ,cAAW,IAAI,QAAQ;AAGvB,GAAK,QAAQ,cAAc;AACzB,eAAW,OAAO,QAAQ;KAC1B;;AAIJ,MAAI,WAAW,OAAO,EACpB,OAAM,QAAQ,KAAK,WAAW;;CAIlC,MAAM,UAAU,QAAQ,QAAQ,MAAM,cAAc,EAAE,OAAO,CAAC;CAC9D,MAAM,SAAS,QAAQ,QAAQ,MAAM,aAAa,EAAE,OAAO,CAAC;CAC5D,MAAM,YAAY,QAAQ,QACvB,MAAM,EAAE,UAAU,EAAE,UAAU,OAAO,EAAE,SAAS,IAClD;AAED,QAAO;EACL,OAAO,QAAQ;EACf,SAAS,QAAQ;EACjB,QAAQ,OAAO;EACf,WAAW,UAAU;EACrB,QAAQ;EACT;;;;;AAMH,SAAgB,qBAAqB,QAM5B;AACP,SAAQ,IAAI,gBAAgB;AAC5B,SAAQ,IAAI,oBAAoB,OAAO,UAAU;AACjD,SAAQ,IAAI,mBAAmB,OAAO,SAAS;AAC/C,SAAQ,IAAI,iBAAiB,OAAO,YAAY;AAChD,SAAQ,KAAK;CAEb,MAAM,SAAS,OAAO,OAAO,QAAQ,MAAM,aAAa,EAAE,OAAO,CAAC;CAClE,MAAM,YAAY,OAAO,OAAO,QAC7B,MAAM,EAAE,UAAU,EAAE,UAAU,OAAO,EAAE,SAAS,IAClD;AAGD,KAAI,OAAO,SAAS,GAAG;AACrB,UAAQ,IAAI,oBAAoB;AAChC,OAAK,MAAM,QAAQ,QAAQ;AACzB,WAAQ,IACN,KAAK,eAAe,KAAK,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,WAC5D;AACD,WAAQ,IAAI,QAAQ,KAAK,MAAM;AAC/B,WAAQ,IAAI,gBAAgB,aAAa,KAAK,QAAQ,KAAK,MAAM,GAAG;AACpE,WAAQ,KAAK;;;AAKjB,KAAI,UAAU,SAAS,GAAG;AACxB,UAAQ,IAAI,kBAAkB;AAC9B,OAAK,MAAM,QAAQ,WAAW;AAC5B,WAAQ,IACN,KAAK,eAAe,KAAK,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,WAC5D;AACD,WAAQ,IAAI,QAAQ,KAAK,MAAM;AAC/B,WAAQ,IAAI,gBAAgB,aAAa,KAAK,QAAQ,KAAK,MAAM,GAAG;AACpE,WAAQ,KAAK;;;CAKjB,MAAM,2BAAW,IAAI,KAGlB;AACH,MAAK,MAAM,UAAU,OAAO,QAAQ;EAClC,MAAM,QAAQ,SAAS,IAAI,OAAO,QAAQ,IAAI;GAC5C,SAAS;GACT,QAAQ;GACR,OAAO;GACR;AACD,QAAM;AACN,MAAI,cAAc,OAAO,OAAO,CAC9B,OAAM;MAEN,OAAM;AAER,WAAS,IAAI,OAAO,SAAS,MAAM;;CAGrC,MAAM,sBAAsB,MAAM,KAAK,SAAS,SAAS,CAAC,CACvD,QAAQ,CAAC,GAAG,WAAW,MAAM,SAAS,EAAE,CACxC,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO;AAE5C,KAAI,oBAAoB,SAAS,GAAG;AAClC,UAAQ,IAAI,+BAA+B;AAC3C,OAAK,MAAM,CAAC,SAAS,UAAU,oBAC7B,SAAQ,IAAI,KAAK,QAAQ,IAAI,MAAM,OAAO,GAAG,MAAM,MAAM,SAAS;AAEpE,UAAQ,KAAK;;AAGf,KAAI,OAAO,SAAS,EAClB,SAAQ,IAAI,aAAa,OAAO,OAAO,iBAAiB;KAExD,SAAQ,IAAI,6BAA6B;;;;;;;;AC/T7C,SAAS,oBAAoB,UAAkC;AAC7D,KAAI,SAASC,SACX,QAAOA,SAAO;CAGhB,MAAM,EAAE,MAAM,MAAM,UAAU,UAAU,sBAAU,SAAS,aAAaA;AACxE,QAAO,gBAAgB,SAAS,GAAG,mBAAmBC,WAAS,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,UAAU;;;;;;AAOxG,IAAa,oBAAb,MAA+B;CAK7B,YAAY,UAA0B;gBAJA;cACP;AAI7B,OAAK,SAASD;;;;;;CAOhB,YAA0B;AACxB,MAAI,CAAC,KAAK,QAAQ;GAChB,MAAM,gBAAgB,oBAAoB,KAAK,OAAO;AAGtD,QAAK,OAAO,IAAIE,YAAG,KAAK,EAAE,kBAAkB,eAAe,CAAC;AAG5D,QAAK,SAAS,IAAI,aAAa;IAC7B,SAHc,IAAI,SAAS,KAAK,KAAK;IAIrC,KACE,QAAQ,IAAI,aAAa,gBACrB,CAAC,QAAQ,QAAQ,GACjB,CAAC,QAAQ,QAAQ;IACxB,CAAC;AAGF,eAAY,KAAK,OAAO;;AAE1B,SAAO,KAAK;;CAGd,MAAM,UAAyB;AAE7B,QADe,KAAK,WAAW,CAClB,UAAU;;CAGzB,MAAM,aAA4B;AAChC,MAAI,KAAK,QAAQ;AACf,SAAM,KAAK,OAAO,aAAa;AAC/B,QAAK,SAAS;;AAEhB,MAAI,KAAK,MAAM;AACb,SAAM,KAAK,KAAK,KAAK;AACrB,QAAK,OAAO;;;;;;;;;;AC/DlB,SAAS,kBACP,KACyC;AACzC,QAAO,OAAO,QAAQ,YAAY,QAAQ;;;;;;;;;AAU5C,SAAgB,sBACd,UACiD;AAEjD,KAAI,kBAAkB,SAAS,CAC7B,QAAO,YAAY;AAIrB,KAAI,OAAO,aAAa,WACtB,QAAO,YAAY;EACjB,MAAM,SACJ,UAGC;AACH,SAAO,kBAAkB,UAAU,MAAM,SAAS;;AAItD,OAAM,IAAI,MACR,kHACD;;;;;;;;AC5BH,SAAgB,4BAA4B,SAAgC;AAC1E,QAAO;EACL,IAAI,QAAQ;EACZ,OAAO,QAAQ;EACf,MAAM,QAAQ;EACd,eAAe;EACf,2BAAW,IAAI,MAAM;EACrB,2BAAW,IAAI,MAAM;EACrB,mBAAmB,QAAQ;EAC5B;;;;;AAMH,SAAgB,0BAA0B,SAAwB;AAChE,QAAO;EACL,MAAM;GACJ,IAAI,QAAQ;GACZ,OAAO,QAAQ;GACf,MAAM,QAAQ;GACd,eAAe;GACf,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,mBAAmB,QAAQ;GAC5B;EACD,SAAS;GACP,IAAI,GAAG,QAAQ,GAAG;GAClB,QAAQ,QAAQ;GAChB,WAAW,IAAI,KAAK,KAAK,KAAK,GAAG,MAAO,KAAK,KAAK,KAAK,GAAG,CAAC,aAAa;GACxE,OAAO,GAAG,QAAQ,GAAG;GACrB,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC;EACF;;;;;ACtBH,MAAMC,WAAuC,CAC3C;CACE,MAAM;CACN,gBAAgB;CAChB,WAAW,UAAQ,SAAS,QAAQ;EAClC,MAAM,WAAW,QAAQ;AAGzB,WAAO,IACL,GAAG,SAAS,gBACZ,OAAO,KAAK,QAAuB;AACjC,OAAI;AAEF,QAAI,IAAI,WAAW,aAAa;AAC9B,SAAI,KAAK,0BAA0B,IAAI,WAAW,YAAY,CAAC;AAC/D;;IAGF,MAAM,UAAU,MAAM,IAAI,KAAK,IAAI,WAAW,EAC5C,SAAS,IAAI,SACd,CAAC;AACF,QAAI,QACF,KAAI,KAAK,QAAQ;QAEjB,KAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,qBAAqB,CAAC;YAE/C,OAAO;AACd,YAAQ,MAAM,wBAAwB,MAAM;AAC5C,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;IAG7D;EAGD,MAAM,cAAc,cAAc,IAAI,KAAK;AAC3C,WAAO,IAAI,GAAG,SAAS,eAAe,YAAY;;CAErD,EACD;CACE,MAAM;CACN,gBAAgB;CAChB,WAAW,aAAW;AAEpB,WAAO,IAAI,sBAAsB,OAAO,KAAK,QAAQ;GACnD,MAAM,EAAE,SAAS,IAAI;AAErB,OAAI,CAAC,QAAQ,CAAC,gBAAgB,KAAK,KAAK,EAAE;AACxC,QAAI,OAAO,IAAI,CAAC,KAAK,oBAAoB;AACzC;;AAGF,OAAI;IACF,MAAM,SAAS,MAAM,eAAe,KAAK;AAEzC,QAAI,CAAC,QAAQ;AACX,SAAI,OAAO,IAAI,CAAC,KAAK,iBAAiB;AACtC;;AAGF,QAAI,UAAU,gBAAgB,OAAO,SAAS;AAC9C,QAAI,UAAU,iBAAiB,wBAAwB;AACvD,QAAI,KAAK,OAAO,QAAQ;YACjB,OAAO;AACd,YAAQ,MAAM,wBAAwB,MAAM;AAC5C,QAAI,OAAO,IAAI,CAAC,KAAK,iBAAiB;;IAExC;;CAEL,CACF;;;;AAKD,SAAgB,iBACd,UACA,SAEA,SACM;CACN,MAAM,WAAW,QAAQ;AAKzB,4BAA2BC,UAAQ,EACjC,UAAU,GAAG,SAAS,SACvB,CAAC;AAGF,6BAA4BA,UAAQ,EAClC,UAAU,GAAG,SAAS,UACvB,CAAC;AAGF,kCAAiCA,UAAQ,EACvC,UAAU,GAAG,SAAS,eACvB,CAAC;CAGF,MAAM,UAAU,QAAQ,YAAY,EAAE;AAEtC,MAAK,MAAM,WAAW,SAGpB,KAFkB,QAAQ,QAAQ,SAAS,QAAQ,eAGjD,SAAQ,SAASA,UAAQ,SAAS,QAAQ;;;;;ACpHhD,eAAsB,mBACpB,SAC6B;;CAE7B,MAAM,WAAW,QAAQ,YAAY;CACrC,MAAM,oBAAoB;EAAE,GAAG;EAAS;EAAU;CAGlD,MAAM,YAAY,IAAI,kBAAkB,QAAQ,SAAS;AAEzD,WAAU,WAAW;CAGrB,MAAM,OAAO,WAAW;EACtB,SAAS,QAAQ,KAAK;EACtB,SAAS,QAAQ,KAAK;EACtB,QAAQ,QAAQ,KAAK;EACrB,WAAW,QAAQ,KAAK;EACxB,SAAS,QAAQ,KAAK;EACtB,kBAAkB,QAAQ,KAAK;EAC/B,kBAAkB,QAAQ,KAAK;EAChC,CAAC;CAGF,MAAM,aAAa,iBAAiB,KAAK;CAGzC,MAAM,iBAAiB,sBAAsB,QAAQ,QAAQ;CAG7D,MAAM,cAAc,QAAQ,KAAK,eAAe,CAAC,6BAA6B;CAG9E,MAAM,gBAAgB,OAAO,EAC3B,UAC6C;EAC7C,MAAM,yBAAyB,MAAM,gBAAgB;EAErD,IAAIC,SAAO;EACX,IAAIC,aAA4B,EAAE;AAGlC,MAAI,QAAQ,KAAK,aAAa;AAC5B,YAAO,4BAA4B,QAAQ,KAAK,YAAY;AAC5D,gBAAa,QAAQ,KAAK,YAAY;QAGtC,KAAI;GACF,MAAM,UAAU,MAAM,KAAK,IAAI,WAAW,EACxC,SAAS,IAAI,SACd,CAAC;AACF,+DAAO,QAAS,SAAQ;AAGxB,OAAID,UAAQ,QAAQ,KAAK,gBACvB,KAAI;IAGF,MAAM,cAAc,MAAM,KAAK,IAAI,eAAe;KAChD,MAAM,EACJ,YAAY,QACb;KACD,SAAS,IAAI;KACd,CAAC;AAEF,QAAI,YAAY,aAAa;KAE3B,MAAM,QAAQ,YAAY,YAAY,MAAM,IAAI;AAChD,SAAI,MAAM,WAAW,KAAK,MAAM,IAAI;MAIlC,MAAM,SAHU,KAAK,MACnB,OAAO,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,CAC3C,CACsB,QAAQ,KAAK;AACpC,mBAAa,MAAM,QAAQ,OAAO,GAAG,SAAS,EAAE;;;YAG7C,OAAO;AACd,YAAQ,MAAM,8CAA8C,MAAM;;WAG/D,OAAO;AACd,WAAQ,MAAM,yCAAyC,MAAM;;AAOjE,SAAO,oBAAoB;GACzB;GACA,MAJqBA,SAAO;IAAE,GAAGA;IAAM,QAAQ;IAAY,GAAG;GAK9D;GACD,CAAC;;CAIJ,MAAME,WAAS,QAAQ;AACvB,UAAO,IAAI,QAAQ,MAAM,CAAC;CAG1B,MAAMC,oBAAuC;EAC3C;EACA;EACA,eAAe,YAAY;AAEzB,UAAO,oBAAoB;IACzB,wBAF6B,MAAM,gBAAgB;IAGnD;IACD,CAAC;;EAEJ,YAAY,QAAQ;EACrB;AAGD,+BAAI,kBAAkB,wFAAU,UAAS,MACvC,UAAO,IACL,GAAG,SAAS,QACZ,YAAY,wBAAwB;EAClC,QAAQ;EACR;EACD,CAAC,CACH;AAIH,kBAAiBD,UAAQ,mBAAmB,kBAAkB;AAG9D,uBAAI,QAAQ,uEAAO,mBACjB,OAAM,QAAQ,MAAM,mBAAmBA,SAAO;AAGhD,QAAO;EACL;EACA;EACA;EAEA,MAAM,UAAyB;;AAC7B,SAAM,UAAU,SAAS;AACzB,0BAAI,QAAQ,yEAAO,oBACjB,OAAM,QAAQ,MAAM,qBAAqB;;EAI7C,MAAM,aAA4B;;AAChC,0BAAI,QAAQ,yEAAO,wBACjB,OAAM,QAAQ,MAAM,yBAAyB;AAE/C,SAAM,UAAU,YAAY;;EAG9B,UAAU,UAA0C;AAClD,YAASA,SAAO;;EAEnB;;;;;;;;;;;;;;;AC/JH,SAAgB,oBACd,MACA,YACQ;AACR,KAAI,WAAW,WAAW,EACxB,QAAO;CAGT,MAAM,aAAa,WAChB,KAAK,QAAQ,oBAAoB,IAAI,cAAa,CAClD,KAAK,KAAK;AAGb,QAAO,KAAK,QAAQ,WAAW,GAAG,WAAW,aAAa"}